真的可能哦。我从切到lsp-bridge以后就再也没遇到过这个问题了
也不对啊,不开启lsp-mode我也会出现这个问题;用Rime会出现,用搜狗就不会出现。唯一发现的共同点就是输入快了就会出现,很怪异~~~
还真的是,慢慢打字时从来没出现过。
我是一旦出现,就会一直都是在前面添加字符,即使慢慢输入也会。
输入快是出现问题之前,出现问题之后无论快慢都会出现多余字符。
今天又尝试 debug 了下,在出现问题时,用 lldb attach 进去,然后对 read_key_sequence 打断点,但是用 make 命令编译出来的二进制没有 debug 信息了,只能看到汇编代码了,相关函数参数也就看不到了,看来要解决问题,必须重新编译 Emacs,把 debug 信息加进去[1],然后再尝试复现解决。
有精力的同学可以再试试,看看能否把这个烦人的 issue fix 了
(lldb) b read_key_sequence
Breakpoint 2: where = Emacs`read_key_sequence, address = 0x0000000100e699f0
Process 4683 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
frame #0: 0x0000000100e699f0 Emacs`read_key_sequence
Emacs`read_key_sequence:
-> 0x100e699f0 <+0>: sub sp, sp, #0x190
0x100e699f4 <+4>: stp x28, x27, [sp, #0x130]
0x100e699f8 <+8>: stp x26, x25, [sp, #0x140]
0x100e699fc <+12>: stp x24, x23, [sp, #0x150]
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 2.1
* frame #0: 0x0000000100e699f0 Emacs`read_key_sequence
frame #1: 0x0000000100e69044 Emacs`command_loop_1 + 760
frame #2: 0x0000000100ee5fbc Emacs`internal_condition_case + 92
frame #3: 0x0000000100e68d2c Emacs`command_loop_2 + 52
frame #4: 0x0000000100ee59c0 Emacs`internal_catch + 84
frame #5: 0x0000000100f9b374 Emacs`command_loop.cold.1 + 112
frame #6: 0x0000000100e68548 Emacs`command_loop + 132
frame #7: 0x0000000100e68438 Emacs`recursive_edit_1 + 168
frame #8: 0x0000000100e68698 Emacs`Frecursive_edit + 236
frame #9: 0x0000000100e66b3c Emacs`main + 4200
frame #10: 0x00000001017790f4 dyld`start + 520
(lldb) fr v
(lldb) p keybuf
error: expression failed to parse:
error: <user expression 0>:1:1: use of undeclared identifier 'keybuf'
keybuf
Recursive edit 没有退出造成的?
或者是某个 hook 没有正常删除?
很奇怪,我现在没用lsp-mode好久都没出现过了,用lsp-mode 没一会就出现了
这是正常的,主进程一直会卡在那里等待下一次输入。
出现问题的时候,我尝试 (self-insert-command 1 ?a)
是正常的,说明大概率不是 hook 导致的,我也尝试过把 post-self-insert-hook
、 post-command-hook
清空,问题也还是有。
你在说啥,为啥我都听不懂
我刚刚又遇到这个问题了,每次输入前都会插入一个 s
。
的确跟那几个 hook 无关,self-insert-command
本身也没有问题,而是不知哪个地方多调了它一次,backtrace 只能追踪到 command-execute
:
(progn
(setq pre-command-hook nil)
(setq post-command-hook nil)
(setq post-self-insert-hook nil)
(add-hook 'post-self-insert-hook
(lambda ()
(when (eq this-command 'self-insert-command)
(when (eq 115 last-command-event)
(backtrace))
(message "==> [post-self-insert] %s"
(list this-command last-command last-command-event))))))
*Messages*
:
backtrace()
(progn (backtrace))
(if (eq 115 last-command-event) (progn (backtrace)))
(progn (if (eq 115 last-command-event) (progn (backtrace))) (message "==> [post-self-insert] %s" (list this-command last-command last-command-event)))
(if (eq this-command 'self-insert-command) (progn (if (eq 115 last-command-event) (progn (backtrace))) (message "==> [post-self-insert] %s" (list this-command last-command last-command-event))))
(closure (t) nil (if (eq this-command 'self-insert-command) (progn (if (eq 115 last-command-event) (progn (backtrace))) (message "==> [post-self-insert] %s" (list this-command last-command last-command-event)))))()
self-insert-command(1 115)
funcall-interactively(self-insert-command 1 115)
call-interactively(self-insert-command nil nil)
command-execute(self-insert-command)
==> [post-self-insert] (self-insert-command self-insert-command 115)
==> [post-self-insert] (self-insert-command self-insert-command 97)
我最近在 Emacs 29 上也遇到了。
在使用Rime(鼠须管)的时候有概率出现。但我这是自动会在字符前面加 d。
重启 Emacs 可以恢复正常。
据我观察,多什么字符跟之前输入字符是相关的,并不固定。
是的,并不固定。
已经把带 debug 信息的 Emacs 编出来了,就等下次出现问题,看看能不能再找到些线索了
期待一下…刚刚出了这个问题,于是顺便看眼论坛,又看见这贴了。
哈哈,我这边出现的概率比较低,感觉差不多两周才能出现一次,有些神奇。。。
你只要自动补全的时候敲键盘敲快点就可以
Emacs Version 28.1 (9.0) 版本下,Mac 环境,升级了最新版本后,在输入快一些的情况下,很容易出现这种情况,只有重启才会消失。没找到解决办法,不知道这种情况是否可以Debug,有高手可以指点共同解决。
用了 emacs-rime 后还没有遇到过。