schemes color activate vim syntax-highlighting vim-syntax-highlighting

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:

  1. Hay un archivo ~/.vim/ftdetect lugar de uno para cada tipo de archivo en el directorio ~/.vim/ftdetect .
  2. La variable b:is_bash se establece localmente en el búfer en lugar de global al referirse a ella como g: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 .