使用emacs shell时清除shell的命令


71

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

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

Answers:


91

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)))

5
shell模式下,C-c C-o执行comint-delete-outputdos,即刷新最新命令的输出。这不是您要的内容,但为了完整起见,我在此添加它。 C-c C-r即使它实际上并未清除shell缓冲区,也可能接近OP的要求。
2011年

谢谢,错过了。我通常使用C-c C-oC-space C-c C-p C-wC-c C-p组合的数量根据要清除的命令数量而有所不同。
泰勒(Tyler)

只是要指出,选项1,2,3在shell是只读缓冲区的情况下不起作用;例如python下层外壳。在这种情况下,仅C-c M-o适用。选项1 2和3确实可以在M-x shell模式下工作,因为这不是只读的。
xdavidliu

29

这里提出的大多数解决方案都无法在EShell模式下使用!

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

要使用普通的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,在清除缓冲区后,该命令将还原初始提示。


这正是我所需要的
Sridhar

19

将您的观点放在*shell*缓冲区中,运行:

C-c M-o

要么

M-x comint-clear-buffer

注意:这也可以在*Python*shell中使用,但似乎在中不起作用*eshell*


10

AFAIK当您以Mx shell启动时无法清除,但如果执行Mx term,则会得到一个功能齐全的终端,可以按预期进行清​​除。我可能对此不对,但是我个人现在使用Mx术语,因为它可以正常运行。


非常感谢。现在我不能停止,但想知道为什么人们使用M-x shell而不是M-x term。没关系,您最后回答了我的问题。
vishnuprasanth

对我来说,我的zsh渲染在shell和eshell中正确,但在术语上不正确。这就是原因:)
J阿伦·玛尼

4

如果找到,则无法使用擦除缓冲区,并且显示文本为只读。您可以使用以下替换功能。

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

3

或者...您可以截断缓冲区。

(let ((eshell-buffer-maximum-lines 0)) (eshell-truncate-buffer))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.