我想让 Vim 高亮显示非 ASCII 字符。是否有可用的设置、正则表达式搜索模式或插件来实现?
在你的搜索中使用[]
字符类中的范围,你应该能够排除ASCII十六进制字符范围,因此突出显示(假设你启用了hlsearch
)在ASCII范围之外的所有其他字符:
使用[]
字符类中的范围,在搜索中可以排除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
定义匹配的字符串分组, highlight
定义该分组所使用的颜色。 可以将其用于 vimrc 文件的语法高亮。
因此,您可以在 .vimrc 文件中使用以下命令:
syntax match nonascii "[^\x00-\x7F]"
highlight nonascii guibg=Red ctermbg=2
:
。 - FDinofftermbg
似乎不是一个合法的参数。 - dotancohen对于其他(从现在开始不那么不幸的)通过搜索引擎到达这里且无法突出非ASCII字符的人,请尝试将以下内容添加到您的.vimrc文件中:
highlight nonascii guibg=Red ctermbg=1 term=standout
au BufReadPost * syntax match nonascii "[^\u0000-\u007F]"
这样做的额外好处是不会与常规(基于文件类型[file extension]的)语法定义发生冲突。
E319: 抱歉,此版本中不可用的命令:au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" Press ENTER or type command to continue
Linux mint 17.3。 - Nassercontainedin=ALL
,使其变为au BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL
。当允许Unicode时,我认为这是值得分心的,因为原始答案无法捕获诸如在if
语句内部使用非ASCII代码之类的内容... - svenevsautocmd BufRead ....
放在自动组中以确保安全。 - Cbhihe:set hlsearch
进行高亮显示:/[^[:alnum:][:punct:][:space:]]/
:%s/[^[:alnum:][:punct:][:space:]]//gc
,它先进行高亮显示,然后再进行替换。 - Grant Bowman[:alnum:][:punct:][:space:]
是字符类,它们包含 UTF-8 区域设置下的非 ASCII 字符。 - KamilCuk/[^\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
hi Error guifg=Black guibg=Orange
。 - Reman根据此主题的其他答案和我在这里得到的答案,我已将以下内容添加到我的.vimrc
文件中,以便通过键入<C-w>1
来控制非ASCII高亮显示。它还会显示在注释中,但是您需要为每个文件语法添加注释组。也就是说,如果您要编辑zsh文件,则需要将zshComment
添加到该行。
au BufReadPost * syntax match nonascii "[^\x00-\x7F]" containedin=cComment,vimLineComment,pythonComment
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
它保留了我感兴趣的大部分字符。
有人已经回答了这个问题。然而,对于仍然遇到问题的其他人,这里提供另一种解决方案来突出显示注释中的非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中将项目设置为更高的突出显示优先级
/ [^ \ d0- \ d127]
的意思是匹配任何不属于 0-127 之间数字的字符。 - Bohr