mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	Problem:  MS-Windows: vimtutor batch script can be improved
Solution: Update vimtutor.bat, validate languages using Powershell
          cultureinfo (RestorerZ)
closes: #16112
Signed-off-by: RestorerZ <restorer@mail2k.ru>
Signed-off-by: Christian Brabandt <cb@256bit.org>
		
	
		
			
				
	
	
		
			249 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Batchfile
		
	
	
	
	
	
			
		
		
	
	
			249 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Batchfile
		
	
	
	
	
	
| :: Start Vim on a copy of the tutor file.
 | |
| @echo off
 | |
| SetLocal
 | |
| 
 | |
| :: Usage:
 | |
| :: vimtutor [/?|{/ | -}h|{/ | --}help] [{/ | -}c|{/ | --}chapter NUMBER] [{/ | --}console] [xx]
 | |
| ::
 | |
| :: -console means gvim will not be used
 | |
| :: xx is a language code like "es" or "nl".
 | |
| :: When an xx argument is given, it tries loading that tutor.
 | |
| :: When this fails or no xx argument was given, it tries using 'v:lang'
 | |
| :: When that also fails, it uses the English version.
 | |
| 
 | |
| :: Use Vim to copy the tutor, it knows the value of $VIMRUNTIME
 | |
| for %%G in (. %TMP% %TEMP%) do (
 | |
|   call :TestDirWritable "%~f0" %%G
 | |
|   if not ERRORLEVEL 1 goto DirOk
 | |
| )
 | |
| 
 | |
| echo:
 | |
| echo:No working directory is found.
 | |
| goto End
 | |
| 
 | |
| :TestDirWritable
 | |
| set TUTORCOPY=%2\$tutor$
 | |
| copy %1 %TUTORCOPY% 2>&1> nul
 | |
| goto DelTmpCopy
 | |
| 
 | |
| :DirOk
 | |
| title Tutorial on the Vim editor
 | |
| set "use=Gui"
 | |
| 
 | |
| for /F "usebackq tokens=2 delims=:" %%G in (`chcp`) do (
 | |
|   set /a "_sav_chcp=%%G"
 | |
|   1> nul chcp 65001
 | |
| )
 | |
| 
 | |
| :GetChptLngs
 | |
| for %%G in (tutor1;tutor2) do (
 | |
|   if exist "%~dp0tutor\%%G" (set "lngs_%%G=en;") else (
 | |
|     if exist "%~dp0tutor\%%G.utf-8" set "lngs_%%G=en;")
 | |
|   for /F "tokens=2 delims=._" %%H in (
 | |
|     '2^> nul dir /B /A:-D "%~dp0tutor\%%G.???.utf-8"') do (
 | |
|       call set "lngs_%%G=%%lngs_%%G%%%%H;")
 | |
| )
 | |
| :EndGetChptLngs
 | |
| 
 | |
| :ParseArgs
 | |
| if "%*"=="" goto Use%use%
 | |
| if "%1"=="/?" goto Usage
 | |
| if "%1"=="/h" goto Usage
 | |
| if "%1"=="-h" goto Usage
 | |
| if "%1"=="/help" goto Usage
 | |
| if "%1"=="--help" goto Usage
 | |
| if "%1"=="/list" goto List
 | |
| if "%1"=="--list" goto List
 | |
| :DoShift
 | |
| if "%1"=="/c" (call :ChkChpt %2 && (shift & shift & goto DoShift) || goto End)
 | |
| if "%1"=="-c" (call :ChkChpt %2 && (shift & shift & goto DoShift) || goto End)
 | |
| if "%1"=="/chapter" (
 | |
|   call :ChkChpt %2 && (shift & shift & goto DoShift) || goto End
 | |
| )
 | |
| if "%1"=="--chapter" (
 | |
|   call :ChkChpt %2 && (shift & shift & goto DoShift) || goto End
 | |
| )
 | |
| if "%1"=="/console" (set "use=Vim" & shift & goto DoShift)
 | |
| if "%1"=="--console" (set "use=Vim" & shift & goto DoShift)
 | |
| call :ChkLng %1 && shift || goto End
 | |
| if not "%1"=="" goto DoShift
 | |
| goto Use%use%
 | |
| 
 | |
| :UseGui
 | |
| :: Try making a copy of tutor with gvim.  If gvim cannot be found, try using
 | |
| :: vim instead.  If vim cannot be found, alert user to check environment and
 | |
| :: installation.
 | |
| 
 | |
| :: The script tutor.vim tells Vim which file to copy.
 | |
| start "dummy" /B /W "%~dp0gvim.exe" -u NONE -c "so $VIMRUNTIME/tutor/tutor.vim"
 | |
| if ERRORLEVEL 1 goto UseVim
 | |
| 
 | |
| :: Start gvim without any .vimrc, set 'nocompatible' and 'showcmd'
 | |
| start "dummy" /B /W "%~dp0gvim.exe" -u NONE -c "set nocp sc" %TUTORCOPY%
 | |
| 
 | |
| goto End
 | |
| 
 | |
| :UseVim
 | |
| :: The script tutor.vim tells Vim which file to copy
 | |
| call "%~dp0vim.exe" -u NONE -c "so $VIMRUNTIME/tutor/tutor.vim"
 | |
| if ERRORLEVEL 1 goto NoExecutable
 | |
| 
 | |
| :: Start vim without any .vimrc, set 'nocompatible and 'showcmd''
 | |
| call "%~dp0vim.exe" -u NONE -c "set nocp sc" %TUTORCOPY%
 | |
| 
 | |
| goto End
 | |
| 
 | |
| :NoExecutable
 | |
| echo:
 | |
| echo:
 | |
| echo:No vim or gvim found in current directory or %%PATH%%.
 | |
| echo:Check your installation or re-run install.exe.
 | |
| 
 | |
| goto End
 | |
| 
 | |
| :ChkChpt
 | |
| if defined CHAPTER (
 | |
|   echo:Error. Invalid command line arguments.
 | |
|   echo:See %~nx0 /? for help.
 | |
|   exit /B 1
 | |
| )
 | |
| for /F %%G in ('echo %1 ^| findstr /R "\<[1-2]\>"') do (
 | |
|   set "CHAPTER=%%G" & exit /B 0
 | |
| )
 | |
| echo:Error. The chapter argument must contain only the digits 1 or 2.
 | |
| exit /B 1
 | |
| 
 | |
| :ChkLng
 | |
| if "%1"=="" exit /B 0
 | |
| if defined xx (
 | |
|   echo:Error. Invalid command line arguments.
 | |
|   echo:See %~nx0 /? for help.
 | |
|   exit /B 1
 | |
| )
 | |
| for /F %%G in ('echo %1 ^| findstr /R "[-0-9\._\[\]\$\^\*/!@#&(|)=+\\]"') do (
 | |
|   echo:Error. The language code must contain only alphabetic characters.
 | |
|   exit /B 1
 | |
| )
 | |
| set "_t=%1"
 | |
| if ""=="%_t:~1%" (
 | |
|   echo:Error. The language code must be 2 or 3 characters only.
 | |
|   exit /B 1
 | |
| )
 | |
| if not ""=="%_t:~3%" (
 | |
|   echo:Error. The language code must be 2 or 3 characters only.
 | |
|   exit /B 1
 | |
| )
 | |
| SetLocal EnableDelayedExpansion
 | |
| if "!lngs_tutor%CHAPTER%:%1;=!"=="!lngs_tutor%CHAPTER%!" (
 | |
|   echo:The current installation does not have the %1 language.
 | |
|   echo:English will be used for the tutorial.
 | |
|   echo:To view the available languages, use the `%~nx0 /list` command.
 | |
|   1> nul timeout /T 2
 | |
|   EndLocal & set "xx=en" & exit /B 0
 | |
| ) else (EndLocal & set "xx=%1" & exit /B 0)
 | |
| 
 | |
| :Usage
 | |
| echo:
 | |
| echo:== USAGE =================================================================
 | |
| echo:
 | |
| echo:%~nx0 /? ^| ^{/ ^| -^}h ^| ^{/ ^| --^}help
 | |
| echo:or
 | |
| echo:%~nx0 ^{/ ^| --^}list
 | |
| echo:or
 | |
| echo:%~nx0 ^[^{/ ^| -^}c ^| ^{/ ^| --}chapter NUMBER^] ^[^{/ ^| --^}console^] ^[lng^]
 | |
| echo:
 | |
| echo:where:
 | |
| echo:/? or /h or -h or /help or --help
 | |
| echo:				Display the quick help and exit.
 | |
| echo:
 | |
| echo:/list or --list
 | |
| echo:				Display the available chapters and languages
 | |
| echo:				of the tutorial and exit.
 | |
| echo:
 | |
| echo:/c or -c or /chapter or --chapter NUMBER
 | |
| echo:				Specified chapter of the tutorial.
 | |
| echo:				The NUMBER should be 1 or 2.
 | |
| echo:				By default, the first chapter.
 | |
| echo:
 | |
| echo:/console or --console
 | |
| echo:				Open the tutorial in the console instead of GUI.
 | |
| echo:
 | |
| echo:lng
 | |
| echo:				Is a 2 or 3 character ISO639 language code
 | |
| echo:				like "es", "nl" or "bar".
 | |
| echo:				The default language is English.
 | |
| echo:
 | |
| echo:Examples:
 | |
| echo:	%~nx0 es /c 1 /console
 | |
| echo:	%~nx0 --chapter 2 de
 | |
| echo:	%~nx0 fr
 | |
| echo:
 | |
| 
 | |
| :EndUsage
 | |
| goto End
 | |
| 
 | |
| :List
 | |
| 
 | |
| :GetLngName
 | |
| if defined TMP (set "pscult_fl=%TMP%\pscult.tmp") else (
 | |
|   set "pscult_fl=%TEMP%\pscult.tmp")
 | |
| 
 | |
| powershell.exe -NoLogo -NoProfile -Command ^
 | |
| [system.globalization.cultureinfo]::GetCultures('AllCultures') ^| ^
 | |
| Where Name -NotLike "*-*" ^| Where DisplayName -NotLike "Invariant*" ^| ^
 | |
| %%{$_.Name + \"`t\" + $_.DisplayName + \"`t\" + $_.NativeName} ^| ^
 | |
| Sort-Object ^| Out-File -FilePath "%pscult_fl%" -Encoding utf8
 | |
| 
 | |
| if defined lngs_tutor1 (set "lngs=%lngs_tutor1%")
 | |
| if defined lngs_tutor2 if defined lngs (
 | |
|   for %%G in (%lngs_tutor2%) do (call set "lngs=%%lngs:%%G;=%%")
 | |
|   set "lngs=%lngs%%lngs_tutor2%"
 | |
|   ) else (set "lngs=%lngs_tutor2%")
 | |
| 
 | |
| if defined lngs (
 | |
|   for %%G in (%lngs%) do (
 | |
|     for /F "tokens=2,* delims=	" %%H in (
 | |
|       '2^> nul findstr /BR "\<%%G\>" "%pscult_fl%"'
 | |
|     ) do (set "%%G_name=%%H       %%I")
 | |
|   )
 | |
|   set "bar_name=Bavarian       Boarisch"
 | |
|   set "eo_name=Esperanto       Esperanto"
 | |
| )
 | |
| :EndGetLngName
 | |
| 
 | |
| echo:
 | |
| echo:The following chapters and languages are available in the current
 | |
| echo:installation tutorial:
 | |
| echo:
 | |
| if defined lngs_tutor1 (
 | |
|   echo:Chapter: 1
 | |
|   for %%G in (%lngs_tutor1%) do if "en"=="%%G" (
 | |
|     call echo:%%G	%%%%G_name%%  by default) else (
 | |
|       call echo:%%G	%%%%G_name%%)
 | |
|   echo:
 | |
| )
 | |
| 
 | |
| if defined lngs_tutor2 (
 | |
|   echo:Chapter: 2
 | |
|   for %%G in (%lngs_tutor2%) do if "en"=="%%G" (
 | |
|     call echo:%%G	%%%%G_name%%  by default) else (
 | |
|       call echo:%%G	%%%%G_name%%)
 | |
| )
 | |
| echo:
 | |
| goto End
 | |
| 
 | |
| :DelTmpCopy
 | |
| :: remove the copy of the tutor
 | |
| if exist %TUTORCOPY% del /F /Q %TUTORCOPY%
 | |
| goto :EOF
 | |
| 
 | |
| :End
 | |
| :: remove the copy of the tutor and ISO639 file
 | |
| if exist %TUTORCOPY% del /F /Q %TUTORCOPY%
 | |
| if exist %pscult_fl% del /F /Q %pscult_fl%
 | |
| chcp %_sav_chcp% 1> nul
 | |
| title %ComSpec%
 | |
| EndLocal
 | |
| 
 | |
| @rem vim:ft=dosbatch:ts=8:sts=2:sw=2:noet:
 |