diff options
-rw-r--r-- | runtime/doc/syntax.txt | 12 | ||||
-rw-r--r-- | runtime/syntax/sh.vim | 84 |
2 files changed, 48 insertions, 48 deletions
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index 2feee0a511..faca3d88da 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -3032,24 +3032,24 @@ cases pertain, then the first line of the file is examined (ex. looking for /bin/sh /bin/ksh /bin/bash). If the first line specifies a shelltype, then that shelltype is used. However some files (ex. .profile) are known to be shell files but the type is not apparent. Furthermore, on many systems sh is -symbolically linked to "bash" (Linux, Windows+cygwin) or "ksh" (Posix). +symbolically linked to "bash" (Linux, Windows+cygwin) or "ksh" (POSIX). One may specify a global default by instantiating one of the following variables in your vimrc: ksh: > let g:is_kornshell = 1 -< posix: (using this is nearly the same as setting g:is_kornshell to 1) > +< posix: (default) > let g:is_posix = 1 < bash: > let g:is_bash = 1 -< sh: (default) Bourne shell > +< dash: > + let g:is_dash = 1 +< sh: Bourne shell > let g:is_sh = 1 -< (dash users should use posix) - If there's no "#! ..." line, and the user hasn't availed themself of a default -sh.vim syntax setting as just shown, then syntax/sh.vim will assume the Bourne +sh.vim syntax setting as just shown, then syntax/sh.vim will assume the POSIX shell syntax. No need to quote RFCs or market penetration statistics in error reports, please -- just select the default version of the sh your system uses and install the associated "let..." in your <.vimrc>. diff --git a/runtime/syntax/sh.vim b/runtime/syntax/sh.vim index 67268cdfe3..37d1c0a83c 100644 --- a/runtime/syntax/sh.vim +++ b/runtime/syntax/sh.vim @@ -7,6 +7,7 @@ " 2024 Nov 03 by Aliaksei Budavei <0x000c70 AT gmail DOT com> (improved bracket expressions, #15941) " 2025 Jan 06 add $PS0 to bashSpecialVariables (#16394) " 2025 Jan 18 add bash coproc, remove duplicate syn keywords (#16467) +" 2025 Mar 21 update shell capability detection (#16939) " Version: 208 " Former URL: http://www.drchip.org/astronaut/vim/index.html#SYNTAX_SH " For options and settings, please use: :help ft-sh-syntax @@ -17,6 +18,9 @@ if exists("b:current_syntax") finish endif +" Ensure this is set unless we find another shell +let b:is_sh = 1 + " If the shell script itself specifies which shell to use, use it if getline(1) =~ '\<ksh\>' let b:is_kornshell = 1 @@ -24,55 +28,45 @@ elseif getline(1) =~ '\<bash\>' let b:is_bash = 1 elseif getline(1) =~ '\<dash\>' let b:is_dash = 1 -elseif !exists("g:is_kornshell") && !exists("g:is_bash") && !exists("g:is_posix") && !exists("g:is_sh") && !exists("g:is_dash") - " user did not specify which shell to use, and - " the script itself does not specify which shell to use. FYI: /bin/sh is ambiguous. - " Assuming /bin/sh is executable, and if its a link, find out what it links to. - let s:shell = "" - if executable("/bin/sh") - let s:shell = resolve("/bin/sh") - elseif executable("/usr/bin/sh") - let s:shell = resolve("/usr/bin/sh") - endif - if s:shell =~ '\<ksh\>' - let b:is_kornshell= 1 - elseif s:shell =~ '\<bash\>' - let b:is_bash = 1 - elseif s:shell =~ '\<dash\>' - let b:is_dash = 1 - endif - unlet s:shell -endif - " handling /bin/sh with is_kornshell/is_sh {{{1 " b:is_sh will be set when "#! /bin/sh" is found; " However, it often is just a masquerade by bash (typically Linux) " or kornshell (typically workstations with Posix "sh"). -" So, when the user sets "g:is_bash", "g:is_kornshell", -" or "g:is_posix", a b:is_sh is converted into b:is_bash/b:is_kornshell, -" respectively. -if !exists("b:is_kornshell") && !exists("b:is_bash") && !exists("b:is_dash") - if exists("g:is_posix") && !exists("g:is_kornshell") - let g:is_kornshell= g:is_posix +" So, when the user sets "g:is_kornshell", "g:is_bash", +" "g:is_posix" or "g:is_dash", a b:is_sh is converted into +" b:is_kornshell/b:is_bash/b:is_posix/b:is_dash, respectively. +elseif !exists("b:is_kornshell") && !exists("b:is_bash") && !exists("b:is_posix") && !exists("b:is_dash") + if exists("g:is_kornshell") + let b:is_kornshell= 1 + elseif exists("g:is_bash") + let b:is_bash= 1 + elseif exists("g:is_dash") + let b:is_dash= 1 + elseif exists("g:is_posix") + let b:is_posix= 1 + elseif exists("g:is_sh") + let b:is_sh= 1 + else + " user did not specify which shell to use, and + " the script itself does not specify which shell to use. FYI: /bin/sh is ambiguous. + " Assuming /bin/sh is executable, and if its a link, find out what it links to. + let s:shell = "" + if executable("/bin/sh") + let s:shell = resolve("/bin/sh") + elseif executable("/usr/bin/sh") + let s:shell = resolve("/usr/bin/sh") endif - if exists("g:is_kornshell") - let b:is_kornshell= 1 - if exists("b:is_sh") - unlet b:is_sh - endif - elseif exists("g:is_bash") - let b:is_bash= 1 - if exists("b:is_sh") - unlet b:is_sh - endif - elseif exists("g:is_dash") - let b:is_dash= 1 - if exists("b:is_sh") - unlet b:is_sh - endif + if s:shell =~ '\<ksh\>' + let b:is_kornshell= 1 + elseif s:shell =~ '\<bash\>' + let b:is_bash = 1 + elseif s:shell =~ '\<dash\>' + let b:is_dash = 1 else - let b:is_sh= 1 + let b:is_posix = 1 endif + unlet s:shell + endif endif " if b:is_dash, set b:is_posix too @@ -80,6 +74,12 @@ if exists("b:is_dash") let b:is_posix= 1 endif +if exists("b:is_kornshell") || exists("b:is_bash") + if exists("b:is_sh") + unlet b:is_sh + endif +endif + " set up default g:sh_fold_enabled {{{1 " ================================ if !exists("g:sh_fold_enabled") |