今天尝试用posframe显示ibuffer
(when (posframe-workable-p)
(defun show-ibuffer-in-posframe (&optional other-window-p name qualifiers noselect
shrink filter-groups formats)
(let ((buf (get-buffer-create (or name "IBuffer"))))
(with-current-buffer buf
(or (derived-mode-p 'ibuffer-mode)
(ibuffer-mode))
(ibuffer-update nil)
(posframe-show buf
:position (point)
:background-color (face-background 'default)
:foreground-color (face-foreground 'default)
:internal-border-width 1
:internal-border-color (face-foreground 'default)
:poshandler #'posframe-poshandler-frame-center-near-top
)
)
)
)
(advice-add #'ibuffer :override #'show-ibuffer-in-posframe)
)
但是发现这样用,没法把光标放到posframe的窗口里面去,也就没法操作ibuffer了
随便改了下,应该是可以的。需要制定一些参数
(defun show-ibuffer-in-posframe (&optional other-window-p name qualifiers noselect
shrink filter-groups formats)
(interactive)
(let ((buf (get-buffer-create (or name "IBuffer"))))
(with-current-buffer buf
(or (derived-mode-p 'ibuffer-mode)
(ibuffer-mode))
(ibuffer-update nil)
(posframe-show buf
:position (point)
:internal-border-width 3
:internal-border-color (face-foreground 'shadow nil t)
:background-color (face-background 'tooltip nil t)
:poshandler #'posframe-poshandler-frame-center
:accept-focus t
))))
加了个hidehandler, 不过反应不是特别灵敏,不知道为啥,想做成那种选中buffer就直接关掉这个posframe的效果
(when (posframe-workable-p)
(defun ibuffer-posframe-hidehandler (_)
(not (string= (buffer-name (current-buffer)) "IBuffer"))
)
(defun show-ibuffer-in-posframe (&optional other-window-p name qualifiers noselect
shrink filter-groups formats)
(interactive)
(let ((buf (get-buffer-create (or name "IBuffer"))))
(with-current-buffer buf
(or (derived-mode-p 'ibuffer-mode)
(ibuffer-mode))
(ibuffer-update nil)
(posframe-show buf
:position (point)
:internal-border-width 3
:internal-border-color (face-foreground 'shadow nil t)
:hidehandler #'ibuffer-posframe-hidehandler
:background-color (face-background 'tooltip nil t)
:poshandler #'posframe-poshandler-frame-center
:accept-focus t
))))
(advice-add #'ibuffer :override #'show-ibuffer-in-posframe))
我只是给你一个例子,还需要其他的很多设置才可用。个人认为在child frame显示ibuffer没有什么意义,还带来不少复杂度。
不建议这么做,posframe 设计之初,就是只显示,不获取焦点,因为焦点处理太麻烦了,
那vertico-posframe这样的插件也是从焦点处理开始做的吗
不是, vertico-posframe 不处理焦点,它只是把 minibuffer 中的内容显示一下而已,焦点一直在minibuffer
你的意思是,posframe只是做一个显示器。光标,焦点啥的其实还是在minibuffer里面的?
那我应该做的事情就是,创建ibuffer的 buffer并且分配window给ibuffer 然后将buffer传给posframe 显示,最后聚焦在ibuffer的window上。不过有个问题,就是这个window要怎么分配,而且分配了还不能直接显示在界面上,因为有posframe做显示器了
所以现在vertico-posframe ivy-posframe的做法是把buffer发到minibuffer里面,然后再用posframe显示是吗
不建议折腾这个,因为我感觉不到在 posframe 中显示 ibuffer 有什么用。
主要是,vertico的buff操作太烦了。没有ivy方便。不然我也不搞这个ibuffer