Vim запускает autocmd для всех типов файлов, КРОМЕ - PullRequest
68 голосов
/ 27 июня 2011

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

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

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

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

Ответы [ 3 ]

57 голосов
/ 27 июня 2011

*.rb не является типом файла.Это шаблон файла.ruby является типом файла и может быть задан для файлов, которые не имеют расширения .rb.Итак, вам, скорее всего, нужна функция, которую ваш autocmd вызывает как для проверки типов файлов, на которые не следует воздействовать, так и для удаления пробелов.

fun! StripTrailingWhitespace()
    " Don't strip on these filetypes
    if &ft =~ 'ruby\|javascript\|perl'
        return
    endif
    %s/\s\+$//e
endfun

autocmd BufWritePre * call StripTrailingWhitespace()

Основываясь на ответе Эвана, вы можетепроверьте локальную переменную буфера и определите, следует ли использовать полосу с ее использованием.Это также позволит вам сделать одноразовое отключение, если вы решили, что не хотите удалять буфер, тип файла которого вы обычно удаляете.

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
50 голосов
/ 02 мая 2012

Другой вариант однострочного пути:

let blacklist = ['rb', 'js', 'pl']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like

Затем вы можете делать что-то, что вам нравится, для всех типов файлов, кроме тех, которые находятся в черном списке.

12 голосов
/ 27 июня 2011

Самый простой способ - установить локальную переменную для одного типа файла в true. Затем установите автокоманду, если эта переменная равна false (если она установлена ​​для всего остального) или если она вообще существует (нет необходимости предварительно устанавливать ее).

autocmd BufWritePre *.foo let b:foo=true

if !exists("b:foo")
    autocmd ...
endif

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

...