繁体   English   中英

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

[英]Make Vim show ALL white spaces as a character

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

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

:set list

这将与

:set listchars=...

显示不可见字符。
现在,没有可用于显示空格的显式选项,但在 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>

从补丁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#!topic/ vim_dev/ pjmW6wOZW_Q

:set list启用。

:set nolist禁用。

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

:syntax on
:set syntax=whitespace

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

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

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

如果你设置:

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

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

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

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

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

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

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

  • 如果语法脚本使用skipwhite关键字,Vim 似乎不会突出显示空格的skipwhite 没有办法解决(也许这会被修复,我发布了一个补丁

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

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

2014 年 10 月 26 日更新我根据这个问题制作了一个插件

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

我用这个

/\s
:set hlsearch

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

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

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

:%s/ /█/g

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

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

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

/<空格>

笔记:

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

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

    /[<空格><标签>]

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

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

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

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

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

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

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

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

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

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

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

    覆盖 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灰色)
    • 任何其他空白字符看起来像红色“

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

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

    vim-scripts/cream-showinvisibles@vim.org

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

    vim-scripts/cream-showinvisibles@github

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

    所以把它添加到~/.vimrc

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

    在vim上安装插件

    :PluginInstall
    

    你去吧

    :match CursorLine /\s\+/
    

    避免了“你必须搜索空间才能让它们显示出来”这一点,但 afaict 不能被配置为对空间做非突出的事情。 CursorLine 可以是任何高亮组,在默认主题中它是一个简单的下划线。

    你可以用

    :set list
    

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

    突出显示搜索

    :set hlsearch 
    

    .vimrc

    并搜索空格制表符和回车

    / \|\t\|\r
    

    或搜索所有空白字符

    /\s
    

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

    /\S
    

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

    /\s$
    

    这些 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
    
    :se list
    :se nolist
    

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

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

    :%s/ /█/g
    

    (在写之前撤消它)

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

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

    暂无
    暂无

    声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM