Vim script で湯婆婆を実装してみる
はじめに
この記事は暇つぶしに書いたネタです。
コード
let s:Keiyakusho = function("input", ["契約書だよ。そこに名前を書きな。\n"])
let s:name = s:Keiyakusho()
echo "\nフン。"..s:name.."というのかい。贅沢な名だねぇ。"
let s:name_index = rand()%strchars(s:name)
let s:new_name = strcharpart(s:name, s:name_index, 1)
echo "今からお前の名前は"..s:new_name.."だ。いいかい、"..
\s:new_name.."だよ。分かったら返事をするんだ、"..s:new_name.."!"
こちらがコードです。
ファイルに保存し、こちらのコードを :so yuba-ba.vim とすれば動きます。
コードの解説
契約書
Vim scriptでは input() 関数を用いてプロンプトから文字列を取得できます。 :h input()
これを、 function() 関数を用いて部分適用し、セリフを言い名前を聞く s:Keiyakusho を作ります。
文字列の連結は . または .. で行います。
. は辞書の参照 my_dict.key 等と被り可読性を落とすので、新しい..を用いました。
let s:Keiyakusho = function("input", ["契約書だよ。そこに名前を書きな。\n"])
let s:name = s:Keiyakusho()
echo "\nフン。"..s:name.."というのかい。贅沢な名だねぇ。"
名前を奪う
新しい名前を決定するために乱数が必要でした。
:h rand() を調べたところ存在した(!?)ので、こちらの関数を用いることにしました。
また、最大値を指定するために文字数を取得する strchars() 関数を利用しました。Vimには strlen() 関数がありますが、マルチバイト文字には対応していません。
let s:name_index = rand()%strchars(s:name)
let s:new_name = strcharpart(s:name, s:name_index, 1)
実行結果

まとめ
- 部分適用なのかわからない
- github