root/trunk/lisp/term/internal.el

Revision 4220, 33.3 kB (checked in by miyoshi, 9 months ago)

Sync up with Emacs22.2.

  • Property svn:eol-style set to LF
Line 
1 ;;; internal.el --- support for PC internal terminal -*- coding: raw-text; no-byte-compile: t -*-
2
3 ;; Copyright (C) 1993, 1994, 1998, 1999, 2001, 2002, 2003, 2004,
4 ;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
5
6 ;; Author: Morten Welinder <terra@diku.dk>
7
8 ;; This file is part of GNU Emacs.
9
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 3, or (at your option)
13 ;; any later version.
14
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.
19
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., 51 Franklin Street, Fifth Floor,
23 ;; Boston, MA 02110-1301, USA.
24
25 ;;; Commentary:
26
27 ;;; Code:
28
29 ;; ---------------------------------------------------------------------------
30 ;; keyboard setup -- that's simple!
31 (set-input-mode nil nil 0)
32 (define-key function-key-map [backspace] "\177") ; Normal behaviour for BS
33 (define-key function-key-map [delete] "\C-d")    ; ... and Delete
34 (define-key function-key-map [tab] [?\t])
35 (define-key function-key-map [linefeed] [?\n])
36 (define-key function-key-map [clear] [11])
37 (define-key function-key-map [return] [13])
38 (define-key function-key-map [escape] [?\e])
39 (define-key function-key-map [M-backspace] [?\M-\d])
40 (define-key function-key-map [M-delete] [?\M-d])
41 (define-key function-key-map [M-tab] [?\M-\t])
42 (define-key function-key-map [M-linefeed] [?\M-\n])
43 (define-key function-key-map [M-clear] [?\M-\013])
44 (define-key function-key-map [M-return] [?\M-\015])
45 (define-key function-key-map [M-escape] [?\M-\e])
46 (put 'backspace 'ascii-character 127)
47 (put 'delete 'ascii-character 127)
48 (put 'tab 'ascii-character ?\t)
49 (put 'linefeed 'ascii-character ?\n)
50 (put 'clear 'ascii-character 12)
51 (put 'return 'ascii-character 13)
52 (put 'escape 'ascii-character ?\e)
53
54 ;; ----------------------------------------------------------------------
55 ;;   DOS display setup
56 ;;   =================
57 ;;
58 ;;   DOS can only support a single font.  On most systems (with the
59 ;;   possible exception of Far Eastern DOS versions), this means that
60 ;;   two character sets are available at any given time: the ASCII
61 ;;   charset, and a single national charset, usually mapped to codes
62 ;;   above 128 (i.e., with 8th bit set).  Which national charset is
63 ;;   supported depends on the codepage loaded by the system when it
64 ;;   boots; usually, this codepage cannot be changed without
65 ;;   rebooting.
66 ;;
67 ;;   Since each codepage can usually display character of a single
68 ;;   MULE charset, Emacs can display a single MULE charset with the
69 ;;   glyphs of the current codepage.  The mapping from DOS codepages
70 ;;   to MULE charsets is established by the charset property of the
71 ;;   cpNNN-decode-table variables in codepage.el, which also
72 ;;   defines translation tables for each such pair, and a bunch of
73 ;;   functions to generate coding systems that use those translation
74 ;;   tables to convert codepage-encoded text to the appropriate MULE
75 ;;   charset and back.  When Emacs starts on DOS, it automatically
76 ;;   sets its default coding systems for file I/O and terminal output
77 ;;   according to the currend DOS codepage, given by the
78 ;;   `dos-codepage' variable.
79 ;;
80 ;;   This leaves us with the problem of displaying character sets
81 ;;   other than the one which maps directly into the current codepage.
82 ;;   The following functions and variables handle this nuisance by
83 ;;   defining a display table where each character that doesn't have a
84 ;;   glyph in some codepage is mapped to a string which represents it.
85 ;;   For example, a small c with cedilla is mapped to the string
86 ;;   "{,c}" (the braces serve as a sign that this is a single
87 ;;   character).  A nice feature of the display tables is that Emacs
88 ;;   knows that the string represents a single character, and thus
89 ;;   cursor motion works as you'd expect: a single `C-f' moves past
90 ;;   the entire string which represents a single character.
91 ;; ----------------------------------------------------------------------
92
93 (defvar IT-character-translations
94   '(
95     (latin-iso8859-1
96      . [255 "!I" "|c" "Pd" "$$" "Ye" "|" "SE" "\"" "(c)"
97         "_a" "<<" "~" "--" "(R)" "'-" "^o" "+-" "^2" "^3"
98         "'" "u" ".P" "^." "'," "^1" "_o" ">>" "1/4" "1/2"
99         "3/4" "?I" "`A" "A'" "A^" "~A" "\"A" "Ao" "AE" ",C"
100         "`E" "E'" "E^" "\"E" "`I" "I'" "I^" "\"I" "-D" "~N"
101         "`O" "O'" "O^" "~O" "\"O" "*x" "/O" "`U" "U'" "U^"
102         "\"U" "Y'" "-P" "ss" "`a" "a'" "a^" "~a" "\"a" "ao"
103         "ae" ",c" "`e" "e'" "e^" "\"e" "`i" "i'" "i^" "\"i"
104         "-d" "~n" "`o" "o'" "o^" "~o" "\"o" "-:" "/o" "`u"
105         "u'" "u^" "\"u" "y'" "-p" "\"y"]
106      )
107     (latin-iso8859-2
108      . [255 "A;" "'(" "/L" "$$" "L<" "S'" "SE" "\"" "S<"
109         ",S" "T<" "Z'" "--" "Z<" "Z^." "^o" "a;" "';" "/l"
110         "'" "l<" "s'" "'<" "'," "s<" ",s" "t<" "z'" "'"
111         "z<" "z^." "R'" "A'" "A^" "A(" "\"A" "L'" "C'" ",C"
112         "C<" "E'" "E;" "E:" "E<" "I'" "I^" "D<" "/D" "N'"
113         "N<" "O'" "O^" "O''" "\"O" "*x" "R<" "U^0" "U'" "U''"
114         "\"U" "Y'" ",T" "ss" "r'" "a'" "a^" "a(" "\"a" "l'"
115         "c'" ",c" "c<" "e'" "e;" "\"e" "e<" "i'" "i^" "d<"
116         "/d" "n'" "n<" "o'" "o^" "o''" "\"o" "-:" "r<" "u^0"
117         "u'" "u''" "\"u" "y'" ",t" "'."]
118      )
119     (latin-iso8859-3
120      . [255 "/H" "'(" "Pd" "$$" " " "H^" "SE" "\"" "I^."
121         ",S" "G(" "J^" "--" " " "Z^." "^o" "/h" "^2" "^3"
122         "'" "u" "h^" "." "'," "i^." ",s" "g(" "j^" "1/2"
123         " " "z^." "`A" "A'" "A^" " " "\"A" "C^." "C^" ",C"
124         "`E" "E'" "E^" "\"E" "`I" "I'" "I^" "\"I" " " "~N"
125         "`O" "O'" "O^" "G^." "\"O" "*x" "G^" "`U" "U'" "U^"
126         "\"U" "U(" "S^" "ss" "`a" "a'" "a^" " " "\"a" "c^."
127         "c^" ",c" "`e" "e'" "e^" "\"e" "`i" "i'" "i^" "\"i"
128         " " "~n" "`o" "o'" "o^" "g^." "\"o" "-:" "g^" "`u"
129         "u'" "u^" "\"u" "u(" "s^" "^."]
130      )
131     (latin-iso8859-4
132      . [255 "A;" "kk" ",R" "$$" "?I" ",L" "SE" "\"" "S<"
133         "E-" ",G" "/T" "--" "Z<" "'-" "^o" "a;" "';" ",r"
134         "'" "~i" ",l" "'<" "'," "s<" "e-" ",g" "/t" "NG"
135         "z<" "ng" "A-" "A'" "A^" "~A" "\"A" "Ao" "AE" "I;"
136         "C<" "E'" "E;" "\"E" "E^." "I'" "I^" "I-" "/D" ",N"
137         "O-" ",K" "O^" "~O" "\"O" "*x" "/O" "U;" "U'" "U^"
138         "\"U" "~U" "U-" "ss" "a-" "a'" "a^" "~a" "\"a" "ao"
139         "ae" "i;" "c<" "e'" "e;" "\"e" "e^." "i'" "i^" "i-"
140         "/d" ",n" "o-" ",k" "o^" "~o" "\"o" "-:" "/o" "u;"
141         "u'" "u^" "\"u" "~u" "u-" "^."]
142      )
143     (cyrillic-iso8859-5
144      . [255 "\"E" "Dj" "Gj" "IE" "Dz" "Ii" "Ji" "JE" "Lj"
145         "Nj" "Ts" "Kj" 240 "V%" "Dzh"  65  "B="  66 226
146         68  69  "Z%"  51  85 "J="  75 "L="  77  72
147         79  "P="  80  67  84  89 232  88 "C=" "C%"
148         "S%" "Sc" "=\"" "Y=" "%\"" "Ee" "Yu" "Ya" 97  98
149         "v=" "g=" 103 101 "z%" "z=" 117 "j=" 107 "l="
150         "m=" "n=" 111 110 112 99 "t=" 121 "f=" 120
151         "c=" "c%" "s%" "sc" "='" "y=" "%'" "ee" "yu" "ya"
152         "N0" "\"e" "dj" "gj" "ie" "dz" "ii" "ji" "je" "lj"
153         "nj" "ts" "kj"  21 "v%" "dzh"]
154      )
155     (arabic-iso8859-6
156      . [255 nil nil nil "$$" nil nil nil nil nil
157         nil nil ",+" "--" nil nil nil nil nil nil
158         nil nil nil nil nil nil nil ";+" nil nil
159         nil "?+" nil "H'" "aM" "aH" "wH" "ah" "yH"
160         "a+" "b+" "tm" "t+" "tk" "g+" "hk" "x+" "d+" "dk"
161         "r+" "z+" "s+" "sn" "c+" "dd" "tj" "zH" "e+" "i+"
162         nil nil nil nil nil "++" "f+" "q+" "k+" "l+"
163         "m+" "n+" "h+" "w+" "j+" "y+" ":+" "\"+" "=+" "/+"
164         "'+" "1+" "3+" "0+" nil nil nil nil nil nil
165         nil nil nil nil nil nil nil]
166      )
167     (greek-iso8859-7
168      . [255 "9'" "'9" "Pd" nil nil "|" "SE" "\"" "(c)"
169         nil "<<" "~" "--" nil "-M" "^o" "+-" "^2" "^3"
170         "'" "'%" "'A" "^." "'E" "'H" "'I" ">>" "'O" "1/2"
171         "'Y" "W%" "i3" 65 66 "G*" "D*" 69 90 72
172         "TH" 73 74 "L*" 77 78 "C*" 79 "P*" 80
173         nil "S*" 84 89 "F*" 88 "Q*" "W*" "\"I" "\"Y"
174         "a%" "e%" "y%" "i%" "u3" "a*" "b*" "g*" "d*" "e*"
175         "z*" "y*" "h*" "i*" 107 "l*" "m*" "n*" "c*" 111
176         "p*" "r*" "*s" "s*" "t*" 117 "f*" "x*" "q*" "w*"
177         "\"i" "\"u" "'o" "'u" "'w" nil]
178      )
179     ;; Note: some of the characters undefined according to ISO 8859-8
180     ;; in the ranges 190..220 and 250..255 are replaced with SI 1311-1
181     ;; points (Niqud) and bidi formatting characters
182     (hebrew-iso8859-8
183      . [255 nil "|c" "Pd" "$$" "Ye" "|" "SE" "\"" "(c)"
184         "*x" "<<" "~" "--" "(R)" "'-" "^o" "+-" "^2" "^3"
185         "'" "u" ".P" "^." "'," "^1" "-:" ">>" "1/4" "1/2"
186         "3/4" nil ":'" "v:" "-:" "-':" ".'" ".." "v'" "-'"
187         "-," "`." nil "\\." "(.)" "|'" "`-" "`=" "||" nil
188         nil "::" nil nil nil nil nil nil nil "LRO"
189         "RLO" "PDF" nil "=2" "A+" "B+" "G+" "D+" "H+" "W+"
190         "Z+" "X+" "Tj" "J+" "K%" "K+" "L+" "M%" "M+" "N%"
191         "N+" "S+" "E+" "P%" "P+" "Zj" "ZJ" "Q+" "R+" "Sh"
192         "T+" "LRE" "RLE" "LRM" "RLM" nil]
193      )
194     (latin-iso8859-9
195      . [255 "!I" "|c" "Pd" "$$" "Ye" "|" "SE" "\"" "(c)"
196         "_a" "<<" "~" "--" "(R)" "'-" "^o" "+-" "^2" "^3"
197         "'" "u" ".P" "^." "'," "^1" "_o" ">>" "1/4" "1/2"
198         "3/4" "?I" "`A" "A'" "A^" "~A" "\"A" "Ao" "AE" ",C"
199         "`E" "E'" "E^" "\"E" "`I" "I'" "I^" "\"I" "G(" "~N"
200         "`O" "O'" "O^" "~O" "\"O" "*x" "/O" "`U" "U'" "U^"
201         "\"U" "I^." ",S" "ss" "`a" "a'" "a^" "~a" "\"a" "ao"
202         "ae" ",c" "`e" "e'" "e<" "\"e" "e^." "i'" "i^" "i-"
203         "g(" "~n" "`o" "o'" "o^" "~o" "\"o" "-:" "/o" "`u"
204         "u'" "u^" "\"u" "i." ",s" "\"y"]
205      )
206     (latin-iso8859-14
207      . [255 "B`" "b`" "Pd" "C`" "c`" "D`" "SE" "`W" "(c)"
208         "W'" "d`" "`Y" "--" "(R)" "\"Y" "F`" "f`" "G`" "g`"
209         "M`" "m`" ".P" "P`" "`w" "p`" "w'" "S`" "`y" "\"W"
210         "\"w" "s`" "`A" "A'" "A^" "~A" "\"A" "Ao" "AE" ",C"
211         "`E" "E'" "E^" "\"E" "`I" "I'" "I^" "\"I" "W^" "~N"
212         "`O" "O'" "O^" "~O" "\"O" "T`" "/O" "`U" "U'" "U^"
213         "\"U" "Y'" "Y^" "ss" "`a" "a'" "a^" "~a" "\"a" "ao"
214         "ae" ",c" "`e" "e'" "e^" "\"e" "`i" "i'" "i^" "\"i"
215         "w^" "~n" "`o" "o'" "o^" "~o" "\"o" "t`" "/o" "`u"
216         "u'" "u^" "\"u" "y'" "y^" "\"y"]
217     )
218     (latin-iso8859-15
219      . [255 "!I" "|c" "Pd" "E=" "Ye" "S<" "SE" "s<" "(c)"
220         "_a" "<<" "~" "--" "(R)" "'-" "^o" "+-" "^2" "^3"
221         "Z<" "u" ".P" "^." "z<" "^1" "_o" ">>" "OE" "oe"
222         "\"Y" "?I" "`A" "A'" "A^" "~A" "\"A" "Ao" "AE" ",C"
223         "`E" "E'" "E^" "\"E" "`I" "I'" "I^" "\"I" "-D" "~N"
224         "`O" "O'" "O^" "~O" "\"O" "*x" "/O" "`U" "U'" "U^"
225         "\"U" "Y'" "|P" "ss" "`a" "a'" "a^" "~a" "\"a" "ao"
226         "ae" ",c" "`e" "e'" "e^" "\"e" "`i" "i'" "i^" "\"i"
227         "-d" "~n" "`o" "o'" "o^" "~o" "\"o" "-:" "/o" "`u"
228         "u'" "u^" "\"u" "y'" "|p" "\"y"]
229      )
230     )
231   "An alist of MULE ISO-8859 character sets and the strings that
232 should be used to represent the characters from each set on a DOS
233 terminal which does not have corresponding glyphs built into the
234 installed codepage.")
235
236 (defun IT-display-table-setup (codepage &optional table)
237   "Set up display table TABLE for a DOS terminal which supports
238 glyphs built into the codepage CODEPAGE.
239
240 If TABLE is nil or omitted, `standard-display-table' is used."
241   (let* ((surrogates IT-character-translations)
242          (disp-tab (or table standard-display-table))
243          (built-in-set (cp-charset-for-codepage codepage))
244          (offset (cp-offset-for-codepage codepage))
245          (cp-decoder
246           (symbol-value (intern-soft (format "%s-decode-table" codepage))))
247          (cp-decoder-len (length cp-decoder))
248          (c offset)
249          association chset)
250     ;; Undo the effects of previous call (where they may have used
251     ;; a different codepage) by reverting the display table for the
252     ;; built-in charset to its pristine shape.
253     (while (< c 256)
254       (aset disp-tab (make-char built-in-set c) nil)
255       (setq c (1+ c)))
256     (while surrogates
257       (setq association (car surrogates))
258       (setq chset (car association))
259       (let* ((vector (cdr association))
260              (veclen (length vector))
261              (i 0)
262              glyph)
263         (while (< i veclen)
264           (setq glyph (aref vector i))
265           (or glyph (setq glyph dos-unsupported-char-glyph))
266           (if (or (not (equal chset built-in-set))
267                   (>= i cp-decoder-len)
268                   (null (aref cp-decoder i)))
269               (aset disp-tab (make-char chset (+ i (logand offset 127)))
270                     (vconcat
271                      (if (numberp glyph)
272                          (char-to-string glyph)
273                        (if (> (length glyph) 1) (concat "{" glyph "}")
274                          glyph)))))
275           (setq i (1+ i))))
276       (setq surrogates (cdr surrogates)))))
277
278 (defvar IT-unicode-translations
279   '(
280     (mule-unicode-0100-24ff             ; charset
281      256                                ; base
282      256 563                            ; first, last
283      [ "A-" "a-" "A(" "a(" "A;" "a;" "C'" "c'" "C>" "c>" ; Latin Extended-A
284        "C." "c." "C<" "c<" "D<" "d<" "D/" "d/" "E-" "e-"
285        "E(" "e(" "E." "e." "E;" "e;" "E<" "e<" "G>" "g>"
286        "G(" "g(" "G." "g." "G," "g," "H>" "h>" "H/" "h/"
287        "I~" "i~" "I-" "i-" "I(" "i(" "I;" "i;" "I." "i."
288        "IJ" "ij" "J>" "j>" "K," "k," "kk" "L'" "l'" "L,"
289        "l," "L<" "l<" "L." "l." "L/" "l/" "N'" "n'" "N,"
290        "n," "N<" "n<" "'n" "NG" "ng" "O-" "o-" "O(" "o("
291        "O\"" "o\"" "OE" "oe" "R'" "r'" "R," "r," "R<" "r<"
292        "S'" "s'" "S>" "s>" "S," "s," "S<" "s<" "T," "t,"
293        "T<" "t<" "T/" "t/" "U~" "u~" "U-" "u-" "U(" "u("
294        "U0" "u0" "U\"" "u\"" "U;" "u;" "W>" "w>" "Y>" "y>"
295        "Y:" "Z'" "z'" "Z." "z." "Z<" "z<" "s1"                ; 017f
296        "b/" "B2" "=B" "=b" "B6" "b6" "!C" "C2" "c2" "-D" ;Lat. Extended-B
297        "D2" "=D" "=d" "!d" "!E" "-E" "Eps" "F2" "f2" "G2"
298        "V0" "hv" "io" "-I" "K2" "k2" "-l"  "la-" "!M" "2N"
299        "n_" "-O" "O9" "o9" "OI" "oi" "P2" "p2" "'R" "!S"
300        "!s" "Esh" "!esh" "t~" "T2" "t2" "T~" "U9" "u9" "Ups"
301        "V2" "Y2" "y2" "Z/" "z/" "ED" "!ED" "!ed" "ed;" "2/"
302        "5-" "_5-" "ts" "wn" "|_" "||" "|=" "!_" "DZ<" "Dz<"
303        "dz<" "LJ3" "Lj3" "lj3" "NJ3" "Nj3" "nj3" "A<" "a<" "I<"
304        "i<" "O<" "o<" "U<" "u<" "U:-" "u:-" "U:'" "u:'" "U:<"
305        "u:<" "U:!" "u:!" "e1" "A:-" "a:-" "A.-" "a.-" "AE-" "ae-"
306        "G/" "g/" "G<" "g<" "K<" "k<" "O;" "o;" "O1" "o1"
307        "EZ" "ez" "j<" "DZ3" "Dz3" "dz3" "G'" "g'" "Hv" "Wn"
308        "N`" "n`" "AA'" "aa'" "AE'" "ae'" "O/'" "o/'" "A!!" "a!!"
309        "A)" "a)" "E!!" "e!!" "E)" "e)" "I!!" "i!!" "I)" "i)"
310        "O!!" "o!!" "O)" "o)" "R!!" "r!!" "R)" "r)" "U!!" "u!!"
311        "U)" "u)" ",S" ",s" ",T" ",t" "'3" "'3_" "H<" "h<"
312        nil nil "8" "8_" "Z2" "z2" "A." "a." "E," "e,"
313        "O:-" "o:-" "O~-" "o~-" "O." "o." "O.-" "o.-" "Y-" "y-"] ; 0x233
314
315      )
316
317     (mule-unicode-0100-24ff             ; charset
318      256                                ; base
319      884 1123                           ; first, last
320      [ "'" "," nil nil nil nil "j3" nil nil nil        ; Greek
321        "?;" nil nil nil nil nil "'*" "'%" "A%" ".*"
322        "E%" "Y%" "I%" nil "O%" nil "U%" "W%" "i3" "A*"
323        "B*" "G*" "D*" "E*" "Z*" "H*" "Th*" "I*" "K*" "L*"
324        "M*" "N*" "C*" "O*" "P*" "R*" nil "S*" "T*" "U*"
325        "F*" "X*" "Q*" "W*" "J*" "V*" "a%" "e%" "y%" "i%"
326        "u3" "a*" "b*" "g*" "d*" "e*" "z*" "h*" "th*" "i*"
327        "k*" "l*" "m*" "n*" "c*" "o*" "p*" "r*" "*s" "s*"
328        "t*" "u*" "f*" "x*" "q*" "w*" "j*" "v*" "o%" "u%"
329        "w%" nil "b3" "th%" "U2*" "'U2*" "U:2*" "ph*" "pi*" "ka*"
330        nil nil "Sti" "sti" "Dig" "dig" "Kop" "kop" "Sam" "sam"
331        "She" "she" "Fei" "fei" "Khe" "khe" "Hor" "hor" "Gan" "gan"
332        "Shi" "shi" "Dei" "dei" "ka*" "rh*" "ls*" "yo*" nil nil
333        nil nil nil nil nil nil nil nil nil nil
334        "IE'" "E:" "D%" "G%" "IE" "DS" "II" "YI" "J%" "LJ" ; Cyrillic
335        "NJ" "Ts"  "KJ" "`I=" "V%" "DZ" 65 "B=" 66 "G="
336        68 69 "Z%" 51 85 "J=" 75 "L=" 77 72
337        79 "P=" 80 67 84 89 "F=" 88 "C=" "C%"
338        "S%" "Sc" "=\"" "Y=" "%\"" "Ee" "JU" "JA" 97 "b="
339        98 "g=" 103 101 "z%" "z=" 117 "j=" 107 "l="
340        109 "n=" 111 "p=" 112 99 "t=" 121 "f=" 120
341        "c=" "c%" "s%" "sc" "='" "y=" "%'" "ee" "ju" "ja"
342        "ie'" "e:" "d%" "g%" "ie" "ds" "ii" "yi" "j%" "lj"
343        "nj" "ts" "kj" "v%" "`i=" "dz" "OM=" "om=" "Y3" "y3"] ; 0x463
344      )
345
346     (mule-unicode-0100-24ff             ; charset
347      256                                ; base
348      1454 1645                          ; first, last
349      [ nil nil ":'" "v:" "-:" "-':" ".'" ".." "v'" "-'"
350        "-," "`." nil "\\." "(.)" "|'"</