我找不到让 Vim 将所有空格显示为字符的方法。我发现的只是制表符、尾随空格等。
:set list
的回复。这并不能回答我们的问题。 (致其他人:mrucci 下面的回答很有帮助,虽然不是真正的解决方案。)
list
和 listchars
中可见的人,请考虑空格直接跟在制表符后面。在这种情况下,它几乎是看不见的。我同意你可以捕捉到大多数情况,但如果适当突出所有空间会很好。
正如其他人所说,您可以使用
: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>
从补丁 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
:help listchars
以检查“空格”是否是“listchars”的有效选项。如果不是,请将您的 vim 升级到指定的补丁 @brettanomyces。或者,如果您不想看到空格,请将“空格”从 set 命令中删除。
space:·
),因为它看起来像 MS Word、Notepad++ 等。
·
键入 <C-K>.M
。详见:h digraph
。
:set list
启用。
:set nolist
禁用。
: set list!
更好:)
Shift
和 !
都比 no
更难键入。如果你把它放在你的 .vimrc 中,我同意感叹号更容易阅读。
:set list!
将这样做,而您无需输入 nolist
。 !
只是与当前设置的相反。我一直使用它,尤其是在使用 :set paste!
时。我讨厌按箭头键来查找 :set paste
或 :set nopaste
哈哈
我认为这里的其他答案更全面,但我想我会分享一个我通常用来在视觉上区分制表符和空格的技巧:
:syntax on
:set syntax=whitespace
这些是 Whitespace programming language 的语法突出显示规则 - 选项卡以绿色显示,空格以红色显示。 :)
正如许多其他答案所提到的,可以与 :set list
结合使用,尽管选项卡随后将显示为 ^I 而没有绿色突出显示,但空格将显示为红色。
:set list
会将所有空格显示为一个字符。 除了空间之外的所有东西看起来都与其正常状态不同,这意味着如果您仍然看到一个普通的旧空间,它实际上是一个普通的旧空间。 :)
:set nolist
将其关闭
!
切换没有的选项:set list!
space
字符,您在设置 listchars
时似乎使用 space:•
。我的看起来像这样:--- set showbreak=↪\
set listchars=tab:→\ ,eol:↲,nbsp:␣,trail:•,extends:⟩,precedes:⟨,space:•
如果你设置:
: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
这需要带有 +conceal 功能的 vim 7.3
2014 年 10 月 24 日更新 对此进行一些扩展。当然可以为锥形字符定义一些突出显示。
您可以配置隐藏字符的外观。对于突出显示,您必须至少配置一次“隐藏”突出显示组(参见帮助:h hl-Conceal 这可以在您的颜色方案中完成,然后您不需要再次重新配置它。但这会影响所有隐藏的字符(例如,如果您的语法脚本隐藏了更多项目,它们将显示为您的空白字符)。可能如下所示: :hi Conceal ctermfg=7 ctermbg=NONE guifg=LightGrey guibg=NONE
如果语法脚本使用 skipwhite 关键字,Vim 似乎不会突出显示空格。没有办法了(也许这会被修复,我贴了一个补丁)
似乎有一个补丁浮动,可以自定义空间在列表模式下的外观。撰写本文时最新的一个似乎是这个。 (这意味着,您需要构建自己的 Vim 才能使用它)。
隐藏级别和隐藏光标是窗口本地选项。这意味着它们在不同的窗口中可能是不同的(也可能由文件类型插件或其他插件脚本设置)。
每当重新加载语法定义文件时,都需要执行语法高亮组。这可以使用 BufWinEnteror 也可能是 Syntax 甚至 FileType 自动命令来完成。 (我还没有测试过哪个真正有效)。
最后两项意味着,您必须设置一些自动命令来重置语法规则和相应的选项。对于第一个,可能需要使用 ColorScheme
自动命令设置突出显示(以便隐藏的字符始终看起来相同,与实际设置的配色方案无关)。要获得完整的解决方案,请查看 romainl 答案,这应该会给您一个开始。如果您设置了一个功能,您可以轻松设置一个切换命令来打开或关闭显示特殊突出显示。
2014 年 10 月 26 日更新我从这个问题中提出了一个plugin。
2015 年 4 月 22 日更新 Vim 中包含一个补丁,使用 list
选项可以实现这一点。只需设置 set list listchars+=space:␣
这适用于 Vim 7.4.711
.vimrc
?
Æ
是一个奇怪的字符选择,为什么不是 ·
?
我用这个
/\s
:set hlsearch
突出显示空白。它搜索所有空白,然后启用突出显示以使它们弹出。但是,它不会打印特殊字符。
nnoremap <leader><space> :noh<cr>
)
如果空格是指 ' ' 字符,我的建议只是搜索/替换。正如其他人所暗示的那样,set list
将 非打印 字符更改为在 listchars
中配置的可见字符。
要将空格显式显示为其他字符,类似于下面的内容应该可以解决问题:
:%s/ /█/g
然后只需撤消更改即可再次返回。
(为了得到 █,我按下了这个确切的键序列::%s/ /CTRL-KFB/g)
:set list
的倒数,将可见字符('空格')更改为 _non priting_(??) 之一。我想知道是否可以使用这个内部匹配,例如 :match MyBlackBlockChar "appropriate_regex
应该可以解决问题,不是吗?
:%s/\s/█/g
表示所有空格。此外,:set hlsearch
加 :&s/\s//gn
可能有用。
要突出显示空格,只需搜索它:
/<空格>
笔记:
使用 :set hlsearch 启用搜索结果突出显示 突出显示空格和制表符:/[
下面的代码基于 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
语法组中的某些内容会阻止显示中间点。我不知道(还不知道?)如何使该解决方案更可靠。
skipwhite
参数,它阻止语法组匹配(尽管它应该被允许包含在所有组中)。
我对这个问题的所有其他答案感到沮丧,因为它们都没有以有用的方式突出空格字符。将空格显示为字符对于空格格式的语言特别有帮助,其中混合制表符和空格是有害的。
我的解决方案是显示选项卡并在多个空格下划线。它从 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 / \+/
使用它,选项卡显示为 |
,空格显示为 _
,这使得在混合代码样式时很容易分辨。
我发现的唯一缺点是此代码段不会调整背景颜色以匹配上下文(如在评论中)。
上面的所有答案都试图使空间在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) 看起来像“│”(两个字符:一个长管道,然后是一个序数空格;它们在墨菲配色方案中是灰色的)。
不间断空格 (U+00A0) 看起来像“·”(一个字符;在配色方案墨菲中它是灰色的)。
任何其他空白字符看起来都像红色空格(“”)。
set listchars=tab:»\ ,space:·
供您参考。
gvim
和 vim
。
Red
替换为 Brown
,因为红色在许多地方已经被大量使用(而且我已经用它来显示尾随空格)。
你可以使用
:set list
真正看到一条线的结构。您将明确看到制表符和换行符。当你看到一个空白时,它真的是一个空白。
:match CursorLine /\s\+/
避免了“您必须搜索空格才能显示它们”位,但不能将 afaict 配置为对空格执行非突出显示的操作。 CursorLine 可以是任何高亮组,在默认主题中它是一个简单的下划线。
我喜欢使用特殊字符来显示空白,更清晰。即使是要切换的地图也是一个关键功能,可以快速检查。
您可以在自 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
你去吧
高亮搜索
:set hlsearch
在 .vimrc
中
并搜索空格制表符和回车
/ \|\t\|\r
或搜索所有空白字符
/\s
搜索所有非空白字符(空白字符未显示,因此您可以看到单词之间的空白字符,但看不到尾随空白字符)
/\S
显示所有尾随空白字符 - 在行尾
/\s$
将 those hacks 作为注释保留在 .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
.vimrc
文件中,这样可以随时使用:set list
轻松启用这种显示不可见字符的漂亮方式(无需再次使用谷歌搜索此页面)。