第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 でキー操作に関数を割り当ててみる。
"
" なにげに一日飛んでるよね、うん。忙しいから、
" また時間が空いたときに二回分作るかな。
"