请问 native 版本的 windows Emacs (非 minGW-w64 版本) 下如何使用 xeft 呢?

官方的 emacs 也是用 mingw-w64编译的,默认是支持动态模块的,可以看 module-file-suffix 变量的值判断是否支持动态模块,支持的话值在 Windows 上应该是 .dll

没有加载成功的原因应该是 xapian-lite.dll 依赖一些动态库,但是那些动态库 emacs 找不到。

可以通过 ldd xapian-lite.dll 查看依赖哪些动态库,将没有的拷贝到 emacs.exe 目录

或者将 mingw64 的 bin 目录加到环境变量 PATH 中,eg. C:\msys64\mingw64\bin

3 个赞

大佬太强了!我的 Emacs module-file-suffix 返回的确实是 .dll,用 ldd xapian-lite.dll 查看的结果是这样的:

确实除了几个 windows 系统文件以外,都在 mingw64 的 bin 目录下。把 mingw64 的 bin 目录加到环境变量 PATH 后,Emacs 里运行 M-x xeft 可以正常出 xeft 的界面了。

这里还踩到的一个坑是本来 xeft-database 设置的是 ~/xeft_db/,结果报 xeft-full-reindex: Xapian library error: "DatabaseCreateError: c:/Users/xxx/xeft_db/: mkdir failed (File exists)",设置成 ~/xeft_db (去掉最后的斜杠) 后解决了这个问题。

不过现在还有两个小问题,一个是找到结果后,在条目上执行 xeft--find-file-at-point (回车) 后跳转的位置不对,不是关键词位置;另外似乎 Github 上的动图 (如下) 是实时出结果,我这边每次输入检索式后需要执行 xeft-refresh-full (默认是 C-c C-g) 后,才能更新结果。

Demo gif

太感谢了!折腾了两天,本来都快放弃了 :joy:

出结果是绑定的 SPACE 键,gif 上应该不是实时的,应该是按了空格键

好吧,那应该就不是问题了。但是我试了一下,我这边在检索式上按空格没有刷新结果,我看了默认的 xeft-mode-map 是这样的:

(defvar xeft-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map (kbd "RET") #'xeft-create-note)
    (define-key map (kbd "C-c C-g") #'xeft-refresh-full)
    (define-key map (kbd "C-c C-r") #'xeft-full-reindex)
    (define-key map (kbd "C-n") #'xeft-next)
    (define-key map (kbd "C-p") #'xeft-previous)
    map)
  "Mode map for `xeft-mode'.")

不知道是不是作者用空格绑定了 xeft-refresh 函数。

readme 提到了按空格预览,不需要任何配置 ,可能是你的emacs配置影响了吧

空格绑定的是 push-button

1 个赞

谢谢!我明白你的意思了,可能我没有表达清楚,我这边在条目上是按空格是可以预览的。

我是说在输入检索式的时候,似乎这个 gif 上在敲击检索式的时候,下面的检索结果就在刷新,deft 也是这样的,但是我用 xeft 的时候,输入检索式的过程中下面的检索结果不是实时更新的,我每次要按 C-c C-g 或者 M-x xeft-refresh 才能更新。

重启了下 Emacs,现在 xeft 里也能够输入检索式的时候实时更新下面的结果了 :joy:

非常感谢大家的帮助!总算用上 xeft 了,确实检索速度还挺快的。