diff lisp/disp-table.el @ 219:262b8bb4a523 r20-4b8

Import from CVS: tag r20-4b8
author cvs
date Mon, 13 Aug 2007 10:09:35 +0200
parents
children e214ff9f9507 3742ea8250b5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/disp-table.el	Mon Aug 13 10:09:35 2007 +0200
@@ -0,0 +1,208 @@
+;;; disp-table.el --- functions for dealing with char tables.
+
+;; Copyright (C) 1987, 1994, 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1995 Sun Microsystems.
+
+;; Author: Howard Gayle
+;; Maintainer: XEmacs Development Team
+;; Keywords: i18n, internal
+
+;; This file is part of XEmacs.
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING.  If not, write to the 
+;; Free Software Foundation, 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Synched up with: Not synched with FSF.
+
+;;; Commentary:
+
+;; #### Need lots of work.  make-display-table depends on a value
+;; that is a define in the C code.  Maybe we should just move the
+;; function into C.
+
+;; #### display-tables-as-vectors is really evil and a big pain in
+;; the ass.
+
+;; Rewritten for XEmacs July 1995, Ben Wing.
+
+
+;;; Code:
+
+(defun describe-display-table (dt)
+  "Describe the display table DT in a help buffer."
+  (with-displaying-help-buffer
+   (lambda ()
+     (princ "\nCharacter display glyph sequences:\n")
+     (save-excursion
+       (let ((vector (make-vector 256 nil))
+             (i 0))
+         (while (< i 256)
+           (aset vector i (aref dt i))
+           (incf i))
+	 ;; FSF calls `describe-vector' here, but it is so incredibly
+	 ;; lame a function for that name that I cannot bring myself
+	 ;; to porting it.  Here is what `describe-vector' does:
+	 (terpri)
+	 (let ((old (aref vector 0))
+	       (oldpos 0)
+	       (i 1)
+	       str)
+	   (while (<= i 256)
+	     (when (or (= i 256)
+		       (not (equal old (aref vector i))))
+	       (if (eq oldpos (1- i))
+		   (princ (format "%s\t\t%s\n"
+				  (single-key-description (int-char oldpos))
+				  old))
+		 (setq str (format "%s - %s"
+				   (single-key-description (int-char oldpos))
+				   (single-key-description (int-char (1- i)))))
+		 (princ str)
+		 (princ (make-string (max (- 2 (/ (length str)
+						  tab-width)) 1) ?\t))
+		 (princ old)
+		 (terpri))
+	       (or (= i 256)
+		   (setq old (aref vector i)
+			 oldpos i)))
+	     (incf i))))))))
+
+;;;###autoload
+(defun describe-current-display-table (&optional domain)
+  "Describe the display table in use in the selected window and buffer."
+  (interactive)
+  (or domain (setq domain (selected-window)))
+  (let ((disptab (specifier-instance current-display-table domain)))
+    (if disptab
+	(describe-display-table disptab)
+      (message "No display table"))))
+
+;;;###autoload
+(defun make-display-table ()
+  "Return a new, empty display table."
+  (make-vector 256 nil))
+
+;; #### we need a generic frob-specifier function.
+;; #### this also needs to be redone like frob-face-property.
+
+;; Let me say one more time how much dynamic scoping sucks.
+
+(defun frob-display-table (fdt-function fdt-locale)
+  (or fdt-locale (setq fdt-locale 'global))
+  (or (specifier-spec-list current-display-table fdt-locale)
+      (add-spec-to-specifier current-display-table (make-display-table)
+			     fdt-locale))
+  (add-spec-list-to-specifier
+   current-display-table
+   (list (cons fdt-locale
+	       (mapcar
+		(lambda (fdt-x)
+                  (funcall fdt-function (cdr fdt-x))
+                  fdt-x)
+		(cdar (specifier-spec-list current-display-table
+					   fdt-locale)))))))
+
+(defun standard-display-8bit-1 (dt l h)
+  (while (<= l h)
+    (aset dt l (char-to-string l))
+    (setq l (1+ l))))
+
+;;;###autoload
+(defun standard-display-8bit (l h &optional locale)
+  "Display characters in the range L to H literally."
+  (frob-display-table
+   (lambda (x)
+     (standard-display-8bit-1 x l h))
+   locale))
+
+(defun standard-display-default-1 (dt l h)
+  (while (<= l h)
+    (aset dt l nil)
+    (setq l (1+ l))))
+
+;;;###autoload
+(defun standard-display-default (l h &optional locale)
+  "Display characters in the range L to H using the default notation."
+  (frob-display-table
+   (lambda (x)
+     (standard-display-default-1 x l h))
+   locale))
+
+;;;###autoload
+(defun standard-display-ascii (c s &optional locale)
+  "Display character C using printable string S."
+  (frob-display-table
+   (lambda (x)
+     (aset x c s))
+   locale))
+
+
+;;; #### should frob in a 'tty locale.
+
+;;;###autoload
+(defun standard-display-g1 (c sc &optional locale)
+  "Display character C as character SC in the g1 character set.
+This function assumes that your terminal uses the SO/SI characters;
+it is meaningless for an X frame."
+  (frob-display-table
+   (lambda (x)
+     (aset x c (concat "\016" (char-to-string sc) "\017")))
+   locale))
+
+
+;;; #### should frob in a 'tty locale.
+
+;;;###autoload
+(defun standard-display-graphic (c gc &optional locale)
+  "Display character C as character GC in graphics character set.
+This function assumes VT100-compatible escapes; it is meaningless for an
+X frame."
+  (frob-display-table
+   (lambda (x)
+     (aset x c (concat "\e(0" (char-to-string gc) "\e(B")))
+   locale))
+
+;;; #### should frob in a 'tty locale.
+;;; #### the FSF equivalent of this makes this character be displayed
+;;; in the 'underline face.  There's no current way to do this with
+;;; XEmacs display tables.
+
+;;;###autoload
+(defun standard-display-underline (c uc &optional locale)
+  "Display character C as character UC plus underlining."
+  (frob-display-table
+   (lambda (x)
+     (aset x c (concat "\e[4m" (char-to-string uc) "\e[m")))
+   locale))
+
+;;;###autoload
+(defun standard-display-european (arg &optional locale)
+  "Toggle display of European characters encoded with ISO 8859.
+When enabled, characters in the range of 160 to 255 display not
+as octal escapes, but as accented characters.
+With prefix argument, enable European character display iff arg is positive."
+  (interactive "P")
+  (frob-display-table
+   (lambda (x)
+     (if (or (<= (prefix-numeric-value arg) 0)
+             (and (null arg)
+                  (equal (aref x 160) (char-to-string 160))))
+         (standard-display-default-1 x 160 255)
+       (standard-display-8bit-1 x 160 255)))
+   locale))
+
+(provide 'disp-table)
+
+;;; disp-table.el ends here