Есть ли встроенная команда для очистки оболочки при использовании оболочки в emacs?
Если нет, есть ли функция elisp для достижения того же?
Есть ли встроенная команда для очистки оболочки при использовании оболочки в emacs?
Если нет, есть ли функция elisp для достижения того же?
Только что заметил, что 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, области маркировки и уничтожения становятся естественными, поэтому вы можете найти первый вариант. Если нет, последний вариант ближе всего к тому, что вы хотите.
EDIT: только что нашел это на 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, после очистки буфера команда вернет начальное приглашение.
AFAIK вы не можете очистить, когда вы начинаете работать как оболочка M-x, но если вы выполняете M-x term, вы получаете полностью функциональный терминал, в котором очистка работает по назначению. Возможно, я ошибаюсь в этом, но лично я использую термин M-x сейчас, поскольку он полностью функционирует.
С вашей точкой в буфере *shell*
запустите:
C-c M-o
или
M-x comint-clear-buffer
ПРИМЕЧАНИЕ. Это также работает в оболочке *Python*
, но, похоже, не работает в *eshell*
.
Если вы находите, вы не можете использовать erase-buffer и показывать, что текст читается только. Вы можете использовать следующую функцию замены.
(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))