我是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命令在转储shell输出之前擦除了缓冲区,因此很难说明。
我的期望:控制台输出被清除。当make仍然在运行时,这应该是可见的,并且还没有产生任何输出(在我的情况下,这是几秒钟)。
我不知道如何进一步测试这个,即使它看起来像是一个常见的任务,我也找不到合适的东西或者类似的东西。还要考虑到我不仅对获得上述行为感兴趣,而且还了解我做错了什么。
理解这种行为的elisp机制上的任何链接/指针都很受欢迎。 谢谢, Tasche
答案 0 :(得分: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-x compile
RET 。特别是,这将负责为您擦除缓冲区,在后台运行进程(不像您的示例那样挂起Emacs),并处理输出以检测错误/警告消息。