自动关闭emacs shell模式tab-completion buffer?

Jer*_*Jer 17 emacs elisp

这让我疯了很长时间; 我想知道是否有办法解决它?希望我能很好地描述这种情况.

为简单起见,请说我有以下目录结构:~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*缓冲区确实关闭.

wen*_*yan 8

我认为这正是你想要的.
删除完成窗口,缓冲功能,将每输入一个命令时执行.它找到所有当前窗口并从中获取缓冲区.然后它将检查缓冲区的名称是否为"*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,正常的终端绑定.
好的代码.希望你喜欢!