[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:1834]call-last-kbd-macro



>>>>> meadow-develop の No. 1832
>>>>> Message-Id: <20000717.193624.110367309.horiguchi.kyotaro@xxxxxxxxxxxxxxxxxxxxx> で、
>>>>> "堀口" == Kyotaro HORIGUCHI <horiguchi.kyotaro@xxxxxxxxxxxxxxxxxxxxx>さま曰く...

堀口>  でもなんかちょっと変な感じです. これはエラーが出たときのバック
堀口> トレースです.

>> Signaling: (wrong-type-argument integerp nil)
>> ad-Orig-forward-word(nil)
>> forward-word(nil)
>> call-interactively(forward-word)
堀口>     ~~~~~~~~~~~~~~~~~~
>> call-last-kbd-macro(1)
>> call-interactively(call-last-kbd-macro)

ここで forward-word の argument がなんで nil になってしまうのかが不思議
だったのですが、 Disassemble してみると...

byte code for forward-word:
  doc:  Move point forward ARG words (backward if ARG is negative). ...
  args: (count)
 interactive: (quote (nil))
0	constant  nil
1	varbind	  ad-return-value
2	interactive-p 
3	goto-if-nil 1
6	constant  call-interactively
7	constant  ad-Orig-forward-word
8	call	  1
9	goto	  2
12:1	constant  ad-Orig-forward-word
13	varref	  count
14	call	  1
15:2	varset	  ad-return-value
...

ということなので、下のような関数を作って実行してみると...

(defun my-test (count)
  (interactive '(10))
  (message "%s, %d" (interactive-p) count))

M-x my-test [RET]                     ... t, 10
これを keyboard macro に登録して実行  ... nil, 10
(call-interactively 'my-test2) を評価 ... t, 10
(my-test) を評価                      ... Wrong number of arguments: ...

と言う結果になりました。

この結果を見ると (interactive '(10)) は有効になっているのにもかかわらず、
(interactive-p) が nil というのは、おかしいのではないかと思うのですが、
いかがなものでしょうか?

>> (defadvice FUNCTION (CLASS NAME [POSITION] [ARGLIST] FLAG...)
>> [DOCSTRING] [INTERACTIVE-FORM]
>> BODY... )   ~~~~~~~~~~~~~~~~~~

堀口> これが正解のようです.

堀口> (defadvice forward-word (after skip-comma activate )
堀口>   (interactive "p")
堀口>   (when (and (interactive-p)
堀口> 	     (eq major-mode 'c-mode)
堀口> 	     (eq (char-after) ?,))
堀口>     (forward-char)))

ありがとうございます、とりあえず、これで無事に動くようになりました。
-- 
鈴木圭一 / keiichi@xxxxxxxxx
PGP finger print (DH/DSS)
0B32 B37E 6DE9 3BC1 68A4  4089 7AAF 2B03 ECBD 614B