#vim
#vim
Вопрос:
Класс, который я беру, требует, чтобы код отправлялся с двумя пробелами вместо символов табуляции. У меня есть autocmd в .vimrc
, чтобы использовать вкладки длиной в два пробела только в каталоге, используемом для назначений в этом классе.
autocmd BufNewFile,BufRead ~/path/to/dir/* set tabstop=2 shiftwidth=2 expandtab
Однако я не хочу, чтобы Makefiles в каталоге использовали expandtab
опцию, поскольку для make требуются символы табуляции.
Для этого я создал другой autocmd в .vimrc
:
autocmd FileType make setlocal noexpandtab
Однако, хотя первый autocmd работает отлично, второй не переопределит первый и expandtab
будет продолжать устанавливаться даже для Makefiles или файлов типа make. Это происходит независимо от порядка в конфигурации.
Одно несколько хакерское решение, которое я нашел для работы, заключается в использовании
autocmd FileType make autocmd!
который отключает все другие autocmd для файла. Однако это приведет к отключению всех других autocmd для Makefiles, что нежелательно.
Есть ли какой-либо другой способ присвоить второй команде приоритет над первой или каким-либо образом отключить expandtab
опцию в Makefiles?
Ответ №1:
Белый список, как правило, намного проще, чем черный:
augroup class
autocmd!
autocmd BufNewFile,BufRead ~/path/to/dir/*.{foo,bar,baz} set tabstop=2 shiftwidth=2 expandtab
augroup END
Ответ №2:
Если вы поместите конфигурацию в ~/.vim/filetype.vim
вместо ~/.vimrc
, это может уже сработать, потому что тогда ваша пользовательская настройка выполняется перед встроенной ftplugin/Makefile
(которая сбрасывает настройки отступа на что-то разумное):
augroup filetypedetect
autocmd BufNewFile,BufRead ~/path/to/dir/* set tabstop=2 shiftwidth=2 expandtab
augroup END
Если это не сработает, я бы добавил условие к :autocmd
вместо определения нейтрализующего второго :autocmd
:
autocmd BufNewFile,BufRead ~/path/to/dir/* if amp;filetype !=# 'make' | set tabstop=2 shiftwidth=2 expandtab | endif
Ответ №3:
Проблема с использованием одного autocmd для FileType
, а другого для BufNewFile,BufRead
событий заключается в том, что тип события определяет порядок, в котором выполняются autocmd, хотя этот порядок не очень четко определен.
Я решил использовать одни и те же типы событий для обоих autocmd. Таким образом, порядок, в котором они указаны, соответствует порядку их запуска (как указано в документах vim, хотя и без упоминания предостережения о типе события):
set noexpandtab
au BufRead,BufNewFile,BufEnter /some/path/* set expandtab
" Not using FileType since that seems to run before BufRead,BufNewFile,BufEnter
au BufRead,BufNewFile,BufEnter *.go set noexpandtab
Определение типа файла для makefiles, вероятно, определено где-то в терминах autocmds с такими типами событий, как BufRead,BufNewFile,BufEnter
, поэтому, возможно, вы можете скопировать эти правила в свои .vimrc
и использовать те же типы событий для другого вашего правила (возможно, не самое чистое решение).