Команду, чтобы очистить оболочки при использовании emacs'а


есть ли встроенная команда для очистки оболочки при использовании оболочки в emacs?

Если нет, есть ли функция elisp для достижения того же?

6 59

6 ответов:

Обновление Февраль 2015 Года

только что заметил, что 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, маркировка и убийство регионов становятся естественными, поэтому вы можете найти первый вариант достаточно. Если нет, то последний вариант ближе всего к тому, что вы хотите.

EDIT: только что нашел это на вики emacs, это лучше, чем мой вариант 4:

(defun my-clear ()
  (interactive)
  (let ((comint-buffer-maximum-size 0))
    (comint-truncate-buffer)))

большинство предлагаемых здесь решений не будет работать в решение eshell режим!

буфер режима EShell доступен только для чтения, поэтому команды kill и erase не будут работать.

использовать ваш обычный Ctrl -L чтобы очистить терминал eshell, добавьте это в свой .init file:

(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, после очистки буфера, команда восстановит начальное приглашение.

С вашей точки *shell* буфер, выполните:

C-c M-o

или

M-x comint-clear-buffer

Примечание: это также работает в *Python* оболочка, но, кажется, не работает в *eshell*.

AFAIK вы не можете очистить, когда вы начинаете как M-x shell, но если вы делаете M-x term, вы получаете полностью функциональный терминал, где clear работает по назначению. Я могу ошибаться в этом, но лично я использую термин M-x сейчас, так как он полностью функционирует.

Если вы найдете, вы не можете использовать 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))