[comp.mail.elm] elm to emacs integration

david@wubios.wustl.edu (David J. Camp) (10/11/90)

Here are my changes to make elm work with gnu emacs.  I start emacs
and run a terminal-emulator session running elm.  I then use 
'elmacs' as my editor within elm.  This shell script can also
be used by elm outside of emacs, in which case it will start 
emacs as a child process.  Inside of emacs, it will cause
a window to be opened in the same session.  

Use ^X^C to exit when run outside of emacs.  Use ^X# to exit
when run inside of emacs.  The suspend.el package requires
that you press ^Z twice to suspend emacs instead of once.
It allows an emacs command to follow the first ^Z, including
when in terminal mode.  You can now type C-^ C-Z to send a ^Z
to the application.  I included the redefinition of C-N just
to demonstrate how ^Z is helpful in switching among buffers
by typing ^Z^N repeatedly.  You will need vi-key.el to remap
the other control keys so that ^N is not needed.

----- add these lines to your ~/.emacs file -----
(define-key global-map "\C-N" 'bury-buffer) ; I define ^J as next-line
(load "suspend")
----- end of .emacs additions -----

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  ../bin/elmacs suspend.el terminal.pat
# Wrapped by david@wubios on Wed Oct 10 04:48:16 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f '../bin/elmacs' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'../bin/elmacs'\"
else
echo shar: Extracting \"'../bin/elmacs'\" \(182 characters\)
sed "s/^X//" >'../bin/elmacs' <<'END_OF_FILE'
X#! /bin/sh
Xif test "$1" = ""
X    then
X    echo "usage: elmacs filename"
Xelif test $TERM != emacs-virtual
X    then
X    emacs $*
Xelse
X    /usr/local/emacs/etc/emacsclient $*
X    fi
X
X
X
END_OF_FILE
if test 182 -ne `wc -c <'../bin/elmacs'`; then
    echo shar: \"'../bin/elmacs'\" unpacked with wrong size!
fi
chmod +x '../bin/elmacs'
# end of '../bin/elmacs'
fi
if test -f 'suspend.el' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'suspend.el'\"
else
echo shar: Extracting \"'suspend.el'\" \(2287 characters\)
sed "s/^X//" >'suspend.el' <<'END_OF_FILE'
X;; Suspend Processor for GNU Emacs.
X;; Copyright (C) 1986, 1987 Free Software Foundation, Inc.
X;; Written by David J. Camp, October 1990.
X
X;; This file is part of GNU Emacs.
X
X;; GNU Emacs is distributed in the hope that it will be useful,
X;; but WITHOUT ANY WARRANTY.  No author or distributor
X;; accepts responsibility to anyone for the consequences of using it
X;; or for whether it serves any particular purpose or works at all,
X;; unless he says so in writing.  Refer to the GNU Emacs General Public
X;; License for full details.
X
X;; Everyone is granted permission to copy, modify and redistribute
X;; GNU Emacs, but only under the conditions described in the
X;; GNU Emacs General Public License.   A copy of this license is
X;; supposed to have been given to you along with GNU Emacs so you
X;; can know your rights and responsibilities.  It should be in a
X;; file named COPYING.  Among other things, the copyright notice
X;; and this notice must be preserved on all copies.
X
X(defun noop ()
X    "Do nothing; return nil."
X    (interactive))
X
X(defvar command-escape-char ?\C-Z
X    "Press ^Z to enter any emacs command.
X     Press ^Z twice to send a ^Z.")
X
X(defun pend-command-escape ()
X    "Requires a second ^Z"
X    (interactive)
X    (let
X        ((local (current-local-map))
X        (global (current-global-map))
X        (suspend-action 'suspend-emacs))        
X        (accept-emacs-command)))
X
X(define-key global-map 
X    (make-string 1 command-escape-char) 'pend-command-escape)
X
X(defun accept-emacs-command ()
X    "Accept an emacs command."
X    (interactive)
X    (use-local-map global-map)
X    (use-global-map global-map)
X    (setq old-escape (lookup-key (current-local-map) 
X        (make-string 1 command-escape-char)))
X    (define-key (current-local-map) (make-string 1 command-escape-char) 'noop)
X    (setq emacs-key-sequence 
X            (read-key-sequence "Enter Emacs Command or ^Z to Quit:"))
X    (message "")
X    (define-key (current-local-map) 
X        (make-string 1 command-escape-char) old-escape)
X    (use-local-map local)
X    (use-global-map global)
X    (if (string= emacs-key-sequence (make-string 1 command-escape-char))
X        (command-execute suspend-action)
X        (setq command (lookup-key global-map emacs-key-sequence))
X        (command-execute command)))
X
X
X
END_OF_FILE
if test 2287 -ne `wc -c <'suspend.el'`; then
    echo shar: \"'suspend.el'\" unpacked with wrong size!
fi
# end of 'suspend.el'
fi
if test -f 'terminal.pat' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'terminal.pat'\"
else
echo shar: Extracting \"'terminal.pat'\" \(2640 characters\)
sed "s/^X//" >'terminal.pat' <<'END_OF_FILE'
X*** /usr/local/emacs/lisp/terminal.el	Fri Apr 15 02:19:45 1988
X--- terminal.el	Wed Oct 10 04:43:04 1990
X***************
X*** 30,35 ****
X--- 30,38 ----
X  (provide 'terminal)
X  (require 'ehelp)
X  
X+ (server-start)
X+ (load "suspend")
X+ 
X  (defvar terminal-escape-char ?\C-^
X    "*All characters except for this are passed verbatim through the
X  terminal-emulator.  This character acts as a prefix for commands
X***************
X*** 64,69 ****
X--- 67,73 ----
X  (defvar terminal-escape-map nil)
X  (defvar terminal-map nil)
X  (defvar terminal-more-break-map nil)
X+ 
X  (if terminal-map
X      nil
X    (let ((map (make-keymap)))
X***************
X*** 90,95 ****
X--- 94,106 ----
X      (define-key map "m" 'te-toggle-more-processing)
X      (define-key map "x" 'te-escape-extended-command)
X      (define-key map "?" 'te-escape-help)
X+     (define-key map "\e" 'accept-emacs-command)
X+     (define-key map (make-string 1 command-escape-char)
X+         '(lambda
X+             () 
X+             "pass ^Z through"
X+             (interactive)
X+             (let ((command-escape-char -259)) (te-pass-through))))
X      (define-key map (char-to-string help-char) 'te-escape-help)
X      (setq terminal-escape-map map)))
X  
X***************
X*** 389,405 ****
X        (sit-for 0))))
X  
X  
X  (defun te-pass-through ()
X    "Send the last character typed through the terminal-emulator
X! without any interpretation"
X    (interactive)
X!   (if (eql last-input-char terminal-escape-char)
X!       (call-interactively 'te-escape)
X!     (and terminal-more-processing
X! 	 (null (cdr te-pending-output))
X  	 (te-set-more-count nil))
X      (send-string te-process (make-string 1 last-input-char))
X!     (te-process-output t))) 
X  
X  (defun te-set-window-start ()
X    (let* ((w (get-buffer-window (current-buffer)))
X--- 400,423 ----
X        (sit-for 0))))
X  
X  
X+ 
X  (defun te-pass-through ()
X      "Send the last character typed through the terminal-emulator
X!      without any interpretation"
X      (interactive)
X!     (cond
X!         ((eql last-input-char terminal-escape-char)
X!             (call-interactively 'te-escape))
X!         ((eql last-input-char command-escape-char)
X!             (let 
X!                 ((suspend-action 'suspend-emacs))
X!                 (setq unread-command-char 27)
X!                 (call-interactively 'te-escape)))
X!         (t
X!             (and terminal-more-processing (null (cdr te-pending-output))
X                  (te-set-more-count nil))
X              (send-string te-process (make-string 1 last-input-char))
X!             (te-process-output t))))
X  
X  (defun te-set-window-start ()
X    (let* ((w (get-buffer-window (current-buffer)))
END_OF_FILE
if test 2640 -ne `wc -c <'terminal.pat'`; then
    echo shar: \"'terminal.pat'\" unpacked with wrong size!
fi
# end of 'terminal.pat'
fi
echo shar: End of shell archive.
exit 0


david@wubios.wustl.edu                 ^        Mr. David J. Camp
david%wubios@wugate.wustl.edu        < * >      +1 314 382 0584
...!uunet!wugate!wubios!david          v
                                            "White light makes me stupid."