有没有插件可以设置一个frame的buffer过滤条件?

frame有个buffer-predicate参数, 但是它好像只用来选择other-buffer, 不会影响buffer-list.

现在想让某个frame只能访问满足指定条件的buffer, 即可以影响并及时更新该frame的buffer-list, 比如切换buffer时候, 列表只显示满足条件的buffer, 打开新文件的时候, 如果该文件打开后buffer满足条件, 则自动添加到buffer-list中, 不满足则不添加.

不知道有没有这样的插件


找到一个类似功能的插件, 看了一下, 在这个基础上改改应该就可以了.

https://www.emacswiki.org/emacs/FrameBufs

src/frame.c

void
*frames_discard_buffer* (Lisp_Object buffer)

{

Lisp_Object frame, tail;

FOR_EACH_FRAME (tail, frame)

他好像是无差别删除

感觉ivy/helm能解决你的需求吧。

(defun +ivy--is-workspace-or-other-buffer-p (buffer)
  (let ((buffer (car buffer)))
    (when (stringp buffer)
      (setq buffer (get-buffer buffer)))
    (and (not (eq buffer (current-buffer)))
         (+workspace-contains-buffer-p buffer)))) ;检查当前buffer在不在当前workspace里
(defun +ivy/switch-workspace-buffer (&optional arg)
  "Switch to another buffer within the current workspace.

If ARG (universal argument), open selection in other-window."
  (interactive "P")
  (ivy-read "Switch to workspace buffer: "
            'internal-complete-buffer
            :predicate #'+ivy--is-workspace-or-other-buffer-p
            :action (if arg
                        #'ivy--switch-buffer-other-window-action
                      #'ivy--switch-buffer-action)
            :matcher #'ivy--switch-buffer-matcher
            :keymap ivy-switch-buffer-map
            :caller #'+ivy/switch-workspace-buffer))

这个应该是在删除被关闭了的buffer, 这个不影响.

如果用workspace的概念, 我这边相当于打开了多个workspace, 用你说这种方法, 需要写多个这样的函数, 每个函数负责一个workspace.

其实我想实现的效果是, 使用多frame, 每个frame可以选择workspace, 一个frame绑定一个workspace, 只能看到该workspace的文件.

为啥需要写多个函数?spacemacs/doom emacs管理workspace的方式应该都是用project root去filter buffer吧,我具体的实现没去看,不过应该就是这样。

可我并没有太理解你的需求,code里有workspace单纯是因为有这样的做法,你完全可以把workspace换成自己想要的filter效果。

如果是workspace+project的概念, 那么假定我打开的文件里总共涉及到5个project, 如何查看某一个project的buffer列表?

论坛回复功能好像有问题, 有时候回复别人的帖子没有指向箭头

没有箭头默认回复上一层或者回复主楼

好像是persp-mode干的事情,它在每个perspective里要先添加一个buffer才能switch到这个buffer,你再在不同的buffer开启不同的perspective就好了。

看了一下, 比较接近想要的效果, 谢了