ln -sv target/release/libfuz_core.so fuz-core.so
macOS下应该是 ln -sv target/release/libfuz_core.dylib fuz-core.so
?
排序舒心多了,只是发现一个问题,describe-variable
很慢很慢~~~ 似乎ivy-fuz-fuzzy-sort-fn
有点问题
ln -sv target/release/libfuz_core.so fuz-core.so
macOS下应该是 ln -sv target/release/libfuz_core.dylib fuz-core.so
?
排序舒心多了,只是发现一个问题,describe-variable
很慢很慢~~~ 似乎ivy-fuz-fuzzy-sort-fn
有点问题
https://github.com/cireu/fuz.el/blob/improve/maybe-speedup-ivy-fuz/ivy-fuz.el
推送了一个补丁到新branchimprove/maybe-speedup-ivy-fuz
上。
原来ivy--flx-sort
要先构建模糊正则来筛选candidate,我当时无脑照抄了,其实直接配合memo-fn用计算出来的score来筛选就行,还能避免多次计算分值。
自动下载预编译binary还是等release先吧
这个补丁对于describe-variable
还是很慢啊,其他都很好
之前一直搞错了一个事情,fuzzy sort应该用ivy-sort-matches-functions-alist
来修改,而我错用了ivy-sort-functions-alist
。现在我已经更新了README
尝试下这个设置。
(setq ivy-sort-matches-functions-alist '(t . ivy-fuz-sort-fn))
(setq ivy-re-builders-alist '(t . ivy-fuz-regex-fuzzy))
(setq ivy-highlight-functions-alist '(ivy-fuz-fuzzy-regex . ivy-fuz-highlight-fn))
(with-eval-after-load 'ivy
(require 'ivy-fuz))
现在行了,谢谢
Update:README 中还有ivy-fuz-fuzzy-regex
大佬,给 snails 写一个 fuz.el 的插件? 看着你的 fuz.el 很不错啊
暂时还没看懂snail的代码,正在研究中。
snails-core.el 是框架主代码,主框架监听 Input buffer 的输入,输入变化时,重新生成一个 input ticker 分给后端去搜索干活
后端控制候选词的搜索和匹配,后端完成的时候,返回 input ticker 给主框架,不管后端干活多么给力,一旦 Input ticker 过期了(就是干活的时候用户输入变化了)主框架就把后端的结果抛弃掉
如果 input ticker 没有过期,主框架就调用 snails-update-callback 来渲染后端返回的候选词
如果是异步子进程的话,Input ticker过期会直接导致子进程被杀掉
整个模糊匹配和高亮其实都是在每个 snails-backend-*.el 文件中自己控制的,主框架只负责监听输入事件、调用后端、管理后端的返回值,主框架啥核心的活都不干。
所有可以基于 fuz.el 写一个通用的匹配函数放到 snails-core.el 中,然后在每个 backend 文件中用 fuz.el 代码替换现在还比较简陋的 string-match-p
昨晚尝试用rayon执行并行化计算。结果发现CPU时间是跑满了,整体的速度却下降了 。emacs的dynamic module设计太过动态,导致每次module的函数要执行,都要各种转换数据类型。甚至连list这种常见的数据结构,都得通过env.funcall("car")
让lisp虚拟机执行然后再手动cast类型给Rust。
对于命令locate来说 fuz应该是没有用的 对于rg 好像也没用
其实替换每个后端的 string-match-p 就可以了 snails/snails-backend-buffer.el at 489299bd1242e7786aa8cc73ea7f9a838fe6fe18 · manateelazycat/snails · GitHub
筛选不需要fuz啊,只要构建一个[^f]*f[^o]*o[^o]*o
的正则就可以了。fuz的算分算法是用来排序的。