Автокоманды для Matlab в vim? - PullRequest
5 голосов
/ 05 марта 2010

Я использую несколько разных языков программирования каждый день, и я хотел бы иметь разные ширины табуляции (в пробелах) для каждого.Например: я использую «стандартные» 2 пробела для Ruby, но весь наш существующий код Matlab использует 4 пробела.

У меня есть это из моих личных ~/.vimrc:

augroup lang_perl
    au!
    set tabstop=4 " tabstop length N in spaces
    set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
    set expandtab " Use spaces instead of tabs
augroup END

augroup lang_ruby
    au!
    set tabstop=2 " tabstop length N in spaces
    set shiftwidth=2 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
    set expandtab " Use spaces instead of tabs
augroup END

Этиработает, но следующее не работает:

augroup lang_matlab
    au!
    set tabstop=4 " tabstop length N in spaces
    set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
    set expandtab " Use spaces instead of tabs
augroup END

Я действительно не понимаю, как augroup lang_ruby выясняет, что я редактирую файл Ruby.(Мои поиски вывели ftdetect, но решение не было очевидным.) Не похоже, что vim знает, что я редактирую Matlab, используя augroup lang_matlab.Что я могу изменить, чтобы сделать эту работу?

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Если вы хотите иметь большое количество настроек для {filetype}, вы должны поместить их в ~/.vim/ftplugin/{filetype}.vim или в файл, который соответствует ~/.vim/ftplugin/{filetype}/**/*.vim (примеры: ~/.vim/ftplugin/ruby/foo.vim, ~/.vim/ftplugin/ruby/foo/bar.vim). В этом случае вам не нужны никакие автокоманды. Если вы все еще хотите использовать автокоманды, используйте следующее:

augroup lang_matlab
    autocmd!
    autocmd FileType matlab      setlocal ts=4 sw=4 et
augroup END

. Обратите внимание на две вещи: событие FileType (оно есть и оно не BufRead, BufNewFile) и setlocal вместо простого set. Первый предназначен для использования с настройками типов файлов, второй - как должны быть установлены параметры буфера.

О том, почему настройки perl и ruby ​​работают и почему настройки matlab не работают: ваш пример кода такой же, как

augroup lang_perl
    autocmd!
augroup END
augroup lang_ruby
    autocmd!
augroup END

set tabstop=4 " tabstop length N in spaces
set shiftwidth=4 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
set expandtab " Use spaces instead of tabs

set tabstop=2 " tabstop length N in spaces
set shiftwidth=2 " make >> and friends (<<, ^T, ^D) shift N, not the default 8
set expandtab " Use spaces instead of tabs

Итак, вы фактически установили ts=2 sw=2 et. Но $VIMRUNTIME/ftplugin/perl.vim содержит следующий код:

setlocal  tabstop=4
setlocal  shiftwidth=4

так, ts=4 sw=4 для perl устанавливается в ftplugin/perl.vim, не в вашем vimrc (если вы установили плагин поддержки perl). Вы можете проверить это, заменив tabstop=4 на tabstop=8 в vimrc.

0 голосов
/ 12 января 2011

Используйте ftplugins, настройка vim будет намного проще. См. gVim и несколько языков программирования

0 голосов
/ 12 января 2011

Я не могу сказать вам, как определяется, что lang_perl или lang_ruby должны быть прочитаны. Но при просмотре документации по автокоманде возникает пример для сжатых файлов (:he gzip-example):

augroup gzip
  autocmd!
  autocmd BufReadPre,FileReadPre       *.gz set bin
  autocmd BufReadPost,FileReadPost     *.gz '[,']!gunzip
  autocmd BufReadPost,FileReadPost     *.gz set nobin
  autocmd BufReadPost,FileReadPost     *.gz execute ":doautocmd BufReadPost " . expand("%:r")
  autocmd BufWritePost,FileWritePost   *.gz !mv <afile> <afile>:r
  autocmd BufWritePost,FileWritePost   *.gz !gzip <afile>:r
  autocmd FileAppendPre                *.gz !gunzip <afile>
  autocmd FileAppendPre                *.gz !mv <afile>:r <afile>
  autocmd FileAppendPost               *.gz !mv <afile> <afile>:r
  autocmd FileAppendPost               *.gz !gzip <afile>:r
augroup END

Видишь? Каждое autocmd, которое получает указанное, несет Событие (BufReadPre, FileReadPre) и расширение, для которого оно должно быть выполнено (*.gz). Это подкрепляет мое до сих пор мнение, что вы можете использовать любое имя для augroup, но вам нужно указать расширение, за которое augroup будет отвечать, чтобы заставить его работать правильно.

Другая цитата из :he autocmd-groups:

Обычно при автоматическом выполнении автокоманд Vim использует автокоманды для всех групп. Группа имеет значение только при выполнении автокоманд с ": doautocmd" или ": doautoall", или при определении или удалении автокоманд.

Итак, чтобы сделать augroup для файлов Matlab, нужно сделать следующее:

augroup lang_matlab
  autocmd!
  autocmd BufRead       *.m set ts=4 sw=4 expandtab
augroup END

И убедитесь, что эти настройки не перезаписываются никакими augroup с, которые делают что-то безусловное (то есть изменяют также другие определения augroup).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...