Clarify initial discussion.
[bpt/emacs.git] / lisp / disp-table.el
CommitLineData
c0274f38
ER
1;;; disp-table.el --- functions for dealing with char tables.
2
3ea1bd50 3;; Copyright (C) 1987, 1994, 1995, 1999 Free Software Foundation, Inc.
9750e079 4
ef9c36a5
EN
5;; Author: Erik Naggum <erik@naggum.no>
6;; Based on a previous version by Howard Gayle
e5167999 7;; Maintainer: FSF
a1d15b3e 8;; Keywords: i18n
a2535589
JA
9
10;; This file is part of GNU Emacs.
11
12;; GNU Emacs is free software; you can redistribute it and/or modify
13;; it under the terms of the GNU General Public License as published by
e5167999 14;; the Free Software Foundation; either version 2, or (at your option)
a2535589
JA
15;; any later version.
16
17;; GNU Emacs is distributed in the hope that it will be useful,
18;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20;; GNU General Public License for more details.
21
22;; You should have received a copy of the GNU General Public License
b578f267
EN
23;; along with GNU Emacs; see the file COPYING. If not, write to the
24;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
25;; Boston, MA 02111-1307, USA.
a2535589 26
e5167999 27;;; Code:
a2535589 28
963fd070 29(put 'display-table 'char-table-extra-slots 6)
dc5a82ea 30
ef9c36a5
EN
31;;;###autoload
32(defun make-display-table ()
33 "Return a new, empty display table."
963fd070 34 (make-char-table 'display-table nil))
ef9c36a5
EN
35
36(or standard-display-table
37 (setq standard-display-table (make-display-table)))
38
963fd070
RS
39;;; Display-table slot names. The property value says which slot.
40
41(put 'truncation 'display-table-slot 0)
42(put 'wrap 'display-table-slot 1)
43(put 'escape 'display-table-slot 2)
44(put 'control 'display-table-slot 3)
45(put 'selective-display 'display-table-slot 4)
46(put 'vertical-border 'display-table-slot 5)
ef9c36a5
EN
47
48;;;###autoload
49(defun display-table-slot (display-table slot)
50 "Return the value of the extra slot in DISPLAY-TABLE named SLOT.
12c9fbcc
EN
51SLOT may be a number from 0 to 5 inclusive, or a slot name (symbol).
52Valid symbols are `truncation', `wrap', `escape', `control',
53`selective-display', and `vertical-border'."
ef9c36a5
EN
54 (let ((slot-number
55 (if (numberp slot) slot
963fd070 56 (or (get slot 'display-table-slot)
ef9c36a5
EN
57 (error "Invalid display-table slot name: %s" slot)))))
58 (char-table-extra-slot display-table slot-number)))
59
60;;;###autoload
61(defun set-display-table-slot (display-table slot value)
62 "Set the value of the extra slot in DISPLAY-TABLE named SLOT to VALUE.
63SLOT may be a number from 0 to 5 inclusive, or a name (symbol).
12c9fbcc
EN
64Valid symbols are `truncation', `wrap', `escape', `control',
65`selective-display', and `vertical-border'."
963fd070
RS
66 (let ((slot-number
67 (if (numberp slot) slot
68 (or (get slot 'display-table-slot)
69 (error "Invalid display-table slot name: %s" slot)))))
70 (set-char-table-extra-slot display-table slot-number value)))
ef9c36a5
EN
71
72;;;###autoload
e31b61e6 73(defun describe-display-table (dt)
49116ac0 74 "Describe the display table DT in a help buffer."
a2535589 75 (with-output-to-temp-buffer "*Help*"
03131799 76 (princ "\nTruncation glyph: ")
963fd070 77 (prin1 (display-table-slot dt 'truncation))
03131799 78 (princ "\nWrap glyph: ")
963fd070 79 (prin1 (display-table-slot dt 'wrap))
03131799 80 (princ "\nEscape glyph: ")
963fd070 81 (prin1 (display-table-slot dt 'escape))
03131799 82 (princ "\nCtrl glyph: ")
963fd070 83 (prin1 (display-table-slot dt 'control))
afb1e4b4 84 (princ "\nSelective display glyph sequence: ")
963fd070 85 (prin1 (display-table-slot dt 'selective-display))
dc5a82ea 86 (princ "\nVertical window border glyph: ")
963fd070 87 (prin1 (display-table-slot dt 'vertical-border))
afb1e4b4 88 (princ "\nCharacter display glyph sequences:\n")
bb6066c8
RS
89 (save-excursion
90 (set-buffer standard-output)
91 (let ((vector (make-vector 256 nil))
92 (i 0))
93 (while (< i 256)
94 (aset vector i (aref dt i))
95 (setq i (1+ i)))
5d74f2a6
KH
96 (describe-vector vector))
97 (help-mode))
a2535589
JA
98 (print-help-return-message)))
99
e31b61e6 100;;;###autoload
a2535589 101(defun describe-current-display-table ()
bb6066c8
RS
102 "Describe the display table in use in the selected window and buffer."
103 (interactive)
ef9c36a5
EN
104 (let ((disptab (or (window-display-table (selected-window))
105 buffer-display-table
106 standard-display-table)))
bb6066c8
RS
107 (if disptab
108 (describe-display-table disptab)
109 (message "No display table"))))
a2535589 110
e31b61e6 111;;;###autoload
a2535589 112(defun standard-display-8bit (l h)
49116ac0 113 "Display characters in the range L to H literally."
a2535589
JA
114 (while (<= l h)
115 (if (and (>= l ?\ ) (< l 127))
ef9c36a5 116 (aset standard-display-table l nil)
afb1e4b4 117 (aset standard-display-table l (vector l)))
a2535589
JA
118 (setq l (1+ l))))
119
798aa8d0
JB
120;;;###autoload
121(defun standard-display-default (l h)
122 "Display characters in the range L to H using the default notation."
123 (while (<= l h)
1c2c3f16
DL
124 (if (and (>= l ?\ ) (char-valid-p l))
125 (aset standard-display-table l nil))
798aa8d0
JB
126 (setq l (1+ l))))
127
a171458a
KH
128;; This function does NOT take terminal-dependent escape sequences.
129;; For that, you need to go through create-glyph. Use one of the
130;; other functions below, or roll your own.
ef9c36a5 131;;;###autoload
a2535589 132(defun standard-display-ascii (c s)
a171458a 133 "Display character C using printable string S."
ef9c36a5 134 (aset standard-display-table c (vconcat s)))
a2535589 135
e31b61e6 136;;;###autoload
a2535589 137(defun standard-display-g1 (c sc)
de7d5cb6
KH
138 "Display character C as character SC in the g1 character set.
139This function assumes that your terminal uses the SO/SI characters;
140it is meaningless for an X frame."
744bcf11 141 (if (memq window-system '(x w32))
de7d5cb6 142 (error "Cannot use string glyphs in a windowing system"))
a2535589 143 (aset standard-display-table c
82093c70 144 (vector (create-glyph (concat "\016" (char-to-string sc) "\017")))))
a2535589 145
e31b61e6 146;;;###autoload
a2535589 147(defun standard-display-graphic (c gc)
de7d5cb6
KH
148 "Display character C as character GC in graphics character set.
149This function assumes VT100-compatible escapes; it is meaningless for an
150X frame."
744bcf11 151 (if (memq window-system '(x w32))
de7d5cb6 152 (error "Cannot use string glyphs in a windowing system"))
a2535589 153 (aset standard-display-table c
82093c70 154 (vector (create-glyph (concat "\e(0" (char-to-string gc) "\e(B")))))
a2535589 155
e31b61e6 156;;;###autoload
a2535589
JA
157(defun standard-display-underline (c uc)
158 "Display character C as character UC plus underlining."
a2535589 159 (aset standard-display-table c
de7d5cb6
KH
160 (vector
161 (if window-system
30c5ceb4 162 (logior uc (lsh (face-id 'underline) 19))
de7d5cb6 163 (create-glyph (concat "\e[4m" (char-to-string uc) "\e[m"))))))
03131799 164
e31b61e6 165;;;###autoload
03131799 166(defun create-glyph (string)
b8fbaf52 167 "Allocate a glyph code to display by sending STRING to the terminal."
03131799
RS
168 (if (= (length glyph-table) 65536)
169 (error "No free glyph codes remain"))
03fd83c5
KH
170 ;; Don't use slots that correspond to ASCII characters.
171 (if (= (length glyph-table) 32)
172 (setq glyph-table (vconcat glyph-table (make-vector 224 nil))))
03131799
RS
173 (setq glyph-table (vconcat glyph-table (list string)))
174 (1- (length glyph-table)))
a2535589 175
2eae7226 176;;;###autoload
951bc45f 177(defun standard-display-european (arg)
3fbd8622 178 "Semi-obsolete way to toggle display of ISO 8859 European characters.
3ea1bd50 179
3fbd8622
KH
180This function is semi-obsolete; if you want to do your editing with
181unibyte characters, it is better to `set-language-environment' coupled
182with either the `--unibyte' option or the EMACS_UNIBYTE environment
183variable, or else customize `enable-multibyte-characters'.
828fac3a 184
3fbd8622
KH
185With prefix argument, this command enables European character display
186if arg is positive, disables it otherwise. Otherwise, it toggles
187European character display.
b2b52747 188
3fbd8622
KH
189When this mode is enabled, characters in the range of 160 to 255
190display not as octal escapes, but as accented characters. Codes 146
191and 160 display as apostrophe and space, even though they are not the
192ASCII codes for apostrophe and space.
40e82ac1 193
3fbd8622
KH
194Enabling European character display with this command noninteractively
195from Lisp code also selects Latin-1 as the language environment, and
196selects unibyte mode for all Emacs buffers \(both existing buffers and
197those created subsequently). This provides increased compatibility
198for users who call this function in `.emacs'."
f5af76c2 199
c3a14a2b 200 (if (or (<= (prefix-numeric-value arg) 0)
2eae7226 201 (and (null arg)
ef9c36a5 202 (char-table-p standard-display-table)
55f5abaf 203 ;; Test 161, because 160 displays as a space.
e470e6f0 204 (equal (aref standard-display-table 161) [161])))
3304a6c4
RS
205 (progn
206 (standard-display-default 160 255)
3fbd8622 207 (unless (or (memq window-system '(x w32))
951bc45f 208 (interactive-p))
3fbd8622
KH
209 (and (terminal-coding-system)
210 (set-terminal-coding-system nil))))
211 ;; If the user does this explicitly from Lisp (as in .emacs),
40e82ac1 212 ;; turn off multibyte chars for more compatibility.
951bc45f 213 (unless (interactive-p)
65c9d785 214 (setq-default enable-multibyte-characters nil)
3ea1bd50
RS
215 (mapcar (lambda (buffer)
216 (with-current-buffer buffer
217 (if enable-multibyte-characters
218 (set-buffer-multibyte nil))))
219 (buffer-list)))
eb72c1bd
RS
220 ;; If the user does this explicitly,
221 ;; switch to Latin-1 language environment
222 ;; unless some other has been specified.
951bc45f 223 (unless (interactive-p)
eb72c1bd
RS
224 (if (equal current-language-environment "English")
225 (set-language-environment "latin-1")))
3fbd8622 226 (unless (or noninteractive (memq window-system '(x w32))
951bc45f
PE
227 (interactive-p))
228 ;; Send those codes literally to a character-based terminal.
229 ;; If we are using single-byte characters,
230 ;; it doesn't matter which coding system we use.
4e633bb8 231 (set-terminal-coding-system
951bc45f
PE
232 (let ((c (intern (downcase current-language-environment))))
233 (if (coding-system-p c) c 'latin-1))))
eb72c1bd 234 (standard-display-european-internal)))
798aa8d0 235
a2535589 236(provide 'disp-table)
c0274f38
ER
237
238;;; disp-table.el ends here