Make Vim show ALL white spaces as a character
我找不到让Vim将所有空格显示为角色的方法。
我发现的只是标签,尾随空格等。
正如其他人所说,你可以使用
1 | :set list |
将与...结合使用
1 | :set listchars=... |
显示不可见的字符。
现在,没有一个明确的选项可用于显示空格,但在列表框中,您可以设置一个字符来显示所有内容但是空白。例如,我看起来像这样
1 | :set listchars=eol:$,tab:>-,trail:~,extends:>,precedes:< |
所以,现在,你使用后
1 | :set list |
那些未明确显示为其他东西的东西,实际上是一个普通的旧空白。
像往常一样,要了解
1 | :help listchars |
向它添加切换可能会有所帮助,这样您就可以轻松地在编辑中看到更改(来源:VIM:设置列表!作为.vimrc中的切换):
1 2 3 | noremap <F5> :set list!<CR> inoremap <F5> <C-o>:set list!<CR> cnoremap <F5> <C-c>:set list!<CR> |
从补丁7.4.710开始,您现在可以使用listchars设置一个字符来代替空格!
1 | :set listchars+=space:? |
因此,要将所有空白字符显示为字符,您可以执行以下操作:
1 2 | :set listchars=eol:?,tab:>·,trail:~,extends:>,precedes:<,space:? :set list |
关于邮件列表的讨论:https://groups.google.com/forum/?fromgroups#!topic / vim_dev / pjmW6wOZW_Q
我认为这里的其他答案更全面,但我想我会分享一个通常用于区分标签和空格的技巧:
1 2 | :syntax on :set syntax=whitespace |
这些是Whitespace编程语言的语法高亮规则 - 标签显示为绿色,空格显示为红色。 :)
可以与许多其他答案所提到的
如果你设置:
1 | :highlight Search cterm=underline gui=underline ctermbg=none guibg=none ctermfg=none guifg=none |
然后执行搜索空格,每个空格字符将显示为下划线字符。
您可以在一个方便的函数中使用此命令,该函数可以切换空格的"下划线"。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
将函数映射到快捷键:
1 | nmap <silent> <F3> <Esc>:call ToggleSpaceUnderscoring()<CR> |
注意:在设置colorscheme后,在vimrc中定义函数。
根据您当前缓冲区的语法规则,这样的东西可以工作:
1 2 | :syn match WhiteSpace / / containedin=ALL conceal cchar=? :setl conceallevel=2 concealcursor=nv |
这需要带有+隐藏功能的vim 7.3
2014年10月24日更新
扩大一点。当然可以为锥形字符定义一些突出显示。
-
您可以配置隐藏字符的外观。要突出显示,您必须至少配置一次"隐藏"突出显示组(请参阅
:h hl-Conceal 处的帮助。这可以在您的colorscheme中完成,然后您不需要再次重新配置它。但这会影响所有隐藏的字符(例如,如果您的语法脚本隐藏了更多项目,它们将显示为您的空白字符)。这可能如下所示::hi Conceal ctermfg=7 ctermbg=NONE guifg=LightGrey guibg=NONE -
如果语法脚本使用
skipwhite 关键字,那么Vim似乎没有突出显示空格的特殊性。将无处可去(也许这将被修复,我发布补丁) -
似乎有一个浮动的补丁,可以自定义空间在
list 模式下的外观。在撰写本文时,最新的一篇似乎就是这一篇。 (这意味着,您需要构建自己的Vim才能使用它)。 -
conceallevel 和concealcursor 是窗口本地选项。这意味着它们可以在不同的窗口中不同(并且可能也由文件类型插件或其他插件脚本设置)。 -
每当重新加载语法定义文件时,都需要执行语法突出显示组。这可以使用
BufWinEnter 或可能还有Syntax 或甚至FileType 自动命令来完成。 (我还没有测试哪一个真正起作用)。
最后两项意味着,您必须设置一些自动命令来重置语法规则和相应的选项。对于第一个,可能想要使用
2014年10月26日更新我从这个问题中制作了一个插件。
更新04/22/2015 Vim中包含一个补丁,可以使用
这适用于Vim 7.4.711
我用这个
1 2 | /\s :set hlsearch |
突出白色空间。它搜索所有空白区域,然后启用突出显示以使其弹出。但是,它不会打印特殊字符。
如果用空格表示''字符,我的建议就是搜索/替换。正如其他人暗示的那样,
要明确地将空格显示为其他字符,类似于下面的内容应该可以做到:
<5233>
然后撤消更改以再次返回。
(为了获得█我按下了这个确切的密钥序列::%s / / CTRL-KFB / g)
要突出显示空格,只需搜索它:
/ <空间>
笔记:
突出空间&amp;标签:
/ [<空间> <标签>]
删除高亮显示的一种快捷方法是搜索其他内容:
/ ASDF
(只需键入随机字符的任何短名单)
下面的代码基于Christian Brabandt的答案,似乎做了OP想要的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
将这些行附加到
随意编辑默认颜色和隐藏字符。
警告:多种语言的
我对这个问题的所有其他答案感到沮丧,因为它们都没有以有用的方式突出空间字符。将空格显示为字符对于空白格式的语言特别有用,其中混合制表符和空格是有害的。
我的解决方案是显示标签并为多个空格加下划线。它借鉴了mrucci的答案和本教程。因为它使用语法高亮,它是持久的:
1 2 3 4 | 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屏幕上出现点的不便...(但它会将空格与标签区分开来......)
我没有从现有的答案中找到我想要的东西。下面的代码将突出显示所有尾随空格的红色。只需将以下内容添加到
1 2 3 4 5 6 | 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() |
我喜欢使用特殊字符来显示空白,更清晰。即使是切换地图也是一个关键功能,可以快速检查。
您可以在2004年以来未更新的旧vim脚本中找到此功能:
vim-scripts/[email protected]
感谢项目vim-scripts和vundle,你可以恢复生活这个插件
VIM的脚本/奶油showinvisibles @ github上
更好的是,我的两分钱是添加一个可配置的快捷方式(而不是预定义的F4)
所以把这个添加到?/ .vimrc
1 2 3 | Plugin 'albfan/cream-invisibles' let g:creamInvisibleShortCut ="<F5>""for my F4 goto next error |
在vim上安装插件
1 | :PluginInstall |
然后你去
1 | :match CursorLine /\s\+/ |
避免"你必须搜索空间让它们显示"位,但是不能将afaict配置为对空间进行非hilighting事物。 CursorLine可以是任何hilighting组,在默认主题中它是一个简单的下划线。
要覆盖Unicode空白字符:
1 2 3 4 5 6 7 | set list set listchars=tab:│\ ,nbsp:· highlight StrangeWhitespace guibg=Red ctermbg=Red " The list is from https://stackoverflow.com/a/37903645 (with `\t`, ` `, ` `, `\xa0` removed): call matchadd('StrangeWhitespace', '[\x0b\x0c \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 | :set list |
真正看到一条线的结构。您将明确地看到制表符和换行符。当你看到一个空白时,它真的是一片空白。
突出搜索
1 | :set hlsearch |
在
并搜索空格标签和回车
1 | / \|\t\| |
或搜索所有空格字符
1 | /\s |
搜索所有非空格字符(未显示空白字符,因此您可以看到单词之间的空格字符,但不会显示尾随空白字符)
1 | /\s |
显示所有尾随空白字符 - 在行尾
1 | /\s$ |
将这些hacks作为注释保存在.vimrc中,所以在shell中,只需:
1 2 3 4 5 6 7 8 | 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 | :%s/ /█/g |
(在写之前撤消它)
将此添加到我的.vimrc对我有用。只要确保你没有其他任何冲突..
1 2 | autocmd VimEnter * :syn match space /\s/ autocmd VimEnter * :hi space ctermbg=lightgray ctermfg=black guibg=lightgray guifg=black |
1 2 | :se list :se nolist |