使Vim显示所有空格作为字符


771

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


14
我也正试图解决这个问题。请,如果您遇到此问题,请不要再做出涉及的回复:set list。那没有回答我们的问题。(对于其他人:mrucci的以下回答很有帮助,尽管不是真正的解决方案。)
ELLIOTTCABLE

1
对于所有说空格可见的人,listlistchars认为空格直接在制表符之后。在这种情况下,它几乎是看不见的。我同意您可以捕获大多数情况,但如果可以适当地突出显示所有空间,那将是一个不错的选择。
凯文·考克斯

11
对于新访客:这在新版本的vim中已解决!请参阅下面的brettanomyces答案
ELLIOTTCABLE

1
相关(但不同的堆栈):vi.stackexchange.com/questions/422/…–
Pureferret

Answers:


693

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

:set list

结合

:set listchars=...

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

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

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

:set list

那么,所有没有明确显示为其他内容的东西,实际上都是纯空白。

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

:help listchars

向其中添加切换可能会有所帮助,以便您可以轻松地在编辑过程中查看更改(来源:VIM:set list!作为.vimrc中的切换):

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

4
“没有明确显示为其他内容的所有内容”?试用范围为U + 2000..U + 200A的unicode空间。如果固定宽度字体支持它们,它们将以正常的0x20空格显示。
ZyX 2011年

2
@ZyX-我没有使用整个Unicode,而是使用了相当普遍的一组字符。如果您对答案不满意,请随时提出改进建议。
Rook

20
@ckarbass-:set invlist
Rook

大提示!我建议将set listchars行放置到.vimrc文件中,以便可以随时轻松启用这种显示不可见字符的漂亮方法:set list(无需再次浏览该页面)。
Melebius

8
@ckarbass用同样的方式在vim中切换任何东西-添加一个!到最后。因此,它成为:set列表!

274

7.4.710补丁开始,您现在可以使用listchars设置要显示在空间位置的字符!

:set listchars+=space:␣

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

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

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


2
这很酷,但是我想知道为什么eol角色的颜色不会像其他字符那样有所不同。
CMCDragonkai '16

3
我试过了,一开始遇到错误。原来,在我使用的gvim的较早版本中,“ space”不是有效的选项。升级我的gvim解决了我的问题。对于其他错误,请键入:help listchars以检查“ space”是否是“ listchars”的有效选项。如果不是,请将您的vim升级到指定的补丁@brettanomyces。或者,如果您不希望看到空格,也可以在set命令中保留“空格”。
Niko Bellic

4
我使用Unicode的中间点(U + 00B7)作为空格字符(space:·),因为它看起来像MS Word,Notepad ++等
。– Dinei

1
@ user5359531尝试<ctrl-v> u2334输入Unicode打开框字符(␣)。有关更多详细信息,请参见sanctum.geek.nz/arabesque/special-characters-in-vim
Brett Y

3
键入<C-K>.M在vim的·。有关:h digraph详细信息,请参见。
johnchen902 '18

252

:set list 启用。

:set nolist 禁用。


11
感谢您向我们展示如何在模式之间切换。您会认为其他高级答案也可以教您。
乔纳森·科玛

1
是的,这很有帮助。我希望它是最好的答案,因为我自己找到了这个答案,只是发现它已经在网站上,只是看不见。
Ejoso

8
: set list!更好:)
skippr

@Skippr通过什么措施?这是相同数量的按键,除了Shift!都难度比打字no。如果您将其放在.vimrc中,则我同意exclam格式更易于阅读。
丹·贝查德

7
@Dan如果您希望在相对较短的时间内:set list!将其打开或关闭,则无需输入即可nolist。这!与当前设置的相反。我一直都用这个,尤其是在使用时:set paste!。我讨厌按箭头键查找:set paste:set nopaste大声笑
skippr

187

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

:syntax on
:set syntax=whitespace

这些是Whitespace编程语言的语法突出显示规则-选项卡以绿色显示,空格以红色显示。:)

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


7
我喜欢这个,它很聪明,而且感觉比其他大多数答案都要好。不过,这并不是一直可用的解决方案。
ComputerDruid

4
我更喜欢传统的方法,但出于创新性考虑,我为此+1。
Sietse van der Molen 2013年

27
我知道语言对某些事情会有用。
Dan Bechard 2015年

1
您介意链接到要用来突出显示的.vim语法文件吗
SeldomNeedy 2015年

2
@SeldomNeedy您不需要下载任何内容,空格突出显示规则已经在Vim中附带了很多年。除非您使用的是Vim的怪异版本或非常老的版本,否则它们基本上应该是内置的。
艾略特

91

:set list将所有空格显示为字符。一切,但空间看起来会比正常状态,这意味着如果你仍然可以看到一个普通的老式空间,这真是一个普通的旧空间的不同。:)


35
:set nolist
Greg K

6
如果您想看到空格字符(例如在Sublime Text 2中启用了“显示空白”)怎么办?我发现它真的很有帮助。
Olical 2012年

不是我来这里的目的,但非常有帮助。谢谢。
哈珀维尔

4
另外,没有选项也可以!在最后切换:set list!
baldrs

:se hls | /\_s为此,我使用一个衬垫。获取所有内容,而set list忽略空格。再次关闭:se nohls。有关此帖子的详细信息:albertech.blogspot.com/2015/02/…–
jar

73

如果您设置:

: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>

注意:设置了colorcheme后,请在vimrc中定义功能。


1
好吧,这有点骇人听闻,但到目前为止,它比其他任何事物都近。赏金奖励!:D
ELLIOTTCABLE

45

根据当前缓冲区的语法规则,类似的方法可能会起作用:

: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不会突出显示空格。将无法解决(也许会解决,我发布了一个补丁

  • 似乎有一个补丁在浮动,可以自定义空间在list模式下的外观。在撰写本文时,最新的版本似乎就是此版本。(这意味着,您需要构建自己的Vim才能使用它)。
  • conceallevelconcealcursor有窗口局部选项。这意味着它们在不同的窗口中可以有所不同(并且也可能由文件类型插件或其他插件脚本来设置)。
  • 每当重新加载语法定义文件时,都需要执行语法突出显示组。这可以使用a BufWinEnter或可能的a Syntax甚至FileType自动命令来完成。(我尚未测试哪一个实际有效)。

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

更新10/26/2014我从这个问题中制作了一个插件

2015年4月22日更新 Vim中包含一个补丁,可以使用该list选项来实现此目的。简单设置set list listchars+=space:␣将从Vim 7.4.711开始


这很棒!如何将其添加到.vimrc
Eric Martindale

1
由于这适用于当前缓冲区,因此您可能需要将其包装到自动命令中。BufEnter甚至语法自动命令都可能对您
有用

3
Æ这是一个奇怪的角色选择,为什么不·呢?
Marius Gedminas 2014年

1
这实际上是正确的答案。关于如何为此字符添加适当的语法突出显示的任何想法?如果它褪色非常好,我宁愿·
空袭2014年

@ChristianBrabandt,您有一堆与nrrwrgn相关的结尾文件污染了您的存储库。
romainl 2014年

31

我用这个

/\s
:set hlsearch

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


最简单的解决方案恕我直言。伟大的搭配命令以清除搜索(我使用nnoremap <leader><space> :noh<cr>
Lenna

24

如果用空格表示“”字符,我的建议就是搜索/替换。正如其他人所暗示的,set list非打印字符更改为在中配置的可见字符listchars

为了将空格显示为其他字符,可以使用类似于以下内容的方法:

:%s/ /█/g

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

(获取█我按这个确切的按键顺序::%s/ /CTRL-KFB/g


2
我比其他答案更喜欢这个,这看起来像是:set list与我相反,将可见字符(“空格”)更改为_non priting_(??)。我想知道是否可以使用这种内部比赛,例如:match MyBlackBlockChar "appropriate_regex,应该做到这一点,不是吗?
Sudhi 2011年

其他答案是有用的,但是这实际上回答了OP的问题+1的第一个
阿里克斯罗氏公司

1
:%s/\s/█/g所有空白。另外,:set hlsearch加号:&s/\s//gn可能很有用。

16

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

/ <空格>

笔记:

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

    突出显示空格和制表符:

    / [<space> <tab>]

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

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


  • 1
    这与3年前发布的答案相同。同样,:noh比/ asdf更快地显示未突出显示的文本。或者甚至可以将f1设置为:noh,因为您可能会经常使用它。

    @DrEval假设您指的是BenediktKöppel的答案,则它/<space>与vs 确实有细微的差别/\s。我认为在这里使用建议不是显而易见的,而且速度更快。
    icc97 '17

    14

    下面的代码基于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标志结合使用的问题。
    Christian Brabandt 2014年

    @ChristianBrabandt,是的,除了使它“自动”之外,我无法超越您已经做的事情。
    romainl 2014年

    1
    是的,这是skipwhite语法规则中的参数,它阻止语法组匹配(尽管应允许将其包含在所有组中)。
    Christian Brabandt 2014年

    有什么方法可以使Indent Guides更好地工作,它为缩进增加了背景?我怀疑这是不覆盖背景色的问题,但这似乎并不重要。
    2014年

    当不需要突出显示空白时如何禁用相同功能?寻找一种简短的切换命令。
    yuvaeasy

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

    使用此选项卡时,选项卡显示为|,空格显示为_,这使我很容易分辨出何时混合代码样式。

    我发现的唯一缺点是,此代码段无法调整背景颜色以匹配上下文(例如在评论中)。


    8

    以上所有答案都试图使vim内部的空间可见。如果您真的坚持将可见的空间作为点,那么还有另一种方法...

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

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


    2
    在我阅读有关用点填充整个屏幕的注释之前,这听起来是一种非常好的方法。:/
    friederbluemle

    3
    创造力点!:-)
    jpaugh

    7

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

    5
    :match CursorLine /\s\+/
    

    避免了“您必须搜索空格以使其出现”的位,但是无法将afaict配置为对空格进行非突出显示的操作。CursorLine可以是任何亮点组,并且在默认主题中是普通下划线。


    使用这种方法我无法分辨制表符和空格之间的区别,这太糟糕了,但是我喜欢它是一个衬纸。
    Rustavore 2013年

    5

    我喜欢用特殊字符来显示空格,更清晰。快速切换甚至是要切换的地图也是关键功能。

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

    vim-scripts/cream-showinvisibles@vim.org

    多亏了项目vim脚本vundle,您可以重新使用此插件

    vim-scripts / cream-showinvisibles @ github

    更好的是,我为此付出的两分钱是添加一个可配置的快捷方式(而不是预定义的F4

    所以将它添加到〜/ .vimrc

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

    在vim上安装插件

    :PluginInstall
    

    然后你去


    5

    要覆盖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)看起来像“ │ ”(两个字符:长管道,然后是序数空格;在中为灰色colorscheme murphy
    • 正常的不间断空格(U + 00A0)看起来像是“ ·”(一个字符;在中为灰色colorscheme murphy
    • 其他任何空格字符看起来都像红色“

    1
    编辑后添加“ ctermbg = Red”,使我的终端可以进行着色。我个人用作set listchars=tab:»\ ,space:·您的参考。
    Johnny Wong

    @JohnnyWong感谢您的更新。最初,它被审阅者拒绝,但我已经检查了代码,并且(毫无疑问)它适用于gvimvim
    Kirill Bulygin '18年

    1
    绝妙的答案,这正是我要捕获在Safari和Firefox中无法呈现的狭窄不间断空间(十六进制202f)所需要的。
    克里斯·科布扎克

    4

    你可以用

    :set list
    

    真正看到一条线的结构。您将明确看到选项卡和换行符。当您看到空白时,实际上是空白。


    3

    突出显示搜索

    :set hlsearch 
    

    .vimrc那是

    并搜索空格和回车

    / \|\t\|\r
    

    或搜索所有空白字符

    /\s
    

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

    /\S
    

    在行尾显示所有尾随空格字符

    /\s$
    

    2

    这些hack作为注释保留在.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
    

    1
    :se list
    :se nolist
    

    :se足够,:set不需要。



    1

    将其添加到我的.vimrc中对我来说有效。只要确保您没有其他冲突即可。

    autocmd VimEnter * :syn match space /\s/
    autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black
    
    By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
    Licensed under cc by-sa 3.0 with attribution required.