全角空白を可視化する設定はよく見るけど、webからコードをコピペしたら、EN SPACE(Nと同じ幅のスペース)でSPACEと見分けがつかなかったので、それも可視化し、取り除くこともできるようにした。
set list
まず、基本として、以下の設定をしておく。
" 不可視文字の表示
set list
" tab: »-
" 行末の空白: ・
" ノーブレークスペース: ⍽
" 画面の右側に文字があるとき: »
" 画面の左側に文字があるとき: «
set listchars=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
autocmd ColorScheme * highlight UnicodeSpaces cterm=underline ctermfg=59 ctermbg=16 gui=underline guifg=#465457 guibg=#000000
autocmd VimEnter,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 position
let _s=@/
let l = line('.')
let c = col('.')
" Trim trailing spaces
silent! execute ':' . a:line1 . ',' . a:line2 . 's/\s\+$//e'
" Replace unicode spaces to normal space
silent! 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 position
let @/=_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
で入力できる。