Article View: gnu.emacs.bug
Article #87210Terminfo support for terminal emulator
From: Kishore Kumar
Date: Tue, 04 Oct 1994 11:23
Date: Tue, 04 Oct 1994 11:23
242 lines
10785 bytes
10785 bytes
Hi,
I am enclosing an implementation of terminal.el that works with
terminfo database (the current version only works with termcap
facility). Hope you find it OK enough to incorporate into the next
release of emacs.
Kishore
------------------------------------------------------------------------------
(emacs-version)
"GNU Emacs 19.19.3 of Fri Feb 18 1994 on shruthi (usg-unix-v)"
Machine: Unisys U6000
OS: SVR4
Also tested on HP9000 running hpux.
------------------------------------------------------------------------------
Mon Oct 3 14:55:27 1994 Kishore Kumar (kishorek@tulblr.unisys.com)
* (terminal.el): Added terminfo support. Modified
terminal-emulator. Added two new functions - te-create-terminfo &
te-tic-sentinel. Also, yanked some code from terminal-emulator
into a seperate function te-create-termcap.
------------------------------------------------------------------------------
cd ~/
diff -c /home1/emacs/lib/emacs/19.19/lisp/terminal.old /home1/emacs/lib/emacs/19.19/lisp/terminal.el
*** /home1/emacs/lib/emacs/19.19/lisp/terminal.old Thu Sep 22 13:38:05 1994
--- /home1/emacs/lib/emacs/19.19/lisp/terminal.el Mon Oct 3 16:50:16 1994
***************
*** 33,38 ****
--- 33,39 ----
;;>> more-processing enabled.
(require 'ehelp)
+ (require 'cl)
(defvar terminal-escape-char ?\C-^
"*All characters except for this are passed verbatim through the
***************
*** 159,164 ****
--- 160,171 ----
(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
***************
*** 1010,1016 ****
(progn (goto-char (point-max))
(recenter -1)))))))
! (defvar te-stty-string "stty -nl erase '^?' kill '^u' intr '^c' echo pass8"
"Shell command to set terminal modes for terminal emulator.")
;; This used to have `new' in it, but that loses outside BSD
;; and it's apparently not needed in BSD.
--- 1017,1023 ----
(progn (goto-char (point-max))
(recenter -1)))))))
! (defvar te-stty-string "stty -nl erase '^?' kill '^u' intr '^c' echo"
"Shell command to set terminal modes for terminal emulator.")
;; This used to have `new' in it, but that loses outside BSD
;; and it's apparently not needed in BSD.
***************
*** 1077,1082 ****
--- 1084,1091 ----
(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))
***************
*** 1087,1135 ****
(if (y-or-n-p (format "Kill process %s? " (process-name process)))
(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"
! ;; 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)
--- 1096,1119 ----
(if (y-or-n-p (format "Kill process %s? " (process-name process)))
(delete-process process)
(error "Process %s not killed" (process-name process)))))
+
(condition-case err
! (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)
***************
*** 1242,1247 ****
--- 1226,1298 ----
(1+ end)))
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 (find system-type te-terminfo-systems)
+ (not (file-exists-p (concat "/tmp/"
+ (subseq 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)
Diff exited abnormally with code 1 at Tue Oct 4 10:58:38
------------------------------------------------------------------------------
Kishore Kumar email: kishorek@tulblr.unisys.com
Tata Unisys Ltd.
80 Ft Road, Indiranagar
Bangalore, INDIA Phone : +91-80-5584681
------------------------------------------------------------------------------
Technical Details
Message-ID:
<9410040602.AA02546@felix>Path:
arc1-ca.pugleaf.net!bga.com!news.sprintlink.net!howland.reston.ans.net!math.ohio-state.edu!magnus.acs.ohio-state.edu!cis.ohio-state.edu!tulblr.unisys.COM!kishorekShow Full Headers
Complete Article Headers
X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: fb2f1,250b1027b430bf69,start X-Google-Attributes: gidfb2f1,public X-Google-ArrivalTime: 1994-10-04 05:45:54 PST Path: arc1-ca.pugleaf.net!bga.com!news.sprintlink.net!howland.reston.ans.net!math.ohio-state.edu!magnus.acs.ohio-state.edu!cis.ohio-state.edu!tulblr.unisys.COM!kishorek From: kishorek@tulblr.unisys.COM (Kishore Kumar) Newsgroups: gnu.emacs.bug Subject: Terminfo support for terminal emulator Date: 4 Oct 1994 07:23:09 -0400 Organization: GNUs Not Usenet Lines: 242 Sender: daemon@cis.ohio-state.edu Approved: bug-gnu-emacs@prep.ai.mit.edu Distribution: gnu Message-ID: <9410040602.AA02546@felix>