branch: externals/coterm commit 08208f3351af530a2b05329264a1ecd639407247 Author: m <> Commit: m <>
Handle \r\n sequence properly --- coterm.el | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/coterm.el b/coterm.el index 6e1b8ee..877a7eb 100644 --- a/coterm.el +++ b/coterm.el @@ -8,7 +8,7 @@ (defconst coterm--t-control-seq-regexp (concat ;; A control character, - "\\(?:[\r\n\000\007\b\016\017]\\|" + "\\(?:[\n\000\007\b\016\017]\\|\r\n?\\|" ;; a C1 escape coded character (see [ECMA-48] section 5.3 "Elements ;; of the C1 set"), "\e\\(?:[DM78c]\\|" @@ -342,12 +342,22 @@ initialize it sensibly." (setq ctl-end (match-end 0)) (pcase (aref string match) - ((and ?\n - (guard coterm--t-pmark-in-sync) - (guard (= pmark (point-max))) - (guard (not (coterm--t-scroll-by-deletion-p)))) - (pass-through) - (cl-incf will-insert-newlines)) + ((and ?\r (guard (= ctl-end (+ 2 match)))) + ;; A match string of length two and beginning with \r means + ;; that we have matched "\r\n". In this case, and if we are + ;; at eob, we pass-through to avoid an unnecessary call to + ;; `substring' which is expensive. In the most common when + ;; the process just outputs text at eob without any control + ;; sequences, we will end up inserting the whole string + ;; without a single call to `substring'. + (if (and coterm--t-pmark-in-sync + (= pmark (point-max)) + (not (coterm--t-scroll-by-deletion-p))) + (progn (pass-through) + (cl-incf will-insert-newlines)) + (ins) + (setq coterm--t-col 0) + (coterm--t-down-line proc-filt process))) (?\n (ins) ;; (terminfo: cud1, ind) (coterm--t-down-line proc-filt process)) (?\r (ins) ;; (terminfo: cr) @@ -543,6 +553,15 @@ initialize it sensibly." (defcustom coterm-term-name term-term-name "Name to use for TERM.") +(defun coterm--comint-strip-CR (_) + "Remove all \\r characters from last output." + (save-excursion + (goto-char comint-last-output-start) + (let ((pmark (process-mark (get-buffer-process (current-buffer))))) + (while (progn (skip-chars-forward "^\r") + (< (point) pmark)) + (delete-char 1))))) + (defun coterm--init () "Initialize current buffer for coterm." (when-let ((process (get-buffer-process (current-buffer)))) @@ -552,6 +571,7 @@ initialize it sensibly." (setq coterm--t-scroll-end coterm--t-height) (setq-local comint-inhibit-carriage-motion t) + (add-hook 'comint-output-filter-functions #'coterm--comint-strip-CR) (add-function :filter-return (local 'window-adjust-process-window-size-function)