如何在vim中自动删除尾部空格

Pau*_*den 192 vim whitespace automation removing-whitespace

我试图在git中提交一些文件时出现"尾随空白"错误.

我想在保存python文件之前自动删除这些尾随的空白字符.

你能配置vim来做到这一点吗?如果是这样,怎么样?

Pau*_*den 202

我在这里找到了答案.

将以下内容添加到我的.vimrc文件中就可以了.

autocmd BufWritePre *.py :%s/\s\+$//e
Run Code Online (Sandbox Code Playgroud)

  • 这会更改每次保存时的光标位置.有可能避免吗? (15认同)
  • 由于这是这个问题的事实上的答案,可能应该更新以保持光标位置. (3认同)
  • 也许你可以明确表示最后的`e`意味着,如果我们没有找到模式,vi不认为替换命令是失败的 (3认同)
  • 这也将删除多行字符串中的尾随空格,在某些情况下可能不需要.但我想有没有简单的方法来避免这种情况? (2认同)

ste*_*heg 166

编译以上加上保存光标位置:

fun! <SID>StripTrailingWhitespaces()
    let l = line(".")
    let c = col(".")
    %s/\s\+$//e
    call cursor(l, c)
endfun

autocmd FileType c,cpp,java,php,ruby,python autocmd BufWritePre <buffer> :call <SID>StripTrailingWhitespaces()
Run Code Online (Sandbox Code Playgroud)

如果要将此保存应用于任何文件,请忽略第二个autocmd并使用通配符*:

autocmd BufWritePre * :call <SID>StripTrailingWhitespaces()
Run Code Online (Sandbox Code Playgroud)

  • @xApple:内部函数,保存和恢复上次搜索不是必需的 - 离开函数上下文将负责这一点. (8认同)
  • 您还可以通过保存上次搜索并恢复它来改善您的功能.让_s = @ /让@/= _ s (7认同)
  • 我删除了``autocmd FileType c,cpp,java,php,ruby,python``部分,使其适用于所有文件. (3认同)
  • @ swt83如果你想让它在所有文件上工作,你还需要用`*`替换`<buffer>` (3认同)
  • 如果你用替换命令w /`keepp`作为前缀,它将不会改变你的搜索历史,即`keepp%s /\s\+ $ // e` (2认同)

mat*_*mat 68

我通常也有一个:

match Todo /\s\+$/
Run Code Online (Sandbox Code Playgroud)

在我的.vimrc文件中,以便行尾空格为高亮显示.

Todo是一个语法hilighting 组名,用于hilighting关键字,如TODO,FIXMEXXX.它有一种令人讨厌的淡黄色背景颜色,我发现它是你在代码中想要的东西最好的东西:-)

  • 或者你可以设置列表并设置listchars + = trail:. (6认同)
  • 不幸的是,我最喜欢的配色方案zenburn并不突出 (2认同)

Mic*_*ant 51

我都突出显示现有的尾随空格,并剥离尾随空格.

我配置我的编辑器(vim)以显示最后的空白区域,例如

在此输入图像描述

在我的.vimrc的底部:

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()
Run Code Online (Sandbox Code Playgroud)

并且我在保存它们时从文件中自动删除它,在我的情况下*.rb用于ruby文件,再次在我的〜/ .vimrc中

function! TrimWhiteSpace()
    %s/\s\+$//e
endfunction
autocmd BufWritePre     *.rb :call TrimWhiteSpace()
Run Code Online (Sandbox Code Playgroud)


syv*_*vex 13

这是一种通过多个FileType进行过滤的方法.

autocmd FileType c,cpp,python,ruby,java autocmd BufWritePre <buffer> :%s/\s\+$//e
Run Code Online (Sandbox Code Playgroud)


laz*_*tem 7

复制并粘贴自http://blog.kamil.dworakowski.name/2009/09/unobtrusive-highlighting-of-trailing.html(该链接不再有效,但您需要的位于下方)

"这样做的好处是不会突出显示您在行尾输入的每个空格,只有当您打开文件或退出插入模式时才会这样.非常整洁."

highlight ExtraWhitespace ctermbg=red guibg=red
au ColorScheme * highlight ExtraWhitespace guibg=red
au BufEnter * match ExtraWhitespace /\s\+$/
au InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
au InsertLeave * match ExtraWhiteSpace /\s\+$/
Run Code Online (Sandbox Code Playgroud)


Die*_*iao 6

我在VIM Wikia的评论中看到了这个解决方案 - 删除不需要的空格

我真的很喜欢它..在不需要的空白处添加一个.

在此输入图像描述

把它放在你的 .vimrc

" Removes trailing spaces
function TrimWhiteSpace()
  %s/\s*$//
  ''
endfunction

set list listchars=trail:.,extends:>
autocmd FileWritePre * call TrimWhiteSpace()
autocmd FileAppendPre * call TrimWhiteSpace()
autocmd FilterWritePre * call TrimWhiteSpace()
autocmd BufWritePre * call TrimWhiteSpace()
Run Code Online (Sandbox Code Playgroud)


gre*_*egf 5

这就是我的做法.我不记得从哪里偷了它.

autocmd BufWritePre * :call <SID>StripWhite()
fun! <SID>StripWhite()
    %s/[ \t]\+$//ge
    %s!^\( \+\)\t!\=StrRepeat("\t", 1 + strlen(submatch(1)) / 8)!ge
endfun
Run Code Online (Sandbox Code Playgroud)

  • 除非您在vim中写入二进制文件,否则这可能永远不会成为问题. (4认同)
  • 嗯,如果你最终打开二进制文件,那么在“*”上这样做是非常危险的,它们最终可能会变得非常糟糕。 (2认同)