その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

行の末尾の空白文字と決別する

ソースコードの各行の末尾に空白文字があると精神衛生上良くないので消す派です.常に消しておくようにすると,VCSのdiffにノイズが乗らなくて良いと思います.

そこで僕は以下のようにVimを設定して対応しています.


以下のようにすると,保存時にフックして末尾の空白を削除出来るようになります.
また,:ToggleRemoveTrailingWhiteSpaceというコマンドを実行すると,
フックして削除するか否か,という状態をトグルさせることが出来ます.
色々な理由で *1 末尾空白を消したくない時にはトグルして機能を一時的に殺すと良いでしょう.

Markdownは末尾に半角スペースを2発入れる事によってブロック内での改行を行う仕様となっているため,
自動的に半角スペースを削除されると具合が悪いことになります.
従って,以下の設定ではMarkdownの編集時には常にdisabledになるようにしています.

" 保存時にフックして常に末尾の空白を削除する
let g:does_remove_trailing_white_space = 1
au MyAutoCmd BufWritePre * call s:removeTrailingWhiteSpace()
func! s:removeTrailingWhiteSpace()
  if &ft != 'markdown' && g:does_remove_trailing_white_space == 1
    :%s/\s\+$//ge
  endif
endf

" `:ToggleRemoveTrailingWhiteSpace` というコマンドを実行すると
" 保存時にフックして空白を削除するか否かをトグル
command! -nargs=0 ToggleRemoveTrailingWhiteSpace
  \ call s:toggleRemovingTrailingWhiteSpaceStatus()
func! s:toggleRemovingTrailingWhiteSpaceStatus()
  let g:does_remove_trailing_white_space =
    \ !g:does_remove_trailing_white_space
endfunc

また,以下のようにすると末尾の空白文字を真っ赤にハイライトすることが出来るため,可視化が捗って便利.
おまけでハードタブにもささやかに色を付けたりなどしています.

highlight TrailingSpaces ctermbg=red guibg=#FF0000
highlight Tabs ctermbg=black guibg=#000000
au BufNewFile,BufRead * call matchadd('TrailingSpaces', ' \{-1,}$')
au BufNewFile,BufRead * call matchadd('Tabs', '\t')

*1:既に末尾空白がたくさんあるプロジェクトのソースコードに変更を加える時に,自分の流儀をプロジェクトに押し付けるのもなんだか気が引けるなァ……みたいな時とか