web-dev-qa-db-ja.com

Vimで非ASCII文字を強調表示するにはどうすればよいですか?

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

134
chutsu

検索で[]文字クラスの範囲を使用すると、exclude ASCII 16進文字範囲ができるはずです。したがって、他のすべてを強調表示(hlsearchが有効になっていると仮定)横になっている文字外側 ASCIIの範囲:

/[^\x00-\x7F]

これは、ASCII [^]とASCII 0x00(0-127)の間の文字に対してnegativeマッチ(0x7Fを介して)を行います。 、そして私の簡単なテストで動作するようです。もちろん、拡張ASCIIの場合、\xFFを使用して、\x7Fではなく/[^\x00-\xFF]まで範囲を拡張します。

\dで10進数で表現することもできます:

/[^\d0-\d127]

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

257

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

:help highlight
:help syn-match

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

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

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

検索エンジンを介してここにたどり着き、非ASCII文字の強調表示を達成できない他の(これからは不運な)人々のために、これを試してください(これを.vimrcに入れてください):

highlight nonascii guibg=Red ctermbg=1 term=standout
au BufReadPost * syntax match nonascii "[^\u0000-\u007F]"

これには、通常の(ファイルタイプ[ファイル拡張子]ベース)構文定義と衝突しないという利点があります。

15
PAStheLoD

non printable文字にも興味がある場合は、これを使用してください:/[^\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
4
Reman

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

:/[^[:alnum:][:punct:][:space:]]/g
3
Grant Bowman

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

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

それ以外の場合、非ASCII文字は表示されません(すべてのグループで非ASCII文字を表示したい場合は、containedin = 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
Werner

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

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

興味のあるキャラクターのほとんどが保持されます。

0
user2250246

すでに誰かが質問に答えています。ただし、まだ問題がある他の人のために、コメント内の非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でアイテムをハイライト優先度に設定

0
nate