每个输入前都会自动加一个字符,有没有人遇到过?

我在vscode绑定了emacs的keymap,此后vscode就不能再用中文了,每输入一个中文包括中文符号就会自动插入一个字符并覆盖已经输入了的前一个字符。疯了要

确实本身是小事,我一开始看到是先删除我自己的帖子,然后关闭网站。但是我之后好几次脑子里出现这个事,本来小事冷静下应该要过去。但是气不过,就还是恢复了我的帖子。我想到的是,网络上总会遇到形形色色的人,能理解,但不能接受。念头通达在这里重要,因为不然就会心里埋下种子。没有想要挑衅谁。但是社区也不应该有人出现一种“我掌握正确的真理,你就是错的,我可以对你怎么样”的思想。往可怕处说,这就是宗教战争。这是我最后的回复,说清楚事情和我的想法。我以前也常看这个社区,但是后来就觉得这里态度不好的人也不少,所以就没有再回复发帖了。很长一段时间没有再来,现在偶尔来看看,刚一发帖结果就被怼了。真是服了。也怪我自己,戒不掉。

愤怒的根源在于,自己对别人有所求或者有所期待,但是别人达不到我们的要求时,我们就会使用愤怒,来证明自己是对的,如果达不到目的,最后其实生气是让自己身体损害。

每个人都有表达自己的自由,但是很多人不懂的自由的前提是尊重他人,只图自己爽。

所以做好自己,不要对他人抱有过高的期望,就不会有无谓的烦恼。

怎么避免别人评价影响自己呢?唐玄奘说过,如人饮水冷暖自知,自己对自己诚实,别人不好的话就伤不了你。

最后,都是小事,不喜欢的人和事,论坛可以屏蔽的,不理就好了呀。

5 个赞

嗯嗯,还是要和经过岁月感悟的人相处才轻松。多谢分享。学习了,希望能达到这种境界。我还在知之的阶段。(别回复了,不然又忍不住回复发帖。)

https://lists.gnu.org/archive/html/emacs-devel/2022-11/msg00222.html

试试这个补丁?如果用一段时间没问题了,请在邮件列表上或这里 ack 下。

5 个赞

虽然没有遇到自动加字符问题了,但…

Screenshot 2022-11-08 at 12.40.08 AM

这可能是个隐藏很深的 bug, 我猜测和 emacs 与系统中文输入法交互方式有关. 我之前在 emacs 用 fctix 输入时不时会掉字, 后来换 emacs-rime 后再没有遇到过这个问题, 看了大家的帖子, 在 terminal 下使用也没有问题.

Hi, 请问用的是哪个 commit?我尝试复现一下。

80c3fadfd57ee797404c80b8e88371c53edecfe5

这个

ok 我这里复现了,我研究研究

找到问题了,试试这个补丁。

diff --git a/src/nsterm.m b/src/nsterm.m
index 17f40dc7e3..0ed047849a 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -7063,16 +7063,19 @@ - (NSRect)firstRectForCharacterRange: (NSRange)theRange
   NSRect rect;
   NSPoint pt;
   struct window *win;
+  specpdl_ref count = SPECPDL_INDEX ();
 
   NSTRACE ("[EmacsView firstRectForCharacterRange:]");
 
   if (NS_KEYLOG)
     NSLog (@"firstRectForCharRange request");
 
-  if (WINDOWP (echo_area_window) && ! NILP (call0 (intern ("ns-in-echo-area"))))
+  specbind (Qinhibit_quit, Qt);
+  if (WINDOWP (echo_area_window) && ! NILP (safe_call (1, Qns_in_echo_area)))
     win = XWINDOW (echo_area_window);
   else
     win = XWINDOW (FRAME_SELECTED_WINDOW (emacsframe));
+  unbind_to (count, Qnil);
 
   rect.size.width = theRange.length * FRAME_COLUMN_WIDTH (emacsframe);
   rect.size.height = FRAME_LINE_HEIGHT (emacsframe);
@@ -11012,6 +11015,7 @@ Nil means use fullscreen the old (< 10.7) way.  The old way works better with
   DEFSYM (Qcondensed, "condensed");
   DEFSYM (Qreverse_italic, "reverse-italic");
   DEFSYM (Qexpanded, "expanded");
+  DEFSYM (Qns_in_echo_area, "ns-in-echo-area");
 
 #ifdef NS_IMPL_COCOA
   Fprovide (Qcocoa, Qnil);
3 个赞

赞,真希望这个能彻底解决了,不过我这里好久没出现过了……Emacs 、Mac一直也没升级过

他这个好像解决的是另一个问题 :laughing:

解决重复的补丁是

是同一个问题,原来的补丁有点bug,现在修好了。

1 个赞

:+1:

简述一下这个问题的发生条件:

  1. 使用 emacs NS port(官方 emacs 而非 emacs-macport)
  2. 开启了系统输入法 [1]
  3. 高频输入,特别是开着 corfu-auto、company-idle=0 时,只要卡一下使得 lisp call 还没跑完下一个键事件就来了就行。我用 citre 基本可以在 20 秒内复现这个问题。

问题原因有点懒得打,不过还是敲一下好了:打开系统输入法 [1, again],如果打开了 nsterm.m 里的 NS_KEYLOG,应该在每次按键的时候都能看到 firstRectForCharacterRange 的调用记录。在开了输入法的情况下,每次敲击都会导致 firstRectForCharacterRange 的一次调用。

firstRectForCharacterRange 会在内部调用一个叫 ns-in-echo-area 的 Lisp 函数(在 term/ns-win.el 里)。在特定情况下,ns-in-echo-area 会 throw,而 firstRectForCharacterRange 里对此没有保护,导致 keyDown 里的 remove event 操作没有完成,于是 event buffer 里会留存之前的 event,这也是为什么系统输入法也会收到额外的键(我一开始就是因为这一点怀疑 NS 相关代码有问题的)。(于是,想要加速复现还有一个办法是在 firstRectForCharacterRange 里 sleep 短暂的一段时间。)

找到问题 fix 就其实很简单了。

此外,这个问题是 emacs NS port 代码中的问题,emacs-macport (使用 Carbon 而非 Cocoa)是另一套实现,所以可能没有该问题。

[1] 置于英文状态也可。但若设为英文键盘则不会调用上述函数,也就不会有问题了。这可能是为什么有的人切换到 emacs-rime 后不再遇到问题的原因,大概是因为把系统键盘设为英文键盘了。

18 个赞

赞啊,困扰了大家好长时间,一直没人找到完美复现的方法,都在猜哈哈哈🤣

赞,辛苦大佬!被这个问题折磨好久了,不得切换到 pyim,现在终于解决了。

这就叫专业 :rofl:

哈哈,在这个场景,pyim起到了它设计的初衷:备用应急

1 个赞