[comp.emacs] Hebrew support for GNU Emacs/Epoch under X11

yossi@Neon.Stanford.EDU (Joseph Friedman) (04/09/90)

Looks like Emacs is going International.  I heard of a Japanese Emacs,
and recently there have been some postings about a Swedish Emacs.  Well,
I'd like to contribute my stuff: Hebrew Emacs (and I hope that somehow
all these foreign dialects will make it to version 19).  The basic
problem with Hebrew is that, like other Semitic languages, you write
it from right to left.  The other problem is that Hebrew fonts share
nothing with Roman fonts, so I had to use a 256-character font.  I
enclose a sample Hebrew X11 screen font, as well as patches to both
GNU Emacs 18.55 and Epoch 3.1.

Enjoy!  Oh, and please report any problems to me.
-yossi

-----------------8<-----------------------8<-----------------

#! /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 archive 1 (of 2)."
# Contents:  README emacs-18.55 emacs-18.55/patch-lisp epoch-3.1
#   epoch-3.1/patch-lisp fonts.alias hebrew.el thefont
# Wrapped by yossi@R2d2.Stanford.EDU on Sun Apr  8 10:05:41 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(2899 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
XThis directory contains the patches necessary to edit text in Semitic
Xlanguages using GNU Emacs 18.55 under X11, or Epoch 3.1.  This
Xdirectory contains:
X
X1) A simple, fixed, Hebrew X screen font, modified from misc/6x13.
X   Also, I included the accompanying line in the fonts.alias file.
X
X2) Patches for the source code and lisp code for GNU Emacs 18.55 and
X   Epoch 3.1 that do right-to-left display and editing, as well
X   as my own version of 256-character fonts support.
X
X3) A new lisp package, hebrew.el, which selectively maps the
X   workstation keyboard into a standard Hebrew keyboard.  This mapping
X   is done both in insertion and in searching (sorry, I haven't
X   implemented replacing yet, but it'll come soon.)
X
XThe basic idea:
X--------------
XTo summarize the changes to the C code, I created two new buffer-local
Xvariables, display-literal and display-reversed.  When display-literal
Xis non-nil, nonprintable characters in the buffer are NOT mapped into
Xctl-arrow or backslash-and-three-octals; instead, whatever is in the
Xfont entry is displayed as is (don't do this at home!  On a non-X
Xdisplay, this can really mess up the screen).  When display-reversed
Xis non-nil, all the windows showing the current buffer are flipped
Xlaterally, so the beginning of the line appears on the right and the
Xlines are wrapped (or truncated) on the left;  all the editing command
Xcontinue to behave as they were before.  The default value for both
Xthese variables is nil, so Emacs and Epoch behave exactly like the
Xnon-semitic version unless you specifically request otherwise.
X
XInstallation:
X------------
X1) Start with the font.  Unpack the font using:
X
X		uudecode thefont
X		uncompress heb6x13.bdf.Z
X
X   then run bdftosnf on heb6x13.bdf and install heb6x13.snf wherever
X   you keep your local fonts.  Run mkfontdir in that directory, and
X   then append the enclosed fonts.alias to your fonts.alias file.
X   You're all set.  Just to be sure, try:
X
X		xfd -fn heb6x13
X
X2) Now apply the patches.  The Emacs patches are in Emacs-18.55.
X   Apply patch-src in the source directory and patch-lisp in the lisp
X   directory.  For Epoch, apply Epoch-3.1/patch-src in the source
X   directory and Epoch-3.1/patch-lisp in the epoch-lisp-files (not the
X   lisp) directory.  NOTE:  A couple of days ago, Simon M. Kaplan
X   posted a new version of motion.el; I enclose patches for both the
X   old motion.el and this new-and-improved motion.el.  When patching
X   the lisp files, don't forget to delete the corresponding
X   .elc files, since they have precedence over .el files.
X
X3) Next, copy hebrew.el to your local lisp directory.
X
X4) You're almost ready to use the package.  Now comes the REALLY HARD
X   part---making little labels with the hebrew characters on them and
X   taping these labels on the front of the keys on the keyboard :-(
X
XHave fun!  And please report any problems/bugs/suggestions to me.
X
X-yossi
END_OF_FILE
if test 2899 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test ! -d 'emacs-18.55' ; then
    echo shar: Creating directory \"'emacs-18.55'\"
    mkdir 'emacs-18.55'
fi
if test -f 'emacs-18.55/patch-lisp' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'emacs-18.55/patch-lisp'\"
else
echo shar: Extracting \"'emacs-18.55/patch-lisp'\" \(1950 characters\)
sed "s/^X//" >'emacs-18.55/patch-lisp' <<'END_OF_FILE'
X*** x-mouse.el.orig	Thu Mar 24 01:04:41 1988
X--- x-mouse.el	Sun Apr  8 05:58:23 1990
X***************
X*** 106,129 ****
X  	 (funcall x-process-mouse-hook x-mouse-pos x-mouse-item))))
X  
X  (define-key global-map "\C-c\C-m" 'x-flush-mouse-queue)
X  (define-key global-map "\C-x\C-@" 'x-flush-mouse-queue)
X  
X  (defun x-mouse-select (arg)
X    "Select Emacs window the mouse is on."
X    (let ((start-w (selected-window))
X  	(done nil)
X  	(w (selected-window))
X! 	(rel-coordinate nil))
X      (while (and (not done)
X  		(null (setq rel-coordinate
X  			    (coordinates-in-window-p arg w))))
X        (setq w (next-window w))
X        (if (eq w start-w)
X  	  (setq done t)))
X      (select-window w)
X!     rel-coordinate))
X  
X  (defun x-mouse-keep-one-window (arg)
X    "Select Emacs window mouse is on, then kill all other Emacs windows."
X    (if (x-mouse-select arg)
X        (delete-other-windows)))
X--- 106,136 ----
X  	 (funcall x-process-mouse-hook x-mouse-pos x-mouse-item))))
X  
X  (define-key global-map "\C-c\C-m" 'x-flush-mouse-queue)
X  (define-key global-map "\C-x\C-@" 'x-flush-mouse-queue)
X  
X+ ; yossi-- modified x-mouse-select to support reverse displays.
X  (defun x-mouse-select (arg)
X    "Select Emacs window the mouse is on."
X    (let ((start-w (selected-window))
X  	(done nil)
X  	(w (selected-window))
X! 	(rel-coordinate nil)
X! 	(cur-buf (current-buffer)))
X      (while (and (not done)
X  		(null (setq rel-coordinate
X  			    (coordinates-in-window-p arg w))))
X        (setq w (next-window w))
X        (if (eq w start-w)
X  	  (setq done t)))
X      (select-window w)
X!     (set-buffer (window-buffer w))
X!     (and rel-coordinate
X! 	 (if (null display-reversed)
X! 	     rel-coordinate
X! 	   (cons (- (window-width) (car rel-coordinate) 1)
X! 		 (cdr rel-coordinate))))))
X  
X  (defun x-mouse-keep-one-window (arg)
X    "Select Emacs window mouse is on, then kill all other Emacs windows."
X    (if (x-mouse-select arg)
X        (delete-other-windows)))
END_OF_FILE
if test 1950 -ne `wc -c <'emacs-18.55/patch-lisp'`; then
    echo shar: \"'emacs-18.55/patch-lisp'\" unpacked with wrong size!
fi
# end of 'emacs-18.55/patch-lisp'
fi
if test ! -d 'epoch-3.1' ; then
    echo shar: Creating directory \"'epoch-3.1'\"
    mkdir 'epoch-3.1'
fi
if test -f 'epoch-3.1/patch-lisp' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'epoch-3.1/patch-lisp'\"
else
echo shar: Extracting \"'epoch-3.1/patch-lisp'\" \(4826 characters\)
sed "s/^X//" >'epoch-3.1/patch-lisp' <<'END_OF_FILE'
X*** smk-x-mouse.el.orig	Tue Jan 30 19:50:55 1990
X--- smk-x-mouse.el	Sun Apr  8 05:59:33 1990
X***************
X*** 106,129 ****
X  	 (funcall x-process-mouse-hook x-mouse-pos x-mouse-item))))
X  
X  (define-key global-map "\C-c\C-m" 'x-flush-mouse-queue)
X  (define-key global-map "\C-x\C-@" 'x-flush-mouse-queue)
X  
X  (defun x-mouse-select (arg)
X    "Select Emacs window the mouse is on."
X    (let ((start-w (selected-window))
X  	(done nil)
X  	(w (selected-window))
X! 	(rel-coordinate nil))
X      (while (and (not done)
X  		(null (setq rel-coordinate
X  			    (coordinates-in-window-p arg w))))
X        (setq w (next-window w))
X        (if (eq w start-w)
X  	  (setq done t)))
X      (select-window w)
X!     rel-coordinate))
X  
X  (defun x-mouse-keep-one-window (arg)
X    "Select Emacs window mouse is on, then kill all other Emacs windows."
X    (if (x-mouse-select arg)
X        (delete-other-windows)))
X--- 106,137 ----
X  	 (funcall x-process-mouse-hook x-mouse-pos x-mouse-item))))
X  
X  (define-key global-map "\C-c\C-m" 'x-flush-mouse-queue)
X  (define-key global-map "\C-x\C-@" 'x-flush-mouse-queue)
X  
X+ 
X+ ; yossi-- modified x-mouse-select to support reverse displays.
X  (defun x-mouse-select (arg)
X    "Select Emacs window the mouse is on."
X    (let ((start-w (selected-window))
X  	(done nil)
X  	(w (selected-window))
X! 	(rel-coordinate nil)
X! 	(cur-buf (current-buffer)))
X      (while (and (not done)
X  		(null (setq rel-coordinate
X  			    (coordinates-in-window-p arg w))))
X        (setq w (next-window w))
X        (if (eq w start-w)
X  	  (setq done t)))
X      (select-window w)
X!     (set-buffer (window-buffer w))
X!     (and rel-coordinate
X! 	 (if (null display-reversed)
X! 	     rel-coordinate
X! 	   (cons (- (window-width) (car rel-coordinate) 1)
X! 		 (cdr rel-coordinate))))))
X  
X  (defun x-mouse-keep-one-window (arg)
X    "Select Emacs window mouse is on, then kill all other Emacs windows."
X    (if (x-mouse-select arg)
X        (delete-other-windows)))
X*** old-motion.el.orig	Wed Jan 31 09:11:37 1990
X--- old-motion.el	Sun Apr  8 06:23:46 1990
X***************
X*** 48,67 ****
X  )
X  
X  (setq-default drag-button nil)
X  (setq-default already-moused nil)
X  
X  (defun mouse-sweep-update()
X    (let (x y pos)
X    (if (not drag-button)
X        (progn
X  	(setq drag-button 
X  	      (epoch::add-button (marker-position mouse-down-marker) (point) 1 nil))
X  	(setq drag-m1 (aref drag-button 0))
X  	(setq drag-m2 (aref drag-button 1))))
X    (setq pos (epoch::query-pointer))
X-   (setq foo pos)
X    (setq y (car (cdr pos)))
X    (if (< y 0)
X      (progn (scroll-down 1) 
X  	   (setq y 0)
X  	   (epoch::send-client-message (current-screen) xa-motion))
X--- 48,67 ----
X  )
X  
X  (setq-default drag-button nil)
X  (setq-default already-moused nil)
X  
X+ ; yossi-- changed mouse-sweep-update to handle reversed screens.
X  (defun mouse-sweep-update()
X    (let (x y pos)
X    (if (not drag-button)
X        (progn
X  	(setq drag-button 
X  	      (epoch::add-button (marker-position mouse-down-marker) (point) 1 nil))
X  	(setq drag-m1 (aref drag-button 0))
X  	(setq drag-m2 (aref drag-button 1))))
X    (setq pos (epoch::query-pointer))
X    (setq y (car (cdr pos)))
X    (if (< y 0)
X      (progn (scroll-down 1) 
X  	   (setq y 0)
X  	   (epoch::send-client-message (current-screen) xa-motion))
X***************
X*** 69,79 ****
X    (if (>= y (window-height))
X      (progn (scroll-up 1) (setq y (- (window-height) 1))
X  	   (epoch::send-client-message (current-screen) xa-motion))
X    )
X    (move-to-window-line (- y (car (cdr (window-edges)))))
X!   (move-to-column (+ (current-column) (car pos)))
X    (setq p (point))
X    (if (> mouse-down-marker (point))
X      (progn
X        (set-marker drag-m1 (point)) (set-marker drag-m2 mouse-down-marker)
X      )
X--- 69,83 ----
X    (if (>= y (window-height))
X      (progn (scroll-up 1) (setq y (- (window-height) 1))
X  	   (epoch::send-client-message (current-screen) xa-motion))
X    )
X    (move-to-window-line (- y (car (cdr (window-edges)))))
X!   (move-to-column (+ (current-column)
X! 		     (let ((x (car pos)))
X! 		       (if (null display-reversed)
X! 			   x
X! 			 (- (window-width) x 1)))))
X    (setq p (point))
X    (if (> mouse-down-marker (point))
X      (progn
X        (set-marker drag-m1 (point)) (set-marker drag-m2 mouse-down-marker)
X      )
X*** motion.el.orig	Sun Apr  8 08:31:34 1990
X--- motion.el	Sun Apr  8 08:24:44 1990
X***************
X*** 67,76 ****
X--- 67,78 ----
X  	(/= 0 (logand mouse-any (elt pos 2)))
X  	;;(/= 0 (logand mouse-any (cdr (cdr pos)))) ;if error on previous line
X        )
X        ;;convert to window relative co-ordinates
X        (setq x (- (car pos) left))
X+       (if (not (null display-reversed))
X+ 	  (setq x (- (window-width) x 1)))
X        (setq y (- (elt pos 1) top))
X        (setq out-of-bounds
X  	(not (and (<= 0 y) (<= y bottom) (<= 0 x) (<= x right)))
X        )
X  
END_OF_FILE
if test 4826 -ne `wc -c <'epoch-3.1/patch-lisp'`; then
    echo shar: \"'epoch-3.1/patch-lisp'\" unpacked with wrong size!
fi
# end of 'epoch-3.1/patch-lisp'
fi
if test -f 'fonts.alias' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fonts.alias'\"
else
echo shar: Extracting \"'fonts.alias'\" \(143 characters\)
sed "s/^X//" >'fonts.alias' <<'END_OF_FILE'
Xheb6x13      -yossi-fixed-medium-r-semicondensed-hebrew-13-120-75-75-c-60--
Xheb8x13      -yossi-fixed-bold-r-normal-hebrew-13-120-75-75-c-80--
END_OF_FILE
if test 143 -ne `wc -c <'fonts.alias'`; then
    echo shar: \"'fonts.alias'\" unpacked with wrong size!
fi
# end of 'fonts.alias'
fi
if test -f 'hebrew.el' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'hebrew.el'\"
else
echo shar: Extracting \"'hebrew.el'\" \(5702 characters\)
sed "s/^X//" >'hebrew.el' <<'END_OF_FILE'
X;;;
X;;; hebrew.el -- Hebrew editing mode.
X;;; For more information, see documentation of `hebrew-mode'.
X;;;
X;;; Copyright (c) Yossi Friedman, April 1990
X;;;
X
X(defvar running-epoch nil "*Non-nil means Epoch is running.")
X
X(defvar hebrew-mode-hook () "*Called when entering hebrew-mode")
X
X(defvar hebrew-mode nil "*Non nil when Hebrew mode is turned on.")
X(make-variable-buffer-local 'hebrew-mode)
X
X(or (assoc 'hebrew-mode minor-mode-alist)
X    (setq minor-mode-alist
X	  (cons '(hebrew-mode " Hebrew") minor-mode-alist)))
X
X(defun hebrew-mode ()
X"\
XToggles hebrew-mode on/off.  Hebrew-mode is a minor mode which allows
Xreversing the editor display and changing the keyboard in order to
Xenter and edit text in a semitic language, such as Hebrew.
X
XBy default, hebrew-mode stays in \"normal\" state.  The \"reversed\"
Xstate is activated with \"\\[hebrew-toggle-reversed]\".  (In Epoch, this
Xis also bound to \"F3\".)  In the \"reversed\" state, hebrew-mode emulates
Xa Hebrew keyboard both during direct insertion and during searches.
X
XHebrew-mode calls hebrew-mode-hook upon entering."
X
X
X  (interactive)
X  (if (null hebrew-mode)
X      (let (char)
X
X	; signal hebrew minor mode in the mode-line
X	(setq hebrew-mode t)
X
X	; activate the hebrew insertion function
X	(setq char ? )
X	(while (<= char ?~)
X	  (local-set-key (format "%c" char) 'hebrew-insert)
X	  (setq char (1+ char)))
X
X	; display-literal, display-reversed
X	(setq display-literal t)
X	(local-set-key "\C-cR" 'hebrew-toggle-reversed)
X
X	; syntax table stuff
X	(setq char ?\340)	; aleph
X	(while (<= char ?\372)	; taf
X	  (modify-syntax-entry char "w")
X	  (setq char (1+ char)))
X
X	; search stuff
X	(local-set-key "\C-s" 'hebrew-ctrl-s)
X	(local-set-key "\C-r" 'hebrew-ctrl-r)
X
X	; hooks
X	(run-hooks 'hebrew-mode-hook))
X
X    (let (char)
X
X      ; turn off hebrew minor mode in the mode-line
X      (setq hebrew-mode nil)
X
X      ; deactivate the hebrew insertion function
X      (setq char ? )
X      (while (<= char ?~)
X	(local-unset-key (format "%c" char))
X	(setq char (1+ char)))
X
X      ; deactivate display-literal and display-reversed
X      (setq display-literal nil)
X      (local-unset-key "\C-cR")
X
X      ; search stuff
X      (local-unset-key "\C-s")
X      (local-unset-key "\C-r")
X
X      ; restore syntax-table
X      (setq char ?\340)		; aleph
X      (while (<= char ?\372)	; taf
X	(modify-syntax-entry char " ")
X	(setq char (1+ char))))))
X
X(if running-epoch
X    (epoch::rebind-key "F3" 0 "\C-cR"))
X(defun hebrew-toggle-reversed ()
X  "Toggle whether or not the display is laterally reversed."
X  (interactive)
X  (setq display-reversed (null display-reversed))
X  (if running-epoch
X      (epoch::redisplay-screen)
X    (x-smart-redisplay)))
X
X(defun hebrew-insert (&optional arg)
X  "\
XIf display-reversed is nil, behaves like self-insert-command.
XIf display-reversed is t, simulates a Hebrew typewriter keyboard."
X
X  (interactive)
X  (or (numberp arg) (setq arg 1))
X  (let ((char (if display-reversed
X		  (aref hebrew-keyboard last-command-char)
X		(format "%c" last-command-char))))
X    (while (> arg 0)
X      (insert char)
X      (setq arg (1- arg)))))
X
X(defun hebrew-ctrl-s () "The Hebrew-mode version of \C-s"
X  (interactive)
X  (let ((old-read-char (symbol-function 'read-char))
X	(old-text-char-description (symbol-function 'text-char-description))
X	(search-exit-option nil)
X	res)
X    (fset 'read-char (symbol-function 'hebrew-read-char))
X    (fset 'text-char-description
X	  (symbol-function 'hebrew-text-char-description))
X    (setq res (funcall (global-key-binding "\C-s")))
X    (fset 'read-char old-read-char)
X    (fset 'text-char-description old-text-char-description)
X    res))
X
X(defun hebrew-ctrl-r () "The Hebrew-mode version of \C-r"
X  (interactive)
X  (let ((old-read-char (symbol-function 'read-char))
X	(old-text-char-description (symbol-function 'text-char-description))
X	(search-exit-option nil)
X	res)
X    (fset 'read-char (symbol-function 'hebrew-read-char))
X    (fset 'text-char-description
X	  (symbol-function 'hebrew-text-char-description))
X    (setq res (funcall (global-key-binding "\C-r")))
X    (fset 'read-char old-read-char)
X    (fset 'text-char-description old-text-char-description)
X    res))
X
X(defun hebrew-read-char ()
X  "The hebrew-mode version of read-char."
X  (let ((char (funcall old-read-char)))
X    (if (and display-reversed (>= char ? ) (<= char ?~))
X	(string-to-char (aref hebrew-keyboard char))
X      char)))
X
X(defun hebrew-text-char-description (char)
X  "The hebrew-mode version of text-char-description."
X  (if display-reversed
X      (char-to-string char)
X    (funcall old-text-char-description char)))
X
X; for the search function to work, we can't use a byte-compiled version of
X; isearch.el, so load it back:
X(load-library "isearch.el")
X
X(setq hebrew-keyboard
X      [
X       ""     ""     ""     ""     ""     ""     ""     ""
X       ""     ""     ""     ""     ""     ""     ""     ""
X       ""     ""     ""     ""     ""     ""     ""     ""
X       ""     ""     ""     ""     ""     ""     ""     ""
X       " "    "!"    "\""   "#"    "$"    "%"    "&"    "'"
X       "("    ")"    "*"    "+"    "\372" "-"    "\365" "."
X       "0"    "1"    "2"    "3"    "4"    "5"    "6"    "7"
X       "8"    "9"    ":"    "\363" "<"    "="    ">"    "?"
X       "@"    "A"    "B"    "C"    "D"    "E"    "F"    "G"
X       "H"    "I"    "J"    "K"    "L"    "M"    "N"    "O"
X       "P"    "Q"    "R"    "S"    "T"    "U"    "V"    "W"
X       "X"    "Y"    "Z"    "["    "\\"   "]"    "^"    "_"
X       ";"    "\371" "\360" "\341" "\342" "\367" "\353" "\362"
X       "\351" "\357" "\347" "\354" "\352" "\366" "\356" "\355"
X       "\364" "\\"   "\370" "\343" "\340" "\345" "\344" ","
X       "\361" "\350" "\346" "{"    "|"    "}"    "~"    ""])
END_OF_FILE
if test 5702 -ne `wc -c <'hebrew.el'`; then
    echo shar: \"'hebrew.el'\" unpacked with wrong size!
fi
# end of 'hebrew.el'
fi
if test -f 'thefont' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'thefont'\"
else
echo shar: Extracting \"'thefont'\" \(8166 characters\)
sed "s/^X//" >'thefont' <<'END_OF_FILE'
Xbegin 644 heb6x13.bdf.Z
XM'YV04Z@$D4+%R!,G5$#(<!%#P9 G39H400@B"(@X==*,6=,BC!LR+<BDD4,G
XM#P@T83:">&,&1!@0<]J$8<,&!)(R8N24N0-SC,XR;D"8>>.&C@N'$"52)%-&
XM3AH[9<@(E?.F#0@;>&+,<"&&C!D%!BFVR/)FSIPT+8RDP1.U19.H:>JT:2&E
XMQ90R;=(,(<K4S9RV-W/N;*&5L P8+6[42+QX2 L;B%LHF))$2Q$06D'<P*$9
XM!]B#5(0\J>*$2!(G1T1CN8IY!@@8(%K,F"R0(!0I3Z 4(9BDR!3,.3XC=!)$
XMXA<I18XD"2@E"P@1(CZ3)M+\.5FS::(;*9Z$298OQ"4^5\N63/0K19(<04(%
XM?/'+(MZ*E!M]"I,@%$5(J5^$RI4D1%"!A'OBB7!77GM]!-1?YBD0!!%$?!%0
XM%DP402!\@>ET1W10)(%%$4Q(6-EE6BD Q1.GM4>999@=I@!R4SS!1!54)''0
XM%ZLI]J)O,M)HHQ-?.*?C%% $,<1I1SPW1'1!6+%;$$=8^%^ 2%P%@T-(##1%
XM?\<EMQP5U4&'I99<3O20::@]%QT116Q7!1/M#9&E%*\)UQZ;4PPQ44*SA=5>
XM$'GNB=F5#T&1A13JL:<D2G*D1$=3<[@TQQAII#$##9&%,6FE,]P@ PA[P9&'
XM4V>@00<(*(R1 @C7G06"$4Y%)9,;+ "7 PS1343$;;GM5J-O8TKQFPPUV$#;
XM0%3(.9"DE*8!P[,*F/D$FDE>.<64 H) @PTQU$D$ME7:4*<00JPF;F:PR:: 
XM$$E0T4004"@ K1%7T@M6O?C>JZ^]]D+K[Y6Z*BO%L00)S&RESS8D+;6830:N
XMMMQZ^["X5Y)K;FNOQ38;N^["*^^5_WXLLHLW7&F&9R4KX&+(T 8\)\')SGFP
XMLS#($*T39R*ID,, 9KMMMU=^VW.XXY;+&KH:K]ONN_&R#/*587A6 ]124ZW 
XMU I$+7++I0D,L\&:-OOL; OK/-NU0T,,M )"4\E:Q4:?ZUJZ&R_ML=,BAP'U
XME67LG?65*;LH.,!=OQP0LF!O2C,--^><)N-HN_VSQ&E3O&[<&-.M=,=-/[TU
XMWU?B<.48H9M\):8*0*8 ZJB[/-#7,H>-, PU-#ZMSK5'[G/$04]<],5(J\LQ
XMTY\7G[+H"B"?<LHTH'PEULW?3(37AQ<<N^+/&EMVFL;J7N7DO5?^^]%S)SW\
XMW9Z'C/SZH"O _)6JLT[X](;7%O.RLM-\@^T,[^^]VI1SF^4L1KZ,"<]NG2L>
XMM%1W*P4T4'5X"YGK!E:]^]$I?S"( >$<ER3/_ ]\;/,=W(!7O@-R3H&>&YP"
XM3J:R*ZW,9)Z18.%>5\'$B2T&"L/9[=(4G _R+H3B&V$!-7>^!.(-!YX9@V>T
XME@//('%UIXNB^SPS0=CA#WLQL-GVDJ1!GDGNAVW+U@ Q%[RZG3""H7-BU5HH
XM,A:JT$55K.'U;D@V'3(,AU[<W=K"2#0ARLV 9B3>&UU(2#:ZJ&\H+%X<[6=#
XMA,6 <5ML41Z_!T817HZ$@-P<\="82$0.TI#SHQXCY^C(VD6R1#[<HR4)^$<B
XM(C"1G)S!&$!)2SC.D(*CO.(-M6='G3URD@ ,GP#'UTKSO?*3R+R2+&'IN44B
XMCI3.BL'^3IF[AX&0CV^[Y!"-><)DUM)DL_2F+>E'PUQ>$'NVY"!FNF?-2@91
XMF\4TX2;3!TYFVI-KY,3E,W6),!GD4)W2!.8U5TG&$@82??8TPRPYB3=G6H^?
XMSI*!%GN9IAAXL)VJ?"<K,\?->=[3<PK]J/1$N<]SBDT&=01H#S$:0#$2DZ/R
XM1"A#Z=G&A=+4H1:<6<T@2=$DN2B5+>TC/&%Z4"/2=*;%"RD^2?I0D_;3E#U5
XM2$. *DR7^I&HFO28. OIHF5N=:3U*ZE.9<!+=4I4H.X<YE7+F-5X?56%GN2J
XM7,%:3K%B4 ;3C"I*T9I1M0Z5K47\IF!=I-2C-O.65G2JLV:PP1WZ%'(LK:I0
XM-PK85R(U9"']*DX;N=A_.E8AU4S;0#5:T$P&]JUSU2QBY0A1&,Q@HF9EIVC3
XM:M6_&K2ML/1,%UV$.A=U$0:>8:$,\YE8G<X@I9_%*U^#FDW*WC:P1Y2B;PN)
XM.N0)][#$9:UB7<M3LUYTMGVMK7--:UG#)G6-6,-: X?+U)QB< 90->M*P<O<
XM,6+2E6<TK[^"ZQG".M&\FX6F:\OZ6<8N5[+-+2U^/8HW T</=68H9(2SYAE$
XM+C6L335N7M4Y@ZE&%HA^'>^"9:I?FKXPD0%>UAS@D)(R\,]L-J,JB,6KX(Z2
XM6*27#26&<UH&/(R!#6%HPXO3=-P#SWBR-8ZI40>;VA3>=+7FO$@=WO H,HB!
XM#4-.TJ6,C$W[;E/)Q4OO\TILSQ33R0UR$0.DTG &-V09!/#E,D'O:^,E0TO,
XM*UPC"_'<4"B+E0QOH$D8Y/#F&<CVB^%%,IW!#"V2^4UO[G-A?YW'QCYG-\IP
XM:,H8@$*'0OOOPUU^:67S*[+H:0UKNY4BUICXY$O;M0V9EL,</$*&0G\7T?45
XM]7/+6^I'2Q'2370@_&+8ZO8:#"-4;@J;357H^>(:P5Z.9U&+9V#>DIF39@8!
XMBW7B!C:4P0R=CB3J9!SJM>Z:U-!*-1OE!T5:_A:[QI;9MH%"*F:+V\/TA;:N
XMR8MNZ1:RBP"?*^K8N^/$/<HI<UC#FVD08U#/^<O3QIN+M,;"E+%0:R<F>%TS
XM# <VU&$."S^;PTF[Z(B;5X5N+"2V_9SA,51%)@N';+Z/G."2XS;'B:RV%"^\
XM\9RB(0]P0 -0%A[:9],\VEB%[K5AB&,=]]Q@L4[#&VHM[D/K,=?FYC>#EUX\
XM1U?:Z?K,\!R / <T+/S3,R^W;;5^8^#*2[=74C>[V:=(EN=4#TUYP\)O?75]
XM9WW$2W81UIY(>#4F;XT9!WMQB>)B<3N[[T??-^"[#C^_??6Z(LLV'>Z@]TAB
XMC=P/E_;-/7<\P[M=[J7+<]U=G6$ZH.$G;ZX!OHVN=A'7^;QO5X"Z4^9VMS^1
XM]_ NN,R&4@=">[[A:0]]TGF=[K@K<\Q7NU(#61CPU<=[669X2N.C6@.1)Y_D
XM$!]]&_^;O"N)870Q3/_A(VU]X:MX+;&7.>V5/^JMLY_PJ9]PX=</_,S;W6!_
XM 15NYGE%!WFUEV0F-WZY5WTJQ&X#%WQ/)S-EL&SAQGU61TF)5G/AIW0B4WKK
XM]WMI](&4IG%AEU-ND 9NL'WJ5 -H-W_@)WH<""T>N'^;D7N^-X(06((&XW)L
XM0!2QQW<8B'5K-WF<Y'6)QT:!DX/%]1=YP8,^Z'F/%X1^-X2W5X2 HW*>HW/M
XMQG,Z*#/>9A9OICJ@]X++UV\+2%VIUUO.9X-*J%T@4 88,1-A.'L&2'_G9G]X
XM@WG0HH?%YGYT<@8Z$08'%X;(YX(AAH#B!RW(HX:Z!S)PMVZI1X+%A1%E, =T
XM('4#&%4VX'V&2&,V%X-7*()G2$N-UH<1B#\5J$XV(']U2(;U=V,SZ!G!IC5:
XM<W[E-T7M=XIT$@1A6(!2&'E_5X5.%GVB^$0LM']/)(EN* 1A>('!!(Q4R&@@
XM=3J>\6"49HVK$URFV(7+,@1AV(*M>(B?R'RAB'^W2'?K@X/^QWHY101A"(3/
XM>(#C:(83AHWV6(WXN$+;6%Q%$(91&(]VR'9+=HRI9UT%F7_$MH[71R=&\&8I
XM,X;BN('DJ'KH:#KG>)"YR(UT<@0.28>_*(\2:88SB)'!1H/[Z(9(X)"%&(Z>
XM&)+VAXR&=XR&MW_*&&5)X)"<R)**YI*PV&1,QGXU*59*X)"L^)$!2819^(C5
XMMY325WD965Q+X)"^")"N>(<WMG\-!&FD\S?")HI!F6%,X)#..%H1"8,369$7
XMF9;6E9!<6%Q-X)#@:)15*9#%LW]DL$1X68RFUX91Y@0."8]DV9)F:89/I$0*
XM8)BT*(N*Z95\*59/X)#_&)@[.9CV%XMZ*8K]UY9N&"^1A#P0*9AE:'_Z-Y/:
XMJ):1V)@9%@5OA@,>295E&9H]>9DP26% F9#9-C"=N9)R^9JO.) AN'\3!FR_
XMR9:*YX93L)HYN9N@V9O&\YNIQWOJ!X)/Z894L)I%Z9K+:94#V5\^Z4U?F5-5
XML)I3*9D:2)E729JR:7B969Q19@6K.9:T-9FPN62S^41XAC4J])T&<P6K&9?8
XM*9_,J3[H^42)29MWN7[Z*3-8L)J &9_E.9]U:7AX)GC01Y.HF5-9L)J1Z:!(
XM%Z">LW\3VITG&65:\&8-])D JIVX=WIK:&WMMI;3&64Y$09K4 9TX&W@9J*M
XM29X=JJ(A\S[MYH!2A#KK25<:"0)BD!)K,'::8G:1E .Z^9\/ZJ$B0W?L-EV-
XM:(/$::3%-:,;8:/UEHJ?E0/)*:4]2I<_NH9,F:755Z39EC^4(@=C(!<F>IT\
XM*GG".#(5NJ4XEVUUH""RYG(Z8:+CR:%X*HU-EU"V^7\R@VR/@J-BRC Y )\9
XM>*9(*3(&]EM\RG5O:J+^>:?!B*B<!)VX2(-;FFUB8*(-6JF'FH"*B)&C>9D3
XMEJ#+,DM/NJ&L&JJN:EXC>8[JJ)E11G51I4'6,G*\Z:/IHWYN5X/UB3*GRJC+
XMHH*?I4$[:JBZFHB\&H($R7\C*E9?<4HU(V=S>:G0XF#5*$7U.*0[=Z$&<P9O
XMID%E"JK1N*N)9)F_%YV4EFU..JPP8*?6.J_8:IH*8(N&V:PQ*E9I\*ZT(Z['
XMBJ8FYCFJXTUN"JUTH@8*2ZE":'NBZCGOI@"9JJ9KV$ /Q)YBI7#@^JG_JK'T
XMBI99.3I^TT#)R*Y>J+"KFK&("(JI(Z*"-;'L:#!"!JZX:K/SB(<T10964Z!:
XM$[,*Z8<@D(D U44H.J7(:D\$.Z![N;2ZN!+OBD=1:ZEY.JK#B9G=RG%;&Z7R
XMJK(!FX=A:XP8B3S9%@=;&Z\I>[,3B3?,BIXUV'OJEVW&-ZR_U+6MFK8T5;4"
XMBSRT2B<@=THQ4*BY"K X:[<AJ#I=))V'"P*1ZDLQ@+%3B+:/JZ[Z&*1#ZAD&
XM5KEUL+4HV[B<6[<T9;#!9@//VK,R8P=;6[.;2[=F>$3H&:('FV%WL+5!6[M#
XMVW:K:WA(NT:5BP?O^E/&FIT.:T_V.5>#][H+"0)YD+S5BKJV2[01*HJMBZ_L
XMEVUZD+QF.[?!:V<T17UH>(M\R*5NZ*5E *G)*[?86[[%8U&"M96?9+^5FZ1]
XM"U RX*_SRY.!I[/>*;/+XKYAFKR,*[0"7#SX.U?V^TE;6;GY<XELP!3)J[G0
XMF+IF:&JRR'66-KWY(TT;-JW*!;C7&EBG9C6KMD8K3)LM3(Q:\Z:*<QB-=4<R
XM0+L;G+TW]L(^[,) +,-41+$S<QB>A<._N\/T&S(_+,1.',,Q3,/-<ABP-:T&
XMAL*..Y%-#,4LW,6T*<65<AC(=4<=QK#,2ZY>O,5I',1@G :'T5U6/+X!;)Y+
XMIL8PO,9.W,:'$5]6++\,3,?%8\>"S,9$G#^'06!D#,!_#*%,',1<?,>0/,.%
XM7,,P4,)DO,# V\"-_,1X_,B2#+L0Y4\W[$N&9L8IVKS0,LB<',E##,J*Y4]'
XM3,JGN\A4FLJ.W,EXK,=9]*XSH,,@"<B;[,FWS,KL&V6&7"*G- -)_,N,[#FJ
XM+,QY/,E3_$NG-&[+>\IH3,S0#,VZS,=W1 /72\M3:\NK_,Q6H\N([$L,9\I2
XMB\JXK,VY+,UA'%#5[,>9#,S./,SF_,7R[,;I-*TTH,CWW,QYH\\&'<VN7,3^
XM]*XT@,E*K,GY7,X''<7]+%%5_,T:S,RU_,[[_,DB7,-[5<VS/- ;#<\FW<1Z
XM_+\,[<M'^;4</='G7-'$PM#+W-(;>](PS<\);<AD]:Z?=\WMG,T=?= I;<F^
XM)'OL[+4W/=027<QV5<,&1DUR+,[NC---3=$[#=6Q7%'=E]2!B[-,S<T5_5H^
XM+= /C<\%?=4O[=099LA%1DT.K='CO-;;'--9/<5;1DT9;=/T&M;Q?-=A'&?4
XM--)G3=#D7-=6K<>E3$TL/:XN;=6([=%,Z]9&S=4U[=A+G=.JK,>M,ZQB"-1*
XMW=>:3=05#<[ORBU>G<):/-I-S=D7[4LV,-4D/=>0O=:</<:P;<^%7=)^3<R<
XM#<=WM(JIG<5FV-LH7=K>#-MQS=<!:]R$#-ANO"VGO=>8+=IJG=BE7=E<9 .$
XM+==5[=P(_=%3C#6GY+K#S<'V!]Y8+=YAC-3E?=D-*]2L+=;032RO75$/"=I?
XMO=K7O=D5W=6G= /A/-O?/=]_S=YN7 / [4N><MX\7,<&[MO_G=SXK=O>+=_]
XM3=KU72SO>@-F?>&/K=YVC>#$HMV8,23ZK=K%'>''7=^J$^#4'=\ASN+/3>*H
XM'>#=S=Q@3>/A/=DU'-L=WM@RGMD9WMH5O8D=#M]G/.-%3M\VON 5Y9DI3MSI
XMS>/K[>-3; ,4SD6LZ>!+'-&1K>$VGLY1+MN[3=LBKM,V;N(69>$ZSM]A;N3U
XMG3*GA ,?_N8KWN0'CN5A+.#OB@/+7=W-;>4CSN=NW.!U'N-+3N1Q[N2&CE>X
XM'>4Y+N@[KN<2/N=0SN5"ONC6W>A[GK6&K"-UKN38S.2>?NDD?@-DSD4G.N7H
XMW<.$KN:/?@-LG@,#?N8%;NDMCN",-<H5!:5>#M%I?>J[;NB,M=6L[N:4#N=T
XM_>E'FC^,==^L?N?+GN?$7N/&[EKOF@.!/N2=WNRHGNV9#AR*7NJ,#N[%#NJ*
XMPUA;#AR3[NV#KNO8KN[-PEBK#AR;;N[?7MOA3N^<4LG;3NI!;>KH/N_/ONY=
XM%$DV'.QH?=@%W^/^;BEXI/ 9Q/"&_?".'O$=)NT*$:Y8_.H0+N\0?_#UCLQZ
XMI>T?_^"!'.N2K?'4?/+4#N^5?NTC7US0OKAOML<6S]LLW\J\GKDY#P/E/O#G
XMSN_I3O*<0L\G_^Z<'N\T?^4:_\\,<QCY3O3[#MYM_%K(WO$"']I.C_&%'O4<
XM+\H[C^8]S];NM>XAK5=<Z^HJ'\Q@+^M1/^[^9.8@7O18W\^OU>[^I.PRS^Q&
XM;_ VK_;W[D\QW_0S'_<MC_26HEP*C_,I_^7#KO@^;^Q1S?9#[_6)'_@U[X;0
XM7L:/S_3Z_O6<#_6,?UQC;[^1+^P.7_IA?_IOS?9=O]_63OEHSUG'1??*^WU_
XM7_NN+_>PS_<+O?H-;_NF/_CUOMAZ=5;$?_&_?_3(SRF=DO-[U?P\+_+'[_GK
XMWMEFI=+63]NX>YB>8=ZV&&R&2<';O_42U>V(K[I)!;)LRG3H7^_KK/ ]_?U5
XMC3<1"_\YG(V[F_;T+]+YE!/F]B0?)T%?\2\!SC].$="H7]73?.X/LR@KJ_7_
XM<%]#HWZS3\5IKY#QL1)@]5F ED*Z*;PK5@!9GWE).1X+_G4L8/74Z)^)0RFW
XM[N[1JSR4C^Z1_P.!\,77^12RAO^R&=Z817D).$DO8^?>]$J1Z8&/K<' /Z22
XM]6K V-LR2/"FT4 M107U5NYI@@)0(<29*#@#S]<$7$"E"0<JN)Q7RKA@P$)+
XMPD7]H)X*"$W@"]^;?F:P<^$>&Q@]\I8!4RSPI?#ULK*7_VA*5LI'^T<,#$&-
XMQX+(8 :D<L*+VJC 19BELMZ+TRO6C/>UO]M%4_37%UQ6@_#TW3A(& /QW 8$
XM*340O3@E' CD%-XZBX,1T'/00:D1!N_@S# T6?!_^;U)^ D5D VT@E;0$=*]
XM!H@**>$<S$>GIQ5B+4W(]RY@+ZR%B@@]!1O]@Y$<8>&3;L<P$0HH_]?_-)7J
XM(84OD :(/JLGN%:4,OQ@:2GKT3E(^ !I'S*4?Y=06;E":.?G3.$A!'DBI7@I
XM@#*PF&;5.EQWB$ZO_#1)./KDH 3T?S;P_-W#>G<#8B%2BX8A[^F]ONAG*3Q<
XMSG."?!##*43@QQ [!=_K:@AQY6&_A:C]"&+A&X,9$>X]O\JG\6C=0V1__1#P
X)Y3WBHBO\A ( 
X 
Xend
END_OF_FILE
if test 8166 -ne `wc -c <'thefont'`; then
    echo shar: \"'thefont'\" unpacked with wrong size!
fi
# end of 'thefont'
fi
echo shar: End of archive 1 \(of 2\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0

yossi@Neon.Stanford.EDU (Joseph Friedman) (04/09/90)

Looks like Emacs is going International.  I heard of a Japanese Emacs,
and recently there have been some postings about a Swedish Emacs.  Well,
I'd like to contribute my stuff: Hebrew Emacs (and I hope that somehow
all these foreign dialects will make it to version 19).  The basic
problem with Hebrew is that, like other Semitic languages, you write
it from right to left.  The other problem is that Hebrew fonts share
nothing with Roman fonts, so I had to use a 256-character font.  I
enclose a sample Hebrew X11 screen font, as well as patches to both
GNU Emacs 18.55 and Epoch 3.1.

Enjoy!  Oh, and please report any problems to me.
-yossi

-----------------8<-----------------------8<-----------------

#! /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 archive 2 (of 2)."
# Contents:  emacs-18.55/patch-src epoch-3.1/patch-src
# Wrapped by yossi@R2d2.Stanford.EDU on Sun Apr  8 10:05:42 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'emacs-18.55/patch-src' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'emacs-18.55/patch-src'\"
else
echo shar: Extracting \"'emacs-18.55/patch-src'\" \(17245 characters\)
sed "s/^X//" >'emacs-18.55/patch-src' <<'END_OF_FILE'
X*** buffer.c.orig	Thu Jul 20 15:36:02 1989
X--- buffer.c	Sat Apr  7 10:52:58 1990
X***************
X*** 1098,1107 ****
X--- 1098,1109 ----
X    buffer_defaults.abbrev_table = Qnil;
X  
X    XFASTINT (buffer_defaults.tab_width) = 8;
X    buffer_defaults.truncate_lines = Qnil;
X    buffer_defaults.ctl_arrow = Qt;
X+   buffer_defaults.display_literal = Qnil;	/* yossi */
X+   buffer_defaults.display_reversed = Qnil;	/* yossi */
X  
X    XFASTINT (buffer_defaults.fill_column) = 70;
X    XFASTINT (buffer_defaults.left_margin) = 0;
X  
X    /* Assign the local-flags to the slots that have default values.
X***************
X*** 1134,1143 ****
X--- 1136,1147 ----
X    XFASTINT (buffer_local_flags.truncate_lines) = 0x100;
X    XFASTINT (buffer_local_flags.ctl_arrow) = 0x200;
X    XFASTINT (buffer_local_flags.fill_column) = 0x400;
X    XFASTINT (buffer_local_flags.left_margin) = 0x800;
X    XFASTINT (buffer_local_flags.abbrev_table) = 0x1000;
X+   XFASTINT (buffer_local_flags.display_literal) = 0x2000;	/* yossi */
X+   XFASTINT (buffer_local_flags.display_reversed) = 0x4000;	/* yossi */
X  
X    Vbuffer_alist = Qnil;
X    bf_cur = 0;
X    all_buffers = 0;
X  
X***************
X*** 1207,1216 ****
X--- 1211,1230 ----
X    DEFVAR_LISP_NOPRO ("default-ctl-arrow",
X  	      &buffer_defaults.ctl_arrow,
X      "Default ctl-arrow for buffers that do not override it.\n\
X  This is the same as (default-value 'ctl-arrow).");
X  
X+   DEFVAR_LISP_NOPRO ("default-display-literal",		/* yossi */
X+ 	      &buffer_defaults.display_literal,
X+     "Default display-literal for buffers that do not override it.\n\
X+ This is the same as (default-value 'display-literal).");
X+ 
X+   DEFVAR_LISP_NOPRO ("default-display-reversed",	/* yossi */
X+ 	      &buffer_defaults.display_reversed,
X+     "Default display-reversed for buffers that do not override it.\n\
X+ This is the same as (default-value 'display-reversed).");
X+ 
X    DEFVAR_LISP_NOPRO ("default-truncate-lines",
X  	      &buffer_defaults.truncate_lines,
X      "Default truncate-lines for buffers that do not override it.\n\
X  This is the same as (default-value 'truncate-lines).");
X  
X***************
X*** 1298,1307 ****
X--- 1312,1332 ----
X  
X    DEFVAR_PER_BUFFER ("ctl-arrow", &bf_cur->ctl_arrow,
X      "*Non-nil means display control chars with uparrow.\n\
X  Nil means use backslash and octal digits.\n\
X  Automatically becomes local when set in any fashion.");
X+ 
X+   DEFVAR_PER_BUFFER ("display-literal", &bf_cur->display_literal,   /* yossi */
X+     "*Non-nil means display the characters in the buffer as they are,\n\
X+ even when ther are \"nonprintable\" ascii.\n\
X+ Nil means display using ctl-arrow for the low nonprintables, and use\n\
X+ backslash and octal digits for the high nonprintables.\n\
X+ Automatically becomes local when set in any fashion.");
X+ 
X+   DEFVAR_PER_BUFFER ("display-reversed", &bf_cur->display_reversed, /* yossi */
X+     "*Non-nil means display each line of the buffer in reversed order,\n\
X+ useful for editing texts in Semitic languages which write right-to-left.");
X  
X    DEFVAR_PER_BUFFER ("truncate-lines", &bf_cur->truncate_lines,
X      "*Non-nil means do not display continuation lines;\n\
X  give each line of text one screen line.\n\
X  Automatically becomes local when set in any fashion.\n\
X*** buffer.h.orig	Sun Feb  8 06:35:54 1987
X--- buffer.h	Sat Apr  7 10:55:10 1990
X***************
X*** 140,149 ****
X--- 140,155 ----
X  
X      /* Non-nil means do not display continuation lines */
X      Lisp_Object truncate_lines;
X      /* Non-nil means display ctl chars with uparrow */
X      Lisp_Object ctl_arrow;
X+     /* yossi-- Non-nil means display the characters in the buffer as they are,
X+        even when they are "nonprintable" ascii.  This is particularly useful
X+        for fonts which have more than 128 characters */
X+     Lisp_Object display_literal;
X+     /* yossi-- Non-nil means reverse each line of the buffer, for Semitics */
X+     Lisp_Object display_reversed;
X      /* Non-nil means do selective display;
X         See doc string in syms_of_buffer (buffer.c) for details.  */
X      Lisp_Object selective_display;
X      /* Non-nil means show ... at end of line followed by invisible lines.  */
X      Lisp_Object selective_display_ellipses;
X*** dispnew.c.orig	Sat Aug 12 09:30:37 1989
X--- dispnew.c	Sat Apr  7 11:33:47 1990
X***************
X*** 522,532 ****
X    XFASTINT (w->last_modified) = bf_modified;
X  
X    reassert_line_highlight (0, cursY);
X    write_chars (p->body + hpos, 1);
X    fflush (stdout);
X!   ++cursX;
X    p->length = max (p->length, cursX);
X    p->body[p->length] = 0;
X    return 1;
X  }
X  
X--- 522,532 ----
X    XFASTINT (w->last_modified) = bf_modified;
X  
X    reassert_line_highlight (0, cursY);
X    write_chars (p->body + hpos, 1);
X    fflush (stdout);
X!   cursX += (NULL(XBUFFER(w->buffer)->display_reversed))? 1: -1;	/* yossi */
X    p->length = max (p->length, cursX);
X    p->body[p->length] = 0;
X    return 1;
X  }
X  
X***************
X*** 538,548 ****
X  
X    /* Avoid losing if cursor is in invisible text off left margin */
X    if (XINT (w->hscroll) && cursX == XFASTINT (w->left))
X      return 0;
X  
X!   cursX += n;
X    XFASTINT (w->last_point_x) = cursX;
X    XFASTINT (w->last_point) = point;
X    topos (cursY, cursX);
X    fflush (stdout);
X    return 1;
X--- 538,548 ----
X  
X    /* Avoid losing if cursor is in invisible text off left margin */
X    if (XINT (w->hscroll) && cursX == XFASTINT (w->left))
X      return 0;
X  
X!   cursX += (NULL(XBUFFER(w->buffer)->display_reversed))? n: -n;	/* yossi */
X    XFASTINT (w->last_point_x) = cursX;
X    XFASTINT (w->last_point) = point;
X    topos (cursY, cursX);
X    fflush (stdout);
X    return 1;
X*** indent.c.orig	Mon Aug 15 19:51:14 1988
X--- indent.c	Sat Apr  7 11:05:28 1990
X***************
X*** 66,75 ****
X--- 66,76 ----
X    register unsigned char *ptr, *stop, c;
X    register int tab_seen;
X    register int post_tab;
X    register int tab_width = XINT (bf_cur->tab_width);
X    int ctl_arrow = !NULL (bf_cur->ctl_arrow);
X+   int display_literal = !NULL (bf_cur->display_literal);	/* yossi */
X  
X    if (point == last_known_column_point
X        && bf_modified == last_known_column_modified)
X      return last_known_column;
X  
X***************
X*** 106,115 ****
X--- 107,120 ----
X  
X  	  post_tab += col;
X  	  col = 0;
X  	  tab_seen = 1;
X  	}
X+       else if (display_literal)			/* yossi */
X+ 	{
X+ 	  col++;
X+ 	}
X        else
X  	col += (ctl_arrow && c < 0200) ? 2 : 4;
X      }
X  
X    if (tab_seen)
X***************
X*** 230,239 ****
X--- 235,245 ----
X    register int col = current_column ();
X    register int goal;
X    register int end = NumCharacters;
X    register int tab_width = XINT (bf_cur->tab_width);
X    register int ctl_arrow = !NULL (bf_cur->ctl_arrow);
X+   register int display_literal = !NULL (bf_cur->display_literal);	/* yossi */
X  
X    Lisp_Object val;
X  
X    if (tab_width <= 0 || tab_width > 20) tab_width = 8;
X    CHECK_NUMBER (column, 0);
X***************
X*** 256,268 ****
X        if (c == '\t')
X  	{
X  	  col += tab_width - 1;
X  	  col = col / tab_width * tab_width;
X  	}
X!       else if (ctl_arrow && (c < 040 || c == 0177))
X          col++;
X!       else if (c < 040 || c >= 0177)
X          col += 3;
X      }
X  
X    SetPoint (pos);
X  
X--- 262,274 ----
X        if (c == '\t')
X  	{
X  	  col += tab_width - 1;
X  	  col = col / tab_width * tab_width;
X  	}
X!       else if ((!display_literal) && ctl_arrow && (c < 040 || c == 0177))  /* yossi */
X          col++;
X!       else if ((!display_literal) && (c < 040 || c >= 0177))	/* yossi */
X          col += 3;
X      }
X  
X    SetPoint (pos);
X  
X***************
X*** 305,314 ****
X--- 311,321 ----
X    register int target = tohpos + (tovpos << SHORTBITS);
X    register int pos;
X    register int c;
X    register int tab_width = XFASTINT (bf_cur->tab_width);
X    register int ctl_arrow = !NULL (bf_cur->ctl_arrow);
X+   register int display_literal = !NULL (bf_cur->display_literal);	/* yossi */
X    int selective
X      = XTYPE (bf_cur->selective_display) == Lisp_Int
X        ? XINT (bf_cur->selective_display)
X  	: !NULL (bf_cur->selective_display) ? -1 : 0;
X    int prevpos;
X***************
X*** 367,376 ****
X--- 374,385 ----
X  	      cpos += 4;
X  	      if (HPOS (cpos) >= width)
X  		cpos -= HPOS (cpos) - width;
X  	    }
X  	}
X+       else if (display_literal)			/* yossi */
X+ 	cpos++;
X        else
X  	cpos += (ctl_arrow && c < 0200) ? 2 : 4;
X  
X        if (HPOS (cpos) >= width
X  	  && (HPOS (cpos) > width
X*** xdisp.c.orig	Wed Apr 26 13:13:59 1989
X--- xdisp.c	Sun Apr  8 07:35:40 1990
X***************
X*** 391,400 ****
X--- 391,407 ----
X  				- (XFASTINT (w->width) + XFASTINT (w->left) != screen_width),
X  				XINT (w->hscroll), 0);
X  	  if (pos.vpos < 1)
X  	    {
X  	      cursX = max (XFASTINT (w->left), pos.hpos);
X+ 	      if (!NULL(XBUFFER(w->buffer)->display_reversed)) {	/* yossi */
X+ 		  register int width = XFASTINT (w->width) - 1
X+ 		      - (XFASTINT(w->width) + XFASTINT(w->left) != screen_width);
X+ 		  
X+ 		  cursX = XFASTINT(w->left) + width -
X+ 		      (cursX - XFASTINT(w->left));
X+ 	      }
X  	      cursY = this_line_vpos;
X  	      goto update;
X  	    }
X  	  else
X  	    goto cancel;
X***************
X*** 520,529 ****
X--- 527,562 ----
X        /* t is unequal to any useful value of Voverlay_arrow_... */
X        last_arrow_position = Qt;
X        last_arrow_string = Qt;
X      }
X  }
X+ 
X+ /*
X+  * yossi-- the following function is a simplified version of Denys Duchier's
X+  *         epoch::redisplay-screen, stolen from Epoch 3.1.
X+  */
X+ DEFUN ("x-smart-redisplay",Fx_smart_redisplay,Sx_smart_redisplay,0,0,"",
X+        "Perform a smart redisplay of the screen.")
X+      ()
X+     {
X+     Lisp_Object root_window = XWINDOW (minibuf_window)->prev;
X+     int modified = bf_text.modified++;
X+ 
X+     windows_or_buffers_changed++;
X+ 
X+     hold_window_change();
X+     if (interrupt_input) unrequest_sigio();
X+ 
X+     redisplay_window(root_window,0);
X+     update_screen(1,1);
X+ 
X+     bf_text.modified = modified;
X+     unhold_window_change();
X+     if (interrupt_input) request_sigio();
X+ 
X+     return Qnil;
X+     }
X  
X  int do_id = 1;
X  
X  /* Do full redisplay of one or all windows.
X    This does not include updating the screen;
X***************
X*** 638,647 ****
X--- 671,687 ----
X  	    lpoint = point;
X  
X  	  if (EQ (window, selected_window))
X  	    {
X  	      cursX = max (0, pos.hpos) + XFASTINT (w->left);
X+ 	      if (!NULL(XBUFFER(w->buffer)->display_reversed)) {	/* yossi */
X+ 		  register int width = XFASTINT (w->width) - 1
X+ 		      - (XFASTINT(w->width) + XFASTINT(w->left) != screen_width);
X+ 		  
X+ 		  cursX = XFASTINT(w->left) + width -
X+ 		      (cursX - XFASTINT(w->left));
X+ 	      }
X  	      cursY = pos.vpos + XFASTINT (w->top);
X  	    }
X  	}
X        goto done;
X      }
X***************
X*** 669,678 ****
X--- 709,725 ----
X  	  /* Ok, point is still on screen */
X  	  if (w == XWINDOW (selected_window))
X  	    {
X  	      /* These variables are supposed to be origin 1 */
X  	      cursX = max (0, pos.hpos) + XFASTINT (w->left);
X+ 	      if (!NULL(XBUFFER(w->buffer)->display_reversed)) {	/* yossi */
X+ 		  register int width = XFASTINT (w->width) - 1
X+ 		      - (XFASTINT(w->width) + XFASTINT(w->left) != screen_width);
X+ 		  
X+ 		  cursX = XFASTINT(w->left) + width -
X+ 		      (cursX - XFASTINT(w->left));
X+ 	      }
X  	      cursY = pos.vpos + XFASTINT (w->top);
X  	    }
X  /* This doesn't do the trick, because if a window to the right of
X   this one must be redisplayed, this does nothing because there
X   is nothing in DesiredScreen yet, and then the other window is
X***************
X*** 1148,1157 ****
X--- 1195,1211 ----
X        point_vpos = val.vpos + top;
X        point_hpos = val.hpos + XFASTINT (w->left);
X      }
X  
X    cursX = max (0, point_hpos);
X+   if (!NULL(XBUFFER(w->buffer)->display_reversed)) {	/* yossi */
X+       register int width = XFASTINT (w->width) - 1
X+ 	  - (XFASTINT(w->width) + XFASTINT(w->left) != screen_width);
X+       
X+       cursX = XFASTINT(w->left) + width -
X+ 	  (cursX - XFASTINT(w->left));
X+   }
X    cursY = point_vpos;
X  
X    if (debug_end_pos)
X      {
X        val = *compute_motion (start, 0, lmargin, NumCharacters + 1,
X***************
X*** 1202,1211 ****
X--- 1256,1266 ----
X    register char *startp;
X    register char *p1prev;
X    register struct display_line *line;
X    int tab_width = XINT (bf_cur->tab_width);
X    int ctl_arrow = !NULL (bf_cur->ctl_arrow);
X+   int display_literal = !NULL (bf_cur->display_literal);	/* yossi */
X    int width = XFASTINT (w->width) - 1
X      - (XFASTINT (w->width) + XFASTINT (w->left) != screen_width);
X    struct position val;
X    int lastpos;
X    int invis;
X***************
X*** 1317,1326 ****
X--- 1372,1387 ----
X  		p1 = endp;
X  	      strncpy (p1prev, " ...", p1 - p1prev);
X  	    }
X  	  break;
X  	}
X+       else if (display_literal)		/* yossi */
X+ 	{
X+ 	  if (p1 >= startp)
X+ 	    *p1 = c;
X+ 	  p1++;
X+ 	}
X        else if (c < 0200 && ctl_arrow)
X  	{
X  	  if (p1 >= startp)
X  	    *p1 = '^';
X  	  p1++;
X***************
X*** 1468,1477 ****
X--- 1529,1562 ----
X  	line->length = len + startp - line->body;
X      }
X  
X    val.bufpos = pos;
X    val_display_text_line = val;
X+   
X+   /* yossi-- reverse the line if necessary */
X+   if (!NULL(bf_cur->display_reversed)) {
X+       char *p2, t;
X+ 
X+       if (p1 < endp + 1) {
X+ 	  while (p1 <= endp) *p1++ = ' ';
X+ 	  line->length = max(line->length, p1 - line->body);
X+ 	  line->body[line->length] = 0;
X+       }
X+ 
X+       /* reverse the line */
X+       for (p1 = startp, p2 = startp + width; p1 < p2; p1++, --p2) {
X+ 	  t = *p1;
X+ 	  *p1 = *p2;
X+ 	  *p2 = t;
X+       }
X+ 
X+       /* reverse the position of point if necessary */
X+       if ((point_vpos == vpos) && (w == XWINDOW (selected_window)))
X+ 	  cursX = XFASTINT(w->left) + width -
X+ 	      (cursX - XFASTINT(w->left));
X+   }
X+ 
X    return &val_display_text_line;
X  }
X  
X  /* Display the mode line for window w */
X  
X***************
X*** 1916,1925 ****
X--- 2001,2016 ----
X  		*p1 = ' ';
X  	      p1++;
X  	    }
X  	  while ((p1 - start + hscroll - (hscroll > 0)) % tab_width);
X  	}
X+       else if (buffer_defaults.display_literal)		/* yossi */
X+ 	{
X+ 	  if (p1 >= start)
X+ 	    *p1 = c;
X+ 	  p1++;
X+ 	}
X        else if (c < 0200 && buffer_defaults.ctl_arrow)
X  	{
X  	  if (p1 >= start)
X  	    *p1 = '^';
X  	  p1++;
X***************
X*** 2005,2014 ****
X--- 2096,2106 ----
X    DEFVAR_BOOL ("mode-line-inverse-video", &mode_line_inverse_video,
X      "*Non-nil means use inverse video, or other suitable display mode, for the mode line.");
X    mode_line_inverse_video = 1;
X  
X    defsubr (&Sredraw_display);
X+   defsubr (&Sx_smart_redisplay);		/* yossi */
X  }
X  
X  /* initialize the window system */
X  init_xdisp ()
X  {
X*** keyboard.c.orig	Wed Jul 19 22:32:59 1989
X--- keyboard.c	Sat Apr  7 11:29:56 1990
X***************
X*** 591,601 ****
X  	    {
X  	      if (EQ (cmd, Qforward_char) && point <= NumCharacters)
X  		{
X  		  lose = CharAt (point);
X  		  SetPoint (point + 1);
X! 		  if (lose >= ' ' && lose < 0177
X  		      && (XFASTINT (XWINDOW (selected_window)->last_modified)
X  			  >= bf_modified)
X  		      && (XFASTINT (XWINDOW (selected_window)->last_point)
X  			  == point)
X  		      && !windows_or_buffers_changed
X--- 591,602 ----
X  	    {
X  	      if (EQ (cmd, Qforward_char) && point <= NumCharacters)
X  		{
X  		  lose = CharAt (point);
X  		  SetPoint (point + 1);
X! 		  if (((lose >= ' ' && lose < 0177) ||
X! 		       !NULL(bf_cur->display_literal))		/* yossi */
X  		      && (XFASTINT (XWINDOW (selected_window)->last_modified)
X  			  >= bf_modified)
X  		      && (XFASTINT (XWINDOW (selected_window)->last_point)
X  			  == point)
X  		      && !windows_or_buffers_changed
X***************
X*** 607,617 ****
X  		}
X  	      else if (EQ (cmd, Qbackward_char) && point > FirstCharacter)
X  		{
X  		  SetPoint (point - 1);
X  		  lose = CharAt (point);
X! 		  if (lose >= ' ' && lose < 0177
X  		      && (XFASTINT (XWINDOW (selected_window)->last_modified)
X  			  >= bf_modified)
X  		      && (XFASTINT (XWINDOW (selected_window)->last_point)
X  			  == point)
X  		      && !windows_or_buffers_changed
X--- 608,619 ----
X  		}
X  	      else if (EQ (cmd, Qbackward_char) && point > FirstCharacter)
X  		{
X  		  SetPoint (point - 1);
X  		  lose = CharAt (point);
X! 		  if (((lose >= ' ' && lose < 0177) ||
X! 		       !NULL(bf_cur->display_literal))		/* yossi */
X  		      && (XFASTINT (XWINDOW (selected_window)->last_modified)
X  			  >= bf_modified)
X  		      && (XFASTINT (XWINDOW (selected_window)->last_point)
X  			  == point)
X  		      && !windows_or_buffers_changed
X***************
X*** 647,658 ****
X  		      lose = 1;
X  		      nonundocount = 0;
X  		    }
X  		  if (!lose
X  		      && (point == NumCharacters + 1 || CharAt (point) == '\n')
X! 		      && last_command_char >= ' '
X! 		      && last_command_char < 0177)
X  		    no_redisplay
X  		      = direct_output_for_insert (last_command_char);
X  		  goto directly_done;
X  		}
X  	    }
X--- 649,660 ----
X  		      lose = 1;
X  		      nonundocount = 0;
X  		    }
X  		  if (!lose
X  		      && (point == NumCharacters + 1 || CharAt (point) == '\n')
X! 		      && ((last_command_char >= ' ' && last_command_char < 0177) ||
X! 			  !NULL(bf_cur->display_literal)))	/* yossi */
X  		    no_redisplay
X  		      = direct_output_for_insert (last_command_char);
X  		  goto directly_done;
X  		}
X  	    }
END_OF_FILE
if test 17245 -ne `wc -c <'emacs-18.55/patch-src'`; then
    echo shar: \"'emacs-18.55/patch-src'\" unpacked with wrong size!
fi
# end of 'emacs-18.55/patch-src'
fi
if test -f 'epoch-3.1/patch-src' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'epoch-3.1/patch-src'\"
else
echo shar: Extracting \"'epoch-3.1/patch-src'\" \(16562 characters\)
sed "s/^X//" >'epoch-3.1/patch-src' <<'END_OF_FILE'
X*** buffer.c.orig	Wed Jan 31 16:50:28 1990
X--- buffer.c	Sat Apr  7 10:07:30 1990
X***************
X*** 1145,1154 ****
X--- 1145,1156 ----
X    buffer_defaults.abbrev_table = Qnil;
X  
X    XFASTINT (buffer_defaults.tab_width) = 8;
X    buffer_defaults.truncate_lines = Qnil;
X    buffer_defaults.ctl_arrow = Qt;
X+   buffer_defaults.display_literal = Qnil;	/* yossi */
X+   buffer_defaults.display_reversed = Qnil;	/* yossi */
X  
X    XFASTINT (buffer_defaults.fill_column) = 70;
X    XFASTINT (buffer_defaults.left_margin) = 0;
X  
X    /* Assign the local-flags to the slots that have default values.
X***************
X*** 1184,1193 ****
X--- 1186,1197 ----
X    XFASTINT (buffer_local_flags.truncate_lines) = 0x100;
X    XFASTINT (buffer_local_flags.ctl_arrow) = 0x200;
X    XFASTINT (buffer_local_flags.fill_column) = 0x400;
X    XFASTINT (buffer_local_flags.left_margin) = 0x800;
X    XFASTINT (buffer_local_flags.abbrev_table) = 0x1000;
X+   XFASTINT (buffer_local_flags.display_literal) = 0x2000;	/* yossi */
X+   XFASTINT (buffer_local_flags.display_reversed) = 0x4000;	/* yossi */
X  
X    Vbuffer_alist = Qnil;
X    bf_cur = 0;
X    all_buffers = 0;
X  
X***************
X*** 1257,1266 ****
X--- 1261,1280 ----
X    DEFVAR_LISP_NOPRO ("default-ctl-arrow",
X  	      &buffer_defaults.ctl_arrow,
X      "Default ctl-arrow for buffers that do not override it.\n\
X  This is the same as (default-value 'ctl-arrow).");
X  
X+   DEFVAR_LISP_NOPRO ("default-display-literal",		/* yossi */
X+ 	      &buffer_defaults.display_literal,
X+     "Default display-literal for buffers that do not override it.\n\
X+ This is the same as (default-value 'display-literal).");
X+ 
X+   DEFVAR_LISP_NOPRO ("default-display-reversed",	/* yossi */
X+ 	      &buffer_defaults.display_reversed,
X+     "Default display-reversed for buffers that do not override it.\n\
X+ This is the same as (default-value 'display-reversed).");
X+ 
X    DEFVAR_LISP_NOPRO ("default-truncate-lines",
X  	      &buffer_defaults.truncate_lines,
X      "Default truncate-lines for buffers that do not override it.\n\
X  This is the same as (default-value 'truncate-lines).");
X  
X***************
X*** 1348,1357 ****
X--- 1362,1382 ----
X  
X    DEFVAR_PER_BUFFER ("ctl-arrow", &bf_cur->ctl_arrow,
X      "*Non-nil means display control chars with uparrow.\n\
X  Nil means use backslash and octal digits.\n\
X  Automatically becomes local when set in any fashion.");
X+ 
X+   DEFVAR_PER_BUFFER ("display-literal", &bf_cur->display_literal,   /* yossi */
X+     "*Non-nil means display the characters in the buffer as they are,\n\
X+ even when ther are \"nonprintable\" ascii.\n\
X+ Nil means display using ctl-arrow for the low nonprintables, and use\n\
X+ backslash and octal digits for the high nonprintables.\n\
X+ Automatically becomes local when set in any fashion.");
X+ 
X+   DEFVAR_PER_BUFFER ("display-reversed", &bf_cur->display_reversed, /* yossi */
X+     "*Non-nil means display each line of the buffer in reversed order,\n\
X+ useful for editing texts in Semitic languages which write right-to-left.");
X  
X    DEFVAR_PER_BUFFER ("truncate-lines", &bf_cur->truncate_lines,
X      "*Non-nil means do not display continuation lines;\n\
X  give each line of text one screen line.\n\
X  Automatically becomes local when set in any fashion.\n\
X*** buffer.h.orig	Tue Jan 30 09:40:40 1990
X--- buffer.h	Sat Apr  7 10:09:06 1990
X***************
X*** 140,149 ****
X--- 140,155 ----
X  
X      /* Non-nil means do not display continuation lines */
X      Lisp_Object truncate_lines;
X      /* Non-nil means display ctl chars with uparrow */
X      Lisp_Object ctl_arrow;
X+     /* yossi-- Non-nil means display the characters in the buffer as they are,
X+        even when they are "nonprintable" ascii.  This is particularly useful
X+        for fonts which have more than 128 characters */
X+     Lisp_Object display_literal;
X+     /* yossi-- Non-nil means reverse each line of the buffer, for Semitics */
X+     Lisp_Object display_reversed;
X      /* Non-nil means do selective display;
X         See doc string in syms_of_buffer (buffer.c) for details.  */
X      Lisp_Object selective_display;
X      /* Non-nil means show ... at end of line followed by invisible lines.  */
X      Lisp_Object selective_display_ellipses;
X*** dispepoch.c.orig	Wed Jan 24 06:30:18 1990
X--- dispepoch.c	Sat Apr  7 10:10:48 1990
X***************
X*** 574,584 ****
X    XFASTINT (w->last_modified) = bf_modified;
X  
X    reassert_line_highlight (0, WS->cursor_y);
X    write_chars (p->body + hpos, 1);
X    fflush (stdout);
X!   ++(WS->cursor_x);
X    p->length = max (p->length, WS->cursor_x);
X    p->body[p->length] = 0;
X    return 1;
X  }
X  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
X--- 574,584 ----
X    XFASTINT (w->last_modified) = bf_modified;
X  
X    reassert_line_highlight (0, WS->cursor_y);
X    write_chars (p->body + hpos, 1);
X    fflush (stdout);
X!   WS->cursor_x += (NULL(XBUFFER(w->buffer)->display_reversed))? 1: -1;	/* yossi */
X    p->length = max (p->length, WS->cursor_x);
X    p->body[p->length] = 0;
X    return 1;
X  }
X  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
X***************
X*** 590,600 ****
X  
X    /* Avoid losing if cursor is in invisible text off left margin */
X    if (XINT (w->hscroll) && cursX == XFASTINT (w->left))
X      return 0;
X  
X!   WS->cursor_x += n;
X    XFASTINT (w->last_point_x) = WS->cursor_x;
X    XFASTINT (w->last_point) = point;
X    topos (WS->cursor_y,WS->cursor_x);
X    fflush (stdout);
X    return 1;
X--- 590,600 ----
X  
X    /* Avoid losing if cursor is in invisible text off left margin */
X    if (XINT (w->hscroll) && cursX == XFASTINT (w->left))
X      return 0;
X  
X!   WS->cursor_x += (NULL(XBUFFER(w->buffer)->display_reversed))? n: -n;	/* yossi */
X    XFASTINT (w->last_point_x) = WS->cursor_x;
X    XFASTINT (w->last_point) = point;
X    topos (WS->cursor_y,WS->cursor_x);
X    fflush (stdout);
X    return 1;
X*** indent.c.orig	Tue Jan 23 08:44:36 1990
X--- indent.c	Sat Apr  7 10:13:58 1990
X***************
X*** 68,77 ****
X--- 68,78 ----
X    register unsigned char *ptr, *stop, c;
X    register int tab_seen;
X    register int post_tab;
X    register int tab_width = XINT (bf_cur->tab_width);
X    int ctl_arrow = !NULL (bf_cur->ctl_arrow);
X+   int display_literal = !NULL (bf_cur->display_literal);	/* yossi */
X  
X    if (point == last_known_column_point
X        && bf_modified == last_known_column_modified)
X      return last_known_column;
X  
X***************
X*** 108,117 ****
X--- 109,122 ----
X  
X  	  post_tab += col;
X  	  col = 0;
X  	  tab_seen = 1;
X  	}
X+       else if (display_literal)			/* yossi */
X+ 	{
X+ 	  col++;
X+ 	}
X        else
X  	col += (ctl_arrow && c < 0200) ? 2 : 4;
X      }
X  
X    if (tab_seen)
X***************
X*** 232,241 ****
X--- 237,247 ----
X    register int col = current_column ();
X    register int goal;
X    register int end = NumCharacters;
X    register int tab_width = XINT (bf_cur->tab_width);
X    register int ctl_arrow = !NULL (bf_cur->ctl_arrow);
X+   register int display_literal = !NULL (bf_cur->display_literal);	/* yossi */
X  
X    Lisp_Object val;
X  
X    if (tab_width <= 0 || tab_width > 20) tab_width = 8;
X    CHECK_NUMBER (column, 0);
X***************
X*** 258,270 ****
X        if (c == '\t')
X  	{
X  	  col += tab_width - 1;
X  	  col = col / tab_width * tab_width;
X  	}
X!       else if (ctl_arrow && (c < 040 || c == 0177))
X          col++;
X!       else if (c < 040 || c >= 0177)
X          col += 3;
X      }
X  
X    SetPoint (pos);
X  
X--- 264,276 ----
X        if (c == '\t')
X  	{
X  	  col += tab_width - 1;
X  	  col = col / tab_width * tab_width;
X  	}
X!       else if ((!display_literal) && ctl_arrow && (c < 040 || c == 0177))  /* yossi */
X          col++;
X!       else if ((!display_literal) && (c < 040 || c >= 0177))	/* yossi */
X          col += 3;
X      }
X  
X    SetPoint (pos);
X  
X***************
X*** 307,316 ****
X--- 313,323 ----
X    register int target = tohpos + (tovpos << SHORTBITS);
X    register int pos;
X    register int c;
X    register int tab_width = XFASTINT (bf_cur->tab_width);
X    register int ctl_arrow = !NULL (bf_cur->ctl_arrow);
X+   register int display_literal = !NULL (bf_cur->display_literal);	/* yossi */
X    int selective
X      = XTYPE (bf_cur->selective_display) == Lisp_Int
X        ? XINT (bf_cur->selective_display)
X  	: !NULL (bf_cur->selective_display) ? -1 : 0;
X    int prevpos;
X***************
X*** 369,378 ****
X--- 376,387 ----
X  	      cpos += 4;
X  	      if (HPOS (cpos) >= width)
X  		cpos -= HPOS (cpos) - width;
X  	    }
X  	}
X+       else if (display_literal)			/* yossi */
X+ 	cpos++;
X        else
X  	cpos += (ctl_arrow && c < 0200) ? 2 : 4;
X  
X        if (HPOS (cpos) >= width
X  	  && (HPOS (cpos) > width
X*** xdisp.c.orig	Mon Jan 29 15:45:35 1990
X--- xdisp.c	Sat Apr  7 10:31:37 1990
X***************
X*** 403,412 ****
X--- 403,419 ----
X  				XINT (w->hscroll), 0);
X  	  if (pos.vpos < 1)
X  	    {
X  	      struct W_Screen *ws = XWSCREEN(XROOT(w->root)->win);
X  	      ws->cursor_x = XFASTINT(w->left) + (pos.hpos < 0 ? 0 : pos.hpos);
X+ 	      if (!NULL(XBUFFER(w->buffer)->display_reversed)) {	/* yossi */
X+ 		  register int width = XFASTINT (w->width) - 1
X+ 		      - (XFASTINT(w->width) + XFASTINT(w->left) != ws->width);
X+ 		  
X+ 		  ws->cursor_x = XFASTINT(w->left) + width -
X+ 		      (ws->cursor_x - XFASTINT(w->left));
X+ 	      }
X  	      ws->cursor_y = this_line_vpos;
X  	      goto update;
X  	    }
X  	  else
X  	    goto cancel;
X***************
X*** 772,781 ****
X--- 779,795 ----
X  	    lpoint = point;
X  
X  	  if (EQ (window, selected_window))
X  	    {
X  	      ws->cursor_x = max (0, pos.hpos) + XFASTINT (w->left);
X+ 	      if (!NULL(XBUFFER(w->buffer)->display_reversed)) {	/* yossi */
X+ 		  register int width = XFASTINT (w->width) - 1
X+ 		      - (XFASTINT(w->width) + XFASTINT(w->left) != ws->width);
X+ 		  
X+ 		  ws->cursor_x = XFASTINT(w->left) + width -
X+ 		      (ws->cursor_x - XFASTINT(w->left));
X+ 	      }
X  	      ws->cursor_y = pos.vpos + XFASTINT (w->top);
X  	    }
X  	}
X        goto done;
X      }
X***************
X*** 805,814 ****
X--- 819,835 ----
X  	  /* Ok, point is still on screen */
X  	  if (w == XWINDOW (selected_window))
X  	    {
X  	      /* These variables are supposed to be origin 1 */
X  	      ws->cursor_x = max (0, pos.hpos) + XFASTINT (w->left);
X+ 	      if (!NULL(XBUFFER(w->buffer)->display_reversed)) {	/* yossi */
X+ 		  register int width = XFASTINT (w->width) - 1
X+ 		      - (XFASTINT(w->width) + XFASTINT(w->left) != ws->width);
X+ 		  
X+ 		  ws->cursor_x = XFASTINT(w->left) + width -
X+ 		      (ws->cursor_x - XFASTINT(w->left));
X+ 	      }
X  	      ws->cursor_y = pos.vpos + XFASTINT (w->top);
X  	    }
X  	  goto done;
X  	}
X        /* Don't bother trying redisplay with same start;
X***************
X*** 1278,1287 ****
X--- 1299,1315 ----
X        point_vpos = val.vpos + top;
X        point_hpos = val.hpos + XFASTINT (w->left);
X      }
X  
X    ws->cursor_x = max (0, point_hpos);
X+   if (!NULL(XBUFFER(w->buffer)->display_reversed)) {	/* yossi */
X+       register int width = XFASTINT (w->width) - 1
X+ 	  - (XFASTINT(w->width) + XFASTINT(w->left) != ws->width);
X+       
X+       ws->cursor_x = XFASTINT(w->left) + width -
X+ 	  (ws->cursor_x - XFASTINT(w->left));
X+   }
X    ws->cursor_y = point_vpos;
X  
X    if (debug_end_pos)
X      {
X        val = *compute_motion (start, 0, lmargin, NumCharacters + 1,
X***************
X*** 1333,1342 ****
X--- 1361,1371 ----
X    register char *p1prev;
X    register struct display_line *line;
X    struct W_Screen *ws = XWSCREEN(XROOT(w->root)->win);
X    int tab_width = XINT (bf_cur->tab_width);
X    int ctl_arrow = !NULL (bf_cur->ctl_arrow);
X+   int display_literal = !NULL (bf_cur->display_literal);	/* yossi */
X    int width = XFASTINT (w->width) - 1
X      - (XFASTINT (w->width) + XFASTINT (w->left) != ws->width);
X    struct position val;
X    int lastpos;
X    int invis;
X***************
X*** 1476,1485 ****
X--- 1505,1520 ----
X  		p1 = endp;
X  	      strncpy (p1prev, " ...", p1 - p1prev);
X  	    }
X  	  break;
X  	}
X+       else if (display_literal)		/* yossi */
X+ 	{
X+ 	  if (p1 >= startp)
X+ 	    *p1 = c;
X+ 	  NEXT_CHAR;
X+ 	}
X        else if (c < 0200 && ctl_arrow)
X  	{
X  	  if (p1 >= startp)
X  	    *p1 = '^';
X  	  NEXT_CHAR;
X***************
X*** 1637,1646 ****
X--- 1672,1719 ----
X  	line->length = len + startp - line->body;
X      }
X  
X    val.bufpos = pos;
X    val_display_text_line = val;
X+   
X+   /* yossi-- reverse the line if necessary */
X+   if (!NULL(bf_cur->display_reversed)) {
X+       char *p2, t;
X+       unsigned char *a2, at;
X+ 
X+       if (p1 < endp + 1) {
X+ 	  while (p1 <= endp) *p1++ = ' ';
X+ 	  line->length = max(line->length, p1 - line->body);
X+ 	  line->body[line->length] = 0;
X+       }
X+ 
X+       /* reverse the line */
X+       for (p1 = startp, p2 = startp + width; p1 < p2; p1++, --p2) {
X+ 	  t = *p1;
X+ 	  *p1 = *p2;
X+ 	  *p2 = t;
X+       }
X+ 
X+ #ifdef BUTTON
X+       /* reverse the buttons */
X+       for (
X+ 	a1 = line->attrib + XFASTINT (w->left),
X+ 	   a2 = line->attrib + XFASTINT (w->left) + width;
X+ 	a1 < a2;
X+ 	a1++, --a2
X+       ) {
X+ 	  at = *a1;
X+ 	  *a1 = *a2;
X+ 	  *a2 = at;
X+       }
X+ #endif BUTTON
X+ 
X+       /* reverse the position of point if necessary */
X+       if ((point_vpos == vpos) && (w == XWINDOW (selected_window)))
X+ 	  ws->cursor_x = XFASTINT(w->left) + width -
X+ 	      (ws->cursor_x - XFASTINT(w->left));
X+   }
X    return &val_display_text_line;
X  }
X  
X  /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
X  /* Display the mode line for window w */
X***************
X*** 2088,2097 ****
X--- 2161,2176 ----
X  	      if (p1 >= start)
X  		*p1 = ' ';
X  	      p1++;
X  	    }
X  	  while ((p1 - start + hscroll - (hscroll > 0)) % tab_width);
X+ 	}
X+       else if (buffer_defaults.display_literal)		/* yossi */
X+ 	{
X+ 	  if (p1 >= start)
X+ 	    *p1 = c;
X+ 	  p1++;
X  	}
X        else if (c < 0200 && buffer_defaults.ctl_arrow)
X  	{
X  	  if (p1 >= start)
X  	    *p1 = '^';
X*** keyboard.c.orig	Thu Jan 25 09:14:47 1990
X--- keyboard.c	Sat Apr  7 10:33:39 1990
X***************
X*** 592,602 ****
X  	    {
X  	      if (EQ (cmd, Qforward_char) && point <= NumCharacters)
X  		{
X  		  lose = CharAt (point);
X  		  SetPoint (point + 1);
X! 		  if (lose >= ' ' && lose < 0177
X  		      && (XFASTINT (XWINDOW (selected_window)->last_modified)
X  			  >= bf_modified)
X  		      && (XFASTINT (XWINDOW (selected_window)->last_point)
X  			  == (point+1))	/* dd/amc */
X  		      && !windows_or_buffers_changed
X--- 592,603 ----
X  	    {
X  	      if (EQ (cmd, Qforward_char) && point <= NumCharacters)
X  		{
X  		  lose = CharAt (point);
X  		  SetPoint (point + 1);
X! 		  if (((lose >= ' ' && lose < 0177) ||
X! 		       !NULL(bf_cur->display_literal))		/* yossi */
X  		      && (XFASTINT (XWINDOW (selected_window)->last_modified)
X  			  >= bf_modified)
X  		      && (XFASTINT (XWINDOW (selected_window)->last_point)
X  			  == (point+1))	/* dd/amc */
X  		      && !windows_or_buffers_changed
X***************
X*** 608,618 ****
X  		}
X  	      else if (EQ (cmd, Qbackward_char) && point > FirstCharacter)
X  		{
X  		  SetPoint (point - 1);
X  		  lose = CharAt (point);
X! 		  if (lose >= ' ' && lose < 0177
X  		      && (XFASTINT (XWINDOW (selected_window)->last_modified)
X  			  >= bf_modified)
X  		      && (XFASTINT (XWINDOW (selected_window)->last_point)
X  			  == (point-1))	/* dd/amc */
X  		      && !windows_or_buffers_changed
X--- 609,620 ----
X  		}
X  	      else if (EQ (cmd, Qbackward_char) && point > FirstCharacter)
X  		{
X  		  SetPoint (point - 1);
X  		  lose = CharAt (point);
X! 		  if (((lose >= ' ' && lose < 0177) ||
X! 		       !NULL(bf_cur->display_literal))		/* yossi */
X  		      && (XFASTINT (XWINDOW (selected_window)->last_modified)
X  			  >= bf_modified)
X  		      && (XFASTINT (XWINDOW (selected_window)->last_point)
X  			  == (point-1))	/* dd/amc */
X  		      && !windows_or_buffers_changed
X***************
X*** 648,659 ****
X  		      lose = 1;
X  		      nonundocount = 0;
X  		    }
X  		  if (!lose
X  		      && (point == NumCharacters + 1 || CharAt (point) == '\n')
X! 		      && last_command_char >= ' '
X! 		      && last_command_char < 0177)
X  		    no_redisplay
X  		      = direct_output_for_insert (last_command_char);
X  		  goto directly_done;
X  		}
X  	    }
X--- 650,661 ----
X  		      lose = 1;
X  		      nonundocount = 0;
X  		    }
X  		  if (!lose
X  		      && (point == NumCharacters + 1 || CharAt (point) == '\n')
X! 		      && ((last_command_char >= ' ' && last_command_char < 0177) ||
X! 			  !NULL(bf_cur->display_literal)))	/* yossi */
X  		    no_redisplay
X  		      = direct_output_for_insert (last_command_char);
X  		  goto directly_done;
X  		}
X  	    }
END_OF_FILE
if test 16562 -ne `wc -c <'epoch-3.1/patch-src'`; then
    echo shar: \"'epoch-3.1/patch-src'\" unpacked with wrong size!
fi
# end of 'epoch-3.1/patch-src'
fi
echo shar: End of archive 2 \(of 2\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked both archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0