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

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



堀口です.

 この動作がどのようにして起きているかはわかりましたが意図がわかり
ません.. というか call-interactively の間違い?

 関数中の interactive フォームは (call-interatively) で処理されま
す.
 一方 (interactive-p) は最初に commands.h で定義される以下式を評
価して, これが nil なら (interactive-p) 自身が nil を返すようになっ
ています. その式はこんなやつ

| #define INTERACTIVE (NILP (Vexecuting_macro) && !noninteractive)

 これは見てのとおりマクロ実行中には nil になるので 
(interactive-p) は nil を返します. でも my-test は 
call-interatively で呼ばれているので (interactive '(10)) は評価さ
れます.

 どちらかというと call-interactively がマクロ実行中にも 
interactive フォームを評価するのが間違っているような気がします.

 パッチのようにするとマクロからの呼び出しについては 
call-interactively が interactive-p とそろった動きはしますが.. は
て, いいのやら.

# Mew は無事に動いてますねぇ^^;

At 18 Jul 2000 10:16:53 +0900, Keiichi Suzuki <keiichi@xxxxxxxxx> wrote in <u8zv01blm.fsf@xxxxxxxxxxxxx>
> (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: ...
-- 
堀口恭太郎
--- callint.c.org	Sun Jul 18 01:18:26 1999
+++ callint.c	Tue Jul 18 23:11:54 2000
@@ -218,4 +218,10 @@
   int key_count;
 
+  if (!INTERACTIVE)
+    {
+      GCPRO1 (function);
+      RETURN_UNGCPRO (Ffuncall (1, &function));
+    }
+
   if (NILP (keys))
     keys = this_command_keys, key_count = this_command_key_count;