我有一个Vim autocmd,在写入文件之前会删除文件中的尾随空格。我希望这个功能几乎在所有情况下都使用,但是有一些文件类型我想要禁用它。传统做法是在以逗号分隔的列表中列出您想要自动命令运行的文件类型,例如:
autocmd BufWritePre *.rb, *.js, *.pl
但在这种情况下,这将是繁琐的。
有没有一种方法可以将自动命令模式与除匹配该模式的文件之外的所有文件进行匹配?我在文档中找不到相当于NOT匹配器的等效项。
*.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()
在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
另外一种一行代码的选择:
let blacklist = ['rb', 'js', 'pl']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like | endif
然后你可以对除黑名单中的文件类型外的所有文件类型进行喜欢的操作。
| endif
。 - Pillager225autocmd BufWritePre *.foo let b:foo=true
if !exists("b:foo")
autocmd ...
endif
根据评论更改变量前缀
您可以在相同的正则表达式上执行排除操作:
autocmd BufWritePre *\(.out\|.diffs\)\@<! <your_command>
这将对除了.out
和.diffs
文件扩展名之外的所有文件扩展名运行<your_command>
命令。
这适用于“Syntax
”自动命令,其中模式(<match>
)只是文件类型。 它排除任何 rst
文件:
au Syntax *\(^rst\)\@<! …
let b:noStripWhitespace
。例如,要禁用git提交的尾随空格删除,请将该行添加到~/.vim/ftplugin/gitcommit.vim
文件中。 - flyingdutchman