能否让ivy-read适应左右分割的窗口

屏幕较大时想要让视野不要移动到其它地方,但是ivy使用minibuffer总是从左下角出现, 有什么好的办法让ivy在当前window下出现(多个window)

我找到一个简单的方法

(setq ivy-count-format "")
(let ((padding (make-string (window-left-column) ?\s)))
  (ivy-read (concat padding "Pick:")
            (mapcar (lambda (x)
                      (concat padding (number-to-string x)))
                    (number-sequence 1 10))))

如何设置ivy才能达到上述效果呢?

必须 Child Frame 了,看看这个是不是你想要的 https://github.com/tumashu/ivy-posframe

终端 Emacs 暂时没有这个特性。

屏幕都那么大了,可以直接并排两个Emacs窗口:

  1. 创建新的Emacs窗口
    (make-frame)
    
  2. 两边各放一个窗口 这个用鼠标拖动就行
  3. 关闭窗口
    (delete-frame)
    

如果还想要更多的窗口,重复上述过程。

楼上一定没亲自跑过Emacs内置教程,不知道C-x 5 2 和 C-x 5 0

我觉得居中就好了

完全无法理解这种反人类的binding。。。

1 个赞

也许吧,但是用了Emacs近20年以后,这个基本上已经成为反射,大脑只需要下指令开个窗口,手指就可以从这里接管了。至于到底按了什么键,反而要想一想才能写出来。

1 个赞

光用ivy也可以设成就地弹出

(setq ivy-completion-beg 0)
(setq ivy-display-function 'ivy-display-function-overlay)

终端窗口也可用

1 个赞

最终自己实现了解决方法

  (setq ivy-count-format "")
  (defvar maple/ivy-format-padding nil)

  (defun maple/ivy-read-around (-ivy-read &rest args)
    "Advice ivy-read `-IVY-READ` `ARGS`."
    (let ((maple/ivy-format-padding (make-string (window-left-column) ?\s)))
      (setcar args (concat maple/ivy-format-padding (car args)))
      (apply -ivy-read args)))

  (advice-add 'ivy-read :around #'maple/ivy-read-around)

  (defun maple/ivy-format-function (cands)
    "Transform CANDS into a string for minibuffer."
    (ivy--format-function-generic
     (lambda (str)
       (concat maple/ivy-format-padding (ivy--add-face str 'ivy-current-match)))
     (lambda (str)
       (concat maple/ivy-format-padding str))
     cands "\n"))

  (setq ivy-format-function 'maple/ivy-format-function)

效果图, 哈哈

1 个赞