Vim Scriptで初めてのコマンド作成
初めてVim Scriptの文法について少し学習したので、とりあえず動くものを作ってみよう、ということで.vimrc
に実行可能な関数を書いてみました。
今回やったことは、コマンドを打ったらカレントバッファに指定された文字列が入力されるようにすることです。最近勉強しているC++のファイルを効率よく書けるように、テンプレートを入力してくれる関数とそれを呼び出すコマンドを作成しました。
コードに改善の余地はたくさんあると思いますが、今回学んだ文法についても説明させていただきます。
cppファイル用のテンプレート入力コマンド
作ったもの
:CplusTemplate
と入力すると、
#include <iostream> using namespace std; int main() { return 0; }
を入力してくれます。
コードの説明
以下を.vimrc
に書きました。
function! CplusTemplate() return setline('.', ['#include <iostream>', '', 'using namespace std;', '', 'int main() {', '', ' return 0;', '}']) endfunction command CplusTemplate :call CplusTemplate()
function Funcname()...endfunction
で囲うことで関数を定義できます。function!
とすることで、関数の再定義ができます。.vimrc
に関数が定義されて読み込まれている状態で、source ~/.vimrc
等でもう一度.vimrc
を読み込むと、function
の場合にはエラーとなってしまいます。- そのため、
.vimrc
に書く際にはfunction
ではなくfunction!
で書くべきなようです。 - 参考:VimScriptざっくりチュートリアル(関数編) - かせいさんとこ
setline( {ターゲット行}, '{文字列}' )
で、カレントバッファの指定した行を文字列で置き換えることができます。- ターゲット行として
'.'
を使うと、現在カーソルがある行が指定されます。 - 第二引数に文字列の配列を渡すと、それぞれの文字列が改行されて出力されます。
- ターゲット行として
command {Command} :call Funcname()
で関数を呼び出すコマンドを指定できます。:Command
で関数を実行できるようになります。
ヘッダーファイル用のテンプレート入力コマンド
作ったもの
:CplusTemplateHeader
と入力すると、
#ifndef _{FILENAME}_H_ #define _{FILENAME}_H_ #endif // _{FILENAME}_H_
を入力してくれます。
コードの説明
以下を.vimrc
に書きました。
function! CplusTemplateHeader() let filename = expand("%:r") let filenameConst = '_' . toupper(filename) . '_H_' return setline('.', ['#ifndef '. filenameConst, '#define ' . filenameConst, '', '#endif //' . filenameConst]) endfunction command CplusTemplateHeader :call CplusTemplateHeader()
上の方で既出のものは省略します。
let {variable}
は値を代入するときに使います。一度let x = 1
としていても、その後でlet
を省略してx =2
とはできません。代入時には必ずlet
が必要です。expand("%:r")
は現在のファイル名の拡張子を除いたものを返します。%:r
の部分を変えることでいろいろな形でファイル名を取得できます。let filenameConst = '_' . toupper(filename) . '_H_'
の.
は、文字列の結合を表します。toupper()
は引数の文字列を大文字に返してくれる組み込みの関数です。
おわりに
この一年ほどよく理解せずにおすすめの.vimrc
の設定等をコピペして使っていましたが、実際に自分で書いてみて理解が深まりました。
最後にVim Scriptについて調べるのに使ったサイトをまとめておきます。