branch: externals/coterm commit db17a99f2a4393e2a836102259b024732609d285 Author: m <> Commit: m <>
Describe terminal emulation --- coterm.el | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/coterm.el b/coterm.el index 2edd904..340548b 100644 --- a/coterm.el +++ b/coterm.el @@ -61,6 +61,15 @@ ;; ;; Optional: bind `coterm-char-mode-cycle' to C-; in comint ;; (with-eval-after-load 'comint ;; (define-key comint-mode-map (kbd "C-;") #'coterm-char-mode-cycle)) +;; +;; +;; Differences from M-x term: +;; +;; coterm is written as an upgrade to comint. For existing comint users, the +;; behaviour of comint doesn't change with coterm enabled comint except for the +;; added functionality that we can now use TUI programs. It is therefor good +;; for users who generally prefer comint to term.el but sometimes miss the +;; superior terminal emulation that term.el provides. (require 'term) (eval-when-compile @@ -438,6 +447,32 @@ is the process mark." ;;; Terminal emulation +;; This is essentially a re-implementation of term.el's terminal emulation. I +;; could have simply reused functions from term.el but that would have been +;; unsatisfactory in my opinion. That is mostly due to the fact that term.el's +;; terminal emulation inserts a lot of redundant trailing whitespace end empty +;; lines, which I believe is very distracting for ordinary comint usage. +;; +;; Terminal emulation is coordinate based, for example, "move cursor to row 11 +;; and column 21". A coordinate position may not be reachable in an Emacs +;; buffer because the specified line is currently too short or there aren't +;; enough lines in the buffer. term.el automatically inserts empty lines and +;; spaces in order to move point to a specified coordinate position. This +;; results in trailing whitespace. +;; +;; coterm takes a different approach. Instead of moving point, the current +;; terminal cursor coordinates are kept in the variables `coterm--t-row' and +;; `coterm--t-col'. Moving the terminal cursor simply means adjusting these +;; two variables, no whitespace needs to be inserted. Point and process mark +;; are usually not guaranteed to be anywhere near the current coordinate +;; position and are only restored at the end of the main filter function +;; `coterm--t-emulate-terminal'. Only when terminal emulation requires +;; insertion of actual text do we have to be able to reach the current cursor +;; coordinates. We may have to insert newlines and spaces to make this +;; position reachable, but inserting text after this whitespace means that it +;; isn't trailing or redundant (except if the inserted text consists of only +;; whitespace). + (defconst coterm--t-control-seq-regexp ;; Differences from `term-control-seq-regexp': ;;