Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vimで全角空白以外のユニコードの空白文字もハイライト&取り除く

$
0
0

全角空白を可視化する設定はよく見るけど、webからコードをコピペしたら、EN SPACE(Nと同じ幅のスペース)でSPACEと見分けがつかなかったので、それも可視化し、取り除くこともできるようにした。

set list

まず、基本として、以下の設定をしておく。

" 不可視文字の表示setlist" tab: »-" 行末の空白: ・" ノーブレークスペース: ⍽" 画面の右側に文字があるとき: »" 画面の左側に文字があるとき: «setlistchars=tab-,trail:・,nbsp:⍽,extends:»,precedes:«

SHOULDERED OPEN BOX (U+237D)と呼ばれるもので「Graphics for keyboard symbol for no break space」と書いてあるので、これをノーブレークスペースに使った。
あとlistcharsでよくある設定としてeol:↵があるけど、すべての文末に表示されるとうるさいのでやってない。

スペース以外の空白文字をハイライト

全角スペースを許すプログラミング言語まとめ | プログラミング生放送を見ると、PowerShellが一番ゆるそうで、「Any character with Unicode class Zs, Zl, or Zp」がwhitespaceとしてみなされるらしい。
これらの空白文字に対してハイライトすることにする。

それらのユニコード一覧はUnicode Character Categoriesに載っている。
また、空白文字の説明はUnicode spacesが詳しい。
Zs(Separator, Space), Zl(Separator, Line), Zp(Separator, Paagraph)のカテゴリに含まれる文字の中で、SPACEと、NO-BREAK SPACE(listで可視化出来ている)、OGHAM SPACE MARK(で空白ではない)以外の文字をハイライトする。

augroup MyVimrc
    autocmd!
augroup END

augroup MyVimrc
    autocmdColorScheme * highlight UnicodeSpaces cterm=underline ctermfg=59 ctermbg=16gui=underline guifg=#465457 guibg=#000000autocmdVimEnter,WinEnter * match UnicodeSpaces /\%u180E\|\%u2000\|\%u2001\|\%u2002\|\%u2003\|\%u2004\|\%u2005\|\%u2006\|\%u2007\|\%u2008\|\%u2009\|\%u200A\|\%u2028\|\%u2029\|\%u202F\|\%u205F\|\%u3000/
augroup END

" 上の設定より下でcolorscheme<your colorscheme>

ハイライトはSpecialKeyと同じハイライトに下線を入れる設定にした。自分の使っているcolorschemeのSpecialKeyの設定は:highlight SpecialKeyで確認できる。
match部分でハイライトしたい文字の正規表現を設定している。例えば\%u3000はU+3000(IDEOGRAPHIC SPACE、全角空白)を表す正規表現。

行末の空白を削除&スペース以外の空白文字をスペースに変換

行末のSPACE, TABを削除し、ユニコードのカテゴリZs, Zl, Zpの中で、SPACEとOGHAM SPACE MARK以外の空白をSPACEに変換するコマンド。

command!-range=% FixSpaces call<SID>fix_spaces(<line1>,<line2>)function!s:fix_spaces(line1, line2)    " Save the current search and cursor positionlet _s=@/
    letl= line('.')letc=col('.')    " Trim trailing spacessilent! execute ':' . a:line1 . ',' . a:line2 . 's/\s\+$//e'    " Replace unicode spaces to normal spacesilent! execute ':' . a:line1 . ',' . a:line2 . 's/\%u00A0\|\%u180E\|\%u2000\|\%u2001\|\%u2002\|\%u2003\|\%u2004\|\%u2005\|\%u2006\|\%u2007\|\%u2008\|\%u2009\|\%u200A\|\%u2028\|\%u2029\|\%u202F\|\%u205F\|\%u3000/ /ge'    " Restore the saved search and cursor positionlet @/=_s
    call cursor(l,c)endfunction

:FixSpacesでバッファ全体、範囲指定するとその範囲だけ変換する。

ntpeters/vim-better-whitespace: Better whitespace highlighting for Vimのコードを一部参考にした。

ユニコードの文字コードで文字入力

Google日本語入力だとU+3000などと打つと候補にそれを表す文字が表示される。
Vimだと挿入モードで<C-v>u3000で入力できる。

また、ノーブレークスペースはダイグラフの入力ができて、挿入モードで<C-k><Space><Space><C-k>NSで入力できる。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>