在vim中禁用特定于项目的autocmd

在vim中禁用特定于项目的autocmd,vim,macvim,Vim,Macvim,我已经给出了在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 问题 我有一个项目,其中有多个开发人员在工作,这是一个大项目。我不想通过删除此项目中现有的尾随空

我已经给出了在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 SpecialProject
    autocmd!
    autocmd BufNewFile,BufRead ~/work/projectA/**/* autocmd! TrailingSpaces
augroup END
其次,你应该把它放在一个适当的“augroup”中:

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

au BufWritePre *.{rb,html,js,jsx,json} %s/\s\+$//e
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()

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

au BufWritePre *.{rb,html,js,jsx,json} %s/\s\+$//e
augroup SpecialProject
    autocmd!
    autocmd BufNewFile,BufRead ~/work/projectA/**/* autocmd! TrailingSpaces
augroup END
其次,你应该把它放在一个适当的“augroup”中:

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

au BufWritePre *.{rb,html,js,jsx,json} %s/\s\+$//e
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()

您还可以修复映射以检查配置变量。然后,可以在
.editorconfig
文件中使用a设置该变量,甚至可以使用自动命令(我不建议这样做)

对于intance,我的自动命令(对于vim)执行一个测试,该测试在执行替换之前是将
b:vim\u maintenant.remove\u training
还是
g:vim\u maintenant.remove\u training
设置为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
文件。

您还可以修复映射以检查配置变量。然后,可以在
.editorconfig
文件中使用a设置该变量,甚至可以使用自动命令(我不建议这样做)

对于intance,我的自动命令(对于vim)执行一个测试,该测试在执行替换之前是将
b:vim\u maintenant.remove\u training
还是
g:vim\u maintenant.remove\u training
设置为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
文件。

我认为最好的配置方法是使用

全局配置

添加全局
~/.editorconfig
以设置全局editorconfig

[*]
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
项目特定配置

~/work/projectA/.editorconfig

[*]
trim_trailing_whitespace = true
没有破坏任何东西。并从
.vimrc

  " 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

对于配置列表:

我认为最好的配置方法是使用

全局配置

添加全局
~/.editorconfig
以设置全局editorconfig

[*]
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
项目特定配置

~/work/projectA/.editorconfig

[*]
trim_trailing_whitespace = true
没有破坏任何东西。并从
.vimrc

  " 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
对于配置列表:

只需将另一个插件解决方案扔到环中即可:

My提供了一个健壮的解决方案(不存在上述更改视图、破坏搜索模式等问题)。(插件页面有指向其他插件的链接。)

我的插件可以通过
b:DeleteTrailingWhitespace
标志关闭某些缓冲区。您可以使用其他答案提供的
:autocmd
为该特定项目创建异常,或者(如果您希望将异常本地化到项目本身,以便在文件系统移动或版本控制克隆后仍然存在)使用本地vimrc插件(例如(尤其是使用),它甚至允许本地文件类型特定的配置)。有了它,您可以将
:让b:DeleteTrailingWhitespace=0
命令放入该项目根目录中的
.lvimrc
,就是这样。

只需将另一个插件解决方案放入环中:

My提供了一个健壮的解决方案(不存在上述更改视图、破坏搜索模式等问题)。(插件页面有指向其他插件的链接。)


我的插件可以通过
b:DeleteTrailingWhitespace
标志关闭某些缓冲区。您可以使用其他答案提供的
:autocmd
为该特定项目创建异常,或者(如果您希望将异常本地化到项目本身,以便在文件系统移动或版本控制克隆后仍然存在)使用本地vimrc插件(例如(尤其是使用),它甚至允许本地文件类型特定的配置)。有了它,您可以将
:let b:DeleteTrailingWhitespace=0
命令放入该项目根目录中的
.lvimrc
,就是它。

正是我要搜索的。我试着使用augroup,但它不起作用。查看您的代码时,我发现缺少递归目录
/***
。非常感谢,如果打开
projectA
中的文件,这不是会清除
TrailingSpaces
组吗?从而停止
TrailingSpaces
projectA
文件之后的非
projectA
目录中工作。可以改为设置一个缓冲区局部变量,如
let b:no_strip=1
,然后向
TrailingSpaces
autocmd添加一个条件。e、 如果!得到(b:,“不”