Vim запускає autocmd на всіх типах файлів, окрім


81

У мене є Vim autocmd, який видаляє пробіли у файлах перед записом. Я хочу це майже 100% часу, але є кілька типів файлів, які я хотів би відключити. Звичайна мудрість полягає в тому, щоб перерахувати типи файлів, для яких потрібно запускати autocmd, у списку, розділеному комами, наприклад:

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

Але в цьому випадку це буде обтяжливо.

Чи є спосіб зіставити шаблон autocmd з усіма файлами, окрім тих, що відповідають шаблону? Я не можу знайти еквівалент збігу НЕ в документах.

Відповіді:


66

*.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

1
Правильно, я сподівався на зразок, який виключав би певні розширення файлів, і, безумовно, неправильно використовував терміни в моєму описі. Поки я сподівався на однокласник, загортання логіки у функцію і виклик її не надто пошарпаний. Дякую!
jerodsanto

Якщо ви хочете, щоб ваша конфігурація vim була більш модульною, ви можете додати налаштування let b:noStripWhitespaceдо файлів у розділі плагіна типу файлів. Fx, щоб вимкнути завершення видалення пробілів для комітів git, додайте рядок до ~/.vim/ftplugin/gitcommit.vim.
flyingdutchman

58

Інший вибір однолінійного шляху:

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

Тоді ви можете зробити щось, що вам подобається, для всіх типів файлів, крім тих, що в чорному списку.


15

Найпростішим способом було б встановити для локальної змінної для одного типу файлу значення true. Потім встановіть автоматичну команду, якщо ця змінна хибна (якщо встановлена ​​для всього іншого) або якщо вона існує взагалі (не потрібно її попередньо встановлювати).

autocmd BufWritePre *.foo let b:foo=true

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

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


1

Це працює для Syntaxавтокоманд, де шаблон ( <match>) - це лише тип файлу. Він виключає будь-які rstфайли:

au Syntax *\(^rst\)\@<! …

1

Наш конфігураційний файл .vimrc запускається лише один раз під час запуску. Отже, якщо ви зараз поставите тест if, він не буде працювати, оскільки в даний час жоден файл python не редагується.

Але ви можете використовувати .vimrc для налаштування автоматичної поведінки: те, що vim робитиме кожного разу, коли зустріне особливу умову. Умовою може бути ваш випадок: "Редагується новий файл, а його тип файлу -" python "". Див .: h: au

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.