Command to clear shell while using emacs shell

Is there a builtin command to clear shell while using shell in emacs?

If not, is there an elisp function to achieve the same?

29617 次浏览

AFAIK 你不能清除,当你开始作为 M-x 外壳,但如果你做 M-x 术语,你得到一个全功能的终端,其中明确的工作原意。我可能是错误的,但个人而言,我现在使用 M-x 项,因为它是完全功能。

2015年2月最新情况

刚刚注意到 Emacs 现在(版本25 +)有一个命令 comint-clear-buffer,默认绑定到 C-c M-o,它完成了我们在这里需要的任务,可能比我最初在下面发布的答案更好。

考虑的备选办法:

  1. C-l将使缓冲区重新集中。按下它会重复循环缓冲区,以便该点出现在缓冲区的顶部、中部或底部。当它停在顶部时,缓冲区看起来像是被清除了,尽管所有的文本仍然在那里,在视图之外。

  2. C-x h标记整个缓冲区,之后 C-w杀死它。这也会杀死最后一个提示符,但是在您输入下一个命令之后,您将得到返回的提示符。

  3. 你也可以使用 erase-buffer,默认情况下它不绑定到一个键,但是很容易做到(你也可以使用 M-x erase-buffer:

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


(add-hook 'shell-mode-hook 'my-shell-hook)

将其绑定到 C-c l; 您可以选择自己喜欢的内容。

  1. 在清除之后重新创建提示符的快速修复方法是可行的:
    (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 一段时间后,标记和清除区域变得很自然,因此您可能会发现第一个选项就足够了。如果不是,最后一个选项最接近您想要的。

编辑: 刚刚在 emacs wiki 上找到这个,它比我的选项4好:

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

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

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

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

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

要使用普通的 Ctrl-L来清除壳牌终端,请将以下内容添加到 .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 "C-l") 'eshell-clear-buffer)))

注意 : 为了更好地模拟标准 Ctrl-L,在清除缓冲区之后,命令将恢复初始提示符。

Or... 你可以截断缓冲区。

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

使用 *shell*缓冲区中的点,运行:

C-c M-o

或者

M-x comint-clear-buffer

注意: 这在 *Python* shell 中也有效,但在 *eshell*中似乎不起作用。