在emacs中使用shell时是否有内置命令清除shell?
如果不是,是否有一个elisp函数来实现相同功能?
Answers:
刚刚注意到,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)))
C-c C-o
或C-space C-c C-p C-w
,C-c C-p
组合的数量根据要清除的命令数量而有所不同。
C-c M-o
适用。选项1 2和3确实可以在M-x shell
模式下工作,因为这不是只读的。
这里提出的大多数解决方案都无法在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,在清除缓冲区后,该命令将还原初始提示。
AFAIK当您以Mx shell启动时无法清除,但如果执行Mx term,则会得到一个功能齐全的终端,可以按预期进行清除。我可能对此不对,但是我个人现在使用Mx术语,因为它可以正常运行。
M-x shell
而不是M-x term
。没关系,您最后回答了我的问题。
zsh
渲染在shell和eshell中正确,但在术语上不正确。这就是原因:)
shell
模式下,C-c C-o
执行comint-delete-output
dos,即刷新最新命令的输出。这不是您要的内容,但为了完整起见,我在此添加它。C-c C-r
即使它实际上并未清除shell缓冲区,也可能接近OP的要求。