1 ;;; latin1-disp.el --- display tables for other ISO 8859 on Latin-1 terminals -*- coding: emacs-mule -*-
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 beacuse we're on a tty or beacuse 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 as 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."
64 (defcustom latin1-display-format
"{%s}"
65 "A format string used to display the ASCII sequences.
66 The default encloses the sequence in braces, but you could just use
67 \"%s\" to avoid the braces."
68 :group
'latin1-display
72 (defcustom latin1-display nil
73 "Set up Latin-1/ASCII display for ISO8859 character sets.
74 This is done for each character set in the list `latin1-display-sets',
75 if no font is available to display it. Characters are displayed using
76 the corresponding Latin-1 characters where they match. Otherwise
77 ASCII sequences are used, mostly following the Latin prefix input
78 methods. Some different ASCII sequences are used if
79 `latin1-display-mnemonic' is non-nil.
81 Setting this variable directly does not take effect;
82 use either M-x customize of the function `latin1-display'."
83 :group
'latin1-display
86 :initialize
'custom-initialize-default
87 :set
(lambda (symbol value
)
88 (set-default symbol value
)
90 #'latin1-display-setup
91 #'latin1-display-reset
)
96 (defun latin1-display (&rest sets
)
97 "Set up Latin-1/ASCII display for the arguments character SETS.
98 See option `latin1-display' for the method. The members of the list
99 must be in `latin1-display-sets'. With no arguments, reset the
100 display for all of `latin1-display-sets'. See also `latin1-display-setup'."
102 (mapc #'latin1-display-setup sets
)
103 (mapc #'latin1-display-reset latin1-display-sets
)))
105 (defcustom latin1-display-mnemonic nil
106 "Non-nil means to display potentially more mnemonic sequences.
107 These are taken from the tables in `internal.el' rather than the Quail
110 :group
'latin1-display
)
112 (defun latin1-display-char (char display
&optional alt-display
)
113 "Make an entry in `standard-display-table' for CHAR using string DISPLAY.
114 If ALT-DISPLAY is provided, use that instead if
115 `latin1-display-mnemonic' is non-nil. The actual string displayed is
116 formatted using `latin1-display-format'."
117 (if (and (stringp alt-display
)
118 latin1-display-mnemonic
)
119 (setq display alt-display
))
120 (if (stringp display
)
121 (standard-display-ascii char
(format latin1-display-format display
))
122 (aset standard-display-table char display
)))
124 (defun latin1-display-identities (charset)
125 "Display each character in CHARSET as the corresponding Latin-1 character.
126 CHARSET is a symbol naming a language environment using an ISO8859
128 (if (eq charset
'cyrillic
)
129 (setq charset
'cyrillic-iso
))
131 (set (car (remq 'ascii
(get-language-info charset
'charset
)))))
133 (aset standard-display-table
135 (vector (make-char 'latin-iso8859-1 i
)))
138 (defun latin1-display-reset (language)
139 "Set up the default display for each character of LANGUAGE's charset.
140 CHARSET is a symbol naming a language environment using an ISO8859
142 (if (eq language
'cyrillic
)
143 (setq language
'cyrillic-iso
))
144 (let ((charset (car (remq 'ascii
(get-language-info language
146 (standard-display-default (make-char charset
32)
147 (make-char charset
127)))
150 (defun latin1-display-check-font (language)
151 "Return non-nil if we have a font with an encoding for LANGUAGE.
152 LANGUAGE is a symbol naming a language environment using an ISO8859
153 character set: `latin-2', `hebrew' etc."
154 (if (eq language
'cyrillic
)
155 (setq language
'cyrillic-iso
))
156 (let* ((info (get-language-info language
'charset
))
157 (char (make-char (car (remq 'ascii info
)) ?\
)))
158 (latin1-char-displayable-p char
)))
160 ;; This should be moved into mule-utils or somewhere after 21.1.
161 (defun latin1-char-displayable-p (char)
163 ;; Single byte characters are always displayable.
165 ((display-multi-font-p)
166 ;; On a window system, a character is displayable if we have
167 ;; a font for that character in the default face of the
168 ;; currently selected frame.
169 (let ((fontset (frame-parameter (selected-frame) 'font
))
171 (if (query-fontset fontset
)
172 (setq font-pattern
(fontset-font fontset char
)))
174 (setq font-pattern
(fontset-font "fontset-default" char
)))
177 ;; Now FONT-PATTERN is a string or a cons of family
178 ;; field pattern and registry field pattern.
179 (or (stringp font-pattern
)
180 (setq font-pattern
(concat (or (car font-pattern
) "*")
182 (cdr font-pattern
))))
183 (x-list-fonts font-pattern
'default
(selected-frame) 1)))))
185 (let ((coding (terminal-coding-system)))
187 (let ((safe-chars (coding-system-get coding
'safe-chars
))
188 (safe-charsets (coding-system-get coding
'safe-charsets
)))
190 (aref safe-chars char
))
192 (memq (char-charset char
) safe-charsets
)))))))))
194 (defun latin1-display-setup (set &optional force
)
195 "Set up Latin-1 display for characters in the given SET.
196 SET must be a member of `latin1-display-sets'. Normally, check
197 whether a font for SET is available and don't set the display if it
198 is. If FORCE is non-nil, set up the display regardless."
202 (not (latin1-display-check-font set
)))
203 (latin1-display-identities set
)
206 (apply 'latin1-display-char l
))
257 (?
\82·
"~v" "'<") ; ?\82¢ in latin-pre
266 (?
\82·
"'<") ; Lynx's rendering of caron
271 (not (latin1-display-check-font set
)))
272 (latin1-display-identities set
)
275 (apply 'latin1-display-char l
))
303 (?
\83ÿ
"/." "^.")))))
307 (not (latin1-display-check-font set
)))
308 (latin1-display-identities set
)
311 (apply 'latin1-display-char l
))
364 (not (latin1-display-check-font set
)))
365 (latin1-display-identities set
)
368 (apply 'latin1-display-char l
))
374 (?
\8dê
"^e" "e<") ; from latin-post
376 (?
\8dï
"\"i" "i-") ; from latin-post
377 (?
\8dý
".i" "i.")))))
381 (not (latin1-display-check-font set
)))
382 (latin1-display-identities set
)
385 (apply 'latin1-display-char l
))
420 (not (latin1-display-check-font set
)))
421 (latin1-display-identities set
)
424 (apply 'latin1-display-char l
))
436 (not (latin1-display-check-font set
)))
439 (apply 'latin1-display-char l
))
500 (aset standard-display-table
(car l
) (string-to-vector (cadr l
))))
519 (not (latin1-display-check-font set
)))
520 ;; Don't start with identities, since we don't have definitions
521 ;; for a lot of Hebrew in internal.el. (Intlfonts is also
522 ;; missing some glyphs.)
525 (aset standard-display-table
526 (make-char 'hebrew-iso8859-8 i
)
527 (vector (make-char 'latin-iso8859-1 i
)))
531 (aset standard-display-table
(car l
) (string-to-vector (cadr l
))))
562 (setq set
'cyrillic-iso
)
564 (not (latin1-display-check-font set
)))
567 (apply 'latin1-display-char l
))
636 (aset standard-display-table
(car l
) (string-to-vector (cadr l
))))
667 (t (error "Unsupported character set: %S" set
)))
671 (provide 'latin1-disp
)
673 ;;; latin1-disp.el ends here