上記のエントリを見て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の際の<>の入力で、ちょっと煩雑かも。まあいいや。
これで、しばらく使ってみよう。
後は、「空白を入力しない」ことになれるだけ!