我现在更新了我的拼音搜索设置,有兴趣的可以试试,中文英文同时搜出,支持首字母搜索或者全拼搜索
(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 个赞
pz239
16
我也遇到了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 个赞
现在得用pyim-cregexp-build-1
才可以了
lyjdwh
20
用了这个配置,当同时搜索多个词时,为啥中间部分被阴影覆盖了呀?
我现在用的版本是:
(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 个赞
lyjdwh
23
我把第二行的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就好了
就是上面 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)))))
我把你的调整,结合我自己的配置,创建了函数 pyim-ivy-cregexp ,提交到 pyim 包了,也许可以方便大家。
1 个赞
yaoni
33
感谢,我这里遇到了一个问题,就是使用这个配置之后发现似乎 ivy--flx-sort
不能正常工作了。
使用 ivy--regex-fuzzy
:
使用 eh-ivy-cregexp
:
不知道这个是什么原因呢?
这是我的 eh-ivy-cregexp
,基本就是复制粘贴的你的代码
(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很长时间了,已经搞不清它的代码了