【发布时间】:2021-11-01 20:14:34
【问题描述】:
我试图让 Vim 突出显示非 ASCII 字符。是否有可用的设置、正则表达式搜索模式或插件来执行此操作?
【问题讨论】:
我试图让 Vim 突出显示非 ASCII 字符。是否有可用的设置、正则表达式搜索模式或插件来执行此操作?
【问题讨论】:
在您的搜索中使用[] 字符类中的范围,您应该能够排除 ASCII 十六进制字符范围,因此突出显示(假设您启用了hlsearch)所有其他字符位于 ASCII 范围之外:
/[^\x00-\x7F]
这将对 ASCII 0x00 和 ASCII 0x7F (0-127) 之间的字符进行 否定 匹配(通过 [^]),并且似乎在我的简单测试中有效。当然,对于扩展 ASCII,使用 /[^\x00-\xFF] 将范围扩展到 \xFF 而不是 \x7F。
你也可以通过\d用十进制表示:
/[^\d0-\d127]
如果您需要更具体的内容,例如排除不可打印字符,则需要将这些范围添加到字符类 []。
【讨论】:
/[^\d0-\d127]
是的,有一个原生功能可以突出显示任何匹配的字符串。 在 Vim 中,做:
:help highlight
:help syn-match
syn-match 定义一个匹配的字符串属于一个组。
highlight 定义组使用的颜色。
想想你的 vimrc 文件的语法高亮。
因此您可以在 .vimrc 文件中使用以下命令:
syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2
【讨论】:
:放在你的vimrc命令前面。
termbg 似乎不是安装在 Ubuntu Server 12.10 上的 VIM 7.3 中的合法命令。
termbg 似乎不是安装在 Ubuntu Server 12.10 上的 VIM 7.3 中的合法参数。
term不能有背景色,而彩色终端cterm可以。
对于其他(从现在开始不那么倒霉)的人通过搜索引擎来到这里并且无法完成非 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 continue Linux mint 17.3
containedin=ALL到最后最后一行,使其成为au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL。我觉得值得分心(当允许使用 unicode 时),这里的原始答案确实 not 在 if 语句中捕获诸如非 ascii 代码之类的东西......
autocmd BufRead .... 包含在vim 的自动组中总是更安全,除非您有充分的理由不...
这个正则表达式也可以突出显示。这是来自briceolion.com 的“vim remove non-ascii characters”的第一个 google 命中,:set hlsearch 将突出显示:
/[^[:alnum:][:punct:][:space:]]/
【讨论】:
:%s/[^[:alnum:][:punct:][:space:]]//gc,它首先突出显示,然后替换。
[:alnum:][:punct:][:space:] 是在 UTF-8 语言环境中包含非 ascii 字符的字符类。
如果您也对不可打印字符感兴趣,请使用这个:/[^\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
【讨论】:
enc 更改为fenc。我更改了编码,因为我的默认编码是(2013 年)latin1。如果字符集是 latin1,该函数不会突出显示不可打印的字符。也看到突出显示,您必须在颜色语法文件中有键 ERROR。这是我的:hi Error guifg=Black guibg=Orange
根据关于此主题的其他答案和我得到的答案here 我已将此添加到我的.vimrc,以便我可以通过键入<C-w>1 来控制非 ascii 突出显示。它也显示在 cmets 中,尽管您需要为您将使用的每个文件语法添加注释组。也就是说,如果你要编辑一个 zsh 文件,你需要将zshComment 添加到该行
au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment
否则它不会显示非 ascii 字符(如果您想确保在所有组中显示非 ascii 字符,也可以设置 containsin=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>
【讨论】:
不知何故,以上答案都不适合我。
所以我用:1,$ s/[^0-9a-zA-Z,-_\.]//g
它保留了我感兴趣的大部分角色。
【讨论】:
已经有人回答了这个问题。但是,对于其他仍然有问题的人,这里是另一种解决方案,用于突出显示 cmets(或任何语法组)中的非 ascii 字符。这不是最好的,但它是一个临时修复。
大家可以试试:
:syntax match nonascii "[^\u0000-\u007F]" containedin=ALL contained |
\ highlight nonascii ctermfg=yellow guifg=yellow
这包含来自其他解决方案的混合部分。您可以删除contained,但是,从文档中,可能存在递归本身的潜在问题(据我所知)。要查看其他定义的模式,syn-contains 部分将包含它。
:help syn-containedin
:help syn-contains
【讨论】: