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

时间:2011-06-23 17:32:44

标签: 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键,我就希望缓冲区被杀死。

谢谢,我希望这是有道理的。注意,我不认为这是Is there any way to automatically close filename completetion buffers in Emacs?的副本,因为那是关于使用find-file(在这种情况下,* Completions *缓冲区确实关闭。

3 个答案:

答案 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)

快速谷歌搜索产生了两种可能性:

Emacs Icicles

ComintModethis extension

答案 2 :(得分:0)

ESHELL模式。 当你命中空格或命令完成时,完成缓冲区将被关闭。