mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-27 07:37:33 +00:00
Added terminfo support.
(te-terminal-name-prefix, te-terminal-name, te-terminfo-systems): New variables. (terminal-emulator): Handle termcap or terminfo. (te-create-terminfo, te-create-termcap): New subroutines. (te-tic-sentinel): New subroutine.
This commit is contained in:
parent
ca0569ad39
commit
398e98d1c2
136
lisp/terminal.el
136
lisp/terminal.el
@ -25,7 +25,6 @@
|
||||
;;; Code:
|
||||
|
||||
;;>>TODO
|
||||
;;>> terminfo?
|
||||
;;>> ** Nothing can be done about emacs' meta-lossage **
|
||||
;;>> (without redoing keymaps `sanely' -- ask Mly for details)
|
||||
|
||||
@ -160,6 +159,12 @@ performance.")
|
||||
(defvar te-more-old-mode-line-format nil)
|
||||
(defvar te-pending-output-info nil)
|
||||
|
||||
;; Required to support terminfo systems
|
||||
(defconst te-terminal-name-prefix "emacs-virtual")
|
||||
(defvar te-terminal-name nil)
|
||||
(defvar te-terminfo-systems '(hpux usg-unix-v)
|
||||
"List of system types that support terminfo instead of termcap")
|
||||
|
||||
|
||||
;;;; escape map
|
||||
|
||||
@ -1048,10 +1053,7 @@ terminal-redisplay-interval.
|
||||
|
||||
This function calls the value of terminal-mode-hook if that exists
|
||||
and is non-nil after the terminal buffer has been set up and the
|
||||
subprocess started.
|
||||
|
||||
Presently with `termcap' only; if somebody sends us code to make this
|
||||
work with `terminfo' we will try to use it."
|
||||
subprocess started."
|
||||
(interactive
|
||||
(cons (save-excursion
|
||||
(set-buffer (get-buffer-create "*terminal*"))
|
||||
@ -1079,6 +1081,8 @@ work with `terminfo' we will try to use it."
|
||||
(if (null height) (setq height (- (window-height (selected-window)) 1)))
|
||||
(terminal-mode)
|
||||
(setq te-width width te-height height)
|
||||
(setq te-terminal-name (concat te-terminal-name-prefix "-" te-width
|
||||
te-height))
|
||||
(setq mode-line-buffer-identification
|
||||
(list (format "Emacs terminal %dx%d: %%b " te-width te-height)
|
||||
'te-pending-output-info))
|
||||
@ -1090,44 +1094,22 @@ work with `terminfo' we will try to use it."
|
||||
(delete-process process)
|
||||
(error "Process %s not killed" (process-name process)))))
|
||||
(condition-case err
|
||||
(let ((termcap
|
||||
;; Because of Unix Brain Death(tm), we can't change
|
||||
;; the terminal type of a running process, and so
|
||||
;; terminal size and scrollability are wired-down
|
||||
;; at this point. ("Detach? What's that?")
|
||||
(concat (format "emacs-virtual:co#%d:li#%d:%s"
|
||||
;; Sigh. These can't be dynamically changed.
|
||||
te-width te-height (if terminal-scrolling
|
||||
"" "ns:"))
|
||||
;;-- Basic things
|
||||
;; cursor-motion, bol, forward/backward char
|
||||
"cm=^p=%+ %+ :cr=^p^a:le=^p^b:nd=^p^f:"
|
||||
;; newline, clear eof/eof, audible bell
|
||||
"nw=^j:ce=^pc:cd=^pC:cl=^p^l:bl=^p^g:"
|
||||
;; insert/delete char/line
|
||||
"IC=^p_%+ :DC=^pd%+ :AL=^p^o%+ :DL=^p^k%+ :"
|
||||
;;-- Not-widely-known (ie nonstandard) flags, which mean
|
||||
;; o writing in the last column of the last line
|
||||
;; doesn't cause idiotic scrolling, and
|
||||
;; o don't use idiotische c-s/c-q sogenannte
|
||||
;; ``flow control'' auf keinen Fall.
|
||||
"LP:NF:"
|
||||
;;-- For stupid or obsolete programs
|
||||
"ic=^p_!:dc=^pd!:al=^p^o!:dl=^p^k!:ho=^p= :"
|
||||
;;-- For disgusting programs.
|
||||
;; (VI? What losers need these, I wonder?)
|
||||
"im=:ei=:dm=:ed=:mi:do=^p^j:nl=^p^j:bs:")))
|
||||
(let ((process-environment
|
||||
(cons "TERM=emacs-virtual"
|
||||
(cons (concat "TERMCAP=" termcap)
|
||||
process-environment))))
|
||||
(setq te-process
|
||||
(start-process "terminal-emulator" (current-buffer)
|
||||
"/bin/sh" "-c"
|
||||
(format "%s; exec %s"
|
||||
te-stty-string
|
||||
(mapconcat 'te-quote-arg-for-sh
|
||||
(cons program args) " ")))))
|
||||
(let ((process-environment
|
||||
(cons (concat "TERM=" te-terminal-name)
|
||||
(cons (concat "TERMCAP=" (te-create-termcap))
|
||||
(cons (concat "TERMINFO=" (te-create-terminfo))
|
||||
process-environment)))))
|
||||
(setq te-process
|
||||
(start-process "terminal-emulator" (current-buffer)
|
||||
"/bin/sh" "-c"
|
||||
;; Yuck!!! Start a shell to set some terminal
|
||||
;; control characteristics. Then start the
|
||||
;; "env" program to setup the terminal type
|
||||
;; Then finally start the program we wanted.
|
||||
(format "%s; exec %s"
|
||||
te-stty-string
|
||||
(mapconcat 'te-quote-arg-for-sh
|
||||
(cons program args) " "))))
|
||||
(set-process-filter te-process 'te-filter)
|
||||
(set-process-sentinel te-process 'te-sentinel))
|
||||
(error (fundamental-mode)
|
||||
@ -1239,6 +1221,74 @@ of the terminal-emulator"
|
||||
start (1+ end)))
|
||||
(concat "\"" harder "\"")))))
|
||||
|
||||
(defun te-create-terminfo ()
|
||||
"Create and compile a terminfo entry for the virtual terminal. This is kept
|
||||
in the /tmp directory"
|
||||
(if (and (member system-type te-terminfo-systems)
|
||||
(not (file-exists-p (concat "/tmp/"
|
||||
(substring te-terminal-name-prefix 0 1)
|
||||
"/" te-terminal-name))))
|
||||
(let ( (terminfo
|
||||
(concat
|
||||
(format "%s,mir, xon,cols#%d, lines#%d,"
|
||||
te-terminal-name te-width te-height)
|
||||
"bel=^P^G, clear=^P\\f, cr=^P^A, cub1=^P^B, cud1=^P\\n,"
|
||||
"cuf1=^P^F, cup=^P=%p1%'\\s'%+%c%p2%'\\s'%+%c,"
|
||||
"dch=^Pd%p1%'\\s'%+%c, dch1=^Pd!, dl=^P^K%p1%'\\s'%+%c,"
|
||||
"dl1=^P^K!, ed=^PC, el=^Pc, home=^P=\\s\\s,"
|
||||
"ich=^P_%p1%'\\s'%+%c, ich1=^P_!, il=^P^O%p1%'\\s'%+%c,"
|
||||
"il1=^P^O!, ind=^P\\n, nel=\\n,"))
|
||||
(file-name (concat "/tmp/" te-terminal-name ".tif")) )
|
||||
(save-excursion
|
||||
(set-buffer (create-file-buffer file-name))
|
||||
(insert terminfo)
|
||||
(write-file file-name)
|
||||
(kill-buffer nil)
|
||||
)
|
||||
(let ( (process-environment
|
||||
(cons (concat "TERMINFO=" "/tmp")
|
||||
process-environment)) )
|
||||
(set-process-sentinel (start-process "tic" nil "tic" file-name)
|
||||
'te-tic-sentinel))))
|
||||
"/tmp"
|
||||
)
|
||||
|
||||
(defun te-create-termcap ()
|
||||
"Create a termcap entry for the virtual terminal"
|
||||
;; Because of Unix Brain Death(tm), we can't change
|
||||
;; the terminal type of a running process, and so
|
||||
;; terminal size and scrollability are wired-down
|
||||
;; at this point. ("Detach? What's that?")
|
||||
(concat (format "%s:co#%d:li#%d:%s"
|
||||
;; Sigh. These can't be dynamically changed.
|
||||
te-terminal-name te-width te-height (if terminal-scrolling
|
||||
"" "ns:"))
|
||||
;;-- Basic things
|
||||
;; cursor-motion, bol, forward/backward char
|
||||
"cm=^p=%+ %+ :cr=^p^a:le=^p^b:nd=^p^f:"
|
||||
;; newline, clear eof/eof, audible bell
|
||||
"nw=^j:ce=^pc:cd=^pC:cl=^p^l:bl=^p^g:"
|
||||
;; insert/delete char/line
|
||||
"IC=^p_%+ :DC=^pd%+ :AL=^p^o%+ :DL=^p^k%+ :"
|
||||
;;-- Not-widely-known (ie nonstandard) flags, which mean
|
||||
;; o writing in the last column of the last line
|
||||
;; doesn't cause idiotic scrolling, and
|
||||
;; o don't use idiotische c-s/c-q sogenannte
|
||||
;; ``flow control'' auf keinen Fall.
|
||||
"LP:NF:"
|
||||
;;-- For stupid or obsolete programs
|
||||
"ic=^p_!:dc=^pd!:al=^p^o!:dl=^p^k!:ho=^p= :"
|
||||
;;-- For disgusting programs.
|
||||
;; (VI? What losers need these, I wonder?)
|
||||
"im=:ei=:dm=:ed=:mi:do=^p^j:nl=^p^j:bs:")
|
||||
)
|
||||
|
||||
(defun te-tic-sentinel (proc state-change)
|
||||
"If tic has finished, delete the .tif file"
|
||||
(if (equal state-change "finished
|
||||
")
|
||||
(delete-file (concat "/tmp/" te-terminal-name ".tif"))))
|
||||
|
||||
(provide 'terminal)
|
||||
|
||||
;;; terminal.el ends here
|
||||
|
Loading…
Reference in New Issue
Block a user