emacsのinteractiveの使い方を整理し理解してみました

| コメント(0) | トラックバック(0)

elispでのinteractiveの使い方ではまったので、 この機会に理解するために整理してみました。

interactiveとは

関数の引数を無効にしてinteractiveで指定した引数を上書きする動作のこと。

起動条件

  • M-x からコマンドを入力し関数起動
  • キーバインドの設定に関数を割り当て起動

M-:で入力すると動作はしない。

コード文字なし

(defun foo1 ()              ; foo1は引数なし
    (interactive)           ; 2単語分先へ進める
    (insert  (number-to-string 2)))

;M-x foo1
;=>  2

(interactive)を指定するとM-xのコマンド一覧に関数の表示が出る。

"p" 数値前置引数

(defun foo2 (n)             ; foo2は1引数
    (interactive "p")       ; 数値前置引数
    (insert  (number-to-string (* 2 n))))

;M-x foo2
;=> 2

(foo2 5)
;=> 10

;M-x foo2
;=> 2

(interactive "p")とするとM-xの起動からは引数nは無視され、 &optionalを付けなくても関数自体が動作する。

そもそも、マニュアルの「数値前置引数」と言う言葉自体難解すぎる・・・・

"n" ミニバッファ起動しての数値入力

(defun foo3 (n)             ; foo3は1引数
    (interactive "nCount:") ; ミニバッファで読む
    (insert   (number-to-string (* 2 n))))
;M-x foo3
; ミニバッファに移動し  Count: ←入力となる
;=> 6

(interactive "nCount:")とするとミニバッファ起動となる。 また引数行頭nはオプション文字と認識し、その末尾までを文字列として認識する。

"r" 2つの数値引数としてのポイントとマーク。小さいほうが先にくる。

;(mark) と(point)を返す、小さいほうが begに入る
(defun foo4 (&optional beg end)
  (interactive "r")
  (insert (number-to-string beg) " " (number-to-string end)))
; C-space  数行移動  M-x foo4
;=> 5272 5386

"r" のサンプル2

(defun foo5 (&optional beg end)
  (interactive "r")
  (insert (concat "foo5 " (number-to-string beg) " " (number-to-string end) " \n"))
  (foo5_sub beg end))

(defun foo5_sub (&optional beg end)
  (insert (concat "foo5_sub " (number-to-string beg) " " (number-to-string end) " \n")))

;M-: (foo5_sub 5 10)
;=> foo 55 10

; C-space  数行移動  M-x foo5
;=> foo5 5818 5844 
;=> foo5_sub 5818 5844

"r" のサンプル3 ダメな例

;(mark) と(point)を返す、小さいほうが begに入る
(defun foo6 (&optional beg end)
  (interactive)
  (foo6_sub1 )
  (insert (concat "foo6  \n")
  (foo6_sub2 )))

(defun foo6_sub1 (&optional beg end)
  (interactive "r")
  (insert (concat "foo6_sub1 " (number-to-string beg) " " (number-to-string end) " \n")))

(defun foo6_sub2 (&optional beg end)
  (interactive "r")
  (insert (concat "foo6_sub2 " (number-to-string beg) " " (number-to-string end) " \n")))


;M-x foo6
;error

関数から関数を呼び出すとエラー

これでが出来ずに、ハマったので詳しく理解をしてみた切っ掛け。

おわり

マニュアルを読むだけじゃなく足りなく、動かしてやっと理解が深まりました!

これでinteractiveは怖くない!

(そもそも、マニュアルを原文で読めれば・・・いいよね・・・)

関連記事

トラックバック(0)

トラックバックURL: http://mukaer.com/cgi-bin/mt/mt-tb.cgi/66

コメントする

PR

PR





検索

Loading

メニュー

twitter