【问题标题】:How to get Vim to highlight non-ascii characters?如何让 Vim 突出显示非 ASCII 字符?
【发布时间】:2021-11-01 20:14:34
【问题描述】:

我试图让 Vim 突出显示非 ASCII 字符。是否有可用的设置、正则表达式搜索模式或插件来执行此操作?

【问题讨论】:

    标签: regex vim


    【解决方案1】:

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

    /[^\x00-\x7F]
    

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

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

    /[^\d0-\d127]
    

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

    【讨论】:

    • 十进制:/[^\d0-\d127]
    • @Bohr 这是一个很好的补充。我会在上面编辑它。
    • 太棒了!拯救了一天!一个缩进字符被粘贴到我的 python 代码中,unicode 错误开始杀死我。在 vim 插件使用的相同字符中很难检测到!
    【解决方案2】:

    是的,有一个原生功能可以突出显示任何匹配的字符串。 在 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可以。
    • 删除了 termbg 但您可以添加 ctermfg、guifg 等来控制前台。
    【解决方案3】:

    对于其他(从现在开始不那么倒霉)的人通过搜索引擎来到这里并且无法完成非 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 时),这里的原始答案确实 notif 语句中捕获诸如非 ascii 代码之类的东西......
    • autocmd BufRead .... 包含在vim 的自动组中总是更安全,除非您有充分的理由不...
    【解决方案4】:

    这个正则表达式也可以突出显示。这是来自briceolion.com 的“vim remove non-ascii characters”的第一个 google 命中,:set hlsearch 将突出显示:

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

    【讨论】:

    • 问题是要求突出显示非ASCII字符,不删除它们
    • 感谢您指出这一点,我已经编辑了我的答案。看到这个正则表达式也以不同于其他答案的方式回答了这个问题,这并不难。我最初的答案是:%s/[^[:alnum:][:punct:][:space:]]//gc,它首先突出显示,然后替换。
    • [:alnum:][:punct:][:space:] 是在 UTF-8 语言环境中包含非 ascii 字符的字符类。
    【解决方案5】:

    如果您也对不可打印字符感兴趣,请使用这个:/[^\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
    【解决方案6】:

    根据关于此主题的其他答案和我得到的答案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>
    

    【讨论】:

      【解决方案7】:

      不知何故,以上答案都不适合我。

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

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

      【讨论】:

      • 删除操作要求突出显示的字符。
      • 你不是说[^0-9a-zA-Z,\-_\.],即\-?
      【解决方案8】:

      已经有人回答了这个问题。但是,对于其他仍然有问题的人,这里是另一种解决方案,用于突出显示 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 
      

      复制问题来自:Set item to higher highlight priority on vim

      【讨论】:

        猜你喜欢
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 2011-05-10
        • 2014-06-18
        相关资源
        最近更新 更多