请问如何获取类似neovim中nvim-treesitter-context的显示代码层级的效果

在nvim-treesitter-context中,可以看到当前光标位置处于哪个函数、甚至哪个if-else或for循环中,如图:

但是我在emacs中没有找到类似的插件,Sticky Func Mode和topsy只能显示出函数的签名,但是没办法展示再细化的层级信息。

是想要面包屑导航的意思吗,看看这个是否合适 GitHub - joaotavora/breadcrumb: Emacs headerline indication of where you are in a large project

如果是想要高亮当前作用域的话,可以看下这个 这样的高亮插件Emacs下有么? - #29,来自 LiuYinCarl

谢谢!但是并不是我想要的那种效果,我想要的效果是能显示出光标所在的if, for循环的层级,因为目前我在做的项目中有大量的长if和长循环语句。

自己动手写一个 :laughing:

2 个赞

如果自己写的话,去查询当前node的满足条件的父节点似乎不难,但是怎么做到实时更新呢?移动光标就查询的话是不是性能很差,也许可以设置一个计时器,光标在当前节点超过多少秒就去查询?因为大部分时间我们要么一下就划过当前节点要么就在当前节点待相当一段时间? 另外,如果要显示查询结果的话,emacs有类似vim的popup window的东西吗,这样可以绘制一个展示在当前窗口上方的东西是最好的。或者有别的展示的方法可以用?

  1. 性能差可以通过异步进程来解决
  2. 有 overlay 可以来展示内容

我在尝试把它写出来,等写完了放到论坛上供大家指教

5 个赞

when idle + child frame

header line 是最方便的,可惜不支持多行。

如果能接受单行的面包屑的形式,header/mode line 随便了。

这种全局常驻的显示内容最好还是不要用 overlay。因为 overlay 太容易互相打架了,而且一打架还很容易出现显示乱码的情况。而且有大量的东西会使用 overlay,比如 citre 的 peek,github 的 copilot,magit 的 blame, company 的 补全 等。此外 overlay 还需要考虑文本是否有 indent (例如 org-indent-mode) 等的各种 corner case。

childframe 没有任何上述的问题,但是用 childframe 的话终端里就不能用了。不是很清楚为什么vim 和 neovim 都是终端的程序都做出来浮窗了,emacs 实现终端的浮窗的难度在什么地方。

1 个赞

eglot 给的这种是什么,用的是buffer吗,终端可用。

也许可以放在一个buffer里,然后可以切换到这个buffer。给这个package一个名字 funpition (function, loop, condition),在这个funpition buffer切换相应行的时候上方的buffer会同步切换到对应位置。

感谢!就是这个效果,但是我还得研究下怎么用,现在treesit-context--update函数的(let* ((node (treesit-node-at (point))))会报treesit-no-parser的错,请问这是什么原因?

请保证你打开的是 **-ts-mode,并且安装了对应的 parser

1 个赞