Vim запускает autocmd для всех типов файлов ЗА ИСКЛЮЧЕНИЕМ
У меня есть autocmd Vim, который удаляет конечные пробелы в файлах перед записью. Я хочу это почти в 100% случаев, но есть несколько типов файлов, которые я бы хотел отключить. Обычная мудрость заключается в перечислении типов файлов, которые вы хотите, чтобы autocmd выполнялся в списке, разделенном запятыми, например:
autocmd BufWritePre *.rb, *.js, *.pl
Но в этом случае это было бы обременительно.
Есть ли способ сопоставить шаблон autocmd со всеми файлами EXCEPT тех, которые соответствуют шаблону? Я не могу найти эквивалент НЕ-сопоставлению в документах.
Ответы
Ответ 1
*.rb
не является типом файла. Это шаблон файла. ruby
- это тип файла и может даже быть установлен на файлы, у которых нет расширения .rb
. Итак, что вы, скорее всего, хотите, это функция, которую ваш автозапуск вызывает для проверки типов файлов, на которые не следует воздействовать, и разделяет пробелы.
fun! StripTrailingWhitespace()
" Don't strip on these filetypes
if &ft =~ 'ruby\|javascript\|perl'
return
endif
%s/\s\+$//e
endfun
autocmd BufWritePre * call StripTrailingWhitespace()
Основываясь на ответе evan, вы можете проверить локальную переменную буфера и определить, следует ли использовать эту полосу. Это также позволит вам отключить одноразовую работу, если вы решили, что не хотите удалять буфер, который обычно выдает тип файла.
fun! StripTrailingWhitespace()
" Only strip if the b:noStripeWhitespace variable isn't set
if exists('b:noStripWhitespace')
return
endif
%s/\s\+$//e
endfun
autocmd BufWritePre * call StripTrailingWhitespace()
autocmd FileType ruby,javascript,perl let b:noStripWhitespace=1
Ответ 2
Другой выбор одного способа:
let blacklist = ['rb', 'js', 'pl']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like
Затем вы можете сделать что-то, что вам нравится, для всех типов файлов, кроме тех, что указаны в черном списке.
Может быть, вам будет полезно:)
Ответ 3
Самый простой способ - установить локальную переменную для одного типа файла в true. Затем задайте автокомпьютер, если эта переменная является ложной (если установлена для всего остального) или если она вообще существует (нет необходимости ее устанавливать).
autocmd BufWritePre *.foo let b:foo=true
if !exists("b:foo")
autocmd ...
endif
измененные префиксы переменных на основе комментариев