使用emacs shell时清除shell的命令

kee*_*eda 66 emacs shell elisp

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

如果没有,是否有一个elisp函数来实现相同的功能?

Tyl*_*ler 86

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)
Run Code Online (Sandbox Code Playgroud)

这与它有关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)
Run Code Online (Sandbox Code Playgroud)

在您使用emacs一段时间后,标记和查杀区域变得很自然,因此您可能会发现第一个选项就足够了.如果没有,最后一个选项最接近你想要的.

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

(defun my-clear ()
  (interactive)
  (let ((comint-buffer-maximum-size 0))
    (comint-truncate-buffer)))
Run Code Online (Sandbox Code Playgroud)

  • 在`shell`模式下,`Cc Co`执行`comint-delete-output`,即刷新最新命令的输出.这不是你要求的,但我在这里添加它是为了完整性.`Cc Cr`也可能接近OP想要的,即使它实际上没有清除shell缓冲区. (5认同)

ant*_*nio 27

这里提出的大多数解决方案都不适用于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)))
Run Code Online (Sandbox Code Playgroud)

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


Pau*_*aul 15

点击*shell*缓冲区,运行:

C-c M-o

要么

M-x comint-clear-buffer

注意:这也适用于*Python*shell,但似乎不起作用*eshell*.

  • 对我来说,Cc Mo是最好的解决方案,谢谢! (2认同)

Jes*_*mos 8

当你开始使用Mx shell时AFAIK你无法清除,但是如果你做Mx术语,你会得到一个功能齐全的终端,其中clear可以按照预期工作.我可能在这方面有误,但我个人现在使用Mx术语,因为它完全正常运行.