10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-15

全角空白を可視化する設定はよく見るけど、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で入力できる。

10
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?