禁用 vim 中特定的 autocmd 项目

Disable autocmd project specific in vim

我已给出配置以删除 vim

中的尾随空格
  au BufWritePre *.rb :%s/\s\+$//e
  au BufWritePre *.html :%s/\s\+$//e
  au BufWritePre *.js :%s/\s\+$//e
  au BufWritePre *.jsx :%s/\s\+$//e
  au BufWritePre *.json :%s/\s\+$//e

问题

我有一个项目,多个开发人员在其中工作,而且它很大。我不想通过删除此项目中现有的尾随空格来引起很多冲突。

预期

我只想为该特定项目禁用此配置。假设我的项目在 ~/work/projectA.

首先,您可以使用一个自动命令完成所有这些操作:

au BufWritePre *.{rb,html,js,jsx,json} %s/\s\+$//e

其次,你应该把它放在一个合适的里面 "augroup":

augroup TrailingSpaces
    autocmd!
    autocmd BufWritePre *.{rb,html,js,jsx,json} %s/\s\+$//e
augroup END

第三,您可以使用另一个(可能有点笨手笨脚的)自动命令为该特定项目禁用该组:

augroup SpecialProject
    autocmd!
    autocmd BufNewFile,BufRead ~/work/projectA/**/* autocmd! TrailingSpaces
augroup END

第四,在 :%s/\s\+$//e 之后失去光标位置并不好玩。如果我是你,我会做这样的事情:

augroup TrailingSpaces
    autocmd!
    autocmd BufWritePre *.{rb,html,js,jsx,json} let w:wv = winsaveview() | %s/\s\+$//e | call winrestview(w:wv)
augroup END

参见 :help winsaveview()

您还可以修复映射以检查配置变量。然后可以在 local vimrcs, or in an .editorconfig file with the a hook I've implemented in lh-vim-lib 中设置该变量,甚至可以使用自动命令(我不推荐)

例如,我的自动命令(针对 vim)执行 function that tests whether b:vim_maintain.remove_trailing, p:vim_maintain.remove_trailingg:vim_maintain.remove_trailing 在执行替换之前设置为 1。

function! lh#vim#maintain#_save_pre_hook() abort
  let pos = getpos('.')
  let cleanup = lh#on#exit()
        \.register('call setpos(".", '.string(pos).')')
  try
    if lh#option#get('vim_maintain.remove_trailing', 1)
      :silent! %s/\s\+$//
    endif
    if s:must_update_time_stamp()
      ......
     endif
  finally
    call cleanup.finalize()
  endtry
endfunction

说到编辑器配置,更简单地说,它有一个选项来决定是否删除尾随空格。这对于您与其他人共享的项目非常有用,但是,您必须修补所有个人项目才能添加 .editorconfig 文件。

我认为最好的配置方法是使用 https://github.com/editorconfig/editorconfig-vim

全局配置

添加全局~/.editorconfig以设置全局编辑器配置

[*]
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false

项目特定配置

~/work/projectA/.editorconfig

[*]
trim_trailing_whitespace = true

没有破坏任何东西。并从 .vimrc

中删除 trim trailing whitespace 代码
  " au BufWritePre *.rb :%s/\s\+$//e
  " au BufWritePre *.html :%s/\s\+$//e
  " au BufWritePre *.js :%s/\s\+$//e
  " au BufWritePre *.jsx :%s/\s\+$//e
  " au BufWritePre *.json :%s/\s\+$//e

配置列表:http://editorconfig.org/

只是把另一个插件解决方案扔进戒指:

我的 DeleteTrailingWhitespace plugin 提供了一个可靠的解决方案(没有提到的更改视图、破坏搜索模式等问题)。 (插件页面有指向其他插件的链接。)

可以通过 b:DeleteTrailingWhitespace 标志为某些缓冲区关闭我的插件。您可以使用其他答案提供的 :autocmd 为该特定项目创建一个例外,或者(如果您想将例外本地化到项目本身,以便它在文件系统移动甚至版本控制克隆中幸存下来)使用 local vimrc 插件(例如 localrc plugin (especially with my own enhancements),它甚至允许本地特定文件类型的配置)。这样,您可以将 :let b:DeleteTrailingWhitespace = 0 命令放入该项目根目录中的 .lvimrc 中,仅此而已。