Doom Emacs 在 org-mode 下的自动补全问题

主要有以下几个问题:

  1. 如何开启代码中的自动补全?我主要用 org-mode 记数学物理笔记,要在笔记中写一些 Mathematica 或者 Python 代码运行输出结果,写代码时候没有补全就很难受。
  2. 如何在特定环境关闭自带的英文单词补全?这个补全经常顶掉 cdlatex 和 laas 的快速输入,很影响输入latex的效率。
  3. 如何调整不同插件的补全优先级?

最后还想问一下哪里有 Doom Emacs 的插件列表和说明文档?最近想要启用一些插件或者找到某个功能对应的插件来进行设置,都不知道从哪里入手。

实现代码自动补全或许你需要使用 lsp-mode, 并针对每个编程语言进行特殊配置. 它的作用是当你在该编程语言的 Major mode 时, 提供类似于 VS Code 的代码补全/语法检查接口.

下面是在 org-mode 中编写代码块得到 lsp-mode 补全的两种方案:

  1. 在代码块中按下 C-c ' (M-x org-edit-src-code), 屏幕下方会弹出针对当前你编写的语言环境的特定窗口. 但是这个窗口中默认不会启用你配置好的 lsp-mode, 你需要参照下面的文章进行简单的配置: LSP mode and org source blocks (C-c '), 其中的解决方案是 #2842.

  2. 使用 lsp-org 在代码块中直接实现补全功能, 目前这个功能还在实验阶段. 使用方式见 Literate programming using LSP and org-mode(alpha).

  3. 关于 Mathematica 使用的 Wolfram 语言, 这个比较特殊, Emacs 中默认并不支持这个语法. 或许下面的几个链接会对你有帮助:

Doom 默认使用了 company-ispell 进行单词补全, 它被定义在了这里.

Doom 有设定一个叫做 set-company-backend! 的函数来指定特定模式下所启用 company-mode 的 backends. 因此你大概需要添加如下代码到你的配置文件:

(set-company-backend! 'org-mode
    'company-dabbrev 'company-yasnippet)

注意这里我把 company-ispell 从默认的列表中移除了.

使用 company-capf 这个函数来调整 company-backends.

(company-capf
 '((:separate company-dabbrev company-yasnippet company-ispell)))

把优先级高的放在前面即可. 当然依靠这个功能你同样可以全局禁用 company-ispell, 把 company-ispell 从上述 list 中移除即可.

我一般是在 GitHub 仓库进行查阅的, 在 modules 目录下有针对 Doom init.el 中每个模块的详细说明. (当然你也可以 Git clone 下 Doom 的仓库在 Emacs 阅读.)

示例: doom-emacs/modules/completion/vertico/.

3 个赞

感谢解答,对我很有帮助

我还遇到了另一个问题,我在使用一个叫做 laas 的插件,这个插件可以将输入的内容自动扩展成代码片段。我在自定义片段的时候遇到了问题,某些情况下代码片段中的括号会多出一个,怀疑是括号自动补全和代码片段产生了冲突。

(use-package laas
  :hook (LaTeX-mode . laas-mode)
  :config ; do whatever here
  (aas-set-snippets 'laas-mode
                    ;; set condition!
                    :cond #'texmathp ; expand only while in math
                    "supp" "\\supp"
                    "On" "O(n)"
                    "O1" "O(1)"
                    "Olog" "O(\\log n)"
                    "Olon" "O(n \\log n)"
                    ;; bind to functions!
                    "Sq"(lambda () (interactive)
                          (yas-expand-snippet "\\sqrt{$1}$0"))
                    "Pf"(lambda () (interactive)
                          (yas-expand-snippet "\\frac{\\partial $1}{\\partial $2}$0"))
                    "Df"(lambda () (interactive)
                          (yas-expand-snippet "\\frac{d $1}{d $2}$0"))
                    "Sum" (lambda () (interactive)
                            (yas-expand-snippet "\\sum_{$1}^{$2} $0"))
                    "Span" (lambda () (interactive)
                             (yas-expand-snippet "\\Span($1)$0"))
                    ;; add accent snippets
                    :cond #'laas-object-on-left-condition
                    "qq" (lambda () (interactive) (laas-wrap-previous-object "sqrt"))))
 

这里是我的插件配置,在输入 Sq 时自动扩展的结果是 \sqrt{}},多出一个 } 。其他几个片段也有同样的问题,除了 PfDf 以外