Doom emacs 无法正确补全尖括号

image

如图,有的时候会出现这样的问题,具体表现为:

  • 当把尖括号的右半部分删去后左尖括号会匹配其它类型的右括号;
  • 输入 < 并自动补全为 <> 并在括号间输入后,输入的右尖括号无法正确替换已有的尖括号而是直接在右尖括号前插入新的右尖括号。

请问有没有 相关的让尖括号正确匹配的方案 或 关闭且只关闭尖括号补全及匹配的方法?

补充: 这个问题尤其在存在一个过长的 eshell 时会频繁发生,且除 Show-paren 显示有误外还会引起自动缩进的错误。

@ Ubuntu 22.04.1 GNU Emacs 27.1 Doom v3.0.0-pre

补充: Doom emacs 无法正确补全尖括号 - #6,来自 AFLeartLey

没法复现。

会补全括号的我知道的有 smartparenselectric-pairs而前者默认不会补全尖括号(smartparens的补全行为是根据 Major-mode 变化的,在cpp,c,rs等buffer 中会补全尖括号),后者在 doom emacs 里面也没默认启用。你可以先看看 M-x describe-mode ,是不是启用了什么奇怪的mode.

我个人是没有在 doom emacs 的基础上安装其它的包,在 M-x describe-mode 调出的 buffer 里搜索 paren 也没有搜索到除了 Show-ParenSmartparensSmartparens-Global 及其描述以外的其它内容,如果有什么会导致这个问题的 mode 还请指点。

在出问题的 buffer 里面关闭 smartparens-mode,然后再测试括号补全看看 。

  • 如果尖括号不再自动补全,那么可以确定出故障的是这个mode
  • 然后再查看 sp-pairs-list 这个变量,里面存储了所有会自动补全的括号
    • 如果里面有尖括号,那么可以尝试这里将其移除
    • 反之,那么应该是更深层的问题,建议直接重装 doom emacs.
1 个赞

关闭 smartparens-mode 后尖括号不再补全了。感谢。

在使用后发现关闭了 smartparens-mode 之后禁用了所有的括号补全。阅读 smartparens 手册并在 ./.doom.d/config.el 添加 (sp-pair "<" nil :actions :rem) 后没有起到禁用尖括号补全的效果。再次搜索后找到了一个类似的问题:

这个 issue 中所记录的状况包括所附上的图片与我之前所遇到的状况吻合,即左尖括号错误地匹配了其他的右括号。但这个 issue 中并没有给出解决方案,且本人遇到问题时所使用的语言为 C++ ,而非 Rust .

刚还以为是 java 代码,我用 cpp 也复现了。我不会 c++ ,不过模板的话是不是会用到尖括号?这大概是设计好的补全行为。

你可以暂时用 electric-pair 替代 smartparens 看看。

其实本人并不是在使用 template<> 时出现问题,更多时候问题出现在输入 for(int i = 0;i<n;++i) 这样的循环时作为小于号的左尖括号会匹配上右小括号,且输入左尖括号时的行为是

for(int i = 1;i

for(int i = 1;i<>

这样的。

循环变量和小于号之间加空格应该就不会补全了吧,它应该是识别成了模板。

现在我是暂时无法复现这个问题了。

折腾了半天把 smartparens 关掉,换成 electric-pair 了。再次感谢。

感觉你遇到的问题挺复杂,包含多个方面,

  • <) 错误匹配的问题
  • <>> 没有跳过 > 的问题
  • 循环判断中 < 自动补全成 <> 的问题

第一个问题我没有复现;第二个问题偶然间遇到过一次;最后这个必定复现,但是可以通过中间加空格解决。改用 electric-pair 的话其实就是不再补全任何 <>,并没有解决前两个问题。

选择使用 electric-pair 能够解决我在使用时遇到的问题,但是治标不治本。

第一个问题可以尝试在开一个 10k+ 的 eshell 后尝试通过循环复现,我曾经在类似情况下出现过。

第二个问题我除了在引入头文件的声明时正常其他时候大概率无法正常覆盖。