helm与ivy简单对比


我为什么放弃ivy回到了helm

说一说ivy用的不爽的地方吧

counsel-find-file

counsel-find-file作为最常用的命令,ivy竟然没有把默认的find-file进行覆写,比如我在dired中想要复制文件,我习惯使用C-h退回上一个目录,但即使我之前已经设置了

:map counsel-find-file-map
("C-h" . counsel-up-directory)

但只有在使用counsel-find-file时有效,类似dired中是无效的,相比较于helm-find-filesfind-file进行覆写,无论何时都能使用自己自定义的按键,这很不爽

tab键

helm中,tab仅作为补全使用,想要打开选中项,则需要按一下enter键,而在ivy中,我不知道开发者怎么想的, 我需要记住两个或两个以上的按键

在ivy中,tab键就像命令名称ivy-alt-done一样,意味着按一下tab,就能得到helm中tab and enter的效果。

这很方便是不是?

但是,如果我要在emacs中重命名一个文件,把aaa.py重命名为aaa.py.bak,这该怎么办,在helm中我可以很容易的重命名,因为tab只是补全,我在tab后输入.bak然后enter就行,在ivy中,我得一个字符一个字符手打,或者记住其它按键补全选中项,然后才能重命名

记忆多个按键

ivy有这样一个问题,它不会像helm一样在第一行显示用户输入的字符,在ivy的很多issue中都有人提了这个问题,如果当前目录下有名为aaa的目录,这是我想要创建一个aaa.py的文件,ivy会列出aaa这个目录,那是我该怎么创建aaa.py文件。方法是一个新的命令ivy-immediate-done,而不是ivy-alt-done

模糊搜索

在helm中我可以很容易的使用模糊搜索,ivy中也一样,只要简单的设置

(setq ivy-re-builders-alist
      '((t . ivy--regex-fuzzy)))

但ivy中有这样一个问题,空格键不能在模糊匹配中使用,/汗,作为从helm转入ivy的人,经常会不经意间在输入时按下空格键,然后,What? ivy中搜索变成空了

候选词按使用频率排序

helm默认支持,但在ivy中我需要安装smex,只安装smex,又不需要什么配置,文档也没有提供(这是我摸索出来的),有些莫名其妙

minibuffer

这是我对ivy种草的原因,从minibuffer中弹出待选项,多么帅气,哪里像helm,使用一个buffer作为弹出框,还带一个"丑丑"的mode-line,但后面仔细研究后,才发现helm从当前buffer中弹出helm-buffer是多么明智的选择,视野不会移动到当前buffer以外的地方,尤其是在屏幕较大的时候

dired中复制或重命名文件

我之前想要复制或重命名一个文件,只要进入dired中按CR,然后选择目标就行,但不知道为什么,使用ivy时复制重命名总是报错,不成功(后面也没有继续折腾)

sudo edit

我从spacemacs中复制了一段代码

(defun file/sudo-edit (&optional arg)
  (interactive "p")
  (let ((fname (if (or arg (not buffer-file-name)) (read-file-name "File: ") buffer-file-name)))
    (find-file
     (cond ((string-match-p "^/ssh:" fname)
            (with-temp-buffer
              (insert fname)
              (search-backward ":")
              (let ((last-match-end nil)
                    (last-ssh-hostname nil))
                (while (string-match "@\\\([^:|]+\\\)" fname last-match-end)
                  (setq last-ssh-hostname (or (match-string 1 fname) last-ssh-hostname))
                  (setq last-match-end (match-end 0)))
                (insert (format "|sudo:%s" (or last-ssh-hostname "localhost"))))
              (buffer-string)))
           (t (concat "/sudo:root@localhost:" fname))))))

可以很容易地使用sudo对文件进行进行编辑,但使用ivy时不成功,印象分又-1

helm中也有用的不爽的地方,比如:

  • 有个header-line是什么鬼

    设置了helm-display-header-linenil还是有,字体那么大,背景那么丑,显示出来干嘛,虽然后面设置height0.1解决

  • 在mode-line显示help信息干嘛

    我已經对helm很熟悉了,不需要这些help info,后面设置spaceline-helm-help-pnil解决

  • multi source

    我不知道这对谁有用,反正对我没用

  • ...

另外,很多人提到的ivy速度要比helm快,这个就仁者见仁,智者见智了,如果说的是启动速度,我的emac配置已经优化为1s内启动,如果是弹出速度,我没有具体对比过,不过就个人而言,helm与ivy弹出速度感觉两者都差不多

总之,helm大而全,ivy小而精,但helm有过多的为用户做出选择,ivy在细节上打磨的不太够,哪个用得爽就选谁吧,反正我用helm!