这让我疯了很长时间; 我想知道是否有办法解决它?希望我能很好地描述这种情况.
为简单起见,请说我有以下目录结构:~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键,我就希望缓冲区被杀死.
谢谢,我希望这是有道理的.注意,我不认为这是重复的是否有任何方法可以自动关闭Emacs中的文件名完成缓冲区?,因为那是关于使用find-file(在这种情况下,*Completions*缓冲区确实关闭.
我认为这正是你想要的.
在删除完成窗口,缓冲功能,将每输入一个命令时执行.它找到所有当前窗口并从中获取缓冲区.然后它将检查缓冲区的名称是否为"*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)
Run Code Online (Sandbox Code Playgroud)
但实际上,完成缓冲区并没有给我带来太多麻烦.令人困扰的是命令"清除"效果不佳.为了解决你的问题我谷歌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)
Run Code Online (Sandbox Code Playgroud)
我将它绑定到Ctrl-L,正常的终端绑定.
好的代码.希望你喜欢!