语言补全框架是否能够更好的兼容 Org-babel?

LSP-mode 似乎有提供类似实验性功能, 但目前体验很不完整.

如果能在 org-mode 编写 Python 代码块的过程中启用代码补全, 那体验岂不是比 DataSpell 还要好?

Lsp-bridge有这个功能啊

1 个赞

lsp-bridge 默认就可以了。

1 个赞

非常感谢两位 (包括开发者) 的推荐. 或许这是我换用 lsp-bridge 的一个巨大动力.

不过个人在刚刚安装完 lsp-bridge 并且在 org-mode buffer 直接启用 lsp-bridge-mode 后出现了下面的情况 (我使用的 Corfu 补全框架):

  1. lsp-bridge 和 corfu 的 frame 重合了.
  2. lsp-bridge 没有提供 python 相关的补全.

试试这个,lsp-bridge 也是这个方案 已经用上 lsp-bridge 了啊,那没事了

需要提供 :file 参数

2 个赞

lsp-bridge需要禁用 compay, corfu, auto-complete, lsp-mode, eglot 等一切提供补全的前后端框架。

lsp-bridge 自己就可以完成补全前后端功能。

1 个赞

可以做的,但只能在 C-c ' 下使用。 output-2023-02-13-20:30:56

1 个赞

lsp-bridge应该可以提供补全的,但是你要安装pyright,你可以试试 whereis pyrigt,然后在emacs中getenv,看看环境有没有安装好。

1 个赞

在 org-edit-special 环境测试下非常顺利.

请问作者有没有考虑直接在原 buffer 内提供补全接口的方案? (在不调用 org-edit-special 的前提下直接补全)

LSP 服务器需要实时发送语言内容给它。

在 org-mode buffer 中, 很难区分当前改动是源代码内容还是 org 文件的其他内容。

2 个赞

参考这个链接: issuses/216 以我个人的理解 lsp不是设计起来用于这个环境的。

1 个赞

目前你可以用一个东西叫做 poly-org 来实现直接在 org 的 buffer 里直接完成补全。它的原理是创建多个不同 major-mode 的内容相同的 buffer,然后在你切换 point 的时候自动切换不同的 buffer。

但是这个 poly-org 有个很大的问题是,它切换不同的模式的时候,buffer内容是一模一样的,这意味着当你在 编程语言的 major-mode 里的时候,那些散文部分的内容对于 lsp 之类的东西依然是可见的。。。这意味着你会得到海量的 linter 给你抱怨的问题。。。以及自动补全可以用,但是你在文档里新建的变量很可能不能够被很好的 parse (因为被那些散文部分给干扰了)。

在 vscode/neovim 里面有一个东西叫做 quarto,他们也可以实现在 quarto (另一个散文/代码二合一的文档格式) 文章的 buffer里直接补全,他们的原理是在后台创建多个隐藏文件,将同一个语言对应的所有代码块的 src 同步到这个隐藏文件里,然后不同步别的内容。然后在那个虚拟的文件里请求 lsp 补全,再将返回的补全结果同步回你的 quarto 的主 buffer 里。这样一来补全,linter之类的都是正常的。

最后,总的而言, C-c ‘ 然后在创建的 临时buffer里用 lsp-mode / lsp-bridge 还是更合适的方案。 poly-org 你可以下载下来玩一玩,但是我觉得它并没有成熟到可以作为日常方案的程度。

1 个赞

这个问题可以通过修改pm–lsp-text解决: 在非inner buffer的每行前面加上注释符号,这样就相当于给server发送inner mode的代码以及一堆注释。可以参考我这个例子,这里因为我只用rmarkdwon所以我就直接在前面添加了个#, 更通用的方法应该是添加comment-start

是个好办法!有考虑给上游的 poly-R 提交补丁吗?此外你这个补丁 quarto-mode 应该也可以用,毕竟 python r julia 啥的注释都是以 # 开头的。

不准备提交了,polymode/poly-r作者基本上不处理pr和issue 了。而且他本人也提到他不用polymode了

你可以试试我的这个poly-rmarkdown,除了这个lsp问题, 还修复了code block边缘绘制不完整问题。不过我没去支持除了r之外的inner code

  • 用lsp-mode的话要在配置中加入这个 (pm-around-advice 'lsp–buffer-content #'polymode-lsp-buffer-content)
  • lsp-bridge的话,需要advice这个函数lsp-bridge–get-buffer-content-func

顺便吐槽一下eglot,eglot是使用的buffer-substring向server提交代码,并没有一个自定义的buffer-content函数。这样就等于不给用户修改代码内容的权限。跟eglot作者讨论过几次都被否决。。。

1 个赞

eglot 是这样的,感觉代码的架构写的就比较死。好像 eglot 的代码架构,一个 buffer 想要 attach 上多个 lsp 也很麻烦,之前好像在某些 issue 里面有看过。

的确,而且对org-babel-edit的支持也很弱 :joy:

似乎原因是因为 org-babel 的代码 buffer 是虚拟 buffer,并不是实例化的文件,所以 eglot 工作不了?而且目前看起来也并没有改进它的想法。

我之前看到有人为了能够在 org-babel 的代码 buffer 里给 rust 用上 eglot,还专门写了一个hack

对,eglot对这个支持搞起来就很麻烦。

lsp-bridge对这个是开箱即用。对于lsp-mode, 大佬 @seagle0128 写了个macro实现自动管理

大佬, 这个方法可以给 lsp-bridge 提交一个 PR 吗?

我乐于合并。 :wink: