GNU bug report logs -
#70541
track-changes-mode logs warnings (with input method, in Eglot buffer)
Previous Next
Reported by: Richard Copley <rcopley <at> gmail.com>
Date: Tue, 23 Apr 2024 20:46:03 UTC
Severity: normal
Done: Stefan Monnier <monnier <at> iro.umontreal.ca>
Bug is archived. No further changes may be made.
Full log
Message #8 received at 70541 <at> debbugs.gnu.org (full text, mbox):
[Message part 1 (text/plain, inline)]
> * Ensure clangd is on the path
> * Start editing a scratch file like this in C++ mode:
>
> int main() {
> const char * s = "";
> }
>
> * Start Eglot (M-x eglot RET)
> * Enable TeX input method (C-u C-\ TeX RET)
> * Start typing the superscript alphabet into the string (^ a ^ b ^ c ^ d ...)
>
> How far you get before the warning pops up seems to depend on timing.
To make it reliable, here's what you need to do after enabling the TeX
input method:
type "quickly"; foo^
wait a couple seconds
and you should get the
» Warning (emacs): Missing/incorrect calls to ‘before/after-change-functions’!!
Details logged to ‘track-changes--error-log’
The problem is that Quail inserts an underlined `^` in the buffer to
show you the part of the input that's already been typed and it does so
stealthily (i.e. within `with-silent-modifications`), which implies that
the `before/after-change-functions` have not been called, and as
a consequence the size of the buffer is not the one that track-changes
expects (and the content of the buffer doesn't corresponds to what Eglot
will send to the LSP server based on the changes it has witnessed,
which can cause errors since Eglot has to send buffer positions and
those may not mean the same any more for the LSP server).
I suggest the patch below (the second hunk is unrelated, I just bumped
into it while tracking this bug).
Stefan
[quail.patch (text/x-diff, inline)]
diff --git a/lisp/international/quail.el b/lisp/international/quail.el
index 48d2ccb8828..cb7aa89b252 100644
--- a/lisp/international/quail.el
+++ b/lisp/international/quail.el
@@ -1334,9 +1334,13 @@ quail-input-method
(quail-setup-overlays (quail-conversion-keymap))
(with-silent-modifications
(unwind-protect
- (let ((input-string (if (quail-conversion-keymap)
+ (let* (;; `with-silent-modifications' inhibits the modification
+ ;; hooks, but that's a part of `with-silent-modifications'
+ ;; we don't actually want here (bug#70541).
+ (inhibit-modification-hooks nil)
+ (input-string (if (quail-conversion-keymap)
(quail-start-conversion key)
- (quail-start-translation key))))
+ (quail-start-translation key))))
(setq quail-guidance-str "")
(when (and (stringp input-string)
(> (length input-string) 0))
@@ -1871,10 +1875,9 @@ quail-delete-last-char
(defsubst quail-point-in-conversion-region ()
"Return non-nil value if the point is in conversion region of Quail mode."
- (let (start pos)
- (and (setq start (overlay-start quail-conv-overlay))
- (>= (setq pos (point)) start)
- (<= pos (overlay-end quail-conv-overlay)))))
+ (let ((start (overlay-start quail-conv-overlay)))
+ (and start
+ (<= start (point) (overlay-end quail-conv-overlay)))))
(defun quail-conversion-backward-char ()
(interactive)
This bug report was last modified 1 year and 71 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.