自动关闭emacs外壳模式选项卡完成缓冲区?

自动关闭emacs外壳模式选项卡完成缓冲区?,emacs,elisp,Emacs,Elisp,这让我疯狂了很长一段时间;我想知道是否有办法解决它?希望我能很好地描述情况 (defun delete-completion-window-buffer (&optional output) (interactive)

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

(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)
为了简单起见,假设我有以下目录结构:~jer/dirA和~jer/dirB

(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)
在emacs中的shell中,我从顶层目录(~jer)开始,键入“cd dir”,然后点击tab

(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)
我的窗口一分为二,我有一个*完成*缓冲区。这很酷;我看到我的选择是'dirA'和'dirB',我键入'A'(因此我的完整命令是'cd dirA')并点击回车键,但是*Completions*缓冲区保持打开状态,我必须手动关闭它(通常使用'C-x 1',因为我在我想要保存的shell缓冲区中,但是如果我已经有一个拆分窗口,这就更烦人了,因为*Completions*缓冲区取代了另一个已经存在的缓冲区,我必须切换到该缓冲区并点击C-x k手动杀死它)

(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)
所以我的问题是:有没有一种方法可以在我完成命令后让*Completions*自动消失?在上面的例子中,只要我在键入'cd DirA'后按enter键,我就想让缓冲区消失

(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)

谢谢,我希望这是有意义的。请注意,我不认为这是的重复,因为这是关于使用查找文件的(在这种情况下,*Completions*缓冲区会关闭。

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

(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)

(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)
使用.eshell模式。
(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)

当您点击空格或命令完成时,完成缓冲区将关闭。

我认为这正是您想要的。
(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)
删除完成窗口缓冲区功能将在您每次输入命令时执行。它将查找所有当前窗口并从中取出缓冲区。然后它将检查缓冲区的名称是否为“*Completions*”,使您抓狂的缓冲区,如果是,则杀死缓冲区并删除相应的窗口。
最后,它将输出字符串传递给下一个钩子comint预输出过滤器函数。
为什么会有输出参数?请参阅comint preoutput filter函数的文档;这里有更好的解释。

(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模式下,没有任何内容。
但我找到了解决问题的办法

(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)
(取消清除外壳()
(互动)
(let((comint缓冲区最大大小0))
(comint截断缓冲区)))
(定义键外壳模式映射(kbd“C-l”)‘清除外壳’)
我将其绑定到Ctrl-L,这是正常的终端绑定。

很好的代码。希望您喜欢它!

谢谢,谢谢,谢谢!到目前为止,它工作得很好。一旦您离开“完成区域”(您正在完成的文本块),缓冲区将自动关闭。至少如果您使用的是最新版本的Emacs。如果您仍然在Emacs-24中看到此问题,请通过
M-x report Emacs bug
报告此问题,并提供足够的详细信息以重现此问题。
(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)