如何让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中将项目设置为更高的高亮优先级