怎样给 Ivy 添加拼音支持

我现在更新了我的拼音搜索设置,有兴趣的可以试试,中文英文同时搜出,支持首字母搜索或者全拼搜索

(use-package pyim
  :after ivy
  :config

  (defun eh-ivy-cregexp (str)
    (let ((a (ivy--regex-plus str))
          (b (let ((case-fold-search nil))
               (pyim-cregexp-build str))))
      (if (and a (stringp a))
          (concat a "\\|" b)
        a)))

  (setq ivy-re-builders-alist
        '((t . eh-ivy-cregexp))))
6 个赞

我也遇到了M-x没有候选项的情况,请问兄弟最后是如何解决的?

今天又更新了一下 ivy pinyin 搜索支持,感觉更好用了,不过要配合最新的 pyim,可能 melpa 还没有更新

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

(setq ivy-re-builders-alist
      '((t . eh-ivy-cregexp)))
6 个赞

6 个赞

现在得用pyim-cregexp-build-1才可以了

用了这个配置,当同时搜索多个词时,为啥中间部分被阴影覆盖了呀?

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: