tumashu / vertico-posframe

GNU General Public License v3.0
106 stars 16 forks source link

请问如何在开启 vertico-posframe-mode 时不展示echo area? #27

Closed zhenhua-wang closed 1 year ago

zhenhua-wang commented 1 year ago

我在开启vertico-posframe-mode 时, echo area会同步展示当前输入的指令 (如图)。请问如何不展示echo area? 2023-02-07-131538_1385x776_scrot

另外,ivy-posframe就不会有这个问题,看了下代码,ivy-posframe是通过ivy-posframe-hide-minibuffer控制的。但设置vertico-posframe-show-minibuffer-rules 为 nil 没什么效果

zhenhua-wang commented 1 year ago

我又研究了一下vertico 和 ivy-posframe。发现ivy-posframe是用overlay来遮住echo area,我尝试在vertico中用相同办法,发现前面的count没法遮挡。跑去看vertico源码才发现vertico count也是通过overlay来展示的,所以只需要在添加overlay之前先删除vertico--count-ov就可以实现隐藏echo area

(advice-add 'vertico-posframe--show :after 'zw/vertico-posframe-hide-minibuffer)

(defun zw/vertico-posframe-hide-minibuffer (BUFFER WINDOW-POINT)
  (remove-overlays (point-min) (point-min))
  (let ((ov (make-overlay (point-min) (point-max) nil nil t)))
    (overlay-put ov 'window (selected-window))
    (overlay-put ov 'face
                 (let ((bg-color (face-background 'default nil)))
                   `( :background ,bg-color :foreground ,bg-color
                      :box nil :underline nil
                      :overline nil :strike-through nil)))
    (setq-local cursor-type nil)))

不过有一个问题是,这样没法显示cursor

zhenhua-wang commented 1 year ago

刚发现这一问题只在exwm中出现。。请问大佬知道大概要研究哪一部分吗?

tumashu commented 1 year ago

vertico-posframe use (set-window-vscroll minibuffer-window 100) to hide prompt.

(defun vertico-posframe--handle-minibuffer-window ()
  "Handle minibuffer window."
  (let ((show-minibuffer-p (vertico-posframe--show-minibuffer-p))
        (minibuffer-window (active-minibuffer-window)))
    (setq-local max-mini-window-height 1)
    (window-resize minibuffer-window
                   (- (window-pixel-height minibuffer-window))
                   nil nil 'pixelwise)
    (set-window-vscroll minibuffer-window 100)
    (when show-minibuffer-p
      (set-window-vscroll minibuffer-window 0))))
tumashu commented 1 year ago

ivy-posframe and vertio-posframe use different method to hide minibuffer's prompt.

zhenhua-wang commented 1 year ago

好吧,一开始没看明白set-window-vscroll的作用,原来是把echo area翻出屏幕。

可能是exwm限制了这种窗口的移动。。我对window manager理解太浅了,应该没办法处理这个问题了,感谢回复

tumashu commented 1 year ago

我猜测未必是限制了,可能是某个 hook 把翻出的效果不小心取消了

zhenhua-wang commented 1 year ago

有道理,不过exwm太复杂,而且作者都抛弃这项目,我好几次都没研究明白。。。

我直接简单粗暴的定义了个poshandler把modeline和echo area挡住了。

tumashu commented 1 year ago

666