第5回Vimスクリプト入門みたいの(関数の定義)
" usr_41.txt vimスクリプトの書き方から " 「41.7 関数の定義」より " " 前回は関数の呼び出しを試した。次は関数の定義をしよう。 " " 関数の定義は :function を用いる。 " 早速 " :h :function " 関数の定義は以下の書式みたい。 " :fu[nction][!] {name}([arguments]) [range] [abort] " " とりあえず、注意する点は二つ。 " * 関数名はアルファベットの大文字からはじめること " * 再定義する場合には ! を付けること " 他にも引数の個数は20個までだとか、関数名に使える文字は[A-Za-z0-9_]だとか " があるが、上の二つで大丈夫かな。[range] [abort] に関しては保留。 " " とにかく一つ定義してみる。 fu! F1() ec 'fu! F1()' endf " :so % " :cal F1() " 特に問題なく動作する。:cal F1() は前回も書いた関数の呼び出し。 " " 引数を試す。 fu! F2(a1,a2,...) ec a:a1 ec a:a2 if (a:0 == 0) ec 'a:0 == 0' elsei (a:0 == 1) ec 'a:1 == 1' ec a:1 elsei (a:0 == 2) ec a:1 ec a:2 en ec a:3 endf " :cal F2() " 引数の個数が少なすぎるとエラー。当然ですね。 " :cal F2('a',1) " 問題なく終了。 " :cal F2('a',1,'b') " 問題なく終了 " :cal F2('a',1,'b',2) " 問題なく終了 " :cal F2('a',1,'b',2,'c') " cは出力されないが問題なく終了 " " a:name で参照されているのが引数。呼び出しに必須。 " ... は可変長引数を表す。printfなどのアレ。これは任意。 " a:0 は可変長引数の個数 a:1 以降はそれぞれの引数。 " a:0 の個数を気にせず a:1 などを使うと未定義の変数だと言われるので、 " 可変長引数を使うときは個数に注意すること。 " " 次は値を返すものを作成する。 " " 値を返すには :return を使う " :h :return " :retu[rn] [expr] " " usr_41 にある Min を作ってみる fu! F3(a,b) retu ((a:a < a:b) ? a:a : a:b) endf " :ec F3(1,3) " 1を出力。正常。 " :ec F3(5,3) " 3を出力。正常。 " " Minのあった場所に書かれていたが、 " 関数内で変数はローカルらしい。 " あと三項演算子使ってみた。 " " 最後にもう一つサンプル fu! F4() let s = visualmode() . " : " let s = s . "'< (" . line("'<") . ',' . col("'<") . ") " . " : " let s = s . "'> (" . line("'>") . ',' . col("'>") . ") " retu s endf " 前回のビジュアルモードと、その選択範囲を返す " 詳細は以下を参照。 " :h visualmode() " :h col() " :h line() " :h :marks " " range と abort を放置してるけど、また必要になったら試してみる。 " " 今回のまとめ ( 次回予告との釣り合いのために改名 ) " :fu[nction][!] {name}([arguments]) [range] [abort] " :retu[rn] [expr] " " 次回予告 " :map でキー操作に関数を割り当ててみる。 " " なにげに一日飛んでるよね、うん。忙しいから、 " また時間が空いたときに二回分作るかな。 "