这使我发疯了很长时间。我想知道是否有解决方法?希望我能很好地描述情况。

为了简单起见,假设我具有以下目录结构:〜jer / dirA和〜jer / dirB

在emacs的shell中,我从顶层目录(〜jer)开始,键入'cd dir',然后单击tab。

我的窗口分割为2,并且有一个* Completions *缓冲区。这很酷;我看到我的选择是'dirA'和'dirB',我输入了'A'(所以我的完整命令是'cd dirA')并按Enter,但是* Completions *缓冲区保持打开状态,我必须手动关闭它(通常使用“ Cx 1”,因为我在要保存的shell缓冲区中,但是如果我已经有一个拆分窗口,这会更令人讨厌,因为* Completions *缓冲区代替了以前的另一个缓冲区已经存在,我必须切换到那个并按Cx k手动将其杀死)。

所以我的问题是:一旦完成命令,有没有办法使“完成”自动消失?在上面的示例中,在键入“ cd DirA”后按下回车键后,我希望缓冲区被杀死。

谢谢,我希望这是有道理的。注意,我不认为这是Is there any way to automatically close filename completetion buffers in Emacs?的重复项,因为那是关于使用查找文件的(在这种情况下,* Completions *缓冲区确实会关闭。

最佳答案

我认为这正是您想要的。
每次输入命令时,将执行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”没有
做得好。为了解决您的问题,我使用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,即普通的终端绑定。
好的代码。希望你喜欢!

09-10 03:54
查看更多