Подтвердить что ты не робот

Vim запускает autocmd для всех типов файлов ЗА ИСКЛЮЧЕНИЕМ

У меня есть autocmd Vim, который удаляет конечные пробелы в файлах перед записью. Я хочу это почти в 100% случаев, но есть несколько типов файлов, которые я бы хотел отключить. Обычная мудрость заключается в перечислении типов файлов, которые вы хотите, чтобы autocmd выполнялся в списке, разделенном запятыми, например:

autocmd BufWritePre *.rb, *.js, *.pl

Но в этом случае это было бы обременительно.

Есть ли способ сопоставить шаблон autocmd со всеми файлами EXCEPT тех, которые соответствуют шаблону? Я не могу найти эквивалент НЕ-сопоставлению в документах.

4b9b3361

Ответ 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

измененные префиксы переменных на основе комментариев