Зацикливание буфера в Emacs: избегание царапин и буфера сообщений - PullRequest
7 голосов
/ 09 октября 2011

Привет! Я включил циклическое переключение буфера, поместив следующие команды в мой .emacs

(global-set-key (kbd "<C-tab>") 'bury-buffer)

Но при циклическом цикле как избежать циклического обхода сообщений и буферов царапин, которые всегда присутствуют в любом списке буферов emacs,Я никогда не использую эти буферы и не испытываю боль при просмотре списка буферов

Ответы [ 4 ]

7 голосов
/ 09 октября 2011

Если вы никогда не используете чистый буфер, просто добавьте его в ваш .emacs, чтобы автоматически закрыть его:

(kill-buffer "* scratch *")

Я также нашел этот код в Emacs wiki , который должен делать то, что вы хотите:

; necessary support function for buffer burial
(defun crs-delete-these (delete-these from-this-list)
  "Delete DELETE-THESE FROM-THIS-LIST."
  (cond
   ((car delete-these)
    (if (member (car delete-these) from-this-list)
        (crs-delete-these (cdr delete-these) (delete (car delete-these)
                                                 from-this-list))
      (crs-delete-these (cdr delete-these) from-this-list)))
   (t from-this-list)))
; this is the list of buffers I never want to see
(defvar crs-hated-buffers
  '("KILL" "*Compile-Log*"))
; might as well use this for both
(setq iswitchb-buffer-ignore (append '("^ " "*Buffer") crs-hated-buffers))
(defun crs-hated-buffers ()
  "List of buffers I never want to see, converted from names to buffers."
  (delete nil
          (append
           (mapcar 'get-buffer crs-hated-buffers)
           (mapcar (lambda (this-buffer)
                     (if (string-match "^ " (buffer-name this-buffer))
                         this-buffer))
                   (buffer-list)))))
; I'm sick of switching buffers only to find KILL right in front of me
(defun crs-bury-buffer (&optional n)
  (interactive)
  (unless n
    (setq n 1))
  (let ((my-buffer-list (crs-delete-these (crs-hated-buffers)
                                          (buffer-list (selected-frame)))))
    (switch-to-buffer
     (if (< n 0)
         (nth (+ (length my-buffer-list) n)
              my-buffer-list)
       (bury-buffer)
       (nth n my-buffer-list)))))
(global-set-key [(control tab)] 'crs-bury-buffer)
(global-set-key [(control meta tab)] (lambda ()
                                       (interactive)
                                       (crs-bury-buffer -1)))

Вам нужно будет добавить чистые и буферы сообщений к переменной crs-hated-buffers, например ::

(add-to-list 'crs-hated-buffers "*Messages*")
(add-to-list 'crs-hated-buffers "*scratch*")
5 голосов
/ 09 октября 2011

Люк ответил на ваш конкретный вопрос.По моему личному опыту, циклическая работа с буфером более полезна в качестве самого последнего используемого стека вместо стандартных функций Emacs.То есть буферы, которые вы использовали в последнее время, должны пузыриться на вершине стека, подобно тому, как работает alt-tab в Windows.

Есть немало пакетов, которые реализуют это в вики .buffer-stack это тот, который я рекомендую.По умолчанию он содержит список исключенных буферов, я включил мою конфигурацию buffer-stack-suppl, которая выполняет ту же фильтрацию основного режима.Если вы зададите вопросы о buffer-stack, я сделаю все возможное, чтобы помочь.

3 голосов
/ 26 августа 2014

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

Мне удалось полностью избавиться от них, никоим образом не нарушая emacs.

Написал сначала здесь , и вставил ниже:

Поместите это в свой .emacs:

;; Makes *scratch* empty.
(setq initial-scratch-message "")

;; Removes *scratch* from buffer after the mode has been set.
(defun remove-scratch-buffer ()
  (if (get-buffer "*scratch*")
      (kill-buffer "*scratch*")))
(add-hook 'after-change-major-mode-hook 'remove-scratch-buffer)

;; Removes *messages* from the buffer.
(setq-default message-log-max nil)
(kill-buffer "*Messages*")

;; Removes *Completions* from buffer after you've opened a file.
(add-hook 'minibuffer-exit-hook
      '(lambda ()
         (let ((buffer "*Completions*"))
           (and (get-buffer buffer)
                (kill-buffer buffer)))))

;; Don't show *Buffer list* when opening multiple files at the same time.
(setq inhibit-startup-buffer-menu t)

;; Show only one active window when opening multiple files at the same time.
(add-hook 'window-setup-hook 'delete-other-windows)

Бонус:

;; No more typing the whole yes or no. Just y or n will do.
(fset 'yes-or-no-p 'y-or-n-p)
1 голос
/ 01 апреля 2013

Ну, если вы используете ido-mode для циклического переключения между буферами, вы можете установить ido-ignore-buffers, чтобы соответствовать буферам, которые вы хотите игнорировать. Из документации:

Список регулярных выражений или функций, соответствующих именам буферов, которые следует игнорировать. Например, традиционное поведение - не перечислять буферы, имена которых начинаются с пробелом, для которого регулярное выражение равно "` ". Смотрите исходный файл для примеры функций, которые фильтруют имена буферов.

Для получения дополнительной информации о ido-mode см .: Введение в режим ido

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...