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