主要有以下几个问题:
- 如何开启代码中的自动补全?我主要用 org-mode 记数学物理笔记,要在笔记中写一些 Mathematica 或者 Python 代码运行输出结果,写代码时候没有补全就很难受。
- 如何在特定环境关闭自带的英文单词补全?这个补全经常顶掉 cdlatex 和 laas 的快速输入,很影响输入latex的效率。
- 如何调整不同插件的补全优先级?
最后还想问一下哪里有 Doom Emacs 的插件列表和说明文档?最近想要启用一些插件或者找到某个功能对应的插件来进行设置,都不知道从哪里入手。
实现代码自动补全或许你需要使用 lsp-mode, 并针对每个编程语言进行特殊配置. 它的作用是当你在该编程语言的 Major mode 时, 提供类似于 VS Code 的代码补全/语法检查接口.
下面是在 org-mode 中编写代码块得到 lsp-mode 补全的两种方案:
-
在代码块中按下 C-c '
(M-x org-edit-src-code), 屏幕下方会弹出针对当前你编写的语言环境的特定窗口. 但是这个窗口中默认不会启用你配置好的 lsp-mode, 你需要参照下面的文章进行简单的配置: LSP mode and org source blocks (C-c '), 其中的解决方案是 #2842.
-
使用 lsp-org
在代码块中直接实现补全功能, 目前这个功能还在实验阶段. 使用方式见 Literate programming using LSP and org-mode(alpha).
-
关于 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{}}
,多出一个 }
。其他几个片段也有同样的问题,除了 Pf
和 Df
以外