我找不到一种方法来让Vim将所有空格显示为一个字符。我找到的只是制表符、尾随空格等。


当前回答

要覆盖Unicode空白字符:

set list
set listchars=tab:│\ ,nbsp:·
highlight StrangeWhitespace guibg=Red ctermbg=Red
" The list is from https://stackoverflow.com/a/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中为灰色)。任何其他空白字符看起来都像红色空格(“”)。

其他回答

根据当前缓冲区的语法规则,类似以下内容可能有效:

:syn match WhiteSpace / / containedin=ALL conceal cchar=Æ
:setl conceallevel=2 concealcursor=nv

这需要一个带有+隐藏功能的vim 7.3

2014年10月24日更新在这一点上稍微扩展一下。当然,可以为锥形字符定义一些突出显示。

您可以配置隐藏字符的外观。对于突出显示,您必须至少配置一次“隐藏”突出显示组(请参阅:h hl Conceal上的帮助)。这可以在您的配色方案中完成,然后您不需要再次重新配置它。但这会影响所有隐藏的字符(例如,如果您的语法脚本隐藏了更多项目,它们将显示为空白字符)。可能是这样的::hi Conceal ctermbg=7 ctermbg=无guidg=浅灰色guidg=无如果语法脚本使用skipwhite关键字,Vim似乎不会突出显示空格。没有办法(也许这会被修复,我发布了一个补丁)似乎有一个补丁在浮动,它将允许自定义空间在列表模式下的外观。在撰写本文时,最近的一篇似乎是这篇。(这意味着,您需要构建自己的Vim来使用它)。conceallevel和conceacursor是窗口本地选项。这意味着它们可以在不同的窗口中不同(也可能由文件类型插件或其他插件脚本设置)。每当重新加载语法定义文件时,都需要执行语法高亮显示组。这可以使用BufWinEnteror完成,也可以使用Syntax或甚至FileType自动命令。(我还没有测试哪一个有效)。

最后两项意味着,您必须设置一些自动命令来重置语法规则和相应的条件选项。对于第一个,可能需要使用ColorScheme自动命令设置高亮显示(这样隐藏的字符看起来总是一样的,而与实际设置的颜色方案无关)。要获得一个完整的解决方案,请查看罗马的答案,这将为您提供一个开始。如果你设置了一个功能,你可以很容易地设置一个切换命令来打开或关闭特殊高亮显示。

更新10/26/2014我做了一个插件来解决这个问题。

更新2015年4月22日Vim中包含了一个补丁,可以使用列表选项实现这一点。只需设置集合列表listchars+=space:␣ 从Vim 7.4.711开始工作

要突出显示空间,只需搜索:

/<空间>

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

突出显示空格和制表符:/[<space><tab>]

删除高光的快速方法是搜索其他任何内容:/美国国防部

(只需键入任意随机字符的短列表)

正如其他人所说,您可以使用

:set list

这将与

:set listchars=...

显示不可见字符。现在,没有一个显式选项可以用来显示空白,但在listchars中,您可以设置一个字符来显示除空白以外的所有内容。例如,我的看起来像这样

:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<

所以,现在,在你使用

:set list

所有没有明确显示为其他内容的内容实际上都是一个普通的空白。

像往常一样,要了解listchars的工作原理,请使用帮助。它提供了关于可以显示哪些字符(例如尾随空格)以及如何显示的详细信息:

:help listchars

给它添加一个切换可能会很有帮助,这样您可以在编辑过程中轻松看到更改(来源:VIM:set list!作为.virc中的切换):

noremap <F5> :set list!<CR>
inoremap <F5> <C-o>:set list!<CR>
cnoremap <F5> <C-c>:set list!<CR>

下面的代码基于Christian Brabandt的答案,似乎可以按照OP的要求执行:

function! Whitespace()
    if !exists('b:ws')
        highlight Conceal ctermbg=NONE ctermfg=240 cterm=NONE guibg=NONE guifg=#585858 gui=NONE
        highlight link Whitespace Conceal
        let b:ws = 1
    endif

    syntax clear Whitespace
    syntax match Whitespace / / containedin=ALL conceal cchar=·
    setlocal conceallevel=2 concealcursor=c
endfunction

augroup Whitespace
    autocmd!
    autocmd BufEnter,WinEnter * call Whitespace()
augroup END

将这些行添加到~/.vimrc并开始新的Vim会话,以查看仍然不完美的魔术发生。

随意编辑默认颜色和隐藏字符。


注意:几种语言中*FuncBody语法组中的某些内容会阻止显示中间点。我还不知道如何使该解决方案更可靠。

将这些黑客作为注释保存在.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