]> git.eshelyaron.com Git - emacs.git/commitdiff
Work around emacs bugs 32237, 32278 ()
authorMichal Krzywkowski <k.michal@zoho.com>
Sat, 28 Jul 2018 17:01:10 +0000 (19:01 +0200)
committerJoão Távora <joaotavora@gmail.com>
Sat, 28 Jul 2018 17:01:10 +0000 (18:01 +0100)
See:
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32237
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32278

* eglot.el (eglot--apply-text-edits): Inhibit modification hooks and
  call them manually for the changed region.

GitHub-reference: https://github.com/joaotavora/eglot/issues/53

lisp/progmodes/eglot.el

index 695db498ff4ff976f92bf027d318814162a1bd78..1ca7b6d65d1e0bd76811c72ec7a3042cd3cf90db 100644 (file)
@@ -1438,7 +1438,23 @@ If SKIP-SIGNATURE, don't try to send textDocument/signatureHelp."
                       (save-excursion
                         (save-restriction
                           (narrow-to-region beg end)
-                          (replace-buffer-contents temp)))
+
+                          ;; On emacs versions < 26.2,
+                          ;; `replace-buffer-contents' is buggy - it calls
+                          ;; change functions with invalid arguments - so we
+                          ;; manually call the change functions here.
+                          ;;
+                          ;; See emacs bugs #32237, #32278:
+                          ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32237
+                          ;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32278
+                          (let ((inhibit-modification-hooks t)
+                                (length (- end beg)))
+                            (run-hook-with-args 'before-change-functions
+                                                beg end)
+                            (replace-buffer-contents temp)
+                            (run-hook-with-args 'after-change-functions
+                                                beg (+ beg (length newText))
+                                                length))))
                       (progress-reporter-update reporter (cl-incf done)))))))
             (mapcar (jsonrpc-lambda (&key range newText)
                       (cons newText (eglot--range-region range 'markers)))