VimScript

vim script で、クラスっぽい定義

まぁこの手のネタは、あちこちで語り尽くされているとは思うんですが。 特に深くつっこむつもりはなかったんですが、書き始めたら止まらなくなっちまった。 vim script にはクラスがないんですが、辞書に関数が定義できるので、クラスオブジェクトっぽく記述…

VimScript のリスト操作

VimScript には、リスト操作を行う組み込み関数が用意されているんですが、複数の操作を行う場合、関数の呼び出しがネストしていて読みづらいのでちょっと考えてみた。 ついでに破壊的にリストが操作されるのもどうにかした。 [ソース] let s:algorithms = {…

ローカル変数を関数ローカルに展開する

id:thinca さんに vim script の黒魔術を教えてもらったので覚え書き。 確かにやってみるとその通りなんだけども……多分教えてもらわなかったら絶対に気づかなかった。 [ソール] function! s:map(list, expr, ...) echo l: call map(copy(a:000), "extend(l:,…

autoload に定義されている関数を呼びやすくする

autoload に以下のような定義を書くことで、ユーザコードから定義されている関数を呼び出す事が出来ます。 [./autoload/accel/functional.vim] " accel#functional は、ディレクトリ構成と同じにする必要がある function! accel#functional#plus(a, b) retur…

VimScript その後

最終的にこんな感じになりました。 本当に誰得……。 [使い方] " 実装部は下記参照 function! s:minus(a, b) return a:a - a:b endfunction " s:apply で関数を評価する echo s:apply("s:minus", 5, 2) " 3 let joint = {} function! joint.apply(a, b) return…

VimScript で、bind とか

部分適用的な処理とか。 すごく… C++ ライクです……。 [ソース] function! s:placeholders(args_no) let func = {"args_no" : a:args_no} function! func.apply(...) dict return a:000[self.args_no] endfunction return func endfunction let _1 = s:placeh…

要素が違う list を for 文で回す

help に普通に載っていました。 for 文の行末に unlet すればいいみたいです。 [ソース] function! s:print(list) for var in a:list echo var unlet var endfor endfunction call s:print(["hoge", 1, 3.14, [1, 2, 3]]) [出力] hoge 1 3.14 [1, 2, 3] [参…

可変長引数を可変長関数へ渡す

call 使えば簡単に行えました。 a:000 で、可変長引数のリストが取得できるのがイイネ。 [ソース] function! s:apply(func, ...) return call(a:func, a:000) endfunction function! s:print(...) for var in a:000 echo var endfor endfunction function! s…

Vim Script の関数への参照とか

実はそんなに知らなかったので、個人的なまとめ。 call なんてあったのか。 詳細は、:help Funcref 辺りで。 [ソース] function! s:plus(a, b) return a:a + a:b endfunction echo s:plus(3, 1) let Plus_func = function("s:plus") echo Plus_func(2, 1) ec…

Vim Script で、apply と lambda

もはや誰得なのかが分からない。 関数型言語はあまり分からないんですが、こんな感じなんでしょうかねぇ。 個人的にやりたい事は出来た気はする。 [ソース] " --------------------------------------------------------- function! s:has_apply(dict) try r…

Vim Script で、fold 書いてみた

実装自体はそんなに難しくない。 需要があるかは分からない。 [ソース] function! s:fold(list, state, forwardOp) let l:op = a:state for value in a:list let l:op = a:forwardOp(l:op, value) endfor return l:op endfunction function! s:plus(a, b) re…

Vim Script で、fold の続き

とりあえず、ここまでがんばった。 ついでに fold の引数順も変更。 特に意味はないけど。 [ソース] " 各演算子を辞書型で定義 function! s:operator(op) let func = {"op" : a:op} function! func.call(a, b) dict return eval(a:a . self.op . a:b) endfun…

Vim で開いているウィンドウをスキップしながらバッファを切り替える

バッファを切り替える際に、すでにウィンドウが開いているならば、スキップして切り替えるとかそんな感じ。 複数ウィンドウを開いている状態で、:bnext で切り替えると、すでに開いているウィンドウも切り替えるのでちょっと無駄かなーと。 Quickfix とか、…