2015 年 2 月更新
刚刚注意到 Emacs 现在(版本 25+)有命令 comint-clear-buffer
,默认绑定到 C-c M-o
,这可以满足我们在这里的需要,并且可能比我最初在下面发布的答案更可取。
要考虑的选项:
Cl 将重新定位缓冲区。反复按下它会循环缓冲区,以便该点出现在缓冲区的顶部、中间或底部。当它停在顶部时,缓冲区看起来像是被清除了,尽管所有的文本仍然在那里,不在视线范围内。 Cx h 标记整个缓冲区,之后 Cw 将其杀死。这也会杀死最后一个提示,但是在您输入下一个命令后,您会得到提示。您还可以使用擦除缓冲区,默认情况下它不绑定到键,但它很容易完成(您也可以使用 Mx 擦除缓冲区:
(defun my-shell-hook ()
(local-set-key "\C-cl" 'erase-buffer))
(add-hook 'shell-mode-hook 'my-shell-hook)
将其绑定到 C-c l
;你可以选择你喜欢的。
清除后重新创建提示的快速修复是可能的:
(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)))
这里提出的大多数解决方案在 EShell 模式下都不起作用!
EShell 模式缓冲区是只读的,因此 kill 和 erase 命令将不起作用。
要使用普通的 Ctrl-L 清除 eshell 终端,请将其添加到您的 .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,在清除缓冲区后,该命令将恢复初始提示。
将您的点放在 *shell*
缓冲区中,运行:
C-c M-o
或者
M-x comint-clear-buffer
注意:这也适用于 *Python*
shell,但似乎不适用于 *eshell*
。
AFAIK 当您以 Mx shell 启动时您无法清除,但如果您执行 Mx term 您将获得一个功能齐全的终端,其中 clear 按预期工作。虽然我可能错了,但我个人现在使用 Mx 术语,因为它功能齐全。
M-x shell
而不是 M-x term
。没关系,你最后回答了我的问题。
zsh
在 shell 和 eshell 中正确呈现,但不是在术语中。所以这就是原因:)
如果找到,则不能使用擦除缓冲区并显示文本是只读的。您可以使用以下替换功能。
(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))
shell
模式下,C-c C-o
执行comint-delete-output
,即刷新最新命令的输出。这不是你要问的,但为了完整起见,我在这里添加它。C-c C-r
也可能接近 OP 想要的,即使它实际上并没有清除 shell 缓冲区。C-c C-o
或C-space C-c C-p C-w
,其中C-c C-p
组合的数量取决于我要清除多少命令。C-c M-o
有效。不过,选项 1 2 和 3 do 在M-x shell
模式下工作,因为它不是只读的。