2013-03-01 1 views
1

Как получить текущий тип файла в vimscript, скажем в .vimrc или обычный скрипт плагина? Линияvim: как получить filetype в скрипте плагина

echo &filetype 

возвращает пустую строку.

+0

Покажите нам, где вы его используете. В '.vimrc', буферы еще не загружены, поэтому он пуст. –

+0

Мне это нужно в '.vim/bundles/vim-autoformat/plugin/autoformat.vim'. –

+0

В то время как sourcing (то же, что и с '.vimrc', это слишком рано) или внутри функции/mapping/command ?! –

ответ

2

Вам необходимо учитывать сроки вашего плагина. Когда ваш скрипт подключен во время запуска Vim, буфер еще не загружен, поэтому &filetype пуст. Поэтому, что-то вроде этого

let s:formatprgvarname = "g:formatprg_".&filetype 

делает не работу! (Для типа файла плагин~/.vim/ftplugin/), это разные, те, получены только тогда, когда Filetype было обнаружено Но, как я понимаю, вы хотите плагин общего назначения, который учитывает текущий тип файла.).

Вместо , удалите скрипт-локальную переменную s:formatprgvarname и разрешите &filetypeв точке действия; т.е. когда запускается функция автоматического форматирования (путем сопоставления или пользовательской команды). Если у вас нет такого триггера, вы можете подключить в FileType события и установить (предпочтительно буфер-местный) переменный, то:

autocmd FileType * let b:formatprgvarname = "g:formatprg_".&filetype 
+0

Возникает ли событие FileType при переключении на буфер с другим типом файла? –

+1

Нет, только когда он изначально обнаружен. –

2

В функции:

let current_filetype = &filetype 

В командной строке:

:echo &filetype 

&filetype пуст, когда нет Filetype (очевидно). Если вы попытаетесь использовать его, когда буфер не загружен, вы просто ничего не получите.

редактировать

&filetype только полезно, когда вам необходимо знать текущий тип файла в функции, выполняемой во время выполнения при редактировании буфера.

&filetype установлен только тогда, когда определено, что буфер имеет некоторый тип файла. Когда он выполняется, скрипт (vimrc, ftplugin, whatever) не проходит через то, что он будет делать, когда он редактируется: no filetype check, no &filetype.

Примером может служить функция, отображающая текущий файл в другом внешнем приложении в зависимости от его типа файла. Использование &filetype в любом другом контексте не имеет смысла, потому что оно будет пустым.

+0

' & filetype', кажется, пуст в pluginscript для всех типов файлов, таких как vim и python. (Тем не менее, in-vim running ': echo & filetype' дает правильный тип файла.) –

+0

' & filetype' работает во время выполнения, а не в вашем скрипте. Вы используете '& filetype' в функции, которая выполняется во время выполнения. – romainl

+0

@ Chiel92, см. Мое редактирование. – romainl