1

我一般是 xemacs 和 linux 的新手,所以请考虑我是新手。我想知道 elisp 是否有理由不立即执行一个或多个命令。

我的 init.el 中有以下代码:

(defun myClear ()
  "Clears console output buffer (F5)"
  (erase-buffer "*Shell Command Output*"))

(defun myMake ()
  "Executes make (F6)"
  (shell-command "make"))

(defun myClearMake ()
  "Clears console output buffer before executing make (F7)"
  (erase-buffer "*Shell Command Output*")
  (shell-command "make"))

它们绑定到 F5-F7 键。按 F7 不会产生与先按 F5,然后按 F6 相同的结果,后者按预期工作。

相反,(erase-buffer ...) 语句似乎被跳过,或者可能在 (shell-command ...) 之前执行。由于 shell-command 在转储 shell 输出之前会擦除缓冲区,因此很难说。

我所期望的:控制台输出被清除。这在 make 仍在运行并且尚未产生任何输出时应该是可见的(在我的情况下是几秒钟)。

我不知道如何进一步测试它,即使这似乎是一项常见的任务,我也找不到任何合适的或类似的东西。还要考虑到我不仅对获得上述行为感兴趣,而且还了解我做错了什么。

任何解释此行为的 elisp 机制的链接/指针都值得赞赏。谢谢, 塔什

4

1 回答 1

2

首先,我不太习惯 XEmacs,而是对 Emacs... 可能会有差异。但是我可以用 Emacs 重现你的问题,所以我希望 Emacs 解决方案也适用于 XEmacs。

Emacs 在命令执行期间不会重新显示 UI,这意味着点击F5运行命令myClear,然后在等待另一个输入时重绘显示,然后myMake在您点击时执行F6。另一方面,当你点击 时F7,整个循环myClear-myMake被执行,没有任何重新显示,使erase-buffer效果不可见。你需要强制一个redisplay之后erase-buffer才能看到它的效果。

下面是一个基于您提供的代码的工作示例。

(defun myClear ()
  "Clears console output buffer (F5)"
  (interactive)
  (with-current-buffer "*Shell Command Output*"
    (erase-buffer)))

(defun myMake ()
  "Executes make (F6)"
  (interactive)
  (shell-command "sleep 2; echo Hello World"))

(defun myClearMake ()
  "Clears console output buffer before executing make (F7)"
  (interactive)
  (myClear)
  (redisplay)
  (myMake))

(global-set-key (kbd "<f5>") 'myClear)
(global-set-key (kbd "<f6>") 'myMake)
(global-set-key (kbd "<f7>") 'myClearMake)

请注意,我必须进行一些小的调整(可能是由于 Emacs/XEmacs 的差异?)

另请注意,执行 make 之类的更好方法是使用M-xcompileRET. 特别是,这将为您擦除缓冲区,在后台运行进程(而不像您的示例那样挂起 Emacs),并处理输出以检测错误/警告消息。

于 2013-05-24T12:51:10.990 回答