Vimに非ASCII文字を強調表示させる方法は?


153

Vimに非ASCII文字を強調表示させようとしています。利用可能な設定、正規表現検索パターン、またはそうするためのプラグインはありますか?

回答:


291

[]検索で文字クラスの範囲を使用すると、ASCII 16進文字範囲を除外できるため、ASCII範囲外にあるhlsearch他のすべての文字が強調表示されます(有効になっている場合)。

/[^\x00-\x7F]

これは、ASCII とASCII (0-127)の間の文字に対して(を介して)否定的な一致を行い、私の簡単なテストで機能するように見えます。もちろん、拡張ASCIIの場合、を使用する代わりに、範囲をまで拡張します。[^]0x000x7F\xFF\x7F/[^\x00-\xFF]

また、次のように10進数で表すこともできます\d

/[^\d0-\d127]

印刷できない文字の除外など、より具体的なものが必要な場合は、それらの範囲を文字クラスに追加する必要があります[]


14
10進数で:/[^\d0-\d127]
ボーア

@Bohrそれは素晴らしい追加です。上で編集します。
Michael Berkowski、

すごい!日を救った!インデント文字の1つが私のpythonコードに貼り付けられ、Unicodeエラーが私を殺し始めました。vimプラグインで使用されているのと同じ文字の中で検出するのは困難でした!
コレリ

36

はい、一致した文字列を強調表示するネイティブ機能があります。Vimの内部で、次の操作を行います。

:help highlight
:help syn-match

syn-match一致する文字列をグループに分類します。 highlightグループが使用する色を定義します。vimrcファイルの構文強調表示について考えてみてください。

したがって、.vimrcファイルで以下のコマンドを使用できます。

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

:vimrcでコマンドの前にを置く必要はありません。
FDinoff 2013年

termbgUbuntu Server 12.10にインストールされているVIM 7.3の合法的なコマンドではないようです。
dotancohen 2013年

4
そのtermbg場合、Ubuntu Server 12.10にインストールされているVIM 7.3では有効なパラメーターではないようです。
dotancohen 2013年

実際、通常の端末termは背景色を持つことができませんが、カラー端末ctermは持つことができます。
Dima Tisnek、2015

termbgを削除しましたが、ctermfg、guifgなどを追加してフォアグラウンドも制御できます。
fatal_error 2017年

16

検索エンジンを介してここに到達し、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 continueLinuxのミント17.3
ナセル

3
目標は、すでに定義されている構文定義と競合しないことを示していますが、必要に応じcontainedin=ALL、最終行の終わりに追加して、にすることができますau BufReadPost * syntax match nonascii "[^\u0000-\u007F]" containedin=ALL。(Unicodeが許可されている場合)私は価値のある注意散漫を見つけます、ここでの元の答えはステートメント内の非ASCIIコードなどのことをキャッチしませif ...
svenevs

1
autocmd BufRead ....Vimのautogroupに自分を含めることは常に安全です。ただし、特別な理由がない限り...
Cbhihe

6

この正規表現も機能します。これはbriceolion.comからの「vim非ASCII文字の削除」の最初のGoogleヒットであり、次の点:set hlsearchが強調表示されます。

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

1
問題は、非ASCII文字を削除するのはなく強調することです。
2015

1
ご指摘いただきありがとうございます。回答を編集しました。この正規表現が他の回答とは異なる方法で質問に回答することを確認するのはそれほど難しくありませんでした。私の元の答えは:%s/[^[:alnum:][:punct:][:space:]]//gc、最初に強調表示してから置き換えるものでした。
Grant Bowman

4

印刷できない文字にも関心がある場合は、次の文字を使用してください。/[^\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

あなたの関数はここでは機能せず、強調表示されず、エンコーディングも混乱します。なぜローカルエンコーディングを変更するのですか?
Werner、

に変更encしてみてくださいfenc。デフォルトのエンコーディングは(2013年では)latin1であるため、エンコーディングを変更しました。文字セットがlatin1の場合、関数は印刷不可能な文字を強調表示しません。ハイライトを表示するにERRORは、カラー構文ファイルにキーが必要です。これは私のものです:hi Error guifg=Black guibg=Orange
リマン

2

このトピックに関する他の回答と私がここで得た回答に基づいて、これをに追加した.vimrcので、と入力してASCII以外の強調表示を制御できます<C-w>1。使用するファイル構文ごとにコメントグループを追加する必要がありますが、内部コメントも表示されます。つまり、zshファイルを編集する場合は、次zshCommentの行に追加する必要があります。

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

そうでない場合、非ASCII文字は表示されません(すべてのグループで非ASCII文字を確実に表示したい場合は、containsin = ALLを設定することもできます)。別のファイルタイプでコメントがどのように呼び出されているかを確認するには、目的のタイプのファイルを開い:syてvim と入力し、構文項目でコメントを検索します。

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

どういうわけか、上記の答えはどれもうまくいきませんでした。

だから私は :1,$ s/[^0-9a-zA-Z,-_\.]//g

それは私が興味を持っているキャラクターのほとんどを保持します。


1
これにより、opが強調表示を要求した文字が削除さます
Bernhard Wagner

[^ 0-9a-zA-Z、\ -_ \。]、つまり\-?
ben26941

0

誰かがすでに質問に答えています。ただし、まだ問題がある他の人のために、コメント(または問題の構文グループ)で非ASCII文字を強調表示する別のソリューションを次に示します。それは最善ではありませんが、一時的な修正です。

1つ試すことができます。

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

これには、他のソリューションの部分が混在しています。を削除することはできますcontainedが、ドキュメンテーションから、(私が理解しているように)再帰自体の潜在的な問題がある可能性があります。他の定義済みパターンを表示syn-containsするには、セクションにそのパターン が含まれます。

:help syn-containedin
:help syn-contains 

複製された問題:vimでアイテムをハイライトの優先順位を高く設定する

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.