我找不到一种方法来让Vim将所有空格显示为一个字符。我找到的只是制表符、尾随空格等。


当前回答

我没有从现有的答案中找到我想要的。下面的代码将突出显示所有的尾部空格亮红色

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()

其他回答

你可以使用

:set list

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

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

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

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

我发现的唯一缺点是,这段代码没有调整背景颜色以匹配上下文(如注释中)。

:match CursorLine /\s\+/

避免了“必须搜索空间才能显示”这一点,但afaict不能配置为对空间进行非隐藏操作。CursorLine可以是任何照明组,在默认主题中它是一个普通下划线。

:set列表将以字符形式显示所有空白。除了一个空间之外,其他所有的东西看起来都会不同于它的正常状态,这意味着如果你仍然看到一个普通的旧空间,那真的是一个普通旧空间。:)

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

:set list

这将与

:set listchars=...

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

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

所以,现在,在你使用

:set list

所有没有明确显示为其他内容的内容实际上都是一个普通的空白。

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

:help listchars

给它添加一个切换可能会很有帮助,这样您可以在编辑过程中轻松看到更改(来源:VIM:set list!作为.virc中的切换):

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