Emacs中的缓冲循环:避免临时和消息缓冲区

smi*_*dha 7 emacs

嗨,我已打开缓冲区循环,在我的.emacs中放置以下命令

(global-set-key (kbd "<C-tab>") 'bury-buffer)
Run Code Online (Sandbox Code Playgroud)

但是在循环时如何避免循环遍历任何emacs缓冲区列表中始终存在的消息和scrratch缓冲区.我从不使用那些缓冲区,并且在循环访问缓冲区列表时会变得眼花缭乱

Luk*_*vin 7

如果您从未使用暂存缓冲区,只需将其添加到.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)))
Run Code Online (Sandbox Code Playgroud)

您需要将临时和消息缓冲区添加到变量中crs-hated-buffers,例如:

(add-to-list 'crs-hated-buffers "*Messages*")
(add-to-list 'crs-hated-buffers "*scratch*")
Run Code Online (Sandbox Code Playgroud)


eve*_*_jr 5

卢克回答了你的具体问题.根据我的个人经验,缓冲循环作为最近使用的堆栈而不是Emacs默认循环功能更有用.也就是说,您最近使用的缓冲区应该冒泡到堆栈顶部,类似于alt-tab在Windows中的工作方式.

有很多软件包在wiki上实现了这一点. buffer-stack是我推荐的那个.默认情况下,它有一个排除缓冲区列表,我已经包含了我的buffer-stack-suppl配置,它执行相同的主模式过滤.如果您提出问题buffer-stack,我会尽力帮助您.