怎样给 Ivy 添加拼音支持

不用的时候是这样的

ivy2

我现在用的版本是:

(defun eh-ivy-cregexp (str)
  (let ((x (ivy--regex-plus str))
        (case-fold-search nil))
    (if (listp x)
        (mapcar (lambda (y)
                  (if (cdr y)
                      (list (if (equal (car y) "")
                                ""
                              (pyim-cregexp-build (car y)))
                            (cdr y))
                    (list (pyim-cregexp-build (car y)))))
                x)
      (pyim-cregexp-build x))))

5 个赞

我把第二行的ivy--regex-plus改成ivy--regex-ignore-order就好了

ivy--regex-ignore-order会把空格当成分隔符,ivy--regex-plus会匹配空格

1 个赞

在doom下,由于使用了ivy-prescient,采用增加advice方式支持pinyin:

  (defun pinyin/around (old-fun query &rest args)
    (let ((result (apply old-fun query args))
          (pinyin nil))
      (when (and (> (length query) 0)
                 (equal (substring query 0 1) ":"))
        (setq pinyin (evil-pinyin--build-regexp (substring query 1)))
        (setq result (list (concat pinyin ".*"))))
      result))
  (advice-add 'prescient-filter-regexps :around #'pinyin/around)

发现一个不是bug的问题。 我在使用这个代码之后, org-insert-link 行为发生了变化。 在用之前, 我先 org-store-link 然后 org-insert-link 会先定位到最后链接这个选项。 使用之后,… 不再定位到链接这里,而是选项列表的第一个。

这个问题能修复么?我看了下代码,也没有进行排序。为啥默认就变了呢?

解决了

(defun pyim--ivy-cregexp (str)
    (let ((regex-sequence (ivy--regex-plus str)) ;; (ivy--regex-ignore-order str)
          (case-fold-search nil))
      (if (listp regex-sequence)
          (mapcar (lambda (regex)
                    (if (cdr regex)
                        (list (if (equal (car regex) "")
                                  ""
                                (pyim-cregexp-build (car regex)))
                              (cdr regex))
                      (list (pyim-cregexp-build (car regex)))))
                  regex-sequence)
        (pyim-cregexp-build regex-sequence))))
  (setq ivy-re-builders-alist '((read-file-name-internal . pyim--ivy-cregexp)
                                (ivy-read . pyim--ivy-cregexp)
                                (t . ivy--regex-plus)))

指定key就好了

key???

就是上面 ivy-re-builders-alist 里面的key

得空看了下,大概是这样,原先空字符串""经过转换之后变成了"\\(?:\\)",虽然从正则角度来说貌似是一致的,不过加下判断应该就可以了:

  (defun ivy--cregex-plus (str)
    (let ((x (ivy--regex-plus str))
          (case-fold-search nil))
      (if (listp x)
          (mapcar (lambda (y)
                    (cons (pyim-cregexp-build (car y))
                          (cdr y)))
                  x)
        (if (string= "" x) x (pyim-cregexp-build x)))))

感谢,用上你的patch后有效。感谢!

我把你的调整,结合我自己的配置,创建了函数 pyim-ivy-cregexp ,提交到 pyim 包了,也许可以方便大家。

1 个赞

感谢,我这里遇到了一个问题,就是使用这个配置之后发现似乎 ivy--flx-sort 不能正常工作了。

使用 ivy--regex-fuzzy

image

使用 eh-ivy-cregexp

image

不知道这个是什么原因呢?

这是我的 eh-ivy-cregexp,基本就是复制粘贴的你的代码 :pray:

(defun eh-ivy-cregexp (str)
  ;; https://github.com/abo-abo/swiper/issues/294#issuecomment-157871131
  (let ((x (ivy--regex-fuzzy str))
        (case-fold-search nil))
    (if (listp x)
        (mapcar (lambda (y)
                  (if (cdr y)
                      (list (if (equal (car y) "")
                                ""
                              (pyim-cregexp-build (car y)))
                            (cdr y))
                    (list (pyim-cregexp-build (car y)))))
                x)
      (pyim-cregexp-build x))))

这我帮不了你了,我不用ivy很长时间了,已经搞不清它的代码了

感谢。。。我可能也要抛弃 ivy 了 :sweat_smile: