如何让Vim突出显示非ascii字符?

时间:2013-06-07 15:09:16

标签: regex vim

我正在尝试让Vim突出显示非ASCII字符。是否有可用的设置,正则表达式搜索模式或插件?

8 个答案:

答案 0 :(得分:246)

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

/[^\x00-\x7F]

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

您也可以通过\d

以十进制表达
/[^\d0-\d127]

如果您需要更具体的内容,例如排除不可打印的字符,则需要将这些范围添加到字符类[]中。

答案 1 :(得分:31)

是的,有一个原生功能可以突出显示任何匹配的字符串。 在Vim里面,做:

:help highlight
:help syn-match

syn-match定义匹配落入组的字符串。 highlight定义组使用的颜色。 想想你的vimrc文件的语法高亮。

因此,您可以在.vimrc文件中使用以下命令:

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

答案 2 :(得分:14)

对于其他(从现在开始不那么不走运)人们通过搜索引擎到达这里并且无法完成非ASCII字符的突出显示,试试这个(把它放到你的.vimrc中):

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

这样做的另一个好处是不会与常规(基于文件类型[文件扩展名]的)语法定义发生冲突。

答案 3 :(得分:4)

如果您对不可打印字符感兴趣,请使用以下字符:/[^\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

答案 4 :(得分:3)

这个正则表达式也有效。这是briceolion.com中“vim删除非ascii字符”的第一个谷歌热门,:set hlsearch将突出显示:

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

答案 5 :(得分:1)

基于此主题的其他答案和我得到的答案here我已将此添加到.vimrc,以便我可以通过键入{{1}来控制非ascii突出显示}。它还显示了内部注释,但您需要为将要使用的每个文件语法添加注释组。也就是说,如果您要编辑zsh文件,则需要将<C-w>1添加到该行

zshComment

否则它不会显示非ascii字符(如果你想确保在所有组中显示非ascii字符,你也可以设置containsin = ALL)。要检查如何在其他文件类型上调用注释,请打开所需类型的文件并在vim上输入au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment ,然后搜索注释的语法项。

:sy

答案 6 :(得分:0)

上述答案中没有一个对我有用。

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

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

答案 7 :(得分:0)

有人已经回答了这个问题。但是,对于仍然存在问题的其他人,这里是另一个解决方法,以突出显示注释中的非ascii字符(或该问题中的任何语法组)。它不是最好的,但它是一个临时修复。

有人可能会尝试:

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

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

:help syn-containedin
:help syn-contains 

来自Set item to higher highlight priority on vim的复制问题