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

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

84591 次浏览

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

/[^\x00-\x7F]

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

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

/[^\d0-\d127]

如果您需要更具体的东西,比如排除非打印字符,您需要将这些范围添加到字符类 []中。

是的,对于任何匹配的字符串都有一个本地特性来做高亮显示。 进入 Vim,做:

:help highlight
:help syn-match

syn-match定义一个字符串,该字符串与 fall 分组匹配。 highlight定义组使用的颜色。 想想你的 vimrc 文件的语法突显。

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

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

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

对于其他(从现在开始不那么不幸)的人通过搜索引擎结束在这里,不能完成突出显示非 ASCII 字符,尝试这一点(把它放入您的。Vimrc) :

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

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

基于这个话题的其他答案和我得到的 给你的答案,我已经把它添加到我的 .vimrc,这样我就可以通过键入 <C-w>1来控制非 ASCI 高亮。它还显示在注释中,不过您需要为将要使用的每个文件语法添加注释组。也就是说,如果要编辑 zsh 文件,就需要将 zshComment添加到行中

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

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

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>

这个 regex 也可以突出显示。这是第一次谷歌点击“ vim 删除非 ascii 字符”从 Briceolion.com:set hlsearch将突出:

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

不知为什么,以上的答案对我都不管用。

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

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

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

你可以试试:

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

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

:help syn-containedin
:help syn-contains

复制问题来自: 将项目设置为 vim 上的高亮优先级