Skip to content

Commit 9a6dbeb

Browse files
committed
rewrite vterm-goto-char
1 parent a2f2286 commit 9a6dbeb

File tree

1 file changed

+57
-21
lines changed

1 file changed

+57
-21
lines changed

vterm.el

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,30 +1117,66 @@ It will reset to original position if it can't move there."
11171117
(when (and vterm--term
11181118
(vterm-cursor-in-command-buffer-p)
11191119
(vterm-cursor-in-command-buffer-p pos))
1120-
(let ((moved t)
1121-
(origin-point (point))
1122-
pt cursor-pos succ)
1123-
(vterm-reset-cursor-point)
1124-
(setq cursor-pos (point))
1125-
(setq pt cursor-pos)
1126-
(while (and (> pos pt) moved)
1127-
(vterm-send-key "<right>" nil nil nil t)
1128-
(setq moved (not (= pt (point))))
1129-
(setq pt (point)))
1130-
(setq pt (point))
1131-
(setq moved t)
1132-
(while (and (< pos pt) moved)
1133-
(vterm-send-key "<left>" nil nil nil t)
1134-
(setq moved (not (= pt (point))))
1135-
(setq pt (point)))
1136-
(setq succ (= pos (point)))
1137-
(unless succ
1138-
(vterm-goto-char cursor-pos)
1139-
(goto-char origin-point))
1140-
succ)))
1120+
(vterm-reset-cursor-point)
1121+
(let ((diff (- pos (point))))
1122+
(= diff (vterm--forward-char diff)))))
11411123

11421124
;;; Internal
11431125

1126+
(defun vterm--forward-char (&optional n)
1127+
"Move point N characters forward (backward if N is negative).
1128+
1129+
Return the count of moved characeters,
1130+
the returned value is negative when backward."
1131+
(vterm-reset-cursor-point)
1132+
(unless n (setq n 1))
1133+
(if (< n 0)
1134+
(- (vterm--backward-char (- n)))
1135+
(let ((pt (point))
1136+
(origin-pt (point))
1137+
(count 0)
1138+
(moved t))
1139+
(while (and moved (< count n))
1140+
(vterm-send-key "<right>" nil nil nil t)
1141+
(cond
1142+
((= (point) (1+ pt))
1143+
(setq count (1+ count))
1144+
(setq pt (1+ pt)))
1145+
((and (= (point) (+ 4 pt))
1146+
(looking-back (regexp-quote "^[[C"))) ;escape code for <right>
1147+
(dotimes (_ 3) (vterm-send-key "<backspace>" nil nil nil t)) ;;delete "^[[C"
1148+
(setq moved nil))
1149+
((> (point) (1+ pt)) ;auto suggest
1150+
(vterm-send-key "_" nil nil t t) ;undo C-_
1151+
(setq moved nil)
1152+
)
1153+
(t (setq moved nil))))
1154+
count)))
1155+
1156+
(defun vterm--backward-char (&optional n)
1157+
"Move point N characters backward.
1158+
1159+
Return count of moved characeters."
1160+
(vterm-reset-cursor-point)
1161+
(unless n (setq n 1))
1162+
(let ((pt (point))
1163+
(origin-pt (point))
1164+
(count 0)
1165+
(moved t))
1166+
(while (and moved (< count n))
1167+
(vterm-send-key "<left>" nil nil nil t)
1168+
(cond
1169+
((= (point) (1- pt))
1170+
(setq count (1+ count))
1171+
(setq pt (1- pt))
1172+
)
1173+
((and (= (point) (+ 4 pt))
1174+
(looking-back (regexp-quote "^[[D"))) ;escape code for <left>
1175+
(dotimes (_ 3) (vterm-send-key "<backspace>" nil nil nil t)) ;;delete "^[[D"
1176+
(setq moved nil))
1177+
(t (setq moved nil))))
1178+
count))
1179+
11441180
(defun vterm--delete-region(start end)
11451181
"A wrapper for `delete-region'."
11461182
(funcall vterm--delete-region-function start end))

0 commit comments

Comments
 (0)