Очень странное поведение с синтаксисом Vim и определением типа файла

StackOverflow https://stackoverflow.com/questions/1291955

Вопрос

У меня есть файл с именем WrongFileTypeDetection.R, содержащий следующий текст:

# This file is sometimes wrongly detected as a conf file

У меня также есть две версии _vimrc, которые, как мне казалось, абсолютно идентичны.Однако, когда я использую первую версию, приведенный выше файл неправильно определяется как файл "conf", хотя я специально попросил, чтобы для всех файлов, заканчивающихся на .R, было установлено значение filetype=r .Когда я перехожу на вторую версию (перемещая "синтаксис" за определение augroup), обнаружение снова работает корректно.Обратите внимание, что это Только конфигурация у меня есть (я убрал свой стандартный vimrc во время отладки этого).

Первая версия:

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

Вторая версия:

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

Похоже, что vimrc очень чувствителен к конкретному порядку расположения двух файлов.С чего бы это, учитывая, что одна из строк является автоматической командой, которая в любом случае будет запущена намного позже?Это ошибка в Vim или это функция, которую я просто не понимаю?

Это было полезно?

Решение

Простой ответ на вашу проблему заключается в том, что этих строк вообще не должно быть в вашем vimrc.Официально поддерживаемый способ справиться с этим - создать filetype.vim файл в вашем .vim каталог , содержащий следующее:

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

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

Что касается того, почему ваш код ведет себя так, как он есть, то на самом деле это немного сложнее, чем @слишком много ответов php подразумевает.

В первой версии вашего vimrc, определение типа файла инициализируется вашим syntax on линия.Это работает путем настройки autocmd на запуск, когда файл с .r расширение открыто, и этот autocmd вызывает функцию s:FTr() в файле filetype.vim.

Однако ваш autocmd! строка перезаписывает этот существующий autocmd1, так что s:FTr() функция никогда не запускается2.Затем срабатывает ваш autocmd, но это не делает установите тип файла, потому что setfiletype команда считает, что тип файла уже задан3.

Затем, поскольку тип файла все еще фактически не задан, Vim пытается назначить его на основе содержимого файла и в конечном итоге присваивает его conf Тип4.

Лучшим справочником для всего этого является :help filetype.И конкретно в вашем случае :help new-filetype и :help remove-filetype.Тот Самый :verbose команда также очень удобна для определения, какие настройки были установлены каким скриптом.

1:Из-за !.Если бы вы удалили это !, тогда вы обнаружите, что тип файла задан правильно.Однако это неправильное решение, потому что тогда вы разрешите присвоить файлу один тип (и примените все настройки для этого типа файла), а затем измените его на другой.Если второй тип файла не перезапишет все эти настройки, некоторые из них могут остаться, что может быть не тем, что вы хотите.

2:Попробуй бежать :set autocmd BufRead *.r когда вы используете два разных файла vimrc.Обратите внимание на разницу в приведенных выходных данных.

3:Видишь :help setfiletype.Обратите внимание, что если вы измените строку setfiletype r в set ft=r в первой версии вашего vimrc тип файла будет должно быть установлено значение r.Однако смотрите сноску 1 о том, почему это не лучшее решение.

4:...в строке кода , которая закомментирована:"проверь это напоследок, это просто предположение".

Другие советы

В вашей первой версии синтаксис включен запускает определение типа файла до ваша автокоманда добавлена.

По данным этого сайта

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

Вам просто нужно добавить две строки кода в файл .vimrc.

au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top