VimScript

Vim の :command で再帰

まさに誰得。 [ソース] command! -nargs=+ Factorial \ execute [<f-args>][1] == 0 \ ? 'echo [ <f-args> ][0]' \ : 'Factorial '.([<f-args>][0]*[<f-args>][1]).' '.([<f-args>][1]-1) [コマンド] :Factorial 1 4 [出力] 24 command だと値が返せない(返す方法が思いつかなかった)ので引数が2つ</f-args></f-args></f-args></f-args></f-args>…

quickrun.vim で Haskell の簡易対話式インタプリタコマンドを定義する

Haskell で対話式インタプリタを使用する場合 ghci を使うのが便利なのですが、起動するのが手間なので quickrun.vim を使用して簡易的なコマンドを定義してみました。 [コード] " 実行結果をバッファで開く command! -nargs=1 QuickHaskell :execute ":Quic…

Vim script で変数を不変で定義するコマンド

前回の続き。 id:tyru さんに色々とコメントを頂いてこんな感じになりました。 [ソース] command! -nargs=1 Val let <args> | :execute 'lockvar '.matchstr(<f-args>, '\zs.*\ze=') Val value = 10 echo value " 代入できないよ let value = 10 " 再代入する場合は unlet </f-args></args>…

Vim script で変数を不変にする

:lockvar コマンドを使用します。 [ソース] let value = 42 lockvar value let value = 10 " error 変数名を渡す事で、その変数が書き換えできないようにします。 便利な機能なのでいろんなところで使いたいんですけど :lockvar に変数を渡さないとダメなの…

Vim script で文字列の足し込み

文字列の足し込みは += や -= のように .= という演算子が使えます。 [ソース] let s:sum = "" for var in range(5) let s:sum .= "homu" endfor echo s:sum [出力] homuhomuhomuhomuhomu [注意] この演算子は Vim 7.0 から実装されたらしいので、それ以下の…

Vim script の exists で autoload の関数は判定してはいけない

言われてみればそのとおりなんですが、ちょっとはまったので覚書。 Vim script では、ある変数や関数などが定義されているかを判定するために exists({expr}) という組み込み関数を使用します。 使い方は簡単で引数に定義されている変数名や関数名などを渡し…

Vim script の読み込みを途中でやめる

Vim script の覚書。 :finish で Vim script の読み込みを途中で止めます。 [hoge.vim] " Windows 環境であれば Vim script の読み込みを止める if has('win32') || has('win64') :finish endif " 以下、Windows 以外の処理を記述 " ....

Vim script で乱数の生成

下記のサイトに Vim script で乱数を生成する方法が載っているのですが、それを元にして C++っぽい生成器を書いてみました。 元ネタ:Vimでゲームを作るためのtips - mfumiの日記 [ソース] function! s:srand(seed) let self = {} let self.seed = a:seed fu…

Vim script で repeat

[ソース] function! s:main() echo repeat("無駄", 5) echo repeat("ほむ", 10) endfunction call s:main() [出力] 無駄無駄無駄無駄無駄 ほむほむほむほむほむほむほむほむほむほむ (…今まで join と map を使っていたなんて言えない。

Vim で隠れバッファを全て削除する

そういう機能が欲しかったのでちょっと Vim script を書いてみました。 既存の機能でもっと簡単に出来るかも。 [ソース] function! s:delete_hide_buffer() let list = filter(range(1, bufnr("$")), "bufexists(v:val) && !buflisted(v:val)") for num in l…

Vim で復活の呪文を使う

Vim Advent Calendar 2011 46日目の記事になります。 特に Vim Advent のネタにする予定もなかったのですが、他に書く人もいなさそうなので、46日目にしました。 こんな感じで書きたいことがあれば各々が好きなように Vim Advent に投稿すればいいと思います…

Vim script で self をローカルに展開する

辞書関数内で自分にアクセスする為には self を使わないとダメなんですが、ちょっと手間だったんでローカルに展開するようにしてみました。 [ソース] let dict = {} let dict.name1 = "homu" let dict.name2 = "mami" let dict.name3 = "mado" function! dic…

カレントで開いているウィンドウのバッファ名を出力する

こういう処理はあんまり慣れていないので結構時間がかかりました。 [ソース] " カレントのウィンドウ番号の範囲 " winnr("$") で最後のウィンドウ番号を取得する let winnrs = range(1, winnr("$")) " ウィンドウ番号からバッファ番号へ変換 let bufnrs = ma…

Vim script で match 文 その2

前回の続き。 もうちょっと拡張し易いようにしてみました。 id:tyru さんの書き方に近いかな。 [ソース] function! s:equal(a, b) return a:a.equal(a:b) endfunction function! s:apply(expr, value) return a:expr.apply(a:value) endfunction function! s…

Vim script で match 文みたいな構文

一応、昨日の続きです。 Vim script で match 文みたいな構文を書いてみました。 [ソース] function! s:match(...) let self = {} let self.key = string(a:1) let self.map = {} function! self.case(val, expr) let self.map[string(a:val)] = a:expr retu…

Vim script でパターンマッチ的な書き方

なんか前も書いたような気がしますが、関数名にパターンを記述してゴニョゴニョします。 [ソース] function! s:apply(expr, ...) let expr = a:expr."_".join(a:000, "_") return call(exists("*".expr) ? expr : a:expr, a:000) endfunction function! s:fa…

vim script で遊ぶなら知っておきたい 10 の組み込み関数

vim script で遊ぶ時によく使う組み込み関数とか。 vimプラグインを作る場合だとまた違ってくると思います。 むしろ、そっちの方が誰かが書いてくれると嬉しいな(チラチラッ。 あと当然ながら詳細は help を参照してください。 ☆まえがき 関数の可変長引数 関数…

vim script 力を高める

元ネタ: Hack #236: 短期間でVim script力を向上する - vim-users.jp [ソース] echo eval(join(filter(range(1000), "!(v:val % 3 && v:val % 5)"), "+")) " => 233168 二項演算子であれば、eval と join で foldl をエミュレート出来るので便利ですね。 [参…

vim script で FizzBuzz

そういえば、やったことがなかったので。 [コマンド] :echo map(range(1, 100), 'v:val% 15 == 0 ? "FizzBuzz" : v:val % 3 == 0 ? "Fizz" : v:val % 3 == 0 ? "Fizz" : v:val') 流石に短いですね。

vim script で eval

vim script では eval 関数を使用して script の評価を行う事ができます。 [ソース] function! s:lambda(expr) let self = {} let self.expr = a:expr function! self.apply(...) return eval(self.expr) endfunction return self endfunction function! s:m…

vim script でカリー化

ふと、思いついたので書いてみた。 [ソース] function! s:plus1(b) return 1 + a:b endfunction function! s:plus2(b) return 2 + a:b endfunction function! s:plus3(b) return 3 + a:b endfunction function! s:plus(a, b) return a:a + a:b endfunction f…

vim script で、Boost.Optional のような処理

前回作ったクラスの処理で Boost.Optional のような処理をやろうとすると、どんな感じになるのか試してみました。 Boost.Optional についてはここら辺を参照して下さい。 不正な値が含まれる場合に使用したりします。 [ソース] function! s:optional(...) le…

vim script でクラスの定義 その2

色々と考えた結果こんな感じになりました。 [ソース] let g:type = accel#type#type() function! s:eval(class, expr, ...) let self = a:class if type(a:expr) == type(function("tr")) return call(a:expr, a:000, a:class) else return eval(a:expr) end…

リストのアンパック

vim script では、リストの要素を個別に取得する事が出来ます。 [ソース] function! s:add_sub(a, b) return [a:a + a:b, a:a - a:b] endfunction function! s:main() let list = [1, 2, 3] let [var1, var2, var3] = list echo var1 echo var2 echo var3 ec…

eval と join を使ったリストの要素の合計を計算

と、ぱっと思いつきで書いてみたもののすでに組み込み関数で似たようなものが用意されていたような…。 [ソース] function! s:sum(list) return eval(join(a:list, "+")) endfunction function! s:main() echo s:sum([1, 2, 3]) echo s:sum(range(1, 10)) end…

vim script で、関数のオーバーロードっぽい定義

vim script では、次のように {} 内を評価して変数名を定義することが出来ます。 let s:hoge = "foo" let s:foo{s:hoge} = "foofoo" echo s:foo{s:hoge} " => foofoo echo s:foofoo " => foofoo これは変数名だけではなく、関数名にも適用することが出来ます…

SingleCompile 2.8.9 から、msvc のコンパイラバージョンが選択出るようになった

vim.org:http://www.vim.org/scripts/script.php?script_id=3115 msvc 2008 や msvc 2010 といった単位で選択できるようになりました。 C++03 のみで開発する場合は、msvc 2008 とかを選択すれば問題ないんじゃないでしょうか。 これは quickrun.vim でもや…

vim script で、ユニークな番号の生成

適当に書いてみました。 そんな実装で大丈夫か? 大丈夫だ、多分問題ない。 [ソース] function! s:uuid() let self = {} function! self.uuid() endfunction return self.uuid endfunction function! s:main() echo s:uuid() echo s:uuid() echo s:uuid() ec…

vim script のリストをフォーマットを指定して出力

ふと、思い立って書いてみた。 [ソース] function! s:pop_back(list) return a:list[ : len(a:list)-2 ] endfunction function! s:back(list) return remove(a:list, -1) endfunction function! s:eval_indent_format(format, indent_space, value) let resu…

vim script で、list をラップ

STL っぽく簡単に list をラップしてみた。 まぁこれぐらいなら素直に組み込み関数を使ったほうがいいのかな。 こういうのは需要があるのだろうか。 [ソース] function! s:class_array(...) " 初期化 let self = {} " プロパティ let self.data = a:000 " メ…