如何使Vim突出显示非ASCII字符?


153

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

Answers:


291

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

/[^\x00-\x7F]

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

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

/[^\d0-\d127]

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


14
以十进制表示:/[^\d0-\d127]
Bohr

@Bohr这是一个很好的补充。我将在上面进行编辑。
Michael Berkowski

大!保存了一天!缩进字符之一粘贴到我的python代码中,并且unicode错误开始使我丧命。很难在vim插件使用的相同字符中检测到!
kollery '17

36

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

:help highlight
:help syn-match

syn-match定义一个匹配的字符串。 highlight定义组使用的颜色。只需考虑一下vimrc文件的语法突出显示即可。

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

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

您不需要:将vimrc中的命令放在前面。
FDinoff 2013年

termbg在Ubuntu Server 12.10上安装的VIM 7.3中似乎不是合法命令。
dotancohen

4
然后termbg似乎并不像安装Ubuntu服务器12.10在VIM 7.3合法参数。
dotancohen

实际上,常规终端term不能具有背景色,而彩色终端却cterm可以。
Dima Tisnek

删除了termbg,但是您可以添加ctermfg,guifg等来控制前台。
fatal_error

16

对于其他(从现在开始倒霉的人)通过搜索引擎进入此处并无法突出显示非ASCII字符的人,请尝试以下操作(将其放入.vimrc中):

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

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


我得到了E319: Sorry, the command is not available in this version: au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continueLinux mint 17.3
Nasser

3
尽管声明的目标是与已经定义的语法定义冲突,但是如果需要,可以将其添加containedin=ALL到最后一行的末尾,使其成为au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL。我发现分心值得(当允许使用unicode时),这里的原始答案无法if语句内捕获非ascii代码之类的东西……
svenevs

1
autocmd BufRead ....除非您有充分的理由不这样做,否则将您放入vim的自动组中总是比较安全的
Cbhihe

6

此正则表达式也适用。这是来自briceolion.com的第一个Google命中“ vim删除非ASCII字符”,并:set hlsearch突出显示了:

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

1
问题是要求突出显示非ASCII字符,而不是将其删除
chutsu 2015年

1
感谢您指出,我已经编辑了答案。看到此正则表达式也可以以不同于其他答案的方式回答该问题,这并没有太大的余地。我的原始答案是:%s/[^[:alnum:][:punct:][:space:]]//gc先突出显示,然后替换。
格兰特·鲍曼

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

您的函数在这里不起作用,不突出显示,并且还会使编码混乱。为什么要更改本地编码?
Werner 2014年

尝试更改encfenc。我更改了编码,因为我的默认编码是(在2013年)latin1。如果字符集为latin1,则该功能不会突出显示不可打印的字符。看不到突出显示,您必须ERROR在颜色语法文件中具有该键。这是我的:hi Error guifg=Black guibg=Orange
Reman 2015年

2

基于关于此主题的其他答案以及我在此处获得的答案,已将其添加到我的信息中.vimrc,以便可以通过键入来控制非ASCII高亮显示<C-w>1。它还会在内部显示注释,尽管您将需要为要使用的每种文件语法添加注释组。也就是说,如果您要编辑zsh文件,则需要添加zshComment到该行

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

否则,它将不会显示非ASCII字符(如果您想确保在所有组中都显示非ASCII字符,也可以设置containedin = 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>

1

不知何故,以上答案均不适用于我。

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

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


1
这将删除操作符要求突出显示的字符。
伯恩哈德·瓦格纳

您不是指[^ 0-9a-zA-Z,\ -_ \。],即\-吗?
ben26941 '18

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上将项目设置为更高的突出显示优先级

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.