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

Posted

技术标签:

【中文标题】让 Vim 将所有空格显示为一个字符【英文标题】:Make Vim show ALL white spaces as a character 【发布时间】:2010-12-13 03:20:17 【问题描述】:

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

【问题讨论】:

我也在努力解决这个问题。如果您遇到这种情况,请不要再做出涉及:set list 的回复。这并不能回答我们的问题。 (致其他人:mrucci 下面的回复很有帮助,虽然不是真正的解决方案。) 对于那些说listlistchars 可以看到空格的人,请考虑空格直接跟在制表符后面。在这种情况下,它几乎是看不见的。我同意你可以捕捉到大多数情况,但如果能适当地突出显示所有空间会很好。 对于新访问者:这已在较新版本的 vim 中得到解决!参见brettanomyces's answer below。 相关(但不同的堆栈):vi.stackexchange.com/questions/422/… 【参考方案1】:

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

:set list

结合

:set listchars=...

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

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

所以,现在,在你使用之后

:set list

所有没有明确显示为其他东西的东西,实际上都是一个普通的旧空白。

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

:help listchars

添加一个切换开关可能会有所帮助,这样您就可以在编辑过程中轻松查看更改(来源:VIM :set list! as a toggle in .vimrc):

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

【讨论】:

“所有未明确显示为其他内容的内容”?尝试 U+2000..U+200A 范围内的 unicode 空格。如果固定宽度字体支持它们,它们将显示为正常的 0x20 空间。 @ZyX - 我没有使用整个 Unicode,而是使用了一组相当常见的字符。如果您对答案不满意,请随时提出改进建议。 很棒的提示!我建议将 set listchars 行放到.vimrc 文件中,这样可以随时使用:set list 轻松启用这种显示不可见字符的漂亮方式(无需再次谷歌搜索此页面)。 @ckarbass 与在 vim 中切换任何内容的方式相同 - 添加 !到最后。所以它变成了:set list! 让我们再看看 ALL 部分。我正在搜索所有空格的可视化,而这里提到的所有内容仅适用于制表符和尾随空格。有人对显示所有空间有什么建议吗?【参考方案2】:

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

:set listchars+=space:␣

因此,要将 ALL 个空白字符显示为一个字符,您可以执行以下操作:

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

完成后,要隐藏不可见的字符,您可以:

:set nolist

邮件列表讨论:https://groups.google.com/forum/?fromgroups#!topic/vim_dev/pjmW6wOZW_Q

【讨论】:

这很酷,但我想知道为什么 eol 字符的颜色与其他字符不同。 我试过这个,一开始出错了。事实证明,在我使用的稍旧版本的 gvim 中,“空格”不是一个有效的选项。升级我的 gvim 解决了我的问题。对于遇到错误的其他人,请键入 :help listchars 以检查“空格”是否是“listchars”的有效选项。如果不是,请将您的 vim 升级到指定的补丁 @brettanomyces。或者,如果您不想看到空格,请将“空格”从 set 命令中删除。 效果很好。我唯一希望您可以将颜色设置为浅一点,这样空格字符就不会分散注意力。 我使用 Unicode 的中间点 (U+00B7) 作为空格字符 (space:·),因为它看起来像 MS Word、Notepad++ 等。 在 vim 中输入 &lt;C-K&gt;.M·。详情请见:h digraph【参考方案3】:

:set list 启用。

:set nolist 禁用。

【讨论】:

感谢您向我们展示如何在模式之间切换。你会认为其他高级答案会教这一点。 是的,这很有帮助。我希望这是最佳答案,因为我自己找到了这个答案,却发现它已经在网站上,只是看不见。 : set list! 更好:) @Skippr 通过什么衡量标准?按键次数相同,只是Shift! 都比no 更难键入。如果你把它放在你的 .vimrc 中,我同意感叹号更容易阅读。 @Dan 如果您希望在相对较短的时间内打开和关闭此功能,:set list! 将在您无需输入 nolist 的情况下完成此操作。 ! 只是与当前设置的相反。我一直都在使用它,尤其是在使用 :set paste! 时。我讨厌按箭头键来查找:set paste:set nopaste 哈哈【参考方案4】:

我认为这里的其他答案更全面,但我想我会分享一个我通常用来在视觉上区分制表符和空格的技巧:

:syntax on
:set syntax=whitespace

这些是Whitespace programming language 的语法高亮规则 - 选项卡以绿色显示,空格以红色显示。 :)

可以与许多其他答案提到的:set list 结合使用,尽管选项卡随后将显示为 ^I 而没有绿色突出显示,但空格将显示为红色。

【讨论】:

我喜欢这个,它很聪明,而且感觉比其他大多数答案都好。不过,这并不是一个始终可用的解决方案。 我更喜欢更传统的方法,但我会为此 +1 以提高创造力。 我知道语言会对某事有用。 你介意链接到你用来突出显示的 .vim 语法文件 @SeldomNeedy 你不需要下载任何东西,空格突出显示规则已经随 Vim 提供多年。它们本质上应该是内置的,除非您使用的是奇怪的或非常旧的 Vim 版本。【参考方案5】:

:set list 会将所有空格显示为一个字符。 除了空间的所有东西看起来都与其正常状态不同,这意味着如果您仍然看到一个普通的旧空间,它实际上是一个普通的旧空间。 :)

【讨论】:

使用:set nolist关闭此功能 如果你想看到空格字符怎么办,比如在 Sublime Text 2 中打开“显示空白”?我发现它真的很有帮助。 不是我来这里的目的,但非常有帮助。谢谢。 另外没有选项可以用!最后切换:set list! 我希望设置space 字符,您在设置listchars 时似乎使用space:•。我的看起来像这样:--- set showbreak=↪\ set listchars=tab:→\ ,eol:↲,nbsp:␣,trail:•,extends:⟩,precedes:⟨,space:•【参考方案6】:

如果你设置:

: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 中定义函数。

【讨论】:

嗯,这有点像 hack,但它比其他任何东西都更接近。赏金发放! :D【参考方案7】:

根据您对当前缓冲区的语法规则,这样的事情可能会起作用:

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

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

2014 年 10 月 24 日更新 对此进行一点扩展。当然可以为锥形字符定义一些突出显示。

您可以配置隐藏字符的外观。对于突出显示,您必须至少配置一次“隐藏”突出显示组(请参阅:h hl-Conceal 的帮助,这可以在您的颜色方案中完成,然后您不需要再次重新配置它。但这会影响所有隐藏的字符(例如,如果您的语法脚本隐藏了更多项目,它们将显示为您的空白字符)。可能如下所示:

:hi Conceal ctermfg=7 ctermbg=NONE guifg=LightGrey guibg=NONE

如果语法脚本使用skipwhite 关键字,Vim 似乎不会突出显示空格。没有办法了(也许这会解决,我发了patch)

似乎有一个补丁浮动,可以自定义空间在list 模式下的外观。撰写本文时最新的似乎是this one。 (这意味着,您需要构建自己的 Vim 才能使用它)。 conceallevelconcealcursor 是窗口本地选项。这意味着它们在不同的窗口中可能不同(也可能由文件类型插件或其他插件脚本设置)。 每当重新加载语法定义文件时,都需要执行语法高亮组。这可以使用BufWinEnterSyntax 甚至FileType 自动命令来完成。 (我还没有测试过哪个真正有效)。

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

2014 年 10 月 26 日更新我为这个问题做了一个plugin。

2015 年 4 月 22 日更新 Vim 中包含一个补丁,可以使用 list 选项实现这一点。只需设置set list listchars+=space:␣ 这适用于Vim 7.4.711

【讨论】:

这很好用!如何将其添加到.vimrc 由于这适用于当前缓冲区,您可能需要将其包装到自动命令中。 BufEnter 甚至语法自动命令可能对你有用: Æ 是一个奇怪的字符选择,为什么不· 这其实是正确的答案。关于如何为这个字符添加正确的语法突出显示的任何想法?如果它很褪色,我会更喜欢它· @ChristianBrabandt,你有一堆尾随 nrrwrgn 相关的文件污染了你的 repo。【参考方案8】:

我用这个

/\s
:set hlsearch

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

【讨论】:

最简单的解决方案恕我直言。与清除搜索的命令完美搭配(我使用nnoremap &lt;leader&gt;&lt;space&gt; :noh&lt;cr&gt;【参考方案9】:

如果您所说的空格是指 ' ' 字符,我的建议只是搜索/替换。正如其他人所暗示的那样,set list非打印 字符更改为在listchars 中配置的可见字符。

要将空格显式显示为其他字符,类似于下面的内容应该可以解决问题:

:%s/ /█/g

然后只需撤消更改即可再次返回。

(为了得到 █ 我按下了这个确切的键序列::%s/ /CTRL-KFB/g )

【讨论】:

我比其他答案更喜欢这个,这对我来说就像 :set list 的逆,将可见字符('空格')更改为 _non priting_(??) 之一。我想知道是否可以在比赛中使用这个,例如:match MyBlackBlockChar "appropriate_regex 应该可以解决问题,不是吗? 其他答案很有用,但这是第一个真正回答OP的问题+1 :%s/\s/█/g 表示所有空格。此外,:set hlsearch 加上 :&amp;s/\s//gn 可能有用。【参考方案10】:

要突出显示空格,只需搜索即可:

/

注意事项:

表示只需键入空格字符。 使用 :set hlsearch 启用高亮搜索结果

突出显示空格和制表符: /[]

删除突出显示的快速方法是搜索其他内容: /asdf

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

【讨论】:

这与 3 年前发布的答案相同。此外, :noh 比 /asdf 更快地取消突出显示文本。或者您甚至可以将 f1 设置为 :noh,因为您可能会经常使用它。 @DrEval 假设您指的是Benedikt Köppel's answer,它实际上与/&lt;space&gt;/\s 略有不同。我认为在这里使用该建议并不明显且更快。【参考方案11】:

以下代码基于 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 语法组中的某些内容会阻止显示中间点。我不知道(还没有?)如何使该解决方案更可靠。

【讨论】:

这就是我所说的“取决于语法组”我怀疑这是 syn 关键字与 skipwhite 标志相结合的问题。 @ChristianBrabandt,是的,除了让它“自动”之外,我无法超越你已经做过的事情。 是的,是语法规则中的skipwhite 参数阻止了语法组匹配(尽管它应该被允许包含在所有组中)。 有什么方法可以让Indent Guides很好地工作,它会为缩进添加背景?我怀疑这是一个不覆盖背景颜色的问题,但这似乎很重要。 如何在不需要突出显示空白时禁用相同?寻找一种短切换命令。【参考方案12】:

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

我的解决方案是显示制表符并在多个空格下划线。它借用了mrucci's answer 和this tutorial。因为它使用语法高亮,所以它是持久的:

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 /  \+/

使用它,标签显示为|,空格显示为_,这让我在混合代码样式时很容易分辨。

我发现的唯一缺点是这个 sn-p 不会调整背景颜色以匹配上下文(就像在评论中一样)。

【讨论】:

【参考方案13】:

上面的所有答案都试图使空格在 vim 中可见。如果你真的坚持将可见空间作为点,还有另一种方法......

如果不能在 vim 中完成,请完全更改字体。我复制了 Ubuntu One Mono 字体并使用 FontForge 对其进行了编辑。请记住更改字体的全名、系列、首选系列、兼容完整(在 FontFoge 中,它位于字体信息中的 TTF 名称下),以便将其作为单独的字体。 只需编辑空格字符以在中间添加一个点并将字体保存到 ~/.fonts 现在您可以将它用于您的 gvim 或整个终端... 我复制了“!”字符,删除线并将点移到中间。花了5分钟多一点...

注意:更改空格字符 (0x20) 会导致在整个 vim 屏幕上出现点的不便...(但它会将空格与制表符分开...)

【讨论】:

这听起来像是一个非常好的方法,直到我阅读了关于用点填充整个屏幕的说明。 :// 创意加分! :-)【参考方案14】:

我没有从现有答案中找到我真正想要的东西。下面的代码将突出显示所有尾随空格亮红色。只需将以下内容添加到您的.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()

【讨论】:

【参考方案15】:

覆盖 Unicode 空白字符:

set list
set listchars=tab:│\ ,nbsp:·
highlight StrangeWhitespace guibg=Red ctermbg=Red
" The list is from https://***.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) 看起来像“│ ”(两个字符:一个长管道,然后是一个序数空格;它们在 colorscheme murphy 中是灰色的) 正常的不间断空格 (U+00A0) 看起来像“·”(一个字符;在colorscheme murphy 中为灰色) 任何其他空白字符看起来像红色“

【讨论】:

已编辑添加“ctermbg=Red”以使我的终端可以进行着色。我个人使用set listchars=tab:»\ ,space:· 供您参考。 @JohnnyWong 感谢您的更新。它最初被审阅者拒绝,但我检查了代码,它(不出所料)适用于 gvimvim 绝妙的答案,这正是我需要捕获在 Safari 和 Firefox 中无法呈现的狭窄不间断空间 (Hex 202f)。 完美解决方案。然而,我用Brown 替换了Red,因为红色在很多地方已经被大量使用(而且我已经用它来显示尾随空格)。【参考方案16】:
:match CursorLine /\s\+/

避免了“您必须搜索空格才能显示它们”位,但不能将 afaict 配置为对空格执行非突出显示的操作。 CursorLine 可以是任何高亮组,并且在默认主题中它是一个简单的下划线。

【讨论】:

我无法使用这种方法区分制表符和空格,这太糟糕了,但我喜欢它是单行的。【参考方案17】:

我喜欢用特殊字符来显示空白,更清楚。即使是要切换的地图也是一项关键功能,以便快速检查。

您可以在自 2004 年以来未更新的旧 vim 脚本中找到此功能:

vim-scripts/cream-showinvisibles@vim.org

感谢项目vim-scripts 和vundle,您可以让这个插件重获新生

vim-scripts/cream-showinvisibles@github

更好的是,我的两分钱是添加一个configurable shortcut(而不是预定义的F4

所以把它添加到 ~/.vimrc

Plugin 'albfan/cream-invisibles'

let g:creamInvisibleShortCut = "<F5>" "for my F4 goto next error

在 vim 上安装插件

:PluginInstall

你去吧

【讨论】:

【参考方案18】:

你可以使用

:set list

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

【讨论】:

【参考方案19】:

突出显示搜索

:set hlsearch 

.vimrc

并搜索空格制表符和回车

/ \|\t\|\r

或搜索所有空白字符

/\s

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

/\S

显示所有尾随空白字符 - 在行尾

/\s$

【讨论】:

【参考方案20】:

将those hacks 保存在.vimrc 中作为cmets,所以在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

【讨论】:

【参考方案21】:
:se list
:se nolist

:se 足够了,:set 不需要。

【讨论】:

【参考方案22】:

您还可以突出显示空格(用块替换空格):

:%s/ /█/g

(在写撤消之前)

【讨论】:

【参考方案23】:

将它添加到我的 .vimrc 对我有用。只要确保你没有任何其他冲突..

autocmd VimEnter * :syn match space /\s/
autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black

【讨论】:

以上是关于让 Vim 将所有空格显示为一个字符的主要内容,如果未能解决你的问题,请参考以下文章

Vim可以显示两个缩进空格,同时在文件中保留四个空格吗?

Vim使用技巧:将Tab转换为4个空格

在vim中用空格替换制表符

怎么让HTML显示纯文本

把记事本里所有的空格替换为换行怎么弄的?

从 SQL Server 中的字符串中删除所有空格