第11回Vimスクリプト入門みたいの(リストソート用関数・変換用関数・関数呼出用関数)
ええと、うまく分割できなかったので、メモをほとんどそのままうp。昨日書いたロックマンは片付いたんで、次は課題図書です。Vimはその3つくらい後かな。優先順位が低いです。
あと、ええと、ブクマのコメ確認しました。genutilsやらtlibやらですね、見てみて「イケる!」と思ったら書きます。まだ、それが何なのかさえわかってないので、また何か書きます。
そろそろ、だれてきたので今回でリスト関係の関数はおしまい。まだDictionaryやらFuncrefやらの型が続くと思うとぞっとします。リストより前に文字列操作をやるべきだったんじゃと思ってます、はい。では以下コピペ。
" リストのソート用関数・変換用関数・関数呼出用関数 " sort(), reverse(), join(), split(), string(), repeat(), call() " " ソート用関数 " sort(), reverse() " " sort() function! s:Compare(v1, v2) return ((a:v1 == a:v2) ? 0 : ((a:v1 > a:v2) ? 1 : -1)) endfunction let a = ['a', 'B', 'c'] echo sort(copy(a)) let a = ['a', 'B', 'c'] echo sort(a, 1) let a = [1, 3, 2] echo sort(a, "<SID>Compare") " 渡されたリストをソートし、そのリストを返す。 " 第2引数は1を渡せば、大文字小文字を区別しないソート。 " 関数名を文字列で渡せば、それを比較関数として解釈する。 " 比較関数についてはC言語のそれと同じ。 " " reverse() let a = range(1,5) echo reverse(a) let a = ['a', 'c', 'b'] echo reverse(a) " 渡されたリストを逆順にし、そのリストを返す。 " " sort(), reverse()は両方とも第1引数自体に変更をかけにいくので注意。 " " " 変換用関数 " join(), split(), string(), repeat() " " join() let a = range(1, 5) echo join(a) echo join(a, "\n") " リストの各要素を第2引数で区切った文字列を返す。 " ただ :echo としてもリストの出力はできるけど、 " 少し整形して出力したいときなどに使いやすい。 " " split() let s = 'a b c d' let a = split(s) echo a let s = join(a, ',') echo split(s, ',') echo split(s,',\zs') " 文字列を分割してリストを返す。要はjoin()の逆。 " 第2引数は区切り文字を表す正規表現。初期では空白。 " 例は書いていないが、最初や最後の要素が空文字になる場合は、 " 第3引数に1を指定しておかないと要素が削除されるらしい。 " " string() let a = range(1,5) echo string(a) " リストを:echoしたときと同じ形式の文字列を返す。evalで元に戻せる。 " リストに限った関数じゃないので、リストを操作する関数と言っていいのかな。 " " repeat() echo repeat('-', 8) echo repeat(1, 8) echo repeat(range(1,3), 2) " リストの場合には第2引数回だけ連結したものが返る。 " あまり使い道はなさそう。数字のときは文字列として結合されるみたい。 " " 関数呼出用関数 " call() " " call() function! s:F1(...) return call('<SID>F2', a:000) endfunction function! s:F2(...) echo join(map(deepcopy(a:000), 'repeat("!", v:val)'), "\n") endfunction call call('<SID>F1', [3,4,5]) " 関数の呼び出しは :call だけでなく、この call() も使える。 " これを使えば、可変長引数を他の関数にそのまま渡すことができる。 " それをやりたいがために、リストについて調べはじめたわけだったりする。 " " 回を経るごとにまとまりがなくなってて、すいません。 " ゆとりにはこれが精一杯。 " " 今回のまとめ " sort() " reverse() " join() " split() " string() " repeat() " call() " " 次回の予定 " DictionaryとFuncrefをこなしてもいいんだけど、 " 適当に既存のVimスクリプトを見て、よくわからなかった部分・調べた部分を " 列挙する形で書いていくのがいいかも。未定ってことでよろしく。 "