新Emacs插件: Peek

对的,peek-goto-xref-defintion-func 可以自定义。要实现预览defintion功能可以分为下面几步:

  1. 有一个可以直接跳转到definition位置的函数,在例子里也就是peek-goto-xref-defintion-func。这个函数完全自定义,接受任意参数,并不需要返回任何值,唯一需要take care的就是在当前window里跳转到definition所在的buffer的point。
  2. 然后接入peek-definition,对应peek-xref-definition。peek-definition的格式是 (peek-definition FUNC &optional ARGS),FUNC就是第一步的函数,ARGS是传递给这个函数的参数的一个list。在例子里,我们传递给 peek-goto-xref-defintion-func当前光标下的Symbol。

如果我没有理解错的话,你的函数接入peek可以这样写:

(defun peek-agda2-definition ()
  "Peek definition of symbol at cursor point."
  (interactive)
  (peek-definition 'agda2-goto-definition-keyboard '()))

正解,用上了,感谢!有三点使用问题(可能并不普遍。。)

  1. 代码高亮:可能不是正则高亮的缘故(?),如果定义在另一个文件,那么peek的窗口显示是不高亮的(如果我用原来的跳转的话,是高亮好的)
  2. 没有禁止我的窗口跳转(这个我完全可以自己删掉跳转窗口的那一行来解决)
  3. 我注意到小窗口总是显示是在我cursor的上面几行,纯键盘的话没啥问题,用鼠标往上滚动起来有异常行为(不知道楼主用不用鼠标)

确实,还存在一些问题,开发测试不全,导致跨文件/buffer情况没测试 :joy:
关于第一点:跨文件(并且是当前没有对应buffer的文件)之后确实没有高亮,但用M-nM-p上下滚动peek view后可以高亮(一些可以,一些不可以)。
第二点:没看懂“窗口跳转”什么意思 XD, 是指跳转到另外一个窗口显示definition吗?peek-definition接受的函数不应该跨窗口操作。
第三点: 可以通过peek-overlay-distance来设置距离(README里忘说了 :joy:
此外,貌似测出了跨文件/buffer的peek definition貌似不能跳转回来。 修bug去了 XD


编辑:
已修复:

  1. 不能跳转回来的问题
  2. 修复跨文件高亮问题
    (完成)
2 个赞

查找定义固然重要,但像c++这种有虚函数和重载特性的语言,没有查找引用的话,使用体验上会难受很多。不知道什么时候emacs能把这块给补上,真的奇怪为什么VS的查引用这么好用,而emacs这块这么弱

3 个赞

个人感觉lsp + consult-xref挺好用的(没试过c++ :face_with_peeking_eye:):

2 个赞

我有一个大胆(或是无知)的想法不知当不当提,这个peek的思路能不能变出一个辞典来

查看变量定义~~查看单词释义?

哈哈想法都可以提啊 : ) 。这个feature通过peek-overlay-set-custom-content(接受一个字符串参数,来设定peek view的内容)或者peek-definition 实现是完全可行的。然而需要面临一些问题:

  1. 对接什么查看词典的接口,比如dictionary-search
  2. 这个词典接口返回的数据是否适合使用peek view(使得查出来的结果比较少),比如这是我的 dictionary-search(给 dictd 配置了比较多的词典源),可以查到很多定义,我觉得并不适合用 peek 来查看: (当然因为dictionary-search的结果多少根据查的词和个人的dictd配置而异,所以说不定适合 peek
    还有一个需要考虑的地方:用 eldoc 来实现是否更加合适,因为 eldoc 更加普遍和通用,而且 peek 已经提供了显示 eldoc 的命令。不过用 eldoc 来实现容易与 major mode 的 eldoc 配置相冲突,所以可能并不是很好。

当然我觉得这个想法挺好的。 我可能会去实现一个dictionary-searchpeek。<3

1 个赞

我不懂哈,只是建议

建议用这个词典《简明英汉增强版》 优点:离线词库全,有接口;实现结果可参考 T.vim 查词示例

1 个赞

我觉得你提供的这个词典可以看看是否能够接入dict (debian - dict, dibian - dictd; archlinux - dictd)。自从 Emacs 28 以来,Emacs 提供了 dicrtionary.el 模块(dictionary-search 命令就是来自这个模块),方便与 dictd 交互。另建了一个仓库, 加入了 Peek 和 dictionary.el 的 交互。
https://git.sr.ht/~meow_king/peek-collection


Mastering Emacs 上有篇文章挺好地介绍了 dictionary.el 和 dict / dictd: Wordsmithing in Emacs - Mastering Emacs

非常感谢指点,花了半天的时间找到了一个简化版加入dict查询了,接一来再研究如何用你的新库

1 个赞