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

真的可能哦。我从切到lsp-bridge以后就再也没遇到过这个问题了

也不对啊,不开启lsp-mode我也会出现这个问题;用Rime会出现,用搜狗就不会出现。唯一发现的共同点就是输入快了就会出现,很怪异~~~

1 个赞

还真的是,慢慢打字时从来没出现过。

我是一旦出现,就会一直都是在前面添加字符,即使慢慢输入也会。

输入快是出现问题之前,出现问题之后无论快慢都会出现多余字符。

1 个赞

今天又尝试 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-hookpost-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 编出来了,就等下次出现问题,看看能不能再找到些线索了

3 个赞

期待一下…刚刚出了这个问题,于是顺便看眼论坛,又看见这贴了。

哈哈,我这边出现的概率比较低,感觉差不多两周才能出现一次,有些神奇。。。

:smile:你只要自动补全的时候敲键盘敲快点就可以

Emacs Version 28.1 (9.0) 版本下,Mac 环境,升级了最新版本后,在输入快一些的情况下,很容易出现这种情况,只有重启才会消失。没找到解决办法,不知道这种情况是否可以Debug,有高手可以指点共同解决。

用了 emacs-rime 后还没有遇到过。

1 个赞