让 Vim 将所有空格都显示为字符

892

我找不到一种方法使Vim将所有的空格都显示为字符。 我发现的都是关于制表符、尾随空格等的。


17
我也在试图解决这个问题。如果您遇到这个问题,请不要再提及 :set list 的响应。那并没有回答我们的问题。(对于其他人来说,下面的 mrucci 的回答是有帮助的,但不算是真正的“解决方案”)。 - ELLIOTTCABLE
2
对于那些说空格可以通过listlistchars看到的人,请考虑一下空格直接跟在制表符后面的情况。在这种情况下,它几乎是看不见的。我同意你可以捕捉到大多数情况,但如果能正确突出显示所有空格就更好了。 - Kevin Cox
12
对于新访客:这在新版本的vim中已经解决了!请查看brettanomyces在下面的答案 - ELLIOTTCABLE
1
相关(但是不同的堆栈):http://vi.stackexchange.com/questions/422/displaying-tabs-as-characters - AncientSwordRage
23个回答

16

想要在文本中突出显示空格,只需搜索它:

/<space>

注意:

  • <space> 表示只需键入空格字符。
  • 启用搜索结果的突出显示 :set hlsearch

    想要同时突出显示空格和制表符:

    /[<space><tab>]

    快速取消高亮的方法是搜索其他内容: /asdf

    (只需输入任意短的随机字符序列即可)


  • 1
    这与3年前发布的答案相同。同时,:noh 比 /asdf 更快地取消高亮显示文本。或者你甚至可以将 f1 设置为 :noh,因为你可能经常使用它。 - user146043
    假设您指的是Benedikt Köppel的答案,实际上有微妙的不同,即/<space>/\s。我认为这并不明显,使用此处的建议更快。 - icc97

    11

    我没有从现有答案中找到完全符合我要求的。下面的代码将使所有的尾随空格显示为亮红色。只需将以下内容添加到你的.vimrc文件中即可:

    highlight ExtraWhitespace ctermbg=red guibg=red
    match ExtraWhitespace /\s\+$/
    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()
    

    11
    我对这个问题的所有其他答案感到失望,因为它们都没有以有用的方式突出空格字符。将空格显示为字符特别有助于使用空格格式化的语言,其中混合制表符和空格是有害的。
    我的解决方案是显示制表符并加下划线多个空格。它借鉴了mrucci的答案这个教程。因为它使用语法高亮,所以它是持久的:
    set list listchars=tab:\|\ 
    highlight Whitespace cterm=underline gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    autocmd ColorScheme * highlight Whitespace gui=underline ctermbg=NONE guibg=NONE ctermfg=yellow guifg=yellow
    match Whitespace /  \+/
    

    使用此功能,制表符显示为|,空格显示为_,这使得混合代码样式很容易被发现。唯一的缺点是此片段不会调整背景颜色以匹配上下文(例如注释中的情况)。

    11
    为了涵盖Unicode空格字符:
    set list
    set listchars=tab:│\ ,nbsp:·
    highlight StrangeWhitespace guibg=Red ctermbg=Red
    " The list is from https://dev59.com/KVoU5IYBdhLWcg3wAjrV#37903645 (with `\t`, `\n`, ` `, `\xa0` removed):
    call matchadd('StrangeWhitespace', '[\x0b\x0c\r\x1c\x1d\x1e\x1f\x85\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]')
    

    结果:
    • 只有序号空格(U+0020)看起来像序号空格(" ")。
    • 制表符(U+0009)看起来像 ""(两个字符:一个长管道,然后是一个序数空格;在颜色方案murphy中是灰色的)。
    • 不间断空格(U+00A0)看起来像 "·"(一个字符;在颜色方案murphy中是灰色的)。
    • 任何其他的空格字符看起来都像红色空格(" ")。

    3
    编辑后添加了"ctermbg=Red",使我的终端可以进行着色。个人使用set listchars=tab:»\ ,space:·供您参考。 - Johnny Wong
    1
    @JohnnyWong 感谢您的更新。最初被审阅者拒绝了,但我已经检查了代码,它(毫不意外地)适用于 gvimvim - Kirill Bulygin
    2
    太棒了,这正是我所需要的,可以捕捉在Safari和Firefox中未呈现的窄非间隔空格(十六进制202f)。 - Chris Kobrzak
    完美的解决方案。然而,我将“红色”替换为“棕色”,因为在许多地方已经广泛使用了红色(而且我已经用它来显示尾随空格)。 - 7heo.tk

    9
    以上所有的回答都试图从vim内部使空格可见。如果你坚持要将可见空格表示为点,还有另外一种方法......如果在vim中无法实现,请改变您的字体。我复制了Ubuntu One Mono字体并使用FontForge进行编辑。记得改变字体的全名、家族、首选家族、兼容完整(在FontFoge中,它在字体信息中的TTF名称下),以便将其作为单独的字体。简单地将空格字符编辑为中间带有一个点,并将字体保存到~/.fonts。现在你可以用它来打开gvim或整个终端...我复制了"!"字符,去掉了线,并将点移到中间。这花了超过5分钟的时间......注意:更改空格字符(0x20)导致在整个vim屏幕上出现点的不便...(但它会将空格与制表符分开...)

    2
    这听起来是一个非常好的方法,直到我读到关于用点填满整个屏幕的注释。 :/ - friederbluemle
    3
    创意分数加油! :-) - jpaugh

    5

    我喜欢使用特殊字符来显示空格,这样更清晰。即使是一个切换地图的键也是一个重要功能,可以快速检查。

    您可以在一款旧版vim脚本中找到此功能,但该脚本已经自2004年以来没有更新:

    vim-scripts/cream-showinvisibles@vim.org

    感谢项目vim-scriptsvundle,您可以重新使用此插件

    vim-scripts/cream-showinvisibles@GitHub

    更好的方法是添加一个可配置的快捷键(而不是预定义的F4),因此请将以下内容添加到~/.vimrc

    Plugin 'albfan/cream-invisibles'
    
    let g:creamInvisibleShortCut = "<F5>" "for my F4 goto next error
    

    在vim上安装插件

    :PluginInstall
    

    然后你就完成了


    5

    这些技巧 作为注释保存在 .vimrc 文件中,这样在 shell 中只需:

    echo '
      " how-to see the non-visible while spaces
      " :set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
      " set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
      " :set list
      " but hei how-to unset the visible tabs ?!
      " :set nolist
      ' >> ~/.vimrc
    

    5
    您可以使用:
    :set list
    

    要真正看到一行的结构,您将明确看到制表符和换行符。当您看到一个空白时,它确实是一个空白。


    5
    :match CursorLine /\s\+/
    

    避免了“您必须搜索空格才能使它们显示”的问题,但据我所知,无法配置为对空格执行非高亮显示操作。CursorLine可以是任何高亮显示组,在默认主题中,它是一个普通的下划线。

    我无法使用这种方法区分制表符和空格,这太糟糕了,但我喜欢它只需要一行代码。 - Rustavore

    4
    高亮搜索
    :set hlsearch 
    

    .vimrc文件中查找空格、制表符和换行符。

    并进行搜索。

    / \|\t\|\r
    

    或者搜索所有的空白字符

    /\s
    

    搜索所有非空格字符(空格字符未显示,因此您可以看到单词之间的空格字符,但看不到尾随的空格字符)。
    /\S
    

    展示所有行尾的空格字符。
    /\s$
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接