jer*_*nto 71 vim strip autocmd
我有一个Vim autocmd,可以在写入之前删除文件中的尾随空格.我几乎百分之百地想要这个,但是有一些我希望它禁用的文件类型.传统的做法是在逗号分隔列表中列出您希望autocmd运行的文件类型,例如:
autocmd BufWritePre *.rb, *.js, *.pl
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,这将是繁重的.
有没有办法将autocmd模式与所有文件匹配除了那些匹配模式的文件?我在文档中找不到相应的NOT匹配器.
jam*_*san 57
*.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()
Run Code Online (Sandbox Code Playgroud)
基于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
Run Code Online (Sandbox Code Playgroud)
小智 51
一种方式的另一种选择:
let blacklist = ['rb', 'js', 'pl']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like
Run Code Online (Sandbox Code Playgroud)
然后你可以为所有文件类型做一些你喜欢的事情,除了黑名单中的那些.
eva*_*van 12
最简单的方法是将一个文件类型的局部变量设置为true.然后设置automcommand如果该变量为false(如果为其他所有设置)或者它是否存在(无需预设).
autocmd BufWritePre *.foo let b:foo=true
if !exists("b:foo")
autocmd ...
endif
Run Code Online (Sandbox Code Playgroud)
根据评论更改了变量前缀
Ste*_*vez 10
您可以对同一个正则表达式执行 except 操作:
autocmd BufWritePre *\(.out\|.diffs\)\@<! <your_command>
Run Code Online (Sandbox Code Playgroud)
这适用于除或 之外<your_command>
的所有文件扩展名。.out
.diffs