关于正则表达式:如何让Vim突出显示非ascii字符?

How to get Vim to highlight non-ascii characters?

我试图让Vim突出显示非ASCII字符。是否有可用的设置、regex搜索模式或插件?


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

1
/[^\x00-\x7F]

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

您也可以通过\d以十进制表示:

1
/[^\d0-\d127]

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


是的,对于任何匹配的字符串,都有一个本机功能来进行突出显示。内部VIM,DO:

1
2
:help highlight
:help syn-match

syn-match定义了一个匹配的字符串,该字符串属于一个组。highlight定义组使用的颜色。只需考虑Vimrc文件的语法突出显示。

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

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


对于其他人(从现在开始不那么倒霉)来说,他们是通过搜索引擎在这里结束的,无法完成非ASCII字符的突出显示,请尝试此操作(将其放入.vimrc中):

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

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


如果您对不可打印字符也感兴趣,请使用以下字符:/[^\x00-\xff]/

我在函数中使用它:

1
2
3
4
5
6
7
8
9
10
 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


这个正则表达式也可以工作。这是谷歌从briceolion.com上首次点击"vim删除非ASCII字符",使用:set hlsearch将突出显示:

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


基于关于这个主题的其他答案和我在这里得到的答案,我将这个添加到我的.vimrc中,这样我就可以通过键入1来控制非ASCII突出显示。它还显示在注释内部,尽管您需要为将要使用的每个文件语法添加注释组。也就是说,如果要编辑zsh文件,则需要将zshComment添加到行中。

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

否则,它不会显示非ASCII字符(如果要确保在所有组中显示非ASCII字符,还可以设置containedIn=all)。要检查如何对不同的文件类型调用注释,请打开所需类型的文件,并在VIM上输入:sy,然后搜索注释的语法项。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
function HighlightNonAsciiOff()
  echom"Setting non-ascii highlight off"
  syn clear nonascii
  let g:is_non_ascii_on=0
  augroup HighlightUnicode
  autocmd!
  augroup end
endfunction

function HighlightNonAsciiOn()
  echom"Setting non-ascii highlight on"
  augroup HighlightUnicode
  autocmd!
  autocmd ColorScheme *
        \ syntax match nonascii"[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment |
        \ highlight nonascii cterm=underline ctermfg=red ctermbg=none term=underline
  augroup end
  silent doautocmd HighlightUnicode ColorScheme
  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 <C-w>1 :call ToggleHighlightNonascii()<CR>


有人已经回答了这个问题。但是,对于仍有问题的其他人,这里有另一个解决方案来突出显示注释中的非ASCII字符(或相关的任何语法组)。这不是最好的,但只是暂时的解决办法。

可以尝试:

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

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

1
2
:help syn-containedin
:help syn-contains

复制的问题来源:将项目设置为VIM上更高的突出显示优先级


不知怎的,以上的答案对我来说都不管用。

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

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