【问题标题】:flush commands xemacs/elisp necessary?需要刷新命令 xemacs/elisp 吗?
【发布时间】:2013-05-24 12:19:43
【问题描述】:

我一般是 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 机制的链接/指针都可以解释这种行为。 谢谢, 塔什

【问题讨论】:

  • 我建议您使用M-x compile RET 而不是shell-command。这将创建一个编译缓冲区,您可以在其中单击错误/警告以直接转到文件中的相应点。

标签: elisp xemacs


【解决方案1】:

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

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

以下是基于您提供的代码的工作示例。

(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),并处理输出以检测错误/警告消息。

【讨论】:

  • 感谢 Francesco,这解决了麻烦,既帮助我理解了问题所在,又改进了方法本身(通过使用编译)。
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 2019-12-29
  • 2022-01-03
相关资源
最近更新 更多