changeset 10671:fe4d986bef9d

Version 0.95. Numerous small fixes. See ChangeLog.
author Per Bothner <bothner@cygnus.com>
date Mon, 06 Feb 1995 21:56:37 +0000
parents f759e91a1654
children 0582cd3a31a6
files lisp/term.el
diffstat 1 files changed, 180 insertions(+), 154 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/term.el	Mon Feb 06 03:30:19 1995 +0000
+++ b/lisp/term.el	Mon Feb 06 21:56:37 1995 +0000
@@ -82,7 +82,7 @@
 
 ;;; This is passed to the inferior in the EMACS environment variable,
 ;;; so it is important to increase it if there are protocol-relevant changes.
-(defconst term-version "0.94")
+(defconst term-version "0.95")
 
 (require 'ring)
 (require 'ehelp)
@@ -94,8 +94,10 @@
 ;;;     term-delimiter-argument-list - list  For delimiters and arguments
 ;;;     term-last-input-start - marker       Handy if inferior always echoes
 ;;;     term-last-input-end   - marker       For term-kill-output command
-;;;     term-input-ring-size  - integer      For the input history
-;;;     term-input-ring       - ring             mechanism
+;; For the input history mechanism:
+(defvar term-input-ring-size 32 "Size of input history ring.")
+;;;     term-input-ring-size  - integer
+;;;     term-input-ring       - ring
 ;;;     term-input-ring-index - number           ...
 ;;;     term-input-autoexpand - symbol           ...
 ;;;     term-input-ignoredups - boolean          ...
@@ -108,6 +110,49 @@
 ;;;     term-input-send	- function
 ;;;     term-scroll-to-bottom-on-output - symbol ...
 ;;;     term-scroll-show-maximum-output - boolean...
+(defvar term-height) ;; Number of lines in window.
+(defvar term-width) ;; Number of columns in window.
+(defvar term-home-marker) ;; Marks the "home" position for cursor addressing.
+(defvar term-saved-home-marker nil) ;; When using alternate sub-buffer,
+;;		contains saved term-home-marker from original sub-buffer .
+(defvar term-start-line-column 0) ;; (current-column) at start of screen line,
+;;		or nil if unknown.
+(defvar term-current-column 0) ;; If non-nil, is cache for (current-column).
+(defvar term-current-row 0) ;; Current vertical row (relative to home-marker)
+;;		or nil if unknown.
+(defvar term-insert-mode nil)
+(defvar term-vertical-motion)
+(defvar term-terminal-state 0) ;; State of the terminal emulator:
+;;		state 0: Normal state
+;;		state 1: Last character was a graphic in the last column.
+;;		If next char is graphic, first move one column right
+;;		(and line warp) before displaying it.
+;;		This emulates (more or less) the behavior of xterm.
+;;		state 2: seen ESC
+;;		state 3: seen ESC [ (or ESC [ ?)
+;;		state 4: term-terminal-parameter contains pending output.
+(defvar term-kill-echo-list nil) ;; A queue of strings whose echo
+;;		we want suppressed.
+(defvar term-terminal-parameter)
+(defvar term-terminal-previous-parameter)
+(defvar term-current-face 'default)
+(defvar term-scroll-start 0) ;; Top-most line (inclusive) of scrolling region.
+(defvar term-scroll-end) ;; Number of line (zero-based) after scrolling region.
+(defvar term-pager-count nil) ;; If nil, paging is disabled.
+;;		Otherwise, number of lines before we need to page.
+(defvar term-saved-cursor nil)
+(defvar term-command-hook)
+(defvar term-log-buffer nil)
+(defvar term-scroll-with-delete nil) ;; term-scroll-with-delete is t if
+;;		forward scrolling should be implemented by delete to
+;;		top-most line(s); and nil if scrolling should be implemented
+;;		by moving term-home-marker.  It is set to t iff there is a
+;;		(non-default) scroll-region OR the alternate buffer is used.
+(defvar term-pending-delete-marker)
+(defvar term-old-mode-map nil) ;; Saves the old keymap when in char mode.
+(defvar term-old-mode-line-format) ;; Saves old mode-line-format while paging.
+(defvar term-pager-old-local-map nil) ;; Saves old keymap while paging.
+(defvar term-pager-old-filter) ;; Saved process-filter while paging.
 
 (defvar explicit-shell-file-name nil
   "*If non-nil, is file name to use for explicitly requested inferior shell.")
@@ -178,9 +223,6 @@
 See variable `term-scroll-to-bottom-on-output'.
 This variable is buffer-local.")
 
-(defvar term-input-ring-size 32
-  "Size of input history ring.")
-
 ;; Where gud-display-frame should put the debugging arrow.  This is
 ;; set by the marker-filter, which scans the debugger's output for
 ;; indications of the current pc.
@@ -282,6 +324,13 @@
 
 (defmacro term-in-char-mode () '(eq (current-local-map) term-raw-map))
 (defmacro term-in-line-mode () '(not (term-in-char-mode)))
+;; True if currently doing PAGER handling.
+(defmacro term-pager-enabled () 'term-pager-count)
+(defmacro term-handling-pager () 'term-pager-old-local-map)
+(defmacro term-using-alternate-sub-buffer () 'term-saved-home-marker)
+
+(defvar term-signals-menu)
+(defvar term-terminal-menu)
 
 (term-if-xemacs
  (defvar term-terminal-menu
@@ -327,19 +376,16 @@
     (kill-all-local-variables)
     (setq major-mode 'term-mode)
     (setq mode-name "Term")
-    (setq mode-line-process '(": line %s"))
     (use-local-map term-mode-map)
     (make-local-variable 'term-home-marker)
     (setq term-home-marker (copy-marker 0))
     (make-local-variable 'term-saved-home-marker)
-    (setq term-saved-home-marker nil)
     (make-local-variable 'term-height)
     (make-local-variable 'term-width)
     (setq term-width (1- (window-width)))
     (setq term-height (1- (window-height)))
     (make-local-variable 'term-terminal-parameter)
     (make-local-variable 'term-saved-cursor)
-    (setq term-saved-cursor nil)
     (make-local-variable 'term-last-input-start)
     (setq term-last-input-start (make-marker))
     (make-local-variable 'term-last-input-end)
@@ -359,54 +405,20 @@
     (make-local-variable 'term-command-hook)
     (setq term-command-hook (symbol-function 'term-command-hook))
 
-    ;; state 0: Normal state
-    ;; state 1: Last character was a graphic in the last column.
-    ;;          If next char is graphic, first move one column right
-    ;;          (and line warp) before displaying it.
-    ;;          This emulates (more or less) the behavior of xterm.
-    ;; state 2: seen ESC
-    ;; state 3: seen ESC [ (or ESC [ ?)
-    ;; state 4: term-terminal-parameter contains pending output.
     (make-local-variable 'term-terminal-state)
-    (setq term-terminal-state 0)
-
-    ;; A queue of strings whose echo we want suppressed.
     (make-local-variable 'term-kill-echo-list)
-    (setq term-kill-echo-list nil)
-
-    ;; (current-column) at start of screen line, or nil if unknown.
     (make-local-variable 'term-start-line-column)
-    (setq term-start-line-column 0)
-    ;; Cache for (current-column), or nil if unknown.
     (make-local-variable 'term-current-column)
-    (setq term-current-column 0)
-    ;; Current vertical row (from home-marker) or nil if unknown.
     (make-local-variable 'term-current-row)
-    (setq term-current-row 0)
     (make-local-variable 'term-log-buffer)
-    (setq term-log-buffer nil)
     (make-local-variable 'term-scroll-start)
-    (setq term-scroll-start 0)
     (make-local-variable 'term-scroll-end)
     (setq term-scroll-end term-height)
-    ;; term-scroll-with-delete is t if forward scrolling should
-    ;; be implemented by delete to top-most line(s); and nil if
-    ;; scrolling should be implemented by moving term-home-marker.
-    ;; It is set to t iff there is a (non-default) scroll-region
-    ;; OR the alternate buffer is used.
     (make-local-variable 'term-scroll-with-delete)
-    (setq term-scroll-with-delete nil)
     (make-local-variable 'term-pager-count)
-    ;;(setq term-pager-count 0)
-    (setq term-pager-count nil)
-    ;; Used to save the old keymap when doing PAGER processing.
     (make-local-variable 'term-pager-old-local-map)
-    (setq term-pager-old-local-map nil)
-    ;; Used to save the old keymap when in char mode.
     (make-local-variable 'term-old-mode-map)
-    (setq term-old-mode-map nil)
     (make-local-variable 'term-insert-mode)
-    (setq term-insert-mode nil)
     (make-local-variable 'term-dynamic-complete-functions)
     (make-local-variable 'term-completion-fignore)
     (make-local-variable 'term-get-old-input)
@@ -425,17 +437,15 @@
     (make-local-variable 'term-pending-delete-marker)
     (setq term-pending-delete-marker (make-marker))
     (make-local-variable 'term-current-face)
-    (setq term-current-face 'default)
     (make-local-variable 'term-pending-frame)
     (setq term-pending-frame nil)
-    (make-local-variable 'term-chars-mode)
-    (setq term-chars-mode nil)
     (run-hooks 'term-mode-hook)
     (term-if-xemacs
      (set-buffer-menubar
       (append current-menubar (list term-terminal-menu))))
     (or term-input-ring
-	(setq term-input-ring (make-ring term-input-ring-size))))
+	(setq term-input-ring (make-ring term-input-ring-size)))
+    (term-update-mode-line))
 
 (if term-mode-map
     nil
@@ -490,82 +500,84 @@
 ;; Menu bars:
 (term-ifnot-xemacs
  (term-if-emacs19
-      ;; terminal:
-      (defvar term-terminal-menu (make-sparse-keymap "Terminal"))
-      (define-key term-terminal-menu [terminal-pager-enable]
-	'("Enable paging" . term-fake-pager-enable))
-      (define-key term-terminal-menu [terminal-pager-disable]
-	'("Disable paging" . term-fake-pager-disable))
-      (define-key term-terminal-menu [terminal-char-mode]
-	'("Character mode" . term-char-mode))
-      (define-key term-terminal-menu [terminal-line-mode]
-	'("Line mode" . term-line-mode))
-      (define-key term-mode-map [menu-bar terminal] 
-	(setq term-terminal-menu (cons "Terminal" term-terminal-menu)))
 
-      ;; completion:  (line mode only)
-      (defvar term-completion-menu (make-sparse-keymap "Complete"))
-      (define-key term-mode-map [menu-bar completion] 
-	(cons "Complete" term-completion-menu))
-      (define-key term-completion-menu [complete-expand]
-	'("Expand File Name" . term-replace-by-expanded-filename))
-      (define-key term-completion-menu [complete-listing]
-	'("File Completion Listing" . term-dynamic-list-filename-completions))
-      (define-key term-completion-menu [menu-bar completion complete-file]
-	'("Complete File Name" . term-dynamic-complete-filename))
-      (define-key term-completion-menu [menu-bar completion complete]
-	'("Complete Before Point" . term-dynamic-complete))
+  ;; terminal:
+  (let (newmap)
+    (setq newmap (make-sparse-keymap "Terminal"))
+    (define-key newmap [terminal-pager-enable]
+      '("Enable paging" . term-fake-pager-enable))
+    (define-key newmap [terminal-pager-disable]
+      '("Disable paging" . term-fake-pager-disable))
+    (define-key newmap [terminal-char-mode]
+      '("Character mode" . term-char-mode))
+    (define-key newmap [terminal-line-mode]
+      '("Line mode" . term-line-mode))
+    (define-key newmap [menu-bar terminal] 
+      (setq term-terminal-menu (cons "Terminal" newmap)))
+
+    ;; completion:  (line mode only)
+    (defvar term-completion-menu (make-sparse-keymap "Complete"))
+    (define-key term-mode-map [menu-bar completion] 
+      (cons "Complete" term-completion-menu))
+    (define-key term-completion-menu [complete-expand]
+      '("Expand File Name" . term-replace-by-expanded-filename))
+    (define-key term-completion-menu [complete-listing]
+      '("File Completion Listing" . term-dynamic-list-filename-completions))
+    (define-key term-completion-menu [menu-bar completion complete-file]
+      '("Complete File Name" . term-dynamic-complete-filename))
+    (define-key term-completion-menu [menu-bar completion complete]
+      '("Complete Before Point" . term-dynamic-complete))
 
-      ;; Input history: (line mode only)
-      (defvar term-inout-menu (make-sparse-keymap "In/Out"))
-      (define-key term-mode-map [menu-bar inout] 
-	(cons "In/Out" term-inout-menu))
-      (define-key term-inout-menu [kill-output]
-	'("Kill Current Output Group" . term-kill-output))
-      (define-key term-inout-menu [next-prompt]
-	'("Forward Output Group" . term-next-prompt))
-      (define-key term-inout-menu [previous-prompt]
-	'("Backward Output Group" . term-previous-prompt))
-      (define-key term-inout-menu [show-maximum-output]
-	'("Show Maximum Output" . term-show-maximum-output))
-      (define-key term-inout-menu [show-output]
-	'("Show Current Output Group" . term-show-output))
-      (define-key term-inout-menu [kill-input]
-	'("Kill Current Input" . term-kill-input))
-      (define-key term-inout-menu [copy-input]
-	'("Copy Old Input" . term-copy-old-input))
-      (define-key term-inout-menu [forward-matching-history]
-	'("Forward Matching Input..." . term-forward-matching-input))
-      (define-key term-inout-menu [backward-matching-history]
-	'("Backward Matching Input..." . term-backward-matching-input))
-      (define-key term-inout-menu [next-matching-history]
-	'("Next Matching Input..." . term-next-matching-input))
-      (define-key term-inout-menu [previous-matching-history]
-	'("Previous Matching Input..." . term-previous-matching-input))
-      (define-key term-inout-menu [next-matching-history-from-input]
-	'("Next Matching Current Input" . term-next-matching-input-from-input))
-      (define-key term-inout-menu [previous-matching-history-from-input]
-	'("Previous Matching Current Input" . term-previous-matching-input-from-input))
-      (define-key term-inout-menu [next-history]
-	'("Next Input" . term-next-input))
-      (define-key term-inout-menu [previous-history]
-	'("Previous Input" . term-previous-input))
-      (define-key term-inout-menu [list-history]
-	'("List Input History" . term-dynamic-list-input-ring))
-      (define-key term-inout-menu [expand-history]
-	'("Expand History Before Point" . term-replace-by-expanded-history))
+    ;; Input history: (line mode only)
+    (defvar term-inout-menu (make-sparse-keymap "In/Out"))
+    (define-key term-mode-map [menu-bar inout] 
+      (cons "In/Out" term-inout-menu))
+    (define-key term-inout-menu [kill-output]
+      '("Kill Current Output Group" . term-kill-output))
+    (define-key term-inout-menu [next-prompt]
+      '("Forward Output Group" . term-next-prompt))
+    (define-key term-inout-menu [previous-prompt]
+      '("Backward Output Group" . term-previous-prompt))
+    (define-key term-inout-menu [show-maximum-output]
+      '("Show Maximum Output" . term-show-maximum-output))
+    (define-key term-inout-menu [show-output]
+      '("Show Current Output Group" . term-show-output))
+    (define-key term-inout-menu [kill-input]
+      '("Kill Current Input" . term-kill-input))
+    (define-key term-inout-menu [copy-input]
+      '("Copy Old Input" . term-copy-old-input))
+    (define-key term-inout-menu [forward-matching-history]
+      '("Forward Matching Input..." . term-forward-matching-input))
+    (define-key term-inout-menu [backward-matching-history]
+      '("Backward Matching Input..." . term-backward-matching-input))
+    (define-key term-inout-menu [next-matching-history]
+      '("Next Matching Input..." . term-next-matching-input))
+    (define-key term-inout-menu [previous-matching-history]
+      '("Previous Matching Input..." . term-previous-matching-input))
+    (define-key term-inout-menu [next-matching-history-from-input]
+      '("Next Matching Current Input" . term-next-matching-input-from-input))
+    (define-key term-inout-menu [previous-matching-history-from-input]
+      '("Previous Matching Current Input" . term-previous-matching-input-from-input))
+    (define-key term-inout-menu [next-history]
+      '("Next Input" . term-next-input))
+    (define-key term-inout-menu [previous-history]
+      '("Previous Input" . term-previous-input))
+    (define-key term-inout-menu [list-history]
+      '("List Input History" . term-dynamic-list-input-ring))
+    (define-key term-inout-menu [expand-history]
+      '("Expand History Before Point" . term-replace-by-expanded-history))
 
-      ;; Signals
-      (defvar term-signals-menu (make-sparse-keymap "Signals"))
-      (define-key term-signals-menu [eof] '("EOF" . term-send-eof))
-      (define-key term-signals-menu [kill] '("KILL" . term-kill-subjob))
-      (define-key term-signals-menu [quit] '("QUIT" . term-quit-subjob))
-      (define-key term-signals-menu [cont] '("CONT" . term-continue-subjob))
-      (define-key term-signals-menu [stop] '("STOP" . term-stop-subjob))
-      (define-key term-signals-menu [] '("BREAK" . term-interrupt-subjob))
-      (define-key term-mode-map [menu-bar signals]
-	(setq term-signals-menu (cons "Signals" term-signals-menu)))
-      ))
+    ;; Signals
+    (setq newmap (make-sparse-keymap "Signals"))
+    (define-key newmap [eof] '("EOF" . term-send-eof))
+    (define-key newmap [kill] '("KILL" . term-kill-subjob))
+    (define-key newmap [quit] '("QUIT" . term-quit-subjob))
+    (define-key newmap [cont] '("CONT" . term-continue-subjob))
+    (define-key newmap [stop] '("STOP" . term-stop-subjob))
+    (define-key newmap [] '("BREAK" . term-interrupt-subjob))
+    (define-key term-mode-map [menu-bar signals]
+      (setq term-signals-menu (cons "Signals" newmap)))
+    )))
 
 (defun term-reset-size (height width)
   (setq term-height height)
@@ -617,7 +629,7 @@
       ;; Note that (term-current-row) must be called *after*
       ;; (point) has been updated to (process-mark proc).
       (goto-char (process-mark proc))
-      (if term-pager-count
+      (if (term-pager-enabled)
 	  (setq term-pager-count (term-current-row)))
       (send-string proc chars))))
 
@@ -633,11 +645,18 @@
 
 (defun term-send-raw-meta ()
   (interactive)
-  ;; Convert `return' to C-m, etc.
-  (if (and (symbolp last-input-char)
-	   (get last-input-char 'ascii-character))
-      (setq last-input-char (get last-input-char 'ascii-character)))
-  (term-send-raw-string (if (> last-input-char 127)
+  (if (symbolp last-input-char)
+      ;; Convert `return' to C-m, etc.
+      (let ((tmp (get last-input-char 'event-symbol-elements)))
+	(if tmp
+	    (setq last-input-char (car tmp)))
+	(if (symbolp last-input-char)
+	    (progn
+	      (setq tmp (get last-input-char 'ascii-character))
+	      (if tmp (setq last-input-char tmp))))))
+  (term-send-raw-string (if (and (numberp last-input-char)
+				 (> last-input-char 127)
+				 (< last-input-char 256))
 			    (make-string 1 last-input-char)
 			  (format "\e%c" last-input-char))))
 
@@ -721,9 +740,7 @@
 		    (end-of-line)
 		    (term-send-input))
 		(setq term-input-sender save-input-sender))))
-
-	(setq mode-line-process '(": char %s"))
-	(set-buffer-modified-p (buffer-modified-p))))) ;; Updates mode line.
+	(term-update-mode-line))))
 
 (defun term-line-mode  ()
   "Switch to line (\"cooked\") sub-mode of term mode.
@@ -733,8 +750,14 @@
   (if (term-in-char-mode)
       (progn
 	(use-local-map term-old-mode-map)
-	(setq mode-line-process '(": line %s"))
-	(set-buffer-modified-p (buffer-modified-p))))) ;; Updates mode line.
+	(term-update-mode-line))))
+
+(defun term-update-mode-line ()
+  (setq mode-line-process
+	(if (term-in-char-mode)
+	    (if (term-pager-enabled) '(": char page %s") '(": char %s"))
+	  (if (term-pager-enabled) '(": line page %s") '(": line %s"))))
+  (set-buffer-modified-p (buffer-modified-p))) ;; Force mode line update.
 
 (defun term-check-proc (buffer)
   "True if there is a process associated w/buffer BUFFER, and
@@ -1434,7 +1457,7 @@
 			  (delete-region pmark (point))
 			  (insert input)
 			  copy))))
-	(if term-pager-count
+	(if (term-pager-enabled)
 	    (save-excursion
 	      (goto-char (process-mark proc))
 	      (setq term-pager-count (term-current-row))))
@@ -1574,7 +1597,6 @@
 is additionally sent. String is not saved on term input history list.
 Security bug: your string can still be temporarily recovered with
 \\[view-lossage]."
- (interactive (list (term-read-noecho "Enter non-echoed text")))
   (interactive "P") ; Defeat snooping via C-x esc
   (if (not (stringp str))
       (setq str (term-read-noecho "Non-echoed text: " t)))
@@ -2007,15 +2029,10 @@
   (if term-current-row
       (setq term-current-row (+ term-current-row delta))))
 
-;; True if currently doing PAGER handling.
-(defmacro term-handling-pager () 'term-pager-old-local-map)
-
-(defmacro term-using-alternate-sub-buffer () 'term-saved-home-marker)
-
 (defun term-terminal-pos ()
   (save-excursion ;    save-restriction
     (let ((save-col (term-current-column))
-	  (x))
+	  x y)
       (term-vertical-motion 0)
       (setq x (- save-col (current-column)))
       (setq y (term-vertical-motion term-height))
@@ -2190,7 +2207,7 @@
 			    (setq term-terminal-parameter 0))
 			   ((eq char ??)) ; Ignore ? 
 			   (t
-			    (term-handle-ansi-escape char)
+			    (term-handle-ansi-escape proc char)
 			    (setq term-terminal-state 0)))))
 	      (if (term-handling-pager)
 		  ;; Finish stuff to get ready to handle PAGER.
@@ -2266,13 +2283,17 @@
 ;;; Handle a character assuming (eq terminal-state 2) -
 ;;; i.e. we have previousely seen Escape followed by ?[.
 
-(defun term-handle-ansi-escape (char)
+(defun term-handle-ansi-escape (proc char)
   (cond
    ((eq char ?H) ; cursor motion
     (if (<= term-terminal-parameter 0)
 	(setq term-terminal-parameter 1))
     (if (<= term-terminal-previous-parameter 0)
 	(setq term-terminal-previous-parameter 1))
+    (if (> term-terminal-previous-parameter term-height)
+	(setq term-terminal-previous-parameter term-height))
+    (if (> term-terminal-parameter term-width)
+	(setq term-terminal-parameter term-width))
     (term-goto
      (1- term-terminal-previous-parameter)
      (1- term-terminal-parameter)))
@@ -2327,6 +2348,12 @@
 	  ((eq term-terminal-parameter 1)
 	   (setq term-current-face 'bold))
 	  (t (setq term-current-face 'default))))
+   ;; \E[6n - Report cursor position
+   ((eq char ?n)
+    (process-send-string proc
+			 (format "\e[%s;%sR"
+				 (1+ (term-current-row))
+				 (1+ (term-horizontal-column)))))
    ;; \E[r - Set scrolling region
    ((eq char ?r)
     (term-scroll-region
@@ -2344,7 +2371,7 @@
 	    0
 	  top))
   (setq term-scroll-end
-	(if (or (< bottom term-scroll-start) (> bottom term-height))
+	(if (or (<= bottom term-scroll-start) (> bottom term-height))
 	    term-height
 	  bottom))
   (setq term-scroll-with-delete
@@ -2375,7 +2402,6 @@
 	       (setq term-saved-home-marker nil)
 	       (goto-char term-home-marker)))
 	(setq term-current-column nil)
-	(setq term-line-start-column nil)
 	(setq term-current-row 0)
 	(term-goto row col))))
 
@@ -2558,17 +2584,19 @@
   (interactive)
   (if (term-handling-pager)
       (term-pager-continue nil)
-    (setq term-pager-count nil)))
+    (setq term-pager-count nil))
+  (term-update-mode-line))
     
 ; Enable pager processing.
 (defun term-pager-enable ()
   (interactive)
-  (or term-pager-count
-      (setq term-pager-count 0))) ;; Or maybe set to (term-current-row) ??
+  (or (term-pager-enabled)
+      (setq term-pager-count 0)) ;; Or maybe set to (term-current-row) ??
+  (term-update-mode-line))
 
 (defun term-pager-toggle ()
   (interactive)
-  (if term-pager-count (term-pager-disable) (term-pager-enable)))
+  (if (term-pager-enabled) (term-pager-disable) (term-pager-enable)))
 
 (term-ifnot-xemacs
  (defalias 'term-fake-pager-enable 'term-pager-toggle)
@@ -2645,7 +2673,6 @@
 	  (goto-char save-point)
 	  (set-marker save-point nil)
 	  (setq term-current-column nil)
-	  (setq term-line-start-column nil)
 	  (setq term-current-row nil))))
   down)
 
@@ -2670,10 +2697,10 @@
 
 (defun term-erase-in-line (kind)
   (if (> kind 1) ;; erase left of point
-      (let ((cols (term-horizontal-column)) (saved-point (point))
-	    (term-vertical-motion 0)
-	    (delete-region (point) saved-point)
-	    (term-insert-char ?\n cols))))
+      (let ((cols (term-horizontal-column)) (saved-point (point)))
+	(term-vertical-motion 0)
+	(delete-region (point) saved-point)
+	(term-insert-char ?\n cols)))
   (if (not (eq kind 1)) ;; erase right of point
       (let ((saved-point (point))
 	    (wrapped (and (zerop (term-horizontal-column))
@@ -2710,9 +2737,8 @@
 	   (delete-region start-region end-region)
 	   (term-unwrap-line)
 	   (if (eq kind 1)
-	       (term-insert-char \?n row))
+	       (term-insert-char ?\n row))
 	   (setq term-current-column nil)
-	   (setq term-line-start-column nil)
 	   (setq term-current-row nil)
 	   (term-goto row col)))))