仅删除 vim 中的单个尾随空格

Remove only single trailing spaces in vim

保存 Markdown 文件时,我想删除行尾的单个尾随空格,trim将两个或多个尾随空格删除为两个。

我试过了

:%s/\([^\s]\)\s$//gc

但这仍然匹配两个尾随空格?修剪两个,但似乎有效:

:%s/\s\{2,}$/  /gc

我在这里错过了什么?谢谢!

里面[],所有的字符都是按字面意思来的。因此,您实际上是在说“除 \s 之外的任何字符”,全白 space 将匹配。您想要的是 \S(任何 non-white space 个字符)。

此外,您可以简化此操作。 Vim 有特殊的 zero-width 修饰符 \zs\ze 分别设置匹配的起点或终点。因此,您可以执行以下操作:

:%s/\S\zs\s$//gc

细分:

  • %s/{pattern}//gc - 用空字符串替换整个文件中每个出现的 {pattern},并确认
  • \S - 任意 non-whitespace 字符
  • \zs - 从这里开始比赛
  • \s - 任何白色space字符
  • $ - 行尾

查看以下 :help 个主题:

:h :s
    :h :s_flags

:h pattern-atoms
    :h /[]
    :h /\zs
    :h /\ze
    :h /$

例如,

%s/\s\+$/\=strlen(submatch(0)) >= 2 ? '  ' : ''/e

也就是说,捕获行尾的所有空格,如果匹配长度大于 2,则将其替换为两个空格。我认为非常简单。另见 :h sub-replace-expression