2010-04-05 15 views
52

L'editor di My Vim evidenzia file PHP (vim file.php), file HTML (vim file.html) e così via.Come evidenziare gli script di Bash in Vim?

Ma quando digito: vim file e al suo interno scrivi uno script Bash, non lo evidenzia.

Come posso comunicare a Vim di evidenziarlo come script Bash?

Inizio a digitare #!/bin/bash nella parte superiore del file, ma non lo fa funzionare.

risposta

58

Stai dando correttamente lo script di shell a .sh estensione? La selezione automatica della sintassi di Vim è quasi completamente basata sul rilevamento del nome del file (estensione). Se un file non ha un sintassi impostato (o è la sintassi errata), Vim non cambierà automaticamente la sintassi corretta solo perché hai iniziato a digitare uno script in una determinata lingua.

Come soluzione temporanea, il comando :set syn=sh attiva l'evidenziazione della sintassi dello shell-script.

+2

ma la maggior parte degli script non ha un'estensione .sh? dovrei metterlo come estensione .sh solo per farlo funzionare? è la migliore pratica per nominare i tuoi script? e il suo bash ... quindi è ancora .sh? –

+1

@ajsie: Non sono sicuro di quali script stai usando, ma la maggior parte degli script 'bash' che ho incontrato hanno effettivamente un suffisso' .sh'. Per specificare realmente * bash * in opposizione a solo 'sh', dovresti usare la riga di shebang' #!/Bin/bash' su un file '.sh'. –

+1

scrivi semplicemente: set ft = sh e your good to go, OR, prefisso il tuo script con una modeline: "# vim: ft = sh" senza le virgolette ovviamente, E, suggerisco di ottenere qualcosa di meglio dell'opportunita sh filetype per script di bash perché non riconosce le cose correttamente, alcuni esempi sono sottostringhe $ {VAR: 1: 2}; & or ;; & <- modificatori di fine caso, e molte delle parole chiave specifiche di bash non sono riconosciute neanche. Certo, non ne trovi uno che è schifoso perché ci sono alcuni BAD ONES che circolano in giro lì fuori, ho usato un paio che era molto peggio del default di sh.vim. – osirisgothra

12

Vim può anche rilevare i tipi di file ispezionando il loro contenuto (come per esempio se la prima riga contiene uno shebang bash), qui è una citazione da filetype.txt file di aiuto:

Se il tipo di file può essere rilevata solo da ispezionare il contenuto del file

Creare la directory dell'utente runtime. Normalmente useresti il ​​primo elemento dell'opzione 'runtimepath'. Esempio per Unix:

:!mkdir ~/.vim 

Creare un file di script vim per fare ciò. Esempio:

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 

Vedere $ VIMRUNTIME/scripts.vim per altri esempi. Scrivi questo file come "scripts.vim" nella tua directory runtime utente. Ad esempio, per Unix:

:w ~/.vim/scripts.vim 

Il rilevamento funziona subito, senza bisogno di riavviare Vim.

Il tuo scripts.vim viene caricato prima dei controlli di default per i tipi di file, che significa che le tue regole sovrascrivono le regole predefinite in $ VIMRUNTIME/scripts.vim.

+1

Ho provato a inserire entrambi in .vimrc e .vim/scripts.vim, ma nessuno dei due ha funzionato. Funziona solo se digito manualmente i comandi dopo aver avviato vim. Che cosa sto facendo di sbagliato? – Eddy

+0

@Eddy Probabilmente hai bisogno di 'set modeline' in' ~/.vimrc', vedi [questa risposta] (http://superuser.com/q/323712/72223) – Tino

0

Vim riconosce già molti tipi di file per impostazione predefinita. Molti di questi funzionano con le estensioni dei file, ma in un caso come questo, vim analizzerà anche il contenuto del file per indovinare il tipo corretto.

vim imposta automaticamente il tipo di file per nomi di file specifici come .bashrc, .tcshrc, ecc. Ma un file con un'estensione .sh verrà riconosciuto come uno script csh, ksh o bash. Per determinare quale tipo di script è esattamente questo, vim legge la prima riga del file per vedere il #! linea.

Se la prima riga contiene la parola bash, il file viene identificato come uno script di bash. Di solito viene visualizzato #!/bin/bash se lo script deve essere eseguito direttamente, ma per un file di configurazione della shell utilizzando un semplice # bash funzionerà anche.

Se si desidera esaminare i dettagli, questo è implementato in $VIMRUNTIME/filetype.vim.

+0

Uhm, in realtà volevo postarlo da qualche altra parte. Ma immagino che la risposta sia adatta anche a questo :-) – raimue

21

Le risposte finora sono corrette che è possibile utilizzare l'estensione (come .sh) o una riga shebang (come #!/bin/bash) per identificare il tipo di file. Se non ne hai uno, puoi comunque specificare manualmente il tipo di file utilizzando un commento modeline nella parte superiore o inferiore del file.

Per esempio, se si vuole identificare uno script senza estensione come uno script di shell, è possibile aggiungere questo commento alla parte superiore del file:

# vim: set filetype=sh : 

o

# vim: filetype=sh 

Quello dirà a vim di trattare il file come uno script di shell. (Puoi anche impostare altre cose nella modeline. In vim type :help modeline per ulteriori informazioni.)

+0

È interessante notare che, nel mio ambiente, il ':' rende questa modeline funzionante, mentre senza la finale ':', questa modeline non si registra. La documentazione della guida mostra una forma di una modeline che non finisce in ':'. – orluke

+0

Questo è interessante. La documentazione di aiuto (con ': help modeline') dice due differenze: (1) La versione con il finale': '" è compatibile con alcune versioni di Vi "e (2) senza la finale': 'non si usa la parola chiave 'set'. Dato che è possibile inserire qualsiasi testo dopo la modeline, il finale ':' funziona con o senza la parola chiave 'set'. – bryant

+1

Se la modeline sembra non avere alcun effetto, prova 'set modeline' in' ~/.vimrc', vedi [questa risposta] (http://superuser.com/q/323712/72223) – Tino

-1

Quando crei un nuovo file, entra in gioco solo il rilevamento del nome del file; il rilevamento del contenuto (#!/bin/bash) non si applica se lo si digita dopo aver creato un nuovo buffer.

la cosa più sensata è quella di fare proprio :set ft=bash la prima volta intorno, e il tempo prossima di modificarlo, il #!/bin/bash imposterà automaticamente il tipo di file a destra.

+1

Al mio fianco, "ft = bash" deve leggere "ft = sh". Inoltre avevo bisogno di 'set modeline' in' ~/.vimrc' per farlo funzionare, vedere [questa risposta] (http://superuser.com/q/323712/72223) – Tino

0

Probabilmente il modo più semplice per ottenere l'evidenziazione della sintassi su un nuovo file, è quello di ricaricarlo dopo aver scritto la riga shebang. Un semplice :w:e scriverà il file, lo ricaricherà e interpreterà la riga di shebang appena scritta per fornire l'evidenziazione della sintassi appropriata.

5

vim può rilevare dal commento top

provare questa linea nella parte superiore del file

#!/bin/sh 
+0

Hai perso la directory root '/' tra ' !' e B'. – h9uest

10

evidenziazione della sintassi In realtà è una caratteristica di vim non vi. Provare a utilizzare il comando vim e quindi fare

:syntax on.

+1

Anche per me. Puoi aggiungere la linea "syntax on" al tuo file .vimrc. – teu

+1

Questa era la soluzione per me su Mac OS X 10.10.3. Aggiunto un file .vimrc alla mia directory home usando 'vim ~/.vimrc' e aggiungendo' syntax on' al file e poi chiudendo con ': x' – kungfujam

1

Una volta aggiunto lo shebang nella parte superiore del file, salvarlo e ricaricarla (ad esempio :w|e) e la colorazione della sintassi può calciare in.

Vedi anche Vim inconsistently syntax highlighting bash files, la risposta accettata può aiutare pure.

5

Sono giunto a questa risposta cercando specificamente come evidenziare la sintassi bash, non la shell POSIX. Semplicemente facendo un set ft=sh (o equivalente) si otterrà il file che viene evidenziato per la shell POSIX, che lascia molta sintassi valida in bash evidenziata in rosso. Per ottenere bash evidenziazione:

" 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 

Nota che se il tuo ft è già sh, è ancora necessario il comando set; altrimenti lo let non ha effetto immediato.

È possibile rendere questo un valore globale predefinito rendendo la variabile globale, ovvero let g:is_bash = 1.

:help ft-sh-syntax è la pagina di manuale che ho dovuto trovare; spiega questo, e come attivare l'evidenziazione di altri sapori di shell.

+0

Alcune versioni dell'evidenziatore' sh' synlax segnano anche il codice posix sh valido come non valido (ad es. '$ (subshell)') - questo corregge anche questo. Grazie. –

0

Se si conosce già il tipo di file prima di aprire lo script o se si sta creando un nuovo script senza estensione che è comune, si può passare alla vim sulla riga di comando in questo modo:

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