我试图让 Vim 突出显示非 ASCII 字符。是否有可用的设置,正则表达式搜索模式,或插件这样做?
在你的搜索中使用 []字符类的范围,你应该能够 排除的 ASCII 十六进制字符范围,因此突出显示(假设你启用了 hlsearch)所有其他字符位于 在外面的 ASCII 范围:
[]
hlsearch
/[^\x00-\x7F]
这将为 ASCII 0x00和 ASCII 0x7F(0-127)之间的字符执行 没有匹配(通过 [^]) ,并且似乎在我的简单测试中起作用。当然,对于扩展的 ASCII,使用 /[^\x00-\xFF]将范围扩展到 \xFF而不是 \x7F。
0x00
0x7F
[^]
/[^\x00-\xFF]
\xFF
\x7F
你也可以通过 \d用十进制表示:
\d
/[^\d0-\d127]
如果您需要更具体的东西,比如排除非打印字符,您需要将这些范围添加到字符类 []中。
是的,对于任何匹配的字符串都有一个本地特性来做高亮显示。 进入 Vim,做:
:help highlight :help syn-match
syn-match定义一个字符串,该字符串与 fall 分组匹配。 highlight定义组使用的颜色。 想想你的 vimrc 文件的语法突显。
syn-match
highlight
因此,可以在.vimrc 文件中使用以下命令:
syntax match nonascii "[^\x00-\x7F]" highlight nonascii guibg=Red ctermbg=2
如果您还对 不能打印字符感兴趣,请使用以下字符: /[^\x00-\xff]/
/[^\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添加到行中
.vimrc
<C-w>1
zshComment
au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment
否则它将不会显示非 ascii 字符(如果希望确保在所有组中都显示非 ascii 字符,也可以设置 contedin = ALL)。要检查如何在不同的文件类型上调用注释,请打开所需类型的文件并在 vim 上输入 :sy,然后在语法项中搜索该注释。
: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将突出:
:set hlsearch
/[^[:alnum:][:punct:][:space:]]/
不知为什么,以上的答案对我都不管用。
所以我用了 :1,$ s/[^0-9a-zA-Z,-_\.]//g
: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部分将包含它。
contained
syn-contains
:help syn-containedin :help syn-contains
复制问题来自: 将项目设置为 vim 上的高亮优先级