171

我试图让 Vim 突出显示非 ASCII 字符。是否有可用的设置、正则表达式搜索模式或插件来执行此操作?

4

8 回答 8

323

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

/[^\x00-\x7F]

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

您也可以通过以下方式以十进制表示\d

/[^\d0-\d127]

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

于 2013-06-07T15:17:05.823 回答
39

是的,有一个本机功能可以突出显示任何匹配的字符串。在 Vim 中,执行以下操作:

:help highlight
:help syn-match

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

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

syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2
于 2013-06-07T16:00:19.933 回答
18

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

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

这具有不与常规(基于文件类型 [文件扩展名])语法定义冲突的额外好处。

于 2014-10-06T03:31:32.527 回答
8

这个正则表达式也可以突出显示。这是来自briceolion.com的“vim remove non-ascii characters”的第一个谷歌点击,并将:set hlsearch突出显示:

/[^[:alnum:][:punct:][:space:]]/
于 2015-12-29T18:43:13.647 回答
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
于 2013-06-16T13:04:06.300 回答
2

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

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

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

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>
于 2014-12-29T14:21:30.013 回答
0

不知何故,以上答案都不适合我。

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

它保留了我感兴趣的大多数角色。

于 2016-09-27T17:44:18.260 回答
0

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

可以尝试:

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

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

:help syn-containedin
:help syn-contains 

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

于 2017-04-03T12:00:16.863 回答