自动关闭emacs shell模式的tab补全缓冲区?

17
这已经让我疯了很长时间了,我想知道是否有方法可以解决?希望我能描述清楚情况。
为了简单起见,假设我有以下目录结构:~jer/dirA和~jer/dirB
在emacs的shell中,我从顶级目录(~jer)开始,键入“cd dir”,然后按tab键。
我的窗口分成2个部分,并出现一个*Completions*缓冲区。这很酷;我看到我的选择是“dirA”和“dirB”,我键入“A”(所以我的完整命令是“cd dirA”),然后按enter键,但是*Completions* 缓冲区保持开放状态,我必须手动关闭它(通常使用“C-x 1”,因为我在要保存的shell缓冲区中,但如果我已经有一个分割窗口,这更加麻烦,因为*Completions*缓冲区会取代已经存在的另一个窗口,并且我必须切换到该窗口并按下C-x k手动杀死它)。
所以我的问题是:是否有方法可以使*Completions*自动消失,一旦我完成我的命令?在上面的示例中,只要我在键入“cd DirA”之后按enter,我就希望该缓冲区被关闭。
谢谢,希望这是有意义的。请注意,我认为这不是Is there any way to automatically close filename completetion buffers in Emacs?的重复,因为那是关于使用find-file(在那种情况下*Completions*缓冲区会关闭)。

1
缓冲区应该在您离开“完成区域”(您正在完成的文本块)时自动关闭。至少,如果您使用的是足够新的Emacs版本。如果您仍然在Emacs-24中看到此问题,请通过M-x report-emacs-bug报告它,并提供足够的详细信息以重现问题。 - Stefan
3个回答

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)

实际上,完成缓冲区并不会给我带来很多困扰。令我困扰的是命令“clear”无法正常工作。为了解决您的问题,我在网上搜索了shell-mode,但并没有找到相关信息。
但我在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,这是普通终端绑定。
不错的代码。希望你喜欢它!

2

0

eshell-mode。 Completions 缓冲区将在您按下空格键或命令完成时关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接