From 911f8164958e50e1e764ba5ec9a7e0a6ee1926da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20T=C3=A1vora?= Date: Sun, 19 Jan 2020 11:02:55 +0100 Subject: [PATCH] Fix eglot-move-to-lsp-abiding-column (#361) Ensure conformance with the this part of the specification: "if the character value is greater than the line length it defaults back to the line length." * eglot.el: (eglot-move-to-lsp-abiding-column): Don't move beyond line-end. (#361: https://github.com/joaotavora/eglot/issues/361 --- lisp/progmodes/eglot.el | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lisp/progmodes/eglot.el b/lisp/progmodes/eglot.el index 3149cd5cc0..2a50611d36 100644 --- a/lisp/progmodes/eglot.el +++ b/lisp/progmodes/eglot.el @@ -1050,15 +1050,20 @@ be set to `eglot-move-to-lsp-abiding-column', and (defun eglot-move-to-lsp-abiding-column (column) "Move to COLUMN abiding by the LSP spec." - (cl-loop - initially (move-to-column column) - with lbp = (line-beginning-position) - for diff = (- column - (/ (- (length (encode-coding-region lbp (point) 'utf-16 t)) - 2) - 2)) - until (zerop diff) - do (forward-char (/ (if (> diff 0) (1+ diff) (1- diff)) 2)))) + (save-restriction + (cl-loop + with lbp = (line-beginning-position) + initially + (narrow-to-region lbp (line-end-position)) + (move-to-column column) + for diff = (- column + (/ (- (length (encode-coding-region lbp (point) 'utf-16 t)) + 2) + 2)) + 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)))))) (defun eglot--lsp-position-to-point (pos-plist &optional marker) "Convert LSP position POS-PLIST to Emacs point.