这让我疯狂了很久;我想知道是否有办法解决它?希望我能很好地描述这种情况。
为简单起见,请说我有以下目录结构:~jer / dirA和~jer / dirB
在emacs的shell中,我从顶级目录(~jer)开始,输入'cd dir',然后点击tab。
我的窗口分成2个,我有一个* Completions *缓冲区。这很酷;我看到我的选择是'dirA'和'dirB',我键入'A'(所以我的完整命令是'cd dirA')然后点击回车,但* Completions *缓冲区保持打开状态,我必须手动关闭它(通常使用'Cx 1',因为我在shell缓冲区中我要保存,但是如果我已经有一个拆分窗口,这会更烦人,因为* Completions *缓冲区代替了另一个已经存在,我必须切换到那个并点击Cx k手动杀死它。)
所以我的问题是:有没有办法让* Completions *在我完成命令后自动死亡?在上面的示例中,只要在输入'cd DirA'后按Enter键,我就希望缓冲区被杀死。
谢谢,我希望这是有道理的。注意,我不认为这是Is there any way to automatically close filename completetion buffers in Emacs?的副本,因为那是关于使用find-file(在这种情况下,* Completions *缓冲区确实关闭。
答案 0 :(得分:8)
我认为这正是你想要的
每次输入命令时都会执行 delete-completion-window-buffer 功能。它找到所有当前窗口并从中获取缓冲区。然后它将检查缓冲区的名称是否为“* Completions *”,缓冲区让你发疯,如果是,则杀死缓冲区并删除相应的窗口。
最后,它将输出字符串传递给你的下一个钩子comint-preoutput-filter-functions
为什么有输出参数?请参阅comint-preoutput-filter-functions的文档;在那里更好地解释
(defun delete-completion-window-buffer (&optional output)
(interactive)
(dolist (win (window-list))
(when (string= (buffer-name (window-buffer win)) "*Completions*")
(delete-window win)
(kill-buffer "*Completions*")))
output)
(add-hook 'comint-preoutput-filter-functions 'delete-completion-window-buffer)
但实际上,完成缓冲区并没有给我带来太多麻烦。令人困扰的是命令“清除”没有 工作得很好。为了解决你的问题我google shell模式,没有 但我得到了解决我的问题EmacsWiki的解决方案。
(defun clear-shell ()
(interactive)
(let ((comint-buffer-maximum-size 0))
(comint-truncate-buffer)))
(define-key shell-mode-map (kbd "C-l") 'clear-shell)
我将它绑定到正常的终端绑定Ctrl-L 好的代码。希望你喜欢!
答案 1 :(得分:2)
答案 2 :(得分:0)
ESHELL模式。 当你命中空格或命令完成时,完成缓冲区将被关闭。