にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

Emacs Lispをコマンドで実行できるようにする

interactive というのを使えばよいらしい。

(defun greeting ()
  (interactive)
  (message "Hello, world"))

こうすると、Emacs上で M-x greeting を叩けばミニバッファに「Hello, world」と出力される。

引数も付けてみる

(defun greeting2 (msg)
  (interactive "sGreeting: ")
  (message "%s" msg))

こうすると、M-x greeting2 を実行したときにミニバッファに以下のように出てくる。

Greeting: 

ここに表示させたい文字列を入力してEnterを押す。

Greeting: こんにちは[Enter]
こんにちは

ちなみに、interactiveの引数では、撮りたい値を文字列の最初の一文字で指定する。
"sGreeting: "となっているのは、文字列を引数で取るためのsが頭についているからである。
他には、以下などがある。

  • b: 既存のバッファ名
  • f: 既存のファイル名
  • n: 数字(整数)

全部で10個ほどあるみたい。
これができただけでなんだかぐっとEmacs Lispを身近に感じますね。

さらに引数を2個に

(defun greeting3 (msg1 msg2)
  (interactive "sGreeting1: \nsGreeting2(%s -> ?): ")
  (message "%s -> %s" msg1 msg2))

こうすると、

Greeting1: こんにちは[Enter]
Greeting2(こんにちは -> ?): さようなら[Enter]
こんにちは -> さようなら

という風に出力されます。(例はあんまりよくないですね)