2013-04-15 2 views
1

В ответ на this question на суперпользователя, я написал небольшую vimscript, которое будет детектировать тип файла символической ссылки и изменить подсветку синтаксиса:Как настроить .vimrc свой собственный тип файла?

а.е. BufNewFile, BufRead * если & синтаксис == «» | молчать! execute (': set filetype ='. matchstr (resolve (@%), '. [^.] * $') [1:]) | endif

Так что, если я открою символическую ссылку без расширения, она рассмотрит расширение файла, на который указывает.

Это работает, но непреднамеренным последствием является то, что теперь подсветка синтаксиса моего файла .vimrc исчезла. По умолчанию мой .vimrc-файл имеет подсветку синтаксиса vim (:echo &syntax возвращает vim).

Но когда я добавляю вышеприведенную строку, :echo &syntax возвращает vimrc (недопустимый тип).

Я не знаю, почему это происходит. Должно ли &syntax=='' оценить значение false, и, таким образом, сохранить &syntax==vim? Я подозреваю, что мой код выполняется до выделения синтаксиса vim. Но как (и когда) точно подсветка синтаксиса установлена ​​на vim для .vimrc? Кроме того, как я могу заставить свой скрипт вести себя так, как должен?

ответ

1

Ознакомиться с областью исполнения Vim для filetype.vim. Вы можете привести его в Vim с:

:e $VIMRUNTIME/filetype.vim 

В моей версии, похоже, эта линия делает трюк:

" Vim script 
au BufNewFile,BufRead *vimrc*   call s:StarSetf('vim') 

Может быть, вы хотите, чтобы положить ваши autocmd в ~/.vim/after/filetype.vim. Я считаю, что это приведет к его регистрации после системных, а затем &syntax должен быть настроен правильно.

+1

Я просто отвечал на ваш вопрос - как установить файл .vimrc's filetype. Если это не ваш вопрос, возможно, вы должны отредактировать его или изменить его. Я подозреваю, что ваш autocmd работает первым, так что да, синтаксис равен нулю. – jszakmeister

+0

Ах, извините, я неправильно понял - это отвечает на первую часть моего вопроса. – Jeff

+0

Я обновил свой ответ. Я думаю, вам нужно поместить ваш autocmd в '~/.vim/after/filetype.vim', поэтому он будет вызван после тех, что во время выполнения Vim. – jszakmeister

0

Когда текущий файл ~/.vimrc, эта часть кода

matchstr(resolve(@%),'.[^.]*$') 

возвращает имя файла: .vimrc.

Я понятия не имею, как вы могли себе представить, что /home/username/.vimrc произведет vim.

Это довольно плохой подход к проблеме, которую вы пытались решить, но нет ошибки: вы получаете именно то, о чем просите. Использование имени файла/расширения для типа файлов не может работать надежно (js против javascript, py против python ...).

Возможно, вам понадобится список имени файла/файла или много if/elseif, если вы хотите, чтобы ваш код выполнял то, что вы хотите.

См. :h syntax-loading.

+0

Я думаю, что вы неправильно поняли мой вопрос. * Без * этой строки в моем .vimrc, '& syntax == vim'. Итак, когда я * добавляю * эту строку в мой .vimrc, почему синтаксис изменяется на 'vimrc'? Должен ли 'if & syntax == ''' оценивать значение nil с '& syntax == vim'? – Jeff

+1

@Jeff, он изменяется на 'vimrc', потому что вы говорите ему об этом. Ответ на ваш вопрос в ': h syntax-loading' (этот указатель в моем ответе):' синтаксис' установлен на 'BufReadPost', но ваш автокоманду запускается до, на' BufRead'. В этот момент синтаксис не задан. – romainl

1

jszakmeister's answer точно диагностирует проблему: filetype.vim устанавливает тип файла для vimrc.

Альтернативное решение, хотя, чтобы сохранить все, содержащиеся в в файле .vimrc, заключается в использовании:

а.е. BufNewFile, BufReadPre * если & синтаксис == '' | молчать! execute (': set filetype ='. matchstr (resolve (@%), '. [^.] * $') [1:]) | ENDIF

Обратите внимание на переход от BufRead к BufReadPre. Изменение заставляет эту строку выполнять до filetype.vim. Синтаксис будет изменен на vimrc, но затем будет изменен на vim. Результатом является то, что скрипт работает так, как должен, но подсветка синтаксиса для vimrc сохраняется.

Смежные вопросы