1 ;;; latin1-disp.el --- display tables for other ISO 8859 on Latin-1 terminals -*- coding: iso-2022-7bit -*-
3 ;; Copyright (C) 2000 Free Software Foundation, Inc.
5 ;; Author: Dave Love <fx@gnu.org>
8 ;; This file is part of GNU Emacs.
10 ;; GNU Emacs is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; GNU Emacs is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
27 ;; This package sets up display of ISO 8859-n for n>1 by substituting
28 ;; Latin-1 characters and sequences of them for characters which can't
29 ;; be displayed, either because we're on a tty or because we don't
30 ;; have the relevant window system fonts available. For instance,
31 ;; Latin-9 is very similar to Latin-1, so we can display most Latin-9
32 ;; characters using the Latin-1 characters at the same code point and
33 ;; fall back on more-or-less mnemonic ASCII sequences for the rest.
35 ;; For the Latin charsets the ASCII sequences are mostly consistent
36 ;; with the Quail prefix input sequences. Latin-4 uses the Quail
37 ;; postfix sequences since a prefix method isn't defined for Latin-4.
39 ;; [A different approach is taken in the DOS display tables in
40 ;; term/internal.el, and the relevant ASCII sequences from there are
41 ;; available as an alternative; see `latin1-display-mnemonic'. Only
42 ;; these sequences are used for Cyrillic, Greek and Hebrew.]
44 ;; If you don't even have Latin-1, see iso-ascii.el and use the
45 ;; complete tables from internal.el. The ASCII sequences used here
46 ;; are mostly in the same style as iso-ascii.
50 ;; Ensure `standard-display-table' is set up:
53 (defconst latin1-display-sets
'(latin-2 latin-3 latin-4 latin-5 latin-8
54 latin-9 cyrillic greek hebrew
)
55 "The ISO8859 character sets with defined Latin-1 display sequences.
56 These are the nicknames for the sets and correspond to Emacs language
59 (defgroup latin1-display
()
60 "Set up display tables for ISO8859 characters using Latin-1."
62 :link
'(emacs-commentary-link "latin1-disp")
65 (defcustom latin1-display-format
"{%s}"
66 "A format string used to display the ASCII sequences.
67 The default encloses the sequence in braces, but you could just use
68 \"%s\" to avoid the braces."
69 :group
'latin1-display
73 (defcustom latin1-display nil
74 "Set up Latin-1/ASCII display for ISO8859 character sets.
75 This is done for each character set in the list `latin1-display-sets',
76 if no font is available to display it. Characters are displayed using
77 the corresponding Latin-1 characters where they match. Otherwise
78 ASCII sequences are used, mostly following the Latin prefix input
79 methods. Some different ASCII sequences are used if
80 `latin1-display-mnemonic' is non-nil.
82 Setting this variable directly does not take effect;
83 use either M-x customize of the function `latin1-display'."
84 :group
'latin1-display
87 :initialize
'custom-initialize-default
88 :set
(lambda (symbol value
)
89 (set-default symbol value
)
91 #'latin1-display-setup
92 #'latin1-display-reset
)
97 (defun latin1-display (&rest sets
)
98 "Set up Latin-1/ASCII display for the arguments character SETS.
99 See option `latin1-display' for the method. The members of the list
100 must be in `latin1-display-sets'. With no arguments, reset the
101 display for all of `latin1-display-sets'. See also `latin1-display-setup'."
103 (progn (mapc #'latin1-display-setup sets
)
104 (setq latin1-display t
))
105 (mapc #'latin1-display-reset latin1-display-sets
)
106 (setq latin1-display nil
))
109 (defcustom latin1-display-mnemonic nil
110 "Non-nil means to display potentially more mnemonic sequences.
111 These are taken from the tables in `internal.el' rather than the Quail
114 :group
'latin1-display
)
116 (defun latin1-display-char (char display
&optional alt-display
)
117 "Make an entry in `standard-display-table' for CHAR using string DISPLAY.
118 If ALT-DISPLAY is provided, use that instead if
119 `latin1-display-mnemonic' is non-nil. The actual string displayed is
120 formatted using `latin1-display-format'."
121 (if (and (stringp alt-display
)
122 latin1-display-mnemonic
)
123 (setq display alt-display
))
124 (if (stringp display
)
125 (standard-display-ascii char
(format latin1-display-format display
))
126 (aset standard-display-table char display
)))
128 (defun latin1-display-identities (charset)
129 "Display each character in CHARSET as the corresponding Latin-1 character.
130 CHARSET is a symbol which is the nickname of a language environment
131 using an ISO8859 character set."
132 (if (eq charset
'cyrillic
)
133 (setq charset
'cyrillic-iso
))
135 (set (car (remq 'ascii
(get-language-info charset
'charset
)))))
137 (aset standard-display-table
139 (vector (make-char 'latin-iso8859-1 i
)))
142 (defun latin1-display-reset (language)
143 "Set up the default display for each character of LANGUAGE's charset.
144 LANGUAGE is a symbol naming a language environment using an ISO8859
146 (if (eq language
'cyrillic
)
147 (setq language
'cyrillic-iso
))
148 (let ((charset (car (remq 'ascii
(get-language-info language
150 (standard-display-default (make-char charset
32)
151 (make-char charset
127)))
154 (defun latin1-display-check-font (language)
155 "Return non-nil if we have a font with an encoding for LANGUAGE.
156 LANGUAGE is a symbol naming a language environment using an ISO8859
157 character set: `latin-2', `hebrew' etc."
158 (if (eq language
'cyrillic
)
159 (setq language
'cyrillic-iso
))
160 (let* ((info (get-language-info language
'charset
))
161 (char (make-char (car (remq 'ascii info
)) ?\
)))
162 (latin1-char-displayable-p char
)))
164 ;; This should be moved into mule-utils or somewhere after 21.1.
165 (defun latin1-char-displayable-p (char)
167 ;; Single byte characters are always displayable.
169 ((display-multi-font-p)
170 ;; On a window system, a character is displayable if we have
171 ;; a font for that character in the default face of the
172 ;; currently selected frame.
173 (let ((fontset (frame-parameter (selected-frame) 'font
))
175 (if (query-fontset fontset
)
176 (setq font-pattern
(fontset-font fontset char
)))
178 (setq font-pattern
(fontset-font "fontset-default" char
)))
181 ;; Now FONT-PATTERN is a string or a cons of family
182 ;; field pattern and registry field pattern.
183 (or (stringp font-pattern
)
184 (setq font-pattern
(concat (or (car font-pattern
) "*")
186 (cdr font-pattern
))))
187 (x-list-fonts font-pattern
'default
(selected-frame) 1)))))
189 (let ((coding (terminal-coding-system)))
191 (let ((safe-chars (coding-system-get coding
'safe-chars
))
192 (safe-charsets (coding-system-get coding
'safe-charsets
)))
194 (aref safe-chars char
))
196 (memq (char-charset char
) safe-charsets
)))))))))
198 (defun latin1-display-setup (set &optional force
)
199 "Set up Latin-1 display for characters in the given SET.
200 SET must be a member of `latin1-display-sets'. Normally, check
201 whether a font for SET is available and don't set the display if it
202 is. If FORCE is non-nil, set up the display regardless."
206 (not (latin1-display-check-font set
)))
207 (latin1-display-identities set
)
210 (apply 'latin1-display-char l
))
211 '((?
\e,BF
\e(B "'C" "C'")
212 (?
\e,BP
\e(B "'D" "/D")
213 (?
\e,B
&\e(B "'S" "S'")
214 (?
\e,Bf
\e(B "'c" "c'")
215 (?
\e,Bp
\e(B "'d" "/d")
216 (?
\e,BE
\e(B "'L" "L'")
217 (?
\e,Bq
\e(B "'n" "n'")
218 (?
\e,BQ
\e(B "'N" "N'")
219 (?
\e,B
`\e(B "'r" "r'")
220 (?
\e,B
@\e(B "'R" "R'")
221 (?
\e,B6
\e(B "'s" "s'")
222 (?
\e,B
<\e(B "'z" "z'")
223 (?
\e,B
,\e(B "'Z" "Z'")
224 (?
\e,B
!\e(B "`A" "A;")
225 (?
\e,BJ
\e(B "`E" "E;")
226 (?
\e,B
#\e(B "`L" "/L")
227 (?
\e,B
*\e(B "`S" ",S")
228 (?
\e,B^
\e(B "`T" ",T")
229 (?
\e,B
/\e(B "`Z" "Z^.")
230 (?
\e,B1
\e(B "`a" "a;")
231 (?
\e,B3
\e(B "`l" "/l")
232 (?
\e,Bj
\e(B "`e" "e;")
233 (?
\e,B
:\e(B "`s" ",s")
234 (?
\e,B~
\e(B "`t" ",t")
235 (?
\e,B?
\e(B "`z" "z^.")
236 (?
\e,B
\x7f\e(B "`." "'.")
237 (?
\e,BC
\e(B "~A" "A(")
238 (?
\e,BH
\e(B "~C" "C<")
239 (?
\e,BO
\e(B "~D" "D<")
240 (?
\e,BL
\e(B "~E" "E<")
241 (?
\e,Bl
\e(B "~e" "e<")
242 (?
\e,B%
\e(B "~L" "L<")
243 (?
\e,BR
\e(B "~N" "N<")
244 (?
\e,BU
\e(B "~O" "O''")
245 (?
\e,BX
\e(B "~R" "R<")
246 (?
\e,B
)\e(B "~S" "S<")
247 (?
\e,B
+\e(B "~T" "T<")
248 (?
\e,B
[\e(B "~U" "U''")
249 (?
\e,B.
\e(B "~Z" "Z<")
250 (?
\e,Bc
\e(B "~a" "a(}")
251 (?
\e,Bh
\e(B "~c" "c<")
252 (?
\e,Bo
\e(B "~d" "d<")
253 (?
\e,B5
\e(B "~l" "l<")
254 (?
\e,Br
\e(B "~n" "n<")
255 (?
\e,Bu
\e(B "~o" "o''")
256 (?
\e,Bx
\e(B "~r" "r<")
257 (?
\e,B9
\e(B "~s" "s<")
258 (?
\e,B
;\e(B "~t" "t<")
259 (?
\e,B
{\e(B "~u" "u''")
260 (?
\e,B
>\e(B "~z" "z<")
261 (?
\e,B7
\e(B "~v" "'<") ; ?\e,B"\e(B in latin-pre
262 (?
\e,B
"\e(B "~~
" "'(")
263 (?\e,By\e(B "uu
" "u^
0")
264 (?\e,BY\e(B "UU
" "U^
0")
267 (?\e,BK\e(B "\"E
" "E
:")
269 (?\e,B=\e(B "''" "'")
270 (?\e,B7\e(B "'<") ; Lynx's rendering of caron
275 (not (latin1-display-check-font set)))
276 (latin1-display-identities set)
279 (apply 'latin1-display-char l))
281 (?\e,C"\e(B "~`" "'(")
282 (?
\e,C
&\e(B "^H" "H^")
283 (?
\e,C6
\e(B "^h" "h^")
284 (?
\e,C
)\e(B ".I" "I^.")
286 (?
\e,C
+\e(B "~G" "G(")
287 (?
\e,C
,\e(B "^J" "J^")
288 (?
\e,C
/\e(B ".Z" "Z^.")
290 (?
\e,C9
\e(B ".i" "i^.")
292 (?
\e,C
;\e(B "~g" "g(")
293 (?
\e,C
<\e(B "^j" "j^")
294 (?
\e,C?
\e(B ".Z" "z^.")
295 (?
\e,CE
\e(B ".c" "C^.")
296 (?
\e,CF
\e(B "^C" "C^")
297 (?
\e,CU
\e(B ".G" "G^.")
298 (?
\e,CX
\e(B "^G" "G^")
299 (?
\e,C
]\e(B "~U" "U(")
300 (?
\e,C^
\e(B "^S" "S^")
301 (?
\e,Ce
\e(B ".C" "c^.")
302 (?
\e,Cf
\e(B "^c" "c^")
303 (?
\e,Cu
\e(B ".g" "g^.")
304 (?
\e,Cx
\e(B "^g" "g^")
305 (?
\e,C
}\e(B "~u" "u(")
306 (?
\e,C~
\e(B "^s" "s^")
307 (?
\e,C
\x7f\e(B "/." "^.")))))
311 (not (latin1-display-check-font set
)))
312 (latin1-display-identities set
)
315 (apply 'latin1-display-char l
))
316 '((?
\e,D
!\e(B "A," "A;")
317 (?
\e,D
"\e(B "k
/" "kk
")
318 (?\e,D#\e(B "R
," ",R
")
319 (?\e,D%\e(B "I~
" "?I
")
320 (?\e,D&\e(B "L
," ",L
")
321 (?\e,D)\e(B "S~
" "S
<")
323 (?\e,D+\e(B "G
," ",G
")
324 (?\e,D,\e(B "T
/" "/T
")
325 (?\e,D.\e(B "Z~
" "Z
<")
326 (?\e,D1\e(B "a
," "a
;")
328 (?
\e,D3
\e(B "r," ",r")
329 (?
\e,D5
\e(B "i~" "~i")
330 (?
\e,D6
\e(B "l," ",l")
332 (?
\e,D9
\e(B "s~" "s<")
334 (?
\e,D
;\e(B "g," ",g")
335 (?
\e,D
<\e(B "t/" "/t")
336 (?
\e,D
=\e(B "N/" "NG")
337 (?
\e,D
>\e(B "z~" "z<")
338 (?
\e,D?
\e(B "n/" "ng")
340 (?
\e,DG
\e(B "I," "I;")
341 (?
\e,DH
\e(B "C~" "C<")
342 (?
\e,DJ
\e(B "E," "E;")
343 (?
\e,DL
\e(B "E." "E^.")
345 (?
\e,DQ
\e(B "N," ",N")
347 (?
\e,DS
\e(B "K," ",K")
348 (?
\e,DY
\e(B "U," "U;")
349 (?
\e,D
]\e(B "U~" "~U")
352 (?
\e,Dg
\e(B "i," "i;")
353 (?
\e,Dh
\e(B "c~" "c<")
354 (?
\e,Dj
\e(B "e," "e;")
355 (?
\e,Dl
\e(B "e." "e^.")
357 (?
\e,Dp
\e(B "d/" "/d")
358 (?
\e,Dq
\e(B "n," ",n")
360 (?
\e,Ds
\e(B "k," ",k")
361 (?
\e,Dy
\e(B "u," "u;")
362 (?
\e,D
}\e(B "u~" "~u")
364 (?
\e,D
\x7f\e(B "^.")))))
368 (not (latin1-display-check-font set
)))
369 (latin1-display-identities set
)
372 (apply 'latin1-display-char l
))
373 '((?
\e,Mp
\e(B "~g" "g(")
374 (?
\e,MP
\e(B "~G" "G(")
375 (?
\e,M
]\e(B ".I" "I^.")
378 (?
\e,Mj
\e(B "^e" "e<") ; from latin-post
379 (?
\e,Ml
\e(B ".e" "e^.")
380 (?
\e,Mo
\e(B "\"i" "i-") ; from latin-post
381 (?
\e,M
}\e(B ".i" "i.")))))
385 (not (latin1-display-check-font set
)))
386 (latin1-display-identities set
)
389 (apply 'latin1-display-char l
))
390 '((?
\e,_
!\e(B ".B" "B`")
391 (?
\e,_
"\e(B ".b
" "b
`")
392 (?\e,_%\e(B ".c
" "c
`")
393 (?\e,_$\e(B ".C
" "C
`")
394 (?\e,_&\e(B ".D
" "D
`")
395 (?\e,_+\e(B ".d
" "d
`")
398 (?\e,_:\e(B "'w
" "w
'")
399 (?\e,_*\e(B "'W
" "W
'")
402 (?\e,_1\e(B ".f
" "f
`")
403 (?\e,_0\e(B ".F
" "F
`")
404 (?\e,_3\e(B ".g
" "g
`")
405 (?\e,_2\e(B ".G
" "G
`")
406 (?\e,_5\e(B ".m
" "m
`")
407 (?\e,_4\e(B ".M
" "M
`")
408 (?\e,_9\e(B ".p
" "p
`")
409 (?\e,_7\e(B ".P
" "P
`")
410 (?\e,_?\e(B ".s
" "s
`")
411 (?\e,_;\e(B ".S
" "S
`")
414 (?\e,_p\e(B "^w
" "w^
")
415 (?\e,_P\e(B "^W
" "W^
")
416 (?\e,_w\e(B ".t
" "t
`")
417 (?\e,_W\e(B ".T
" "T
`")
418 (?\e,_~\e(B "^y
" "y^
")
419 (?\e,_^\e(B "^Y
" "Y^
")
420 (?\e,_/\e(B "\"Y
")))))
424 (not (latin1-display-check-font set)))
425 (latin1-display-identities set)
428 (apply 'latin1-display-char l))
429 '((?\e,b(\e(B "~s
" "s
<")
430 (?\e,b&\e(B "~S
" "S
<")
431 (?\e,b$\e(B "Euro
" "E
=")
432 (?\e,b8\e(B "~z
" "z
<")
433 (?\e,b4\e(B "~Z
" "Z
<")
436 (?\e,b<\e(B "OE
")))))
440 (not (latin1-display-check-font set)))
443 (apply 'latin1-display-char l))
504 (aset standard-display-table
(car l
) (string-to-vector (cadr l
))))
523 (not (latin1-display-check-font set
)))
524 ;; Don't start with identities, since we don't have definitions
525 ;; for a lot of Hebrew in internal.el. (Intlfonts is also
526 ;; missing some glyphs.)
529 (aset standard-display-table
530 (make-char 'hebrew-iso8859-8 i
)
531 (vector (make-char 'latin-iso8859-1 i
)))
535 (aset standard-display-table
(car l
) (string-to-vector (cadr l
))))
563 (?
\e,Hz
\e(B "T+")))))
566 (setq set
'cyrillic-iso
)
568 (not (latin1-display-check-font set
)))
571 (apply 'latin1-display-char l
))
637 (?\e,L\x7f\e(B "dzh
")))
640 (aset standard-display-table (car l) (string-to-vector (cadr l))))
641 '((?\e,L!\e(B "\e,AK
\e(B")
644 (?\e,L'\e(B "\e,AO
\e(B")
646 (?\e,Lq\e(B "\e,Ak
\e(B")
647 (?\e,L}\e(B "\e,A
'\e(B")
668 (?\e,Lw\e(B "\e,Ao
\e(B")
671 (t (error "Unsupported character set
: %S
" set)))
675 (provide 'latin1-disp)
677 ;;; latin1-disp.el ends here