这是 Emacs 注释的 bug 吗?

今天在写 latex 的时候意外遇到了注释的问题,因为我一直在用 evil,还以为是 evil-nerd-commenter 的问题,但一路看下来,发现问题貌似是出现在 comment-or-uncomment-region 这个函数上

\documentclass{article}

\begin{document}
% start: 64, end: 77
bug in \LaTeX
\end{document}

把光标放在 bug in \LaTeXb 上,然后

M-:(comment-or-uncomment-region 64 77)RET

会出现 bug in \LaTe 被注释,X 跑到下一行的情况,也即

\documentclass{article}

\begin{document}
% start: 64, end: 77
%% bug in \LaTe
X
\end{document}

如果把光标放在其他地方就没问题


还是说这是我自己的问题?但是我用 emacs -Q 测出来也是这样,大家有啥解决的办法吗?

不为啥,77 是 X 所在的位置,

(comment-or-uncomment-region 64 77) region 只包括从 64 到 76。

TeX 没行间注释,X 不包括在注释里就会換行。

x 的位置是 76

遇到的问题是如果光标放在 b,那行语句注释就会导致 x 换行;如果光标在其他地方,语句就能正常注释

換成 78,不管在哪运行都正常

这样会凭空生成一个空行出来吧,在 latex 里不就分段了

不会

我这里没有问题, 版本是 emacs master

刚吃完饭试了试,用 78 的话,如果光标放在任意一行的行首,的确不会生成新行;如果放在其他位置,就会在注释行下生成一行空行

我用的 emacs28.2,你是使用 64 77 当参数时不会出现 x 换行的情况吗

是的, 没有出现

谢谢,我刚刚也编译了一下 29.0.50 使用,的确没有出现换行的情况

不过启动的时候报了这样的错误,请问知道是什么原因吗?

看着像是配置里中文字符的问题

我没用 evil. byte recompile 一遍也许能解决.

谢谢,我自己排查下

一般都是emacs自己的bug,evil-nerd-commenter最后靠emacs的api来注释,你可以用advicing来临时修复一下。

1 个赞

嗯,一路打断点发现问题在 comment-or-uncomment-region 这个函数上(并且这个问题只出现在写 tex 文件的时候,写其他语言的时候都没遇到这个问题)

29.0.50 版本虽然没了这个问题,但我遇到的小毛病好多。

上面的 symbol's value as variable is void,我重新编译了 emacs,把安装的所有包都 recompile 了一遍也没解决;大佬你的 evil-nerd-commenter 在我的配置里我拆了两部分,一部分是在没有 evil 的情况下用的,一部分是在用 evil 的情况下用的:

;; without evil
(use-package evil-nerd-commenter
  :bind (("C-c c l" . evilnc-comment-or-uncomment-lines)
         ("C-c c d" . evilnc-copy-and-comment-lines)
         ("C-c c p" . evilnc-comment-or-uncomment-paragraphs)))

;; with evil
(use-package evil-nerd-commenter
  :bind ((:map evil-normal-state-map
               ("gc" . evilnc-comment-operator)
               ("gp" . evilnc-copy-and-comment-operator)
               ("gy" . evilnc-yank-and-comment-operator))
         (:map evil-motion-state-map
               ("gc" . evilnc-comment-operator)
               ("gp" . evilnc-copy-and-comment-operator)
               ("gy" . evilnc-yank-and-comment-operator))))

结果在 29.0.50 里 gc 这种快捷键无法绑定上,必须 C-c c l 调用过一次 evilnc 的函数后才能绑定上,太心累了,又用回 28.2 了

熊

可以试着用general.el绑定evil快捷键。我一般用发行版要比主流晚半年,可能遇到的坑别人都帮我踩过了,所以没什么不兼容问题,

1 个赞

看起来这个bug也不是不可以忍受,如果一定要在29的话。。。

嗯嗯,一直在用着这个,还是从大佬你那边抄来的

神奇的地方就在于,evilnc 的配置拆分成两部分, evil 的部分无法绑定上,最开始看似是 evil 的问题,但是用 general 绑定的 evil 按键是生效的,还是以我上面的配置为例,我 general 的相关配置里有这么一句

;; comma as leader key
 "cl" #'evilnc-quick-comment-or-uncomment-to-the-line

这是能绑定上的,按下 ,cl 也能触发,触发完后 evilnc 绑定在 evil 里的相关配置才会生效。

困扰了我好久,结果最后发现。。。问题出现在 init.el 里加载配置的地方

之前我的配置是抄的大佬你的,所以在 require 各个文件的时候有一个前置 file-name-handler-alistnil,也就是说加载配置是这样的:

(let ((file-name-handler-alist nil))
  ;; load configs for specific features and modes
  (require 'init-utils)
  (...))

如果我把 file-name-handler-alist 设为 nil 这一语句去掉。。。一切都正常了!symbol's value as variable is void: \213 的问题也没出现。。。

不知道对您的配置有没有帮助,可以参考一下 :joy:

幸运的是,找到了解决这个问题的方法,并不是啥 bug,而是我配置的问题

这一路问题解决下来,可算是……

1 个赞