@@ -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