如何让Vim突出非ASCII字符?

我试图让Vim突出显示非ASCII字符。 有没有可用的设置,正则expression式search模式,或插件这样做?

在search中使用[]字符类中的范围,您应该能够排除 ASCIIhex字符范围,因此突出显示(假设您启用了hlsearch )位于ASCII范围之外的所有其他字符:

 /[^\x00-\x7F] 

这将对ASCII 0x00和ASCII 0x7F (0-127)之间的字符进行否定匹配(通过[^] ),并且在我的简单testing中可以正常工作。 对于扩展ASCII,当然,使用/[^\x00-\xFF]将范围扩展到\xFF而不是/[^\x00-\xFF]

您也可以用\d中的十进制表示它:

 /[^\d0-\d127] 

如果你需要更具体的东西,比如排除不可打印的字符,你需要将这些范围添加到字符类[]

是的,有一个本地function可以对任何匹配的string进行突出显示。 在Vim里面,做:

 :help highlight :help syn-match 

syn-match定义了一个匹配到一个组中的string。 highlight定义组使用的颜色。 想想你的vimrc文件的语法突出显示。

所以你可以在你的.vimrc文件中使用下面的命令:

 syntax match nonascii "[^\x00-\x7F]" highlight nonascii guibg=Red ctermbg=2 

对于其他(从现在不那么倒霉)人通过search引擎结束在这里,并不能完成非ASCII字符的突出显示,试试这个(把它放到你的.vimrc中):

 highlight nonascii guibg=Red ctermbg=1 term=standout au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" 

这有另外的好处,不冲突常规(基于文件types[文件扩展名])的语法定义。

如果你对非打印字符也感兴趣,可以使用这个: /[^\x00-\xff]/

我在一个函数中使用它:

  function! NonPrintable() setlocal enc=utf8 if search('[^\x00-\xff]') != 0 call matchadd('Error', '[^\x00-\xff]') echo 'Non printable characters in text' else setlocal enc=latin1 echo 'All characters are printable' endif endfunction 

这个正则expression式也适用。 这是来自briceolion.com的 “vim删除非ascii字符”的第一个谷歌命中,并且:set hlsearch将突出显示:

 :/[^[:alnum:][:punct:][:space:]]/g 

基于这个话题的其他答案和我在这里得到的答案,我已经把它添加到我的.vimrc ,这样我就可以通过input<Cw>1来控制非ASCII字符高亮显示。 它还会显示内部注释,但是您将需要为将要使用的每个文件语法添加注释组。 也就是说,如果你要编辑一个zsh文件,你将需要添加zshComment到该行

 au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment 

否则不会显示非ascii字符。 要检查如何在不同的文件types上调用注释,请打开所需types的文件,并在vim中input:sy ,然后search注释的语法项目。

 function HighlightNonAsciiOff() echom "Setting non-ascii highlight off" highlight nonascii none let g:is_non_ascii_on=0 endfunction function HighlightNonAsciiOn() au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment echom "Setting non-ascii highlight on" highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline let g:is_non_ascii_on=1 endfunction function ToggleHighlightNonascii() if g:is_non_ascii_on == 1 call HighlightNonAsciiOff() else call HighlightNonAsciiOn() endif endfunction silent! call HighlightNonAsciiOn() nnoremap <Cw>1 :call ToggleHighlightNonascii()<CR> 

不知何故,上述答案都没有为我工作。

所以我用:1,$ s/[^0-9a-zA-Z,-_\.]//g

它保留了大部分我感兴趣的angular色。

有人已经回答了这个问题。 但是,对于仍然存在问题的其他人来说,这里是另一个解决scheme,可以突出显示评论中的非ASCII字符(或任何语法组)。 这不是最好的,但这是一个临时的解决办法。

有人可能会尝试:

 :syntax match nonascii "[^\u0000-\u007F]" containedin=ALL contained | \ highlight nonascii ctermfg=yellow guifg=yellow 

这混合了其他解决scheme的部分。 您可以删除contained ,但从文档,可能有自我recursion的潜在问题(据我所知)。 要查看其他定义的模式, syn-contains部分将包含它。

 :help syn-containedin :help syn-contains 

复制的问题来自: 在vim中将项目设置为更高的高亮优先级