Pregunta

Tengo un archivo, llamado WrongFileTypeDetection.R, con el siguiente texto:

# This file is sometimes wrongly detected as a conf file

También tengo dos versiones de _vimrc, que yo habría pensado que ser absolutamente idénticos. Sin embargo, cuando se utiliza la primera versión, el archivo de arriba se detecta incorrectamente como un archivo "conf", a pesar de que le he pedido específicamente para todos los archivos que terminan en .R se establezca en filetype = r. Cuando cambio a la segunda versión (que se mueve "en la sintaxis" detrás de la definición augroup), detección vuelve a funcionar correctamente. Tenga en cuenta que este es el solamente configuración He (I alejado de mi vimrc estándar, mientras que la depuración de esto).

Primera versión:

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

Segunda versión:

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

Parece que vimrc es muy sensible al ordenamiento particular de los dos archivos. ¿Por qué sería, teniendo en cuenta que una de las líneas es un AutoCommand que se ejecutará mucho más tarde de todos modos? Es esto un error en Vim o se trata de una característica que simplemente no estoy entendiendo?

¿Fue útil?

Solución

La simple respuesta a su problema es que estas líneas no deben estar en su vimrc en absoluto. La manera con apoyo oficial de manejar esto es crear un archivo en el directorio de filetype.vim .vim que contiene lo siguiente:

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

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

En cuanto a por qué su código se comporta como lo hace, en realidad es un poco más complicada que la @ exceso de php respuesta implica.

En la primera versión de su vimrc, detección de tipo de archivo es inicializado por su línea syntax on. Esto funciona mediante la creación de un autocmd para disparar cuando se abre un archivo con la extensión .r, y esto autocmd llama a la función en s:FTr() filetype.vim.

Sin embargo, su línea autocmd! sobrescribe el existente autocmd 1 , por lo que la función s:FTr() nunca se queda 2 . Su autocmd luego se dispara, pero no Establecer el tipo de archivo, ya que el comando setfiletype piensa que el tipo de archivo que ya se ha establecido 3 .

A continuación, debido a que el tipo de archivo aún no está establecido de hecho, Vim intenta asignar uno basado en el contenido del archivo, y termina por asignar al tipo conf 4 .

La mejor referencia para todo esto es :help filetype. Y, específicamente, en su caso y :help new-filetype :help remove-filetype. El comando :verbose también es muy útil para averiguar qué ajustes se han establecido por lo que la escritura.

1: Debido a la !. Si se va a eliminar esta !, a continuación, se verá el tipo de archivo está configurado correctamente. Esta no es la solución correcta, sin embargo, porque entonces se le permitiendo que el archivo que se ajusta a un tipo (y aplicar todos los ajustes para ese tipo de archivo) y luego cambiar a otro. Si el segundo tipo de archivo no sobrescribe todos estos ajustes, algunos pueden permanecer, que podría no ser lo que quieres.

2: Trate :set autocmd BufRead *.r corriendo cuando está usando los dos archivos vimrc diferentes. Tenga en cuenta la diferencia en la salida dada.

3: Ver :help setfiletype. Tenga en cuenta que si cambia el setfiletype r línea en set ft=r en la primera versión de su vimrc, el tipo de archivo se establece en r. Sin embargo, véase la nota 1 de por qué esto no es la mejor solución.

4: ... en una línea de código que se comenta: "mira esto último, es sólo una suposición"

Otros consejos

En su primera versión, sintaxis de está provocando la detección filetype antes su AutoCommand se ha añadido.

De acuerdo con este sitio

  

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

Sólo tiene que añadir dos líneas de código en el archivo de .vimrc.

au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top