@@ -430,6 +430,7 @@ Only background is used."
430
430
(defvar-local vterm--redraw-immididately nil )
431
431
(defvar-local vterm--linenum-remapping nil )
432
432
(defvar-local vterm--prompt-tracking-enabled-p nil )
433
+ (defvar-local vterm--undecoded-bytes nil )
433
434
434
435
(defvar vterm-timer-delay 0.1
435
436
" Delay for refreshing the buffer after receiving updates from libvterm.
@@ -960,10 +961,35 @@ be set to BUFFER-NAME, otherwise it will be `vterm'"
960
961
Then triggers a redraw from the module."
961
962
(let ((inhibit-redisplay t )
962
963
(inhibit-read-only t )
963
- (buf (process-buffer process)))
964
+ (buf (process-buffer process))
965
+ (decoded-str))
964
966
(when (buffer-live-p buf)
965
967
(with-current-buffer buf
966
- (vterm--write-input vterm--term input)
968
+ ; ; Borrowed from term.el
969
+ ; ;
970
+ ; ; Avoid garbling of certain multibyte characters by decoding the string
971
+ ; ; before counting characters. See,
972
+ ; ; https://github.com/akermu/emacs-libvterm/issues/394, and the
973
+ ; ; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=1006 (for term.el).
974
+ (when vterm--undecoded-bytes
975
+ (setq input (concat vterm--undecoded-bytes input))
976
+ (setq vterm--undecoded-bytes nil ))
977
+ (setq decoded-str
978
+ (decode-coding-string input locale-coding-system t ))
979
+ (let ((partial 0 )
980
+ (count (length decoded-str)))
981
+ (while (and (< partial count)
982
+ (eq (char-charset (aref decoded-str
983
+ (- count 1 partial)))
984
+ 'eight-bit ))
985
+ (cl-incf partial))
986
+ (when (> count partial 0 )
987
+ (setq vterm--undecoded-bytes
988
+ (substring decoded-str (- partial)))
989
+ (setq decoded-str
990
+ (substring decoded-str 0 (- partial)))))
991
+
992
+ (vterm--write-input vterm--term decoded-str)
967
993
(vterm--update vterm--term)))))
968
994
969
995
(defun vterm--sentinel (process event )
0 commit comments