Команда для очистки оболочки при использовании оболочки Emacs - PullRequest
64 голосов
/ 12 октября 2011

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

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

Ответы [ 6 ]

85 голосов
/ 12 октября 2011

Обновление за февраль 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; вы можете выбрать то, что вам нравится.

Возможно быстрое исправление для повторного создания вашего приглашения после очистки:
    (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, это лучше, чем мой вариант 4:

(defun my-clear ()
  (interactive)
  (let ((comint-buffer-maximum-size 0))
    (comint-truncate-buffer)))
27 голосов
/ 12 января 2015

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

15 голосов
/ 18 ноября 2016

С вашей точкой в ​​буфере *shell*, запустите:

C-c M-o

или

M-x comint-clear-buffer

ПРИМЕЧАНИЕ: это также работает в *Python* оболочке, но, похоже, не работает в *eshell*.

8 голосов
/ 12 октября 2011

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

4 голосов
/ 05 мая 2014

Если вы обнаружите, вы не можете использовать стирающий буфер и показывает, что текст только для чтения.Вы можете использовать следующую функцию замены.

  (defun eshell/clear ()
  "Hi, you will clear the eshell buffer."
  (interactive)
  (let ((inhibit-read-only t))
    (erase-buffer)
    (message "erase eshell buffer")))
2 голосов
/ 06 июля 2015

Или ... Вы можете обрезать буфер.

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