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


当前回答

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

: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开始工作

其他回答

如果设置:

:highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none

然后搜索空格,每个空格字符将显示为下划线字符。

您可以在切换空格“下划线”的便捷函数中使用此命令。

set hls
let g:HLSpace = 1
let g:HLColorScheme = g:colors_name
function ToggleSpaceUnderscoring()
    if g:HLSpace
        highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none
        let @/ = " "
    else
        highlight clear
        silent colorscheme "".g:HLColorScheme
        let @/ = ""
    endif
    let g:HLSpace = !g:HLSpace
endfunction

将功能映射到快捷键,快捷键包括:

nmap <silent> <F3> <Esc>:call ToggleSpaceUnderscoring()<CR>

注意:设置配色方案后,在vimrc中定义函数。

我对这个问题的所有其他答案都感到沮丧,因为没有一个答案能以有用的方式突出空间特征。将空格显示为字符对于空格格式的语言特别有用,因为混合制表符和空格是有害的。

我的解决方案是显示制表符并在多个空格下加下划线。它借鉴了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 /  \+/

使用此选项,制表符显示为|,空格显示为_,这使得在混合代码样式时很容易分辨。

我发现的唯一缺点是,这段代码没有调整背景颜色以匹配上下文(如注释中)。

从补丁7.4.710开始,您现在可以使用listchars设置一个字符来代替空格!

:set listchars+=space:␣

因此,要将所有空白字符显示为字符,可以执行以下操作:

:set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:␣
:set list

完成后,要隐藏不可见的字符,请执行以下操作:

:set nolist

关于邮件列表的讨论:https://groups.google.com/forum/?fromgroups#!主题/vim_dev/pjmW6wOZW_Q

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

: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开始工作

我用这个

/\s
:set hlsearch

以突出显示空白。它搜索所有空白,然后启用高亮显示,使其突出显示。但是,它不打印特殊字符。