Snails超级快的模糊搜索框架

我还没有试 snails,但是 tiling wm 应该都可以设定一些规则让某些窗口是浮动的,你要不试试(

1 个赞

花了5分钟写了一个 rg 全文搜索后端:

Jul-22-2019%2019-36-08

i3wm 可以设置 float window,不知道 sway 是不是支持,下面对 Helm 的 frame 是适用的:

for_window [class="Emacs" title="Helm"] floating enable
1 个赞

和朋友在聊 Snails 的设计思路,分享一下聊天记录:

snails-core.el 是框架主代码,主框架监听 Input buffer 的输入,输入变化时,重新生成一个 input ticker 分给后端去搜索干活

后端控制候选词的搜索和匹配,后端完成的时候,返回 input ticker 给主框架,不管后端干活多么给力,一旦 Input ticker 过期了(就是干活的时候用户输入变化了)主框架就把后端的结果抛弃掉

如果 input ticker 没有过期,主框架就调用 snails-update-callback 来渲染后端返回的候选词

如果是异步子进程的话,Input ticker过期会直接导致子进程被杀掉

整个模糊匹配和高亮其实都是在每个 snails-backend-*.el 文件中自己控制的,主框架只负责监听输入事件、调用后端、管理后端的返回值,主框架啥核心的活都不干。

简单来说,就是每次输入的时候框架分配一个新的 ticker , 后端们自己去搜索,得到结果的时候看看自己的 ticker 是不是最新的,最新的就能用,不是最新的就丢掉。

如果 ticker 都更新了,后端还没有干完活,会被框架直接杀掉。

每次输入变化,都会导致启动子进程,但是很多时候敲入过程的字符没必要搜索,所以就用 run-with-idle-timer 0.1 在指头一松的时候去让后端去干活

这个框架的目的就是,只监听输入事件变化,同时给不同的后端分配任务,至于怎么搜索,怎么过滤,框架完全不管。

框架只管定义宏让后端的代码尽量的少。

5 个赞

即使你不用emacs,EXWM只做窗口管理也很不错啊

画了一张snails的架构图

2 个赞

社区大牛花了5分钟写了一个 bookmark 插件: add bookmark backend by pengpengxp · Pull Request #6 · manateelazycat/snails · GitHub

我打开snails后直接占据我整个emacs页面,并且搜索字体也变得特别大。。是我哪里没调好吗

是不是你的窗口管理器有啥自动变大的设置?

默认弹出窗口只有Emacs窗口的一半大小。

写了一篇Snails技术架构的文章,欢迎大家看完后来贡献插件 !

https://manateelazycat.github.io/emacs/2019/07/23/snails-framework.html

我没有动过窗口管理器吧,白天在公司里用win10的emacs27也同样是这个效果

你看看在Linux上或者Mac上能够重现吗?

我这边主要用Mac,没有win10的环境。

上面的截图就是我个人lubuntu系统的重现。

稍等,我去读一读你的源代码看看我这的问题是咋回事

没有GUI的我只能眼馋了

我的terminal下直接segment fault 了

terminal 不支持 make-frame 啊

今天更新了很多补丁,除了更高级的模糊搜索、关键字匹配以外,该有的功能都有了。 性能也相对于前天的第一版本有了很多优化。

大家有问题可以继续反馈,现在我已经用 snails 完全替换 helm 了。

(add-to-list 'default-frame-alist '(fullscreen . maximized)) 是不是你的配置中有这句话,注释掉就可以了

3 个赞

咱个人还没在用,主要是因为在终端里也用 Emacs :rofl: 不过咱想说一些需求,或许可以考虑一下:

  • 有时单纯的一个 candidate-do 还不能满足需求。比方说如果用来搜索 company 的补全结果,可能会想要用一个快捷键查看某选项的文档;再比如文本之后可能想要做替换,不知您使用 helm 时是否有类似的需求?是否打算在 Snails 中实现呢(或者有替代方案?)
  • helm 有类似这种的 multi-editing 方案,ivy 也有替代方案,Snails 是否有可能也把搜索到的结果放到一个 buffer 里,并提供浏览 + 编辑的功能呢?

其实换句话就是我看着 Snails 现在的功能很单纯(当然单纯也是美的 :smile:),想知道您之后想朝一个什么方向发展它呢?

懒猫为什么没有采用 child frame 呢?make frame 感觉代价还是高很多啊