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

735 vi vim

我找不到让Vim将所有空格显示为角色的方法.我发现的只是标签,尾随空格等.

Roo*_*ook 655

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

:set list
Run Code Online (Sandbox Code Playgroud)

将与...结合使用

:set listchars=...
Run Code Online (Sandbox Code Playgroud)

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

:set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<
Run Code Online (Sandbox Code Playgroud)

所以,现在,你使用后

:set list
Run Code Online (Sandbox Code Playgroud)

那些未明确显示为其他东西的东西,实际上是一个普通的旧空白.

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

:help listchars
Run Code Online (Sandbox Code Playgroud)

向它添加切换可能会有所帮助,这样您就可以轻松地在编辑中看到更改(来源:VIM:设置列表!作为.vimrc中的切换):

noremap <F5> :set list!<CR>
inoremap <F5> <C-o>:set list!<CR>
cnoremap <F5> <C-c>:set list!<CR>
Run Code Online (Sandbox Code Playgroud)

  • @ckarbass - :设置invlist (18认同)
  • @ckarbass同样你在vim中切换任何东西 - 添加一个!到最后.所以它变成:设置清单! (7认同)
  • noobie问题,但你如何切换:设置列表 (5认同)
  • "未明确显示为其他内容的所有内容"?尝试从U + 2000..U + 200A范围内的unicode空间.如果固定宽度字体支持它们,它们将显示为正常的0x20空间. (3认同)
  • @ZyX - 我没有采用整个Unicode,而是使用了相当常见的字符集.如果您对答案不满意,请随时提出改进建议. (2认同)
  • 我使用中间的点 `·` 来表示空白,我的 VIM 现在看起来棒极了!谢谢指点~ (2认同)

Bre*_*t Y 250

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

:set listchars+=space:?
Run Code Online (Sandbox Code Playgroud)

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

:set listchars=eol:¬,tab:>·,trail:~,extends:>,precedes:<,space:?
:set list
Run Code Online (Sandbox Code Playgroud)

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

  • 我使用Unicode的中间点(U + 00B7)作为空格字符(`space:·`),因为它看起来像MS Word,Notepad ++等. (4认同)
  • 也许有人喜欢我选择的符号: `set listchars=tab:⇤–⇥,space:·,trail:·,precedes:⇠,extends:⇢,nbsp:×` (4认同)
  • 我试过这个并且一开始就出错了.事实证明,"空间"不是我正在使用的稍微旧版gvim中的有效选项.升级我的gvim解决了我的问题.对于收到错误的其他人,键入`:help listchars`来检查"space"是否是"listchars"的有效选项.如果不是,请将vim升级到指定的补丁@brettanomyces.或者如果您不想看空格,只需将"空格"留在set命令之外. (3认同)
  • 这很酷,但我想知道为什么eol角色的颜色不同,与其他角色不同. (2认同)
  • 在vim中为`·`输入`&lt;CK&gt; .M`。有关详细信息,请参见`:h digraph`。 (2认同)

Mar*_*cin 248

:set list 启用.

:set nolist 禁用.

  • 感谢您向我们展示如何在模式之间切换.您认为其他高级答案会教会这一点. (11认同)
  • `:设置列表!`更好:) (6认同)
  • @Dan如果你想在相对较短的时间内关闭和打开它,`:set list!`将会这样做,而你不需要输入`nolist`.`!`只是与当前设置的相反.我一直都在使用它,特别是在`:set paste!`时.我讨厌按箭头键找到`:set paste`或`:set nopaste` lol (6认同)
  • 是的,这很有帮助。我希望这是最佳答案,因为我自己找到了这个答案,却发现它已经在网站上,只是看不见。 (2认同)

Eli*_*iot 182

我认为这里的其他答案更全面,但我想我会分享一个通常用来区分标签和空格的技巧:

:syntax on
:set syntax=whitespace
Run Code Online (Sandbox Code Playgroud)

这些是Whitespace编程语言的语法高亮规则- 标签显示为绿色,空格显示为红色.:)

可以与:set list许多其他答案所提及的组合,虽然选项卡将显示为^ I而没有绿色高光,但空格将显示为红色.

  • 我知道这种语言对**有用. (24认同)
  • 我喜欢这个,它非常聪明,并且感觉比其他大多数答案更好.但是,并不是一直都可以使用的解决方案. (7认同)
  • 我更喜欢更传统的方法,但我是为了创造性而言. (4认同)
  • @SeldomNeedy你不需要下载任何东西,空白突出显示规则已经与Vim一起出货多年.它们应该基本上是内置的,除非你使用的是奇怪或旧版本的Vim. (2认同)

Eth*_*her 89

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

  • 用`:set nolist`将其关闭 (35认同)
  • 如果你想看到空格字符怎么样,比如Sublime Text 2中有"show whitespace"?我觉得它真有帮助. (6认同)
  • 另外,没有选项可以用`!`结尾切换:`set list!` (4认同)
  • 我正在寻找设置“空格”字符,这似乎是您在设置“listchars”时使用“空格:•”所做的。我的看起来像这样: --- `set showbreak=↪\ ` `set listchars=tab:→\ ,eol:↲,nbsp:␣,trail:•,extends:⟩,precedes:⟨,space:•` (3认同)

mru*_*cci 73

如果你设置:

:highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none
Run Code Online (Sandbox Code Playgroud)

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

您可以在一个方便的函数中使用此命令,该函数可以切换空格的"下划线".

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
Run Code Online (Sandbox Code Playgroud)

将函数映射到快捷键:

nmap <silent> <F3> <Esc>:call ToggleSpaceUnderscoring()<CR>
Run Code Online (Sandbox Code Playgroud)

注意:在设置colorscheme后,在vimrc中定义函数.


Chr*_*ndt 45

根据您当前缓冲区的语法规则,这样的东西可以工作:

:syn match WhiteSpace / / containedin=ALL conceal cchar=Æ
:setl conceallevel=2 concealcursor=nv
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 如果语法脚本使用skipwhite关键字,那么Vim似乎没有突出显示空格的特殊性.将无处可去(也许这将被修复,我发布补丁)

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

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

2014年10月26日更新我从这个问题中制作了一个插件.

更新04/22/2015 Vim中包含一个补丁,可以使用该list选项实现此功能.简单设置set list listchars+=space:? 这适用于Vim 7.4.711

  • `Æ`是一个奇怪的角色选择,为什么不```? (3认同)

Ben*_*pel 30

我用这个

/\s
:set hlsearch
Run Code Online (Sandbox Code Playgroud)

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

  • 我输入:nohl (3认同)

Ran*_*ris 22

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

要明确地将空格显示为其他字符,类似于下面的内容应该可以做到:

:%s/ /?/g

然后撤消更改以再次返回.

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

  • 我比其他答案更喜欢这个,这看起来像`:set list`对我来说,将可见字符('space')改为_non priting_(??).我想知道是否可以使用这个内部匹配例如`:匹配MyBlackBlockChar"proper_regex`应该做的伎俩,不应该吗? (2认同)

小智 16

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

/ <空间>

笔记:

  • <space>表示只键入空格字符.
  • 使用以下命令启用搜索结果的突出显示:set hlsearch

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

    / [<space> <tab>]

    删除高亮显示的一种快捷方法是搜索其他任何内容:/ asdf

    (只需键入随机字符的任何短名单)


    rom*_*inl 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
    
    Run Code Online (Sandbox Code Playgroud)

    将这些行附加到您的~/.vimrc并开始一个新的Vim会话,以查看仍然不完美的魔法发生.

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


    警告:*FuncBody多种语言的语法组中的某些内容会阻止中间点显示.我不知道(还有?)如何使该解决方案更可靠.


    Wyl*_*lie 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 /  \+/
    
    Run Code Online (Sandbox Code Playgroud)

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

    我发现的唯一缺点是这个片段不会调整背景颜色以匹配上下文(如评论中).


    che*_*hef 8

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

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

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

    • 创意点!:-) (3认同)
    • 这听起来像是一个非常好的方法,直到我读到关于用点填充整个屏幕的说明.:/ (2认同)

    the*_*tto 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()
    
    Run Code Online (Sandbox Code Playgroud)


    tan*_*ens 5

    你可以使用

    :set list
    
    Run Code Online (Sandbox Code Playgroud)

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


    ldr*_*drg 5

    :match CursorLine /\s\+/
    
    Run Code Online (Sandbox Code Playgroud)

    避免"你必须搜索空间让它们显示"位,但是不能将afaict配置为对空间进行非hilighting事物.CursorLine可以是任何hilighting组,在默认主题中它是一个简单的下划线.


    alb*_*fan 5

    我喜欢使用特殊字符来显示空白,更清晰.即使是切换地图也是一个关键功能,可以快速检查.

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

    vim-scripts/cream-showinvisibles@vim.org

    感谢项目vim-scriptsvundle,你可以恢复生活这个插件

    VIM的脚本/奶油showinvisibles @ github上

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

    所以把这个添加到〜/ .vimrc

    Plugin 'albfan/cream-invisibles'
    
    let g:creamInvisibleShortCut = "<F5>" "for my F4 goto next error
    
    Run Code Online (Sandbox Code Playgroud)

    在vim上安装插件

    :PluginInstall
    
    Run Code Online (Sandbox Code Playgroud)

    然后你去


    Kir*_*gin 5

    要覆盖Unicode空格字符:

    set list
    set listchars=tab:?\ ,nbsp:·
    highlight StrangeWhitespace guibg=Red ctermbg=Red
    " The list is from /sf/answers/2653255181/ (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]')
    
    Run Code Online (Sandbox Code Playgroud)

    结果:

    • 只有序数空间(U + 0020)看起来像一个空间(“ ”)
    • 选项卡(U + 0009)看起来像“ ”(两个字符:长管道,然后是序数空格;在中为灰色colorscheme murphy
    • 正常的不间断空格(U + 00A0)看起来像“ ·”(一个字符;在中为灰色colorscheme murphy
    • 其他任何空格字符看起来都像红色“

    • 编辑添加“ctermbg=Red”以使我的终端为着色工作。我个人使用 `set listchars=tab:»\ ,space:·` 供您参考。 (2认同)
    • 出色的答案,这正是我需要捕获无法在 Safari 和 Firefox 中呈现的狭窄的不间断空格(Hex 202f)。 (2认同)

    Yor*_*iev 5

    将这些 hack作为注释保留在 .vimrc 中,因此在 shell 中,只需:

    \n\n
    echo \'\n  " how-to see the non-visible while spaces\n  " :set listchars=eol:\xc2\xac,tab:>\xc2\xb7,trail:~,extends:>,precedes:<,space:\xe2\x90\xa3\n  " set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:<\n  " :set list\n  " but hei how-to unset the visible tabs ?!\n  " :set nolist\n  \' >> ~/.vimrc\n
    Run Code Online (Sandbox Code Playgroud)\n