はじめに
突然ですが、皆さんはC言語での関数やforの中括弧、どこに書いてますか?
intmain(void){//関数の括弧のすぐに書く横派}intmain(void){//改行した行頭に書く派}
僕は上の括弧のすぐ横に書く派なのですが、学校で配布されるサンプルプログラムは改行した行頭に中括弧がついているのです。おまけにインデントが2tabだし、代入するときにイコールと変数の間にスペースを入れるし、GUIのemacs使ってるやつがほとんどだし、とことん僕と趣味が合わないのです。(穏やかな表現)
インデントの2tabはgg=Gで修正できますが、中括弧の位置は置換とかではどうにもなりません。
括弧の横に中括弧が無いと気が済まないので毎回半ギレで修正しています。
今回はvimscriptをかいてvimからコマンドで中括弧の位置を自動で修正できるようにしたいと思います。
環境
# uname -a
Linux kali 4.18.0-kali2-amd64 #1 SMP Debian 4.18.10-2kali1 (2018-10-09) x86_64 GNU/Linux# nvim -v
NVIM v0.3.4
今回は、neovimですが当然vimでも同じ要領で動きます。
準備
vimscriptを置くディレクトリを作成する
既にある人は飛ばしてください。
作成するところは適当なところで構いません。僕は~/.vimにmy_scriptというディレクトリで作成しました。
# mkdir ~/.vim/my_script
ファイルを作成し、設定する
そうしたら、vimscriptを記述するファイルを適当に作成し、
# touch ~/.vim/my_script/bracket.vim
vimを使っている人はvimrcにnvimを使っている人はinit.vimに以下の一文を追加します。
"source さっき作成したファイルのパス
source ~/.vim/my_script/bracket.vim
プログラム
さっき作成したファイルに記述していきます。
まともなvimscriptを書くのは初めてなのでガバガバですが、一行ずつ確認していって行頭あるいは、複数の\tの後ろに中括弧({)があったら、その行を削除し一つ前の行の末尾に中括弧を追加しています。
もしかしたら、中括弧の後にコメントを書く狂人がいるかもしれないので、その場合は行を削除せず、中括弧だけ消しています。
"Fixがコマンド名。ここを書き換えれば、呼び出すコマンド名を変えられる。
command! Fix call Fix_bracket()function! Fix_bracket()let index=0"全行を取得し配列に格納 let line_list=getline(0,'$')for row in line_list
"もし、rowの行頭に(tabを除く){があったら if row=~'^\t*{$'"該当する行を削除
execute index+1."delete"let index-=1"該当する行の一つ前の行の末尾に{を挿入 call setline(index+1,getline(index+1)."{")elseif row=~'^\t*{.\+'let row=substitute(row,'{','','g')call setline(index+1,row)call setline(index,getline(index)."{")endiflet index+=1endfor"ついでにオートインデントで2tabや4tabを8tab(自分が設定しているtabstop)に修正
normal gg=G
endfunction
保存してvimで
:Fix
と実行すると、オートインデントされ、きれいに中括弧の位置が整えられます。
これが
#include <stdio.h>
intmain(void){inti;intmax=1000;for(i=1;i<=max;i++){if(i%3==0){printf("fizz\n");}elseif(i%5==0){printf("bizz\n");}else{printf("%d\n",i);}}}
こーなる
#include <stdio.h>
intmain(void){inti;intmax=1000;for(i=1;i<=max;i++){if(i%3==0){printf("fizz\n");}elseif(i%5==0){printf("bizz\n");}else{printf("%d\n",i);}}}
すっきり。(個人的に)
最後に
初めてvimrc以外でvimscriptをさわりました。記法もそうですが正規表現の癖がすごいですね...(惨敗)
間違えていたり、こうしたほうがいいよという部分があればコメントお願いします。
アレ?逆verは?
ねぇよそんな危険なもん。