在使用emacs shell时清除shell的命令

在emacs中使用shell时,是否有内置命令来清除shell?

如果没有,是否有elisp函数来实现相同?

2015年2月更新

刚刚注意到Emacs现在(版本25+)有默认绑定到Cc Mo的命令comint-clear-buffer ,这就是我们在这里所需要的,可能比我最初在下面发布的答案更可取。

要考虑的选项:

  1. Cl将重置缓冲区。 重复按下循环缓冲区,使得该点出现在缓冲区的顶部,中间或底部。 当它停在顶部时,缓冲区看起来已经被清除,尽pipe所有的文本仍然在那里,在视野之外。

  2. Cx h标记整个缓冲区,之后Cw杀死它。 这也会杀死最后一个提示,但是在你input下一个命令之后,你会回到你的提示。

  3. 您也可以使用erase-buffer ,默认情况下不会绑定到某个键,但可以轻松完成(也可以使用Mx erase-buffer

  (defun my-shell-hook () (local-set-key "\C-cl" 'erase-buffer)) (add-hook 'shell-mode-hook 'my-shell-hook) 

这绑定到Cc l ; 你可以select你喜欢的。

  1. 清除后重新创build提示的快速修复是可能的:
  (defun my-clear () (interactive) (erase-buffer) (comint-send-input)) (defun my-shell-hook () (local-set-key "\C-cl" 'my-clear)) (add-hook 'shell-mode-hook 'my-shell-hook) 

在使用emacs一段时间之后,标记和查杀区域就变得很自然,所以你可能会发现第一个选项就足够了。 如果不是,最后的select是最接近你想要的。

编辑:刚发现这在emacs维基上,这比我的select更好4:

 (defun my-clear () (interactive) (let ((comint-buffer-maximum-size 0)) (comint-truncate-buffer))) 

这里提出的大多数解决scheme都不能在EShell模式下工作!

EShell模式缓冲区是只读的,所以kill和擦除命令将不起作用。

要使用普通的CtrlL清除eshellterminal,将其添加到.init文件中:

 (defun eshell-clear-buffer () "Clear terminal" (interactive) (let ((inhibit-read-only t)) (erase-buffer) (eshell-send-input))) (add-hook 'eshell-mode-hook '(lambda() (local-set-key (kbd "Cl") 'eshell-clear-buffer))) 

注意 :为了更好地模拟标准的CtrlL ,清除缓冲区后,该命令将恢复初始提示。

AFAIK你不能清楚,当你开始Mx壳,但如果你做Mx的话,你会得到一个function齐全的terminal,清晰地工作。 虽然我可能是错误的,但个人使用Mx术语,因为它是完全正常运行。

用你的*shell*缓冲区,运行:

Cc Mo

要么

Mx comint-clear-buffer

注意:这也适用于*Python* shell,但似乎不能在*eshell*

如果你发现,你不能使用擦除缓冲区,并显示文本是只读的。 您可以使用以下replacefunction。

  (defun eshell/clear () "Hi, you will clear the eshell buffer." (interactive) (let ((inhibit-read-only t)) (erase-buffer) (message "erase eshell buffer"))) 

或者…你可以截断缓冲区。

 (let ((eshell-buffer-maximum-lines 0)) (eshell-truncate-buffer))