Автоматически закрывать буфер завершения режима оболочки emacs? - PullRequest
17 голосов
/ 23 июня 2011

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

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 21 февраля 2013

Я думаю, это именно то, что вы хотите.
Функция delete-complete-window-buffer будет выполняться каждый раз, когда вы вводите команду. Он находит все текущие окна и извлекает из него буфер. Затем он проверит, является ли имя буфера «* 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, нормальному терминальному связыванию.
Хороший код Надеюсь, вам понравится!

2 голосов
/ 23 июня 2011

Быстрый поиск в Google дал две возможности:

Сосульки Emacs

ComintMode с это расширение .

0 голосов
/ 24 июня 2011

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

...