はじめに
この記事は 湯婆婆 Advent Calendar 2020 の5日目です。
こちらの記事をきっかけに、色々な言語で湯婆婆(入力された名前から1文字選んで新しい名前を付ける)を実装するのが流行っています。
原作者様: Javaで湯婆婆を実装してみる - Qiita
世の中にはいったい何種類のプログラミング言語があるのか…。令和のHello World!
→【毎日自動更新】湯婆婆 LGTMランキング! - Qiita
だいたいのプログラミング言語は出てしまっているので、何にしようかなと思いましたが
Vim script で湯婆婆を実装してみる - Qiita
こちらからヒントを得て「Vim script があるなら Emacs Lisp があってもいいじゃない」ということで。
検証環境
- Cygwin (Windows 10 20H2 Home)
- GNU Emacs 27.1
コード
Emacsの設定ファイル (~/emacs.d/init.el
など) に以下のコードを書いてください。
(defun yubaba (name)
(interactive "sそこに名前を書きな。")
(let* ((len (length name))
(index (random len))
(new-name (substring name index (+ index 1))))
(message
"フン。%sというのかい。贅沢な名だねぇ。\n今からお前の名前は%sだ。いいかい、%sだよ。分かったら\\
返事をするんだ、%s!!"
name new-name new-name new-name)))
Emacsを再起動すると、yubaba
コマンドが使えるようになります。
M-x yubaba
1 を入力すると湯婆婆が起動します。
M-x yubaba
そこに名前を書きな。
ここで名前を入力してEnterを押すと、湯婆婆は名前からランダムに1文字取って命名します。
そこに名前を書きな。山田太郎
フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は太だ。いいかい、太だよ。分かったら返事をするんだ、太!!
サロゲートペアにも対応しているようでした。
そこに名前を書きな。𠮷田
フン。𠮷田というのかい。贅沢な名だねぇ。
今からお前の名前は𠮷だ。いいかい、𠮷だよ。分かったら返事をするんだ、𠮷!!
解説
あまり解説することもありませんが、強いて言えば interactive
でしょうか。
(interactive "sそこに名前を書きな。")
を含む関数が M-x
でコマンドとして呼び出されると、「そこに名前を書きな。」を表示して入力を促し、入力された内容を文字列としてその関数の第1引数 (name
) にセットします。
interactive
の使用例が書かれたページをいくつか挙げておきます。
- [Home] Interactive Function
- Emacs Lispを基礎から学ぶ (3): コマンドの定義 - yhashのブログ
- emacsのinteractiveの使い方を整理し理解してみました - むかぁ~ どっと こむ
ちなみに、この関数はコマンドとして動くだけではなく、普通の関数として (yubaba "山田太郎")
のように引数を与えて呼び出すことも可能です。
例えば *scratch*
などに (yubaba "山田太郎")
と書いて、閉じカッコの後ろにカーソルを移動して C-x C-e
を入力すると
"フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は郎だ。いいかい、郎だよ。分かったら返事をするんだ、郎!!"
のように表示されます。このとき「そこに名前を書きな。」は表示されません。
お約束
名前を書かずにEnterを押すとクラッシュします。
そこに名前を書きな。
Args out of range: "", 339121942017045916, 339121942017045917
-
M-x
は Alt+Xキーを同時押しするか、Escキーを押した後にXキーを押すと入ります。 ↩