]> git.eshelyaron.com Git - emacs.git/commitdiff
Eglot: use faster strategy for moving to LSP positions (bug#61726)
authorEli Zaretskii <eliz@gnu.org>
Sun, 26 Feb 2023 10:27:18 +0000 (10:27 +0000)
committerJoão Távora <joaotavora@gmail.com>
Sun, 26 Feb 2023 10:29:14 +0000 (10:29 +0000)
Turns out we don't need encode-coding-region after all.

* lisp/progmodes/eglot.el (eglot-move-to-lsp-abiding-column): Rewrite.

Co-authored-by: Augusto Stoffel <arstoffel@gmail.com>
lisp/progmodes/eglot.el

index 2b9d44f84e67db656aa103894d3f466fa6eccddc..b52b4975a8976f05969a2a50fa439fd0f76d0df1 100644 (file)
@@ -1491,19 +1491,16 @@ be set to `eglot-move-to-lsp-abiding-column' (the default), and
                   (line-end-position))))
 
 (defun eglot-move-to-lsp-abiding-column (column)
-  "Move to COLUMN abiding by the LSP spec."
-  (save-restriction
-    (cl-loop
-     with lbp = (line-beginning-position)
-     initially
-     (narrow-to-region lbp (line-end-position))
-     (move-to-column column)
-     for diff = (- column
-                   (eglot-lsp-abiding-column lbp))
-     until (zerop diff)
-     do (condition-case eob-err
-            (forward-char (/ (if (> diff 0) (1+ diff) (1- diff)) 2))
-          (end-of-buffer (cl-return eob-err))))))
+  "Move to COLUMN as computed by LSP's UTF-16 criterion."
+  (let* ((bol (line-beginning-position))
+         (goal-char (+ bol column))
+         (eol (line-end-position)))
+    (goto-char bol)
+    (while (and (< (point) goal-char)
+                (< (point) eol))
+      (if (<= #x010000 (char-after) #x10ffff)
+          (setq goal-char (1- goal-char)))
+      (forward-char 1))))
 
 (defun eglot--lsp-position-to-point (pos-plist &optional marker)
   "Convert LSP position POS-PLIST to Emacs point.