@@ -1117,30 +1117,66 @@ It will reset to original position if it can't move there."
1117
1117
(when (and vterm--term
1118
1118
(vterm-cursor-in-command-buffer-p)
1119
1119
(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)))))
1141
1123
1142
1124
; ;; Internal
1143
1125
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
+
1144
1180
(defun vterm--delete-region (start end )
1145
1181
" A wrapper for `delete-region' ."
1146
1182
(funcall vterm--delete-region-function start end))
0 commit comments