物置き

smartchr.vim入れた


Tanablog:smartchrを入れた


上記のエントリを見てsmartchr.vimを入れ、
元エントリに書かれている通り、下記のように設定して使ってみた。

inoremap <buffer><expr> = smartchr#one_of(' = ', ' == ', '=')


おお、こりゃ便利、と思ったけど、
C/C++の場合、+=や|=のような複合代入演算子や、<=,>=などの比較演算子を入力する際に
意図しないスペースが挿入されるようになってしまった。
できれば、このへんの演算子を入力する際、無駄にキーを連打したくない。


そこで、=が入力された際は、カーソル直前の内容をチェックして
+,-,*,/,&,|,>,<,! の後に続かない場合だけ、smartchr#one_ofを呼ぶように設定した。(%=は使わないので無視)
で、これらの演算子に続く=の場合には、直前の空白を削除するようにした。


あと、同様に#includeの直後にくる < も後ろに空白を入れたくないので、これもチェックするようにした。


結果、こんな感じの設定になった。

" 演算子の間に空白を入れる
inoremap <buffer><expr> < search('^#include\%#', 'bcn')? ' <': smartchr#one_of(' < ', ' << ', '<')
inoremap <buffer><expr> > search('^#include <.*\%#', 'bcn')? '>': smartchr#one_of(' > ', ' >> ', '>')
inoremap <buffer><expr> + smartchr#one_of(' + ', '++', '+')
inoremap <buffer><expr> - smartchr#one_of(' - ', '--', '-')
inoremap <buffer><expr> / smartchr#one_of(' / ', '// ', '/')
" *はポインタで使うので、空白はいれない
inoremap <buffer><expr> & smartchr#one_of(' & ', ' && ', '&')
inoremap <buffer><expr> % smartchr#one_of(' % ', '%')
inoremap <buffer><expr> <Bar> smartchr#one_of(' <Bar> ', ' <Bar><Bar> ', '<Bar>')
inoremap <buffer><expr> , smartchr#one_of(', ', ',')
" 3項演算子の場合は、後ろのみ空白を入れる
inoremap <buffer><expr> ? smartchr#one_of('? ', '?')
inoremap <buffer><expr> : smartchr#one_of(': ', '::', ':')

" =の場合、単純な代入や比較演算子として入力する場合は前後にスペースをいれる。
" 複合演算代入としての入力の場合は、直前のスペースを削除して=を入力
inoremap <buffer><expr> = search('\(&\<bar><bar>\<bar>+\<bar>-\<bar>/\<bar>>\<bar><\) \%#', 'bcn')? '<bs>= '
				\ : search('\(*\<bar>!\)\%#', 'bcn') ? '= '
				\ : smartchr#one_of(' = ', ' == ', '=')

" 下記の文字は連続して現れることがまれなので、二回続けて入力したら改行する
inoremap <buffer><expr> } smartchr#one_of('}', '}<cr>')
inoremap <buffer><expr> ; smartchr#one_of(';', ';<cr>')
" 「->」は入力しづらいので、..で置換え
inoremap <buffer><expr> . smartchr#loop('.', '->', '...')
" 行先頭での@入力で、プリプロセス命令文を入力
inoremap <buffer><expr> @ search('^\(#.\+\)\?\%#','bcn')? smartchr#one_of('#define', '#include', '#ifdef', '#endif', '@'): '@'

inoremap <buffer><expr> " search('^#include\%#', 'bcn')? ' "': '"'
" if文直後の(は自動で間に空白を入れる
inoremap <buffer><expr> ( search('\<\if\%#', 'bcn')? ' (': '('


なんかもっとましな書き方があるような気がしなくもないけど、まあいいや。
とりあえずこれで、意図しない空白は挿入されなくなり、その結果幸せな気分になることに成功した。
ああでも、templateとか(static|dynamic)_castの際の<>の入力で、ちょっと煩雑かも。まあいいや。
これで、しばらく使ってみよう。


後は、「空白を入力しない」ことになれるだけ!