我想在posframe中显示ibuffer,但是光标没法focus到posframe里面去

今天尝试用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里面的?

这个比喻很恰当 :rofl:

那我应该做的事情就是,创建ibuffer的 buffer并且分配window给ibuffer 然后将buffer传给posframe 显示,最后聚焦在ibuffer的window上。不过有个问题,就是这个window要怎么分配,而且分配了还不能直接显示在界面上,因为有posframe做显示器了

所以现在vertico-posframe ivy-posframe的做法是把buffer发到minibuffer里面,然后再用posframe显示是吗

不建议折腾这个,因为我感觉不到在 posframe 中显示 ibuffer 有什么用。

主要是,vertico的buff操作太烦了。没有ivy方便。不然我也不搞这个ibuffer