使用 emacs shell 时清除 shell 的命令

Posted

技术标签:

【中文标题】使用 emacs shell 时清除 shell 的命令【英文标题】:Command to clear shell while using emacs shell 【发布时间】:2011-12-05 17:28:35 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

2015 年 2 月更新

刚刚注意到 Emacs 现在(版本 25+)有命令 comint-clear-buffer,默认绑定到 C-c M-o,这可以满足我们的需要,并且可能比我最初在下面发布的答案更可取。

考虑的选项:

    C-l 将使缓冲区居中。反复按下它会循环缓冲区,以便该点出现在缓冲区的顶部、中间或底部。当它停在顶部时,缓冲区看起来已经被清除了,尽管所有的文本都还在那儿,不在视线范围内。

    C-x h 标记整个缓冲区,然后C-w 将其杀死。这也会杀死最后一个提示,但是在您输入下一个命令后,您会得到提示。

    你也可以使用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;你可以选择你喜欢的。

    可以在清除后重新创建提示的快速修复:
    (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)))

【讨论】:

shell 模式下,C-c C-o 执行comint-delete-output,即刷新最新命令的输出。这不是你要问的,但为了完整起见,我在这里添加它。 C-c C-r 也可能接近 OP 想要的,即使它实际上并没有清除 shell 缓冲区。 谢谢,错过了。我通常使用C-c C-oC-space C-c C-p C-wC-c C-p 组合的数量取决于我要清除的命令数量。 只是指出选项 1、2、3 不适用于 shell 是只读缓冲区的情况;例如 python 劣质外壳。在这种情况下,只有 C-c M-o 有效。不过,选项 1 2 和 3 doM-x shell 模式下工作,因为它不是只读的。【参考方案2】:

这里提出的大多数解决方案在 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,清除缓冲区后,该命令将恢复初始提示。

【讨论】:

这正是我所需要的【参考方案3】:

*shell* 缓冲区中,运行:

C-c M-o

M-x comint-clear-buffer

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

【讨论】:

【参考方案4】:

AFAIK 当您以 M-x shell 启动时,您无法清除,但如果您执行 M-x term,您将获得一个功能齐全的终端,其中 clear 按预期工作。虽然我可能错了,但我个人现在使用 M-x 术语,因为它功能齐全。

【讨论】:

非常感谢。现在我忍不住想知道为什么人们使用M-x shell 而不是M-x term。没关系,你最后回答了我的问题。 对我来说,我的 zsh 在 shell 和 eshell 中正确呈现,但不是在术语中。所以这就是原因:)【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于使用 emacs shell 时清除 shell 的命令的主要内容,如果未能解决你的问题,请参考以下文章

Emacs打开shell窗口

Emacs 中使用 shell

Emacs shell ^[[0m 问题修复

如何在 ubuntu 上的 emacs 中运行 shell 命令,同时避免 bash 作业控制错误?

emacs 在shell下中文乱码解决方案

Emacs shell 中的屏幕:如何分离?