Переопределить vim autocmd для Makefiles

#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 и использовать те же типы событий для другого вашего правила (возможно, не самое чистое решение).