Подтвердить что ты не робот

Автоматически закрыть буфер ввода-вывода оболочки оболочки emacs?

Это сбило меня с ума надолго; Интересно, есть ли способ исправить это? Надеюсь, я смогу хорошо описать ситуацию.

Для простоты, скажем, у меня есть следующая структура каталогов: ~ jer/dirA и ~ jer/dirB

Внутри оболочки внутри emacs я начинаю в своем каталоге верхнего уровня (~ jer), набираю 'cd dir' и нажимаю вкладку.

Мое окно разбивается на 2, и у меня есть буфер * Completions *. Это здорово; Я вижу, что мои варианты - "dirA" и "dirB", я набираю "A" (поэтому моя полная команда - "cd dirA" ) и нажмите enter, но буфер * Completions * остается открытым, и мне нужно вручную закрыть его (обычно с "Cx 1", потому что я в буфере оболочки, который я хочу сохранить, но если у меня уже есть разделенное окно, это еще более раздражает, потому что буфер * Completions * заменяет собой другой, который был уже есть, и я должен переключиться на этот и нажать Cx k, чтобы вручную убить его).

Итак, мой вопрос: есть ли способ сделать * Completions * автоматически умирать, как только я закончу свою команду? В приведенном выше примере, как только я нажимаю enter после ввода 'cd DirA', я хотел бы, чтобы буфер был убит.

Спасибо, и я надеюсь, что это имеет смысл. Заметьте, я не думаю, что это дубликат Есть ли способ автоматически закрыть буферы добавления файлов в Emacs?, потому что об использовании find-file (и в в этом случае буфер * Completions * закрывается.

4b9b3361

Ответ 1

Я думаю, что это именно то, что вы хотите.
Функция удаления-завершения-окна-буфера будет выполняться каждый раз, когда вы вводите команду. Он находит все текущие окна и извлекает из него буфер. Затем он проверит, является ли имя буфера "* Completions *", буфером, который вас бесит, и, если это так, уничтожит буфер и удалит соответствующее окно.
Наконец, он передает выходную строку вашим следующим хукам comint-preoutput-filter-functions.
Почему есть выходной аргумент? Смотрите документ comint-preoutput-filter-functions; лучше объяснил там.

(defun delete-completion-window-buffer (&optional output)                                                                
  (interactive)                                                                                                
  (dolist (win (window-list))                                                                                  
    (when (string= (buffer-name (window-buffer win)) "*Completions*")                                          
      (delete-window win)                                                                                      
      (kill-buffer "*Completions*")))                                                                          
  output)                                                                                                      

(add-hook 'comint-preoutput-filter-functions 'delete-completion-window-buffer)

Но на самом деле буфер завершения меня не сильно беспокоит. Что беспокоит, так это то, что команда "очистить" не работает хорошо. Для того, чтобы решить вашу проблему я гугл shell-mode, там ничего нет.
Но я получил решение моей проблемы EmacsWiki.

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

(define-key shell-mode-map (kbd "C-l") 'clear-shell)                                                           

Я связываю его с Ctrl-L, обычным терминальным связыванием.
Хороший код Надеюсь, вам понравится!

Ответ 3

eshell-режим. Буфер завершения будет закрыт, когда вы нажмете пробел или команда будет завершена.