Domanda

Ho un file, chiamato WrongFileTypeDetection.R, contenente il testo seguente:

# This file is sometimes wrongly detected as a conf file

Ho anche due versioni di _vimrc, che avrei pensato di essere assolutamente identici. Tuttavia, quando uso la prima versione, il file di cui sopra viene rilevato in modo non corretto in un file "conf", anche se ho chiesto specificamente per tutti i file che terminano con .R essere impostato su filetype = r. Quando cambio alla seconda versione (in movimento "sintassi" dietro la definizione augroup), rilevamento funziona correttamente di nuovo. Si noti che questo è il solo di configurazione che ho (ho allontanato il mio vimrc standard, mentre il debug questo).

Prima versione:

syntax on
augroup filetypedetect
    autocmd! BufRead,BufNewFile *.r,*.R     setfiletype r
augroup END

Seconda versione:

augroup filetypedetect
    autocmd! BufRead,BufNewFile *.r,*.R     setfiletype r
augroup END
syntax on

Sembra che vimrc è molto sensibile al particolare ordinamento dei due file. Perché questo sarebbe, se si considera che una delle linee è un autocomando che verrà eseguito molto più tardi in ogni caso? Si tratta di un bug in Vim o si tratta di una caratteristica che sto solo non capire?

È stato utile?

Soluzione

La semplice risposta al vostro problema è che queste linee non dovrebbero essere nel vostro vimrc a tutti. Il modo più ufficialmente supportato per gestire questa situazione è creare un file nella directory filetype.vim .vim contenente quanto segue:

" my filetype file
if exists("did_load_filetypes")
  finish
endif

augroup filetypedetect
  au! BufRead,BufNewFile *.r setfiletype r
augroup END

Per quanto riguarda il motivo per cui il codice si comporta come lo fa, in realtà è un po 'più complicato di @ risposta troppo di php implica.

Nella prima versione del vimrc, il rilevamento del tipo di file viene inizializzata dal vostra linea syntax on. Questo funziona attraverso la creazione di un autocmd a fuoco quando si apre un file con estensione .r, e questo autocmd chiama la funzione s:FTr() in filetype.vim.

Tuttavia, la vostra linea autocmd! sovrascrive questo esistente autocmd 1 , in modo che la funzione di s:FTr() mai eseguito 2 . Il tuo autocmd poi gli incendi, ma non impostare il tipo di file, perché il comando setfiletype pensa che il tipo di file è già stato impostato 3 .

Quindi, poiché il tipo di file non è ancora attualmente impostato, Vim tenta di assegnare uno basato sul contenuto del file, e finisce per assegnare al tipo conf 4 .

Il miglior riferimento per tutto questo è :help filetype. E in particolare nel tuo caso :help new-filetype e :help remove-filetype. Il comando :verbose è anche molto utile per capire quali impostazioni sono state impostate da quello script.

1: A causa della !. Se si dovesse rimuovere questo !, allora si dovrebbe trovare il tipo di file viene impostato correttamente. Questa non è la soluzione corretta, però, perché allora si sarà consente al file da essere impostato su un tipo (e applicare tutte le impostazioni per questo tipo di file) e poi cambiare a un altro. Se il secondo tipo di file non sovrascrive tutte queste impostazioni, alcuni possono rimanere, che potrebbe non essere ciò che si desidera.

2: Prova :set autocmd BufRead *.r esecuzione quando si utilizzano i due file vimrc differenti. Si noti la differenza nell'output data.

3: Vedere :help setfiletype. Si noti che se si modifica la setfiletype r linea nel set ft=r nella prima versione del vostro vimrc, il tipo di file si essere impostato a r. Tuttavia, vedi nota 1 per il motivo per cui questa non è la soluzione migliore.

4: ... in una riga di codice che viene commentato: "check quest'ultima, è solo indovinare"

Altri suggerimenti

Nella prima versione, sintassi on è innescando l'individuazione del tipo di file prima il tuo autocomando è stato aggiunto.

Secondo questo sito

  

http://www.build-doctor.com/2008/06/04/how-to-set-the-filetype-in-vim-when-the-extension-doesnt-match/

Hai solo bisogno di aggiungere due righe di codice nel file .vimrc.

au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top