color - Vim inconsistentemente sintaxis resaltando archivos bash
vim color schemes list (4)
Cuando abro algunos archivos de script bash con vim, a veces los identifica como archivos conf
, está bien, puedo corregir eso estableciendo el tipo de archivo sh
con :setf sh
.
Eso es genial, excepto que me he dado cuenta de que esto no arregla las cosas por completo:
Observe que shopt
está correctamente resaltado a la izquierda, pero no a la derecha, donde configuro manualmente el tipo de archivo a sh
.
Esto significa que cuando un archivo es identificado como bash
o sh
por vim, establece el tipo de archivo en sh
pero luego realiza algunos pasos adicionales que no estoy haciendo cuando configuro el tipo de archivo manualmente.
¿Alguien sabe lo que podría ser y cómo podría arreglarlo?
Intente ver la configuración de sintaxis efectiva
:windo echo b:current_syntax
(Espero que la primera ventana diga bash
y la segunda que diga sh
...?)
También intente mucking con la sincronización de Synatx:
:windo syn sync fromstart
:windo syn sync minlines=300
En general
:he syn-sync
para más información
PD.
Un tiro largo, pero algún otro resaltado podría estar interfiriendo:
:windo se @/=''''
:match none
:2match none
:3match none
Resulta que syntax/sh.vim
incluye resaltado específico para Korn , Bash y sh , solo tienes que decir qué está utilizando. Esto se hace con b:is_kornshell
, b:is_bash
y b:is_sh
respectivamente.
Dependiendo de la situación, imagino que usaré lo siguiente:
ftdetect / bash.vim:
au BufRead,BufNewFile *bash* let g:is_bash=1
au BufRead,BufNewFile *bash* setf sh
Modeline:
# vim:let g:is_bash=1:set filetype=sh:
Mapeo de teclas
nmap <silent> <leader>b :let g:is_bash=1<cr> :setf sh<cr>
Similar a la solución de Peter Coulton y documentada, así como una alternativa en la sección "new-filetype" del "filetype" Vim ayuda al ~/.vim/filetype.vim
podría contener el siguiente código:
if exists("did_load_filetypes")
finish
endif
augroup filetypedetect
au! BufRead,BufNewFile *bash* let b:is_bash = 1 | setfiletype sh
augroup END
Este enfoque tiene las siguientes implicaciones:
- Hay un archivo
~/.vim/ftdetect
lugar de uno para cada tipo de archivo en el directorio~/.vim/ftdetect
. - La variable
b:is_bash
se establece localmente en el búfer en lugar de global al referirse a ella comog:is_bash
.
vim ya reconoce muchos tipos de archivos por defecto. La mayoría de ellos trabajan por extensiones de archivo, pero en un caso como este, vim también analizará el contenido del archivo para adivinar el tipo correcto.
vim establece el tipo de archivo para nombres de archivos específicos como .bashrc
, .tcshrc
, etc. automáticamente. Pero un archivo con una extensión .sh
será reconocido como csh, ksh o bash script. Para determinar qué tipo de script es exactamente, vim lee la primera línea del archivo para ver el #! línea.
Si la primera línea contiene la palabra bash
, el archivo se identifica como una secuencia de comandos bash. Por lo general, verá #!/bin/bash
si la secuencia de comandos está pensada para ejecutarse directamente; para algún otro archivo de configuración de shell, debe usar las extensiones de archivo .bash
.
La ayuda en vim explica esto también en :help ft-bash-syntax
. También puede usar let g:is_bash=1
en su .vimrc para hacer que la sintaxis de bash resalte el valor predeterminado para todos los archivos con filetype=sh
. Si desea ver los detalles, esto se implementa en $VIMRUNTIME/filetype.vim
.