2

我使用ibuffer以及打开了几个框架。我的一个非常常见的用例ibuffer是按名称/文件名过滤C-x C-b缓冲区列表()。问题是过滤器对所有帧都以相同的方式工作(我相信这是预测的)。我想必须为我拥有的每一帧的 ibuffer 列表应用过滤器。

例如,在第一帧中,我希望看到按文件名过滤的缓冲区列表,在第二帧中按模式过滤。

环顾四周,ibuffer.el我发现了一个名为的实体ibuffer-filtering-qualifiers,它包含当前应用的过滤器的关联列表。我试过玩:

(let ((ibuffer-filtering-qualifiers '())) ;;; Imitate that there are no filters applied
   (call-interactively 'ibuffer))

但这对我不起作用。

您能否指出我如何实现这种期望的行为ibuffer

4

2 回答 2

3

该函数ibuffer-update使用buffer-list,它包括所有帧。ibuffer-update从使用修改buffer-list(frame-parameter (selected-frame) 'buffer-list)接近您正在寻求的行为。基于相同概念的 ibuffer 过滤器也应该是可能的。

在我看来,每帧缓冲区列表(frame-parameter (selected-frame) 'buffer-list)并不是将缓冲区与帧相关联的最佳方法,因为它太容易被修改。我见过的最好的方法是 Al Parker 的 frame-bufs:   https ://github.com/alpaker/Frame-Bufs  这已更新为与当前版本的 Emacs 一起使用,但是,我使用的是稍微修改过的版本适合我自己的需要。

因此,我知道回答您的问题的最简单方法是使用 Al Parker 的帧缓冲区组合,并使用frame-bufs-buffer-listinside ibuffer-update。这给了你两全其美。这是一个示例,它将为您提供一个漂亮的 ibuffer,其中只有与给定帧关联的缓冲区——所有其他缓冲区都不会显示。[仅供参考:帧缓冲区也按模式或文件名排序。]

(require 'ibuffer)

(defalias 'ibuffer-update 'lawlist-ibuffer-update)

(defun lawlist-ibuffer-update (arg &optional silent)
  "Regenerate the list of all buffers.

Prefix arg non-nil means to toggle whether buffers that match
`ibuffer-maybe-show-predicates' should be displayed.

If optional arg SILENT is non-nil, do not display progress messages."
  (interactive "P")
  (if arg
      (setq ibuffer-display-maybe-show-predicates
        (not ibuffer-display-maybe-show-predicates)))
  (ibuffer-forward-line 0)
  ;; (let* ((bufs (buffer-list))
  (let* ((bufs (frame-parameter (selected-frame) 'frame-bufs-buffer-list))
     (blist (ibuffer-filter-buffers
         (current-buffer)
         (if (and
              (cadr bufs)
              (eq ibuffer-always-show-last-buffer
              :nomini)
              (minibufferp (cadr bufs)))
             (cl-caddr bufs)
           (cadr bufs))
         (ibuffer-current-buffers-with-marks bufs)
         ibuffer-display-maybe-show-predicates)))
    (and (null blist)
     (featurep 'ibuf-ext)
     ibuffer-filtering-qualifiers
     (message "No buffers! (note: filtering in effect)"))
    (unless silent
      (message "Updating buffer list..."))
    (ibuffer-redisplay-engine blist arg)
    (unless silent
      (message "Updating buffer list...done")))
  (if (eq ibuffer-shrink-to-minimum-size 'onewindow)
      (ibuffer-shrink-to-fit t)
    (when ibuffer-shrink-to-minimum-size
      (ibuffer-shrink-to-fit)))
  (ibuffer-forward-line 0)
  ;; I tried to update this automatically from the mode-line-process format,
  ;; but changing nil-ness of header-line-format while computing
  ;; mode-line-format is asking a bit too much it seems.  --Stef
  (setq header-line-format
        (and ibuffer-use-header-line
             ibuffer-filtering-qualifiers
             ibuffer-header-line-format)))
于 2013-11-10T00:31:37.163 回答
2

您遇到的问题不是 ibuffer 对所有帧都以相同的方式工作。问题是所有帧的 ibuffer 缓冲区都是相同的(每个帧都有一个单独的窗口(带有光标),显示您的 ibuffer 唯一实例)。

一个简单的解决方案是克隆 ibuffer 缓冲区(Mx clone-buffer)。那就是:你有两个不同的缓冲区,你可以独立地对它们应用过滤器。

于 2013-11-08T07:45:47.623 回答