2010-04-05 38 views
52

Mi editor de Vim resalta automáticamente los archivos PHP (vim file.php), los archivos HTML (vim file.html) y así sucesivamente.¿Cómo resaltar los scripts Bash en Vim?

Pero cuando escribo: vim file y en su interior escribo un script Bash, no lo resalta.

¿Cómo puedo decirle a Vim que lo resalte como un script Bash?

Empiezo a escribir #!/bin/bash en la parte superior del archivo, pero no lo hace funcionar.

Respuesta

58

¿Está dando correctamente al script de shell una extensión .sh? La selección de sintaxis automática de Vim se basa casi por completo en la detección del nombre de archivo (extensión). Si un archivo no tiene un conjunto de sintaxis (o es la sintaxis incorrecta), Vim no cambiará automáticamente a la sintaxis correcta simplemente porque comenzó a escribir un script en un idioma determinado.

Como una solución temporal, el comando :set syn=sh activará el resaltado de sintaxis de shell-script.

+2

pero la mayoría de los scripts no tienen una extensión .sh? ¿Debería ponerlo como una extensión .sh solo para que funcione? ¿Es una mejor práctica nombrar tus guiones? y su bash ... así que todavía está .sh? –

+1

@ajsie: No estoy seguro de qué scripts está usando, pero la mayoría de los scripts 'bash' que encuentro tienen un sufijo' .sh'. Para realmente especificar * bash * en lugar de simplemente 'sh', usaría la línea de shebang' #!/Bin/bash' en un archivo '.sh'. –

+1

simplemente escriba: set ft = sh y listo, O, prefija su script con una línea de modo: "# vim: ft = sh" sin las comillas, por supuesto, Y, sugiero obtener algo mejor que el resaltador sh filetype for scripts bash porque no reconoce las cosas correctamente, algunos ejemplos son subcadenas $ {VAR: 1: 2}; & or ;; y <- al final de los modificadores de mayúsculas y minúsculas, y muchas de las palabras clave específicas de bash tampoco se reconocen. Por supuesto, no obtengas uno que sea malo porque HAY ALGUNOS MALOS circulando por ahí, he usado un par que era mucho peor que el sh.vim predeterminado. – osirisgothra

12

Vim también puede detectar los tipos de archivos mediante la inspección de sus contenidos (como por ejemplo, si la primera línea contiene un tinglado bash), aquí es una cita de archivo filetype.txt ayuda:

Si el tipo de archivo sólo puede ser detectado por inspección del contenido del archivo

Cree su directorio de tiempo de ejecución de usuario. Normalmente usaría el primer elemento de la opción 'runtimepath'. Ejemplo para Unix:

:!mkdir ~/.vim 

Cree un archivo de script vim para hacerlo. Ejemplo:

if did_filetype() " filetype already set.. 
    finish  " ..don't do these checks 
endif 
if getline(1) =~ '^#!.*\<mine\>' 
    setfiletype mine 
elseif getline(1) =~? '\<drawing\>' 
    setfiletype drawing 
endif 

Consulte $ VIMRUNTIME/scripts.vim para ver más ejemplos. Escriba este archivo como "scripts.vim" en su directorio de tiempo de ejecución de usuario. Para ejemplo, para Unix:

:w ~/.vim/scripts.vim 

La detección va a funcionar de inmediato, sin necesidad de reiniciar Vim.

Su scripts.vim se carga antes de los controles por defecto para los tipos de archivos, lo que significa que su reglas sustituyen a las reglas predeterminadas en $ VIMRUNTIME/scripts.vim.

+1

He intentado poner esto en .vimrc y .vim/scripts.vim, pero ninguno ha funcionado. Solo funciona si escribo manualmente los comandos una vez que comienzo vim. ¿Qué estoy haciendo mal? – Eddy

+0

@Eddy Probablemente necesites 'establecer modeline' en' ~/.vimrc', ver [esta respuesta] (http://superuser.com/q/323712/72223) – Tino

0

vim ya reconoce muchos tipos de archivos de forma predeterminada. La mayoría de ellos funcionan 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 automáticamente el tipo de archivo para nombres de archivos específicos como .bashrc, .tcshrc, etc. Pero un archivo con una extensión .sh se reconocerá como script csh, ksh o bash. 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 un script bash. Por lo general, verá #!/bin/bash si la secuencia de comandos debe ejecutarse directamente, pero para un archivo de configuración de shell con un simple # bash también funcionará.

Si desea mirar los detalles, esto se implementa en $VIMRUNTIME/filetype.vim.

+0

Uhm, en realidad quería publicar esto en otro lugar. Pero supongo que la respuesta también cabe aquí :-) – raimue

21

Las respuestas hasta ahora son correctas, puede usar la extensión (como .sh) o una línea shebang (como #!/bin/bash) para identificar el tipo de archivo. Si no tiene uno de esos, puede especificar el tipo de archivo manualmente utilizando un comentario en línea en la parte superior o inferior de su archivo.

Por ejemplo, si desea identificar una secuencia de comandos sin una extensión como un script de shell, se podría añadir este comentario a la parte superior de su archivo:

# vim: set filetype=sh : 

o

# vim: filetype=sh 

Eso le dirá a vim que trate el archivo como un script de shell. (También puede establecer otras cosas en la línea de modem. En vim escriba :help modeline para obtener más información.)

+0

Curiosamente, en mi entorno, el ':' final hace que esta línea funcione, mientras que sin el ':' final, esta línea de modo no se registra. La documentación de ayuda muestra una forma de una línea de modo que no termina en ':'. – orluke

+0

Eso es interesante. La documentación de ayuda (con ': help modeline') dice dos diferencias: (1) La versión con el': '" final es compatible con algunas versiones de Vi ", y (2) sin el': 'final no lo hace usa la palabra clave 'set'. Como puede poner cualquier texto después de la línea de modo, el ':' final funciona con o sin la palabra clave 'set'. – bryant

+1

Si la línea de modelado parece no tener efecto, intente 'establecer modeline' en' ~/.vimrc', vea [esta respuesta] (http://superuser.com/q/323712/72223) – Tino

-1

Cuando crea un archivo nuevo, solo entra en juego la detección de nombre de archivo; la detección de contenido (#!/bin/bash) no se aplica si la escribe después de crear un nuevo búfer.

Lo más sensato es hacer sólo :set ft=bash la primera vez, y el tiempo de siguiente de modificarlo, el #!/bin/bash establecerá el tipo de archivo adecuado de forma automática.

+1

A mi lado 'ft = bash' necesita leer' ft = sh'. También necesitaba 'establecer modeline' en' ~/.vimrc' para que funcione, consulte [esta respuesta] (http://superuser.com/q/323712/72223) – Tino

0

Probablemente la forma más fácil de resaltado de sintaxis en un archivo nuevo, es simplemente volver a cargarlo después de escribir la línea tinglado. Un simple :w:e escribirá el archivo, vuelva a cargarlo, e interpretar la línea tinglado que acaba de escribir para ofrecerle el resaltado de sintaxis adecuada.

5

vim puede detectar por el comentario arriba

tratar esta línea en la parte superior del archivo

#!/bin/sh 
+0

Se perdió el directorio raíz '/' entre ' ! ' y B'. – h9uest

10

resaltado de sintaxis En realidad es una característica de vim no vi. Intente usar el comando vim y luego haga

:syntax on.

+1

Para mí también. Puede agregar la línea "sintaxis" a su archivo .vimrc. – teu

+1

Esta fue la solución para mí en Mac OS X 10.10.3. Agregué un archivo .vimrc a mi directorio personal usando 'vim ~/.vimrc' y agregando' syntax on' al archivo y luego cerrando con ': x' – kungfujam

1

Una vez añadido el tinglado en la parte superior del archivo, guardarlo y volver a cargarlo (por ejemplo :w|e) y la sintaxis para colorear puede patear.

Véase también Vim inconsistently syntax highlighting bash files, la respuesta aceptada puede ayudar también.

5

Llegué a esta respuesta buscando específicamente cómo resaltar bash sintaxis, no POSIX shell. Simplemente haciendo un set ft=sh (o equivalente) se traducirá en el archivo que se está resaltada por el shell POSIX, lo que deja una gran cantidad de sintaxis que es válido en bash resaltado en rojo. Para obtener resaltado bash:

" Set a variable on the buffer that tells the sh syntax highlighter 
" that this is bash: 
let b:is_bash = 1 
" Set the filetype to sh 
set ft=sh 

Tenga en cuenta que si su ft es ya sh, sigue siendo necesario el comando set; de lo contrario, let no surte efecto de inmediato.

Puede hacer que esto sea un valor predeterminado global al hacer que la variable sea global, es decir, let g:is_bash = 1.

:help ft-sh-syntax es la página del manual que tuve que buscar; lo explica y cómo activar el resaltado de otros sabores de shell.

+0

Algunas versiones del resaltador de sintaxis' sh' incluso marcan código posix sh válido como inválido (ej. '$ (subshell)') - esto corrige eso también. Gracias. –

0

Si ya conoce el tipo de archivo antes de abrir la secuencia de comandos o si va a crear un nuevo guión sin una extensión que es común, puede pasar a vim en la línea de comandos, así:

vim -c 'setfiletype sh' path/to/script 
vim -c 'setfiletype python' path/to/script 
Cuestiones relacionadas