comparison lisp/mule/mule-diag.el @ 207:e45d5e7c476e r20-4b2

Import from CVS: tag r20-4b2
author cvs
date Mon, 13 Aug 2007 10:03:52 +0200
parents
children
comparison
equal deleted inserted replaced
206:d3e9274cbc4e 207:e45d5e7c476e
1 ;;; mule-diag.el --- Show diagnosis of multilingual environment (MULE)
2
3 ;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
4 ;; Licensed to the Free Software Foundation.
5 ;; Copyright (C) 1997 MORIOKA Tomohiko
6
7 ;; Keywords: multilingual, charset, coding system, fontset, diagnosis
8
9 ;; This file is part of XEmacs.
10
11 ;; XEmacs is free software; you can redistribute it and/or modify it
12 ;; under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
14 ;; any later version.
15
16 ;; XEmacs is distributed in the hope that it will be useful, but
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ;; General Public License for more details.
20
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with XEmacs; see the file COPYING. If not, write to the Free
23 ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24 ;; 02111-1307, USA.
25
26 ;;; General utility function
27
28 ;; Print all arguments with single space separator in one line.
29 (defun print-list (&rest args)
30 (while (cdr args)
31 (when (car args)
32 (princ (car args))
33 (princ " "))
34 (setq args (cdr args)))
35 (princ (car args))
36 (princ "\n"))
37
38 ;; Re-order the elements of charset-list.
39 (defun sort-charset-list ()
40 (setq charset-list
41 (sort charset-list
42 (function (lambda (x y) (< (charset-id x) (charset-id y)))))))
43
44 ;;; CHARSET
45
46 ;;;###autoload
47 (defun list-character-sets (&optional arg)
48 "Display a list of all character sets.
49
50 The ID column contains a charset identification number for internal use.
51 The B column contains a number of bytes occupied in a buffer.
52 The W column contains a number of columns occupied in a screen.
53
54 With prefix arg, the output format gets more cryptic
55 but contains full information about each character sets."
56 (interactive "P")
57 (sort-charset-list)
58 (with-output-to-temp-buffer "*Help*"
59 (save-excursion
60 (set-buffer standard-output)
61 (let ((l charset-list)
62 charset)
63 (if (null arg)
64 (progn
65 (insert "ID Name B W Description\n")
66 (insert "-- ---- - - -----------\n")
67 (while l
68 (setq charset (car l) l (cdr l))
69 (insert (format "%03d %s" (charset-id charset) charset))
70 (indent-to 28)
71 (insert (format "%d %d %s\n"
72 (charset-bytes charset)
73 (charset-width charset)
74 (charset-description charset)))))
75 (insert "\
76 #########################
77 ## LIST OF CHARSETS
78 ## Each line corresponds to one charset.
79 ## The following attributes are listed in this order
80 ## separated by a colon `:' in one line.
81 ## CHARSET-ID,
82 ## CHARSET-SYMBOL-NAME,
83 ## DIMENSION (1 or 2)
84 ## CHARS (94 or 96)
85 ## BYTES (of multibyte form: 1, 2, 3, or 4),
86 ## WIDTH (occupied column numbers: 1 or 2),
87 ## DIRECTION (0:left-to-right, 1:right-to-left),
88 ## ISO-FINAL-CHAR (character code of ISO-2022's final character)
89 ## ISO-GRAPHIC-PLANE (ISO-2022's graphic plane, 0:GL, 1:GR)
90 ## DESCRIPTION (describing string of the charset)
91 ")
92 (while l
93 (setq charset (car l) l (cdr l))
94 (princ (format "%03d:%s:%d:%d:%d:%d:%d:%d:%d:%s\n"
95 (charset-id charset)
96 charset
97 (charset-dimension charset)
98 (charset-chars charset)
99 (charset-bytes charset)
100 (charset-width charset)
101 (charset-direction charset)
102 (charset-iso-final-char charset)
103 (charset-iso-graphic-plane charset)
104 (charset-description charset))))))
105 (help-mode)
106 (setq truncate-lines t))))
107
108 ;;; CODING-SYSTEM
109
110 (defun describe-designation (cs register)
111 (let ((charset
112 (coding-system-property
113 cs (intern (format "charset-g%d" register))))
114 (force
115 (coding-system-property
116 cs (intern (format "force-g%d-on-output" register)))))
117 (princ
118 (format
119 " G%d: %s%s\n"
120 register
121 (cond ((null charset) "never used")
122 ((eq t charset) "none")
123 (t (charset-name charset)))
124 (if force " (explicit designation required)" "")))))
125
126 ;;;###autoload
127 (defun describe-coding-system (coding-system)
128 "Display information of CODING-SYSTEM."
129 (interactive "zDescribe coding system (default, current choices): ")
130 (if (or (null coding-system)
131 (string= (symbol-name coding-system) ""))
132 (describe-current-coding-system)
133 (with-output-to-temp-buffer "*Help*"
134 (print-coding-system-briefly coding-system 'doc-string)
135 (let ((type (coding-system-type coding-system)))
136 (princ (format "Type: %s" type))
137 (when (eq type 'iso2022)
138 (princ " (variant of ISO-2022)\n")
139 (princ "Initial designations:\n")
140 ;;(print-designation flags)
141 (describe-designation coding-system 0)
142 (describe-designation coding-system 1)
143 (describe-designation coding-system 2)
144 (describe-designation coding-system 3)
145 (princ "Other Form: \n ")
146 (princ (if (coding-system-short coding-system)
147 "short-form"
148 "long-form"))
149 (if (coding-system-no-ascii-eol coding-system)
150 (princ ", ASCII@EOL"))
151 (if (coding-system-no-ascii-cntl coding-system)
152 (princ ", ASCII@CNTL"))
153 (princ (if (coding-system-seven coding-system)
154 ", 7-bit"
155 ", 8-bit"))
156 (if (coding-system-lock-shift coding-system)
157 (princ ", use-locking-shift")
158 (princ ", use-single-shift"))
159 ;;(if (aref flags 10) (princ ", use-roman"))
160 ;;(if (aref flags 10) (princ ", use-old-jis"))
161 (if (coding-system-no-iso6429 coding-system)
162 (princ ", no-ISO6429"))
163 )
164 (princ "\nEOL type:")
165 (let ((eol-type (coding-system-eol-type coding-system)))
166 (cond ((null eol-type)
167 (princ "\n Automatic selection from\n ")
168 (princ (format "%s-unix, %s-dos or %s-mac.\n"
169 coding-system coding-system coding-system))
170 )
171 ((symbolp eol-type)
172 (princ " ")
173 (princ eol-type))
174 (t (princ "invalid\n")))))
175 (save-excursion
176 (set-buffer standard-output)
177 (help-mode)))))
178
179 ;;;###autoload
180 (defun describe-current-coding-system-briefly ()
181 "Display coding systems currently used in a brief format in echo area.
182
183 The format is \"F[..],K[..],T[..],P>[..],P<[..], default F[..],P<[..],P<[..]\",
184 where mnemonics of the following coding systems come in this order
185 at the place of `..':
186 buffer-file-coding-system (of the current buffer)
187 eol-type of buffer-file-coding-system (of the current buffer)
188 (keyboard-coding-system)
189 eol-type of (keyboard-coding-system)
190 (terminal-coding-system)
191 eol-type of (terminal-coding-system)
192 process-coding-system for read (of the current buffer, if any)
193 eol-type of process-coding-system for read (of the current buffer, if any)
194 process-coding-system for write (of the current buffer, if any)
195 eol-type of process-coding-system for write (of the current buffer, if any)
196 default-buffer-file-coding-system
197 eol-type of default-buffer-file-coding-system
198 default-process-coding-system for read
199 eol-type of default-process-coding-system for read
200 default-process-coding-system for write
201 eol-type of default-process-coding-system"
202 (interactive)
203 (let* ((proc (get-buffer-process (current-buffer)))
204 (process-coding-systems (if proc (process-coding-system proc))))
205 (message
206 "F[%c%c],K[%c%c],T[%c%c],P>[%c%c],P<[%c%c], default F[%c%c],P>[%c%c],P<[%c%c]"
207 (coding-system-mnemonic buffer-file-coding-system)
208 (coding-system-eol-type-mnemonic buffer-file-coding-system)
209 (coding-system-mnemonic (keyboard-coding-system))
210 (coding-system-eol-type-mnemonic (keyboard-coding-system))
211 (coding-system-mnemonic (terminal-coding-system))
212 (coding-system-eol-type-mnemonic (terminal-coding-system))
213 (coding-system-mnemonic (car process-coding-systems))
214 (coding-system-eol-type-mnemonic (car process-coding-systems))
215 (coding-system-mnemonic (cdr process-coding-systems))
216 (coding-system-eol-type-mnemonic (cdr process-coding-systems))
217 (coding-system-mnemonic default-buffer-file-coding-system)
218 (coding-system-eol-type-mnemonic default-buffer-file-coding-system)
219 (coding-system-mnemonic (car default-process-coding-system))
220 (coding-system-eol-type-mnemonic (car default-process-coding-system))
221 (coding-system-mnemonic (cdr default-process-coding-system))
222 (coding-system-eol-type-mnemonic (cdr default-process-coding-system))
223 )))
224
225 ;; Print symbol name and mnemonic letter of CODING-SYSTEM by `princ'.
226 (defun print-coding-system-briefly (coding-system &optional doc-string)
227 (if (not coding-system)
228 (princ "nil\n")
229 ;; In XEmacs, coding-system has own type.
230 (if (coding-system-p coding-system)
231 (setq coding-system (coding-system-name coding-system))
232 )
233 ;; In XEmacs, coding-system-mnemonic returns string.
234 (princ (format "%s -- %s"
235 (coding-system-mnemonic coding-system)
236 coding-system))
237 ;; Current XEmacs does not have `coding-system-parent'.
238 ;; (let ((parent (coding-system-parent coding-system)))
239 ;; (if parent
240 ;; (princ (format " (alias of %s)" parent))))
241 (let ((aliases (get coding-system 'alias-coding-systems)))
242 (if aliases
243 (princ (format " %S" (cons 'alias: aliases)))))
244 (princ "\n")
245 (if (and doc-string
246 (setq doc-string (coding-system-doc-string coding-system)))
247 (princ (format " %s\n" doc-string)))))
248
249 ;;;###autoload
250 (defun describe-current-coding-system ()
251 "Display coding systems currently used in a detailed format."
252 (interactive)
253 (with-output-to-temp-buffer "*Help*"
254 (let* ((proc (get-buffer-process (current-buffer)))
255 (process-coding-systems (if proc (process-coding-system proc))))
256 (princ "Coding system for saving this buffer:\n ")
257 ;; local-variable-p of XEmacs requires 2 arguments.
258 (if (local-variable-p 'buffer-file-coding-system (current-buffer))
259 (print-coding-system-briefly buffer-file-coding-system)
260 (princ "Not set locally, use the default.\n"))
261 (princ "Default coding system (for new files):\n ")
262 (print-coding-system-briefly default-buffer-file-coding-system)
263 (princ "Coding system for keyboard input:\n ")
264 (print-coding-system-briefly (keyboard-coding-system))
265 (princ "Coding system for terminal output:\n ")
266 (print-coding-system-briefly (terminal-coding-system))
267 (when (get-buffer-process (current-buffer))
268 (princ "Coding systems for process I/O:\n")
269 (princ " encoding input to the process: ")
270 (print-coding-system-briefly (cdr process-coding-systems))
271 (princ " decoding output from the process: ")
272 (print-coding-system-briefly (car process-coding-systems)))
273 ;;(princ "Defaults for subprocess I/O:\n")
274 ;;(princ " decoding: ")
275 ;;(print-coding-system-briefly (car default-process-coding-system))
276 ;;(princ " encoding: ")
277 ;;(print-coding-system-briefly (cdr default-process-coding-system))
278 )
279 (save-excursion
280 (set-buffer standard-output)
281
282 (princ
283 "\nPriority order for recognizing coding systems when reading files:\n")
284 (let ((l (coding-category-list)) ; It is function in XEmacs.
285 (i 1)
286 (coding-list nil)
287 coding aliases)
288 (while l
289 (setq coding (coding-category-system (car l))) ; for XEmacs
290 (when (not (memq coding coding-list))
291 (setq coding-list (cons coding coding-list))
292 (princ (format " %d. %s" i coding))
293 (when (setq aliases (get coding 'alias-coding-systems))
294 (princ " ")
295 (princ (cons 'alias: aliases)))
296 (terpri)
297 (setq i (1+ i)))
298 (setq l (cdr l))))
299 (princ "\n Other coding systems cannot be distinguished automatically
300 from these, and therefore cannot be recognized automatically
301 with the present coding system priorities.\n\n")
302
303 (let ((categories '(iso-7)) ; for XEmacs
304 ;; '(coding-category-iso-7 coding-category-iso-7-else))
305 coding-system codings)
306 (while categories
307 ;; for XEmacs
308 (setq coding-system (coding-category-system (car categories)))
309 (mapcar
310 (function
311 (lambda (x)
312 (if (and (not (eq x coding-system))
313 (get x 'no-initial-designation)
314 (let ((flags (coding-system-flags x)))
315 (not (or (aref flags 10) (aref flags 11)))))
316 (setq codings (cons x codings)))))
317 (get (car categories) 'coding-systems))
318 (if codings
319 (let ((max-col (frame-width))
320 pos)
321 (princ (format " The followings are decoded correctly but recognized as %s:\n " coding-system))
322 (while codings
323 (setq pos (point))
324 (insert (format " %s" (car codings)))
325 (when (> (current-column) max-col)
326 (goto-char pos)
327 (insert "\n ")
328 (goto-char (point-max)))
329 (setq codings (cdr codings)))
330 (insert "\n\n")))
331 (setq categories (cdr categories))))
332
333 (princ "Particular coding systems specified for certain file names:\n")
334 (terpri)
335 (princ " OPERATION\tTARGET PATTERN\t\tCODING SYSTEM(s)\n")
336 (princ " ---------\t--------------\t\t----------------\n")
337 (let ((func (lambda (operation alist)
338 (princ " ")
339 (princ operation)
340 (if (not alist)
341 (princ "\tnothing specified\n")
342 (while alist
343 (indent-to 16)
344 (prin1 (car (car alist)))
345 (indent-to 40)
346 (princ (cdr (car alist)))
347 (princ "\n")
348 (setq alist (cdr alist)))))))
349 (funcall func "File I/O" file-coding-system-alist)
350 (funcall func "Process I/O" process-coding-system-alist)
351 (funcall func "Network I/O" network-coding-system-alist))
352 (help-mode))))
353
354 ;; Print detailed information on CODING-SYSTEM.
355 (defun print-coding-system (coding-system &optional aliases)
356 (let ((type (coding-system-type coding-system))
357 (eol-type (coding-system-eol-type coding-system))
358 (flags (coding-system-flags coding-system))
359 (base (coding-system-base coding-system)))
360 (if (not (eq base coding-system))
361 (princ (format "%s (alias of %s)\n" coding-system base))
362 (princ coding-system)
363 (while aliases
364 (princ ",")
365 (princ (car aliases))
366 (setq aliases (cdr aliases)))
367 (princ (format ":%s:%c:%d:"
368 type
369 (coding-system-mnemonic coding-system)
370 (if (integerp eol-type) eol-type 3)))
371 (cond ((eq type 2) ; ISO-2022
372 (let ((idx 0)
373 charset)
374 (while (< idx 4)
375 (setq charset (aref flags idx))
376 (cond ((null charset)
377 (princ -1))
378 ((eq charset t)
379 (princ -2))
380 ((charsetp charset)
381 (princ charset))
382 ((listp charset)
383 (princ "(")
384 (princ (car charset))
385 (setq charset (cdr charset))
386 (while charset
387 (princ ",")
388 (princ (car charset))
389 (setq charset (cdr charset)))
390 (princ ")")))
391 (princ ",")
392 (setq idx (1+ idx)))
393 (while (< idx 12)
394 (princ (if (aref flags idx) 1 0))
395 (princ ",")
396 (setq idx (1+ idx)))
397 (princ (if (aref flags idx) 1 0))))
398 ((eq type 4) ; CCL
399 (let (i len)
400 (setq i 0 len (length (car flags)))
401 (while (< i len)
402 (princ (format " %x" (aref (car flags) i)))
403 (setq i (1+ i)))
404 (princ ",")
405 (setq i 0 len (length (cdr flags)))
406 (while (< i len)
407 (princ (format " %x" (aref (cdr flags) i)))
408 (setq i (1+ i)))))
409 (t (princ 0)))
410 (princ ":")
411 (princ (coding-system-doc-string coding-system))
412 (princ "\n"))))
413
414 ;;;###autoload
415 (defun list-coding-systems (&optional arg)
416 "Display a list of all coding systems.
417 It prints mnemonic letter, name, and description of each coding systems.
418
419 With prefix arg, the output format gets more cryptic,
420 but contains full information about each coding systems."
421 (interactive "P")
422 (with-output-to-temp-buffer "*Help*"
423 (if (null arg)
424 (princ "\
425 ###############################################
426 # List of coding systems in the following format:
427 # MNEMONIC-LETTER -- CODING-SYSTEM-NAME
428 # DOC-STRING
429 ")
430 (princ "\
431 #########################
432 ## LIST OF CODING SYSTEMS
433 ## Each line corresponds to one coding system
434 ## Format of a line is:
435 ## NAME[,ALIAS...]:TYPE:MNEMONIC:EOL:FLAGS:POST-READ-CONVERSION
436 ## :PRE-WRITE-CONVERSION:DOC-STRING,
437 ## where
438 ## NAME = coding system name
439 ## ALIAS = alias of the coding system
440 ## TYPE = nil (no conversion), t (undecided or automatic detection),
441 ## 0 (EMACS-MULE), 1 (SJIS), 2 (ISO2022), 3 (BIG5), or 4 (CCL)
442 ## EOL = 0 (LF), 1 (CRLF), 2 (CR), or 3 (Automatic detection)
443 ## FLAGS =
444 ## if TYPE = 2 then
445 ## comma (`,') separated data of the followings:
446 ## G0, G1, G2, G3, SHORT-FORM, ASCII-EOL, ASCII-CNTL, SEVEN,
447 ## LOCKING-SHIFT, SINGLE-SHIFT, USE-ROMAN, USE-OLDJIS, NO-ISO6429
448 ## else if TYPE = 4 then
449 ## comma (`,') separated CCL programs for read and write
450 ## else
451 ## 0
452 ## POST-READ-CONVERSION, PRE-WRITE-CONVERSION = function name to be called
453 ##
454 "))
455 (let ((bases (coding-system-list))
456 ;;(coding-system-list 'base-only))
457 coding-system)
458 (while bases
459 (setq coding-system (car bases))
460 (if (null arg)
461 (print-coding-system-briefly coding-system 'doc-string)
462 (print-coding-system coding-system))
463 (setq bases (cdr bases))))))
464
465 ;;;###automatic
466 (defun list-coding-categories ()
467 "Display a list of all coding categories."
468 (with-output-to-temp-buffer "*Help*"
469 (princ "\
470 ############################
471 ## LIST OF CODING CATEGORIES (ordered by priority)
472 ## CATEGORY:CODING-SYSTEM
473 ##
474 ")
475 (let ((l coding-category-list))
476 (while l
477 (princ (format "%s:%s\n" (car l) (symbol-value (car l))))
478 (setq l (cdr l))))))
479
480 ;;; FONT
481
482 ;; Print information of a font in FONTINFO.
483 (defun describe-font-internal (font-info &optional verbose)
484 (print-list "name (opened by):" (aref font-info 0))
485 (print-list " full name:" (aref font-info 1))
486 (let ((charset (aref font-info 2)))
487 (print-list " charset:"
488 (format "%s (%s)" charset (charset-description charset))))
489 (print-list " size:" (format "%d" (aref font-info 3)))
490 (print-list " height:" (format "%d" (aref font-info 4)))
491 (print-list " baseline-offset:" (format "%d" (aref font-info 5)))
492 (print-list "relative-compose:" (format "%d" (aref font-info 6))))
493
494 ;;;###autoload
495 (defun describe-font (fontname)
496 "Display information about fonts which partially match FONTNAME."
497 (interactive "sFontname (default, current choise for ASCII chars): ")
498 (or window-system
499 (error "No window system being used"))
500 (when (or (not fontname) (= (length fontname) 0))
501 (setq fontname (cdr (assq 'font (frame-parameters))))
502 (if (query-fontset fontname)
503 (setq fontname
504 (nth 2 (assq 'ascii (aref (fontset-info fontname) 2))))))
505 (let ((font-info (font-info fontname)))
506 (if (null font-info)
507 (message "No matching font")
508 (with-output-to-temp-buffer "*Help*"
509 (describe-font-internal font-info 'verbose)))))
510
511 ;; Print information of FONTSET. If optional arg PRINT-FONTS is
512 ;; non-nil, print also names of all fonts in FONTSET. This function
513 ;; actually INSERT such information in the current buffer.
514 (defun print-fontset (fontset &optional print-fonts)
515 (let* ((fontset-info (fontset-info fontset))
516 (size (aref fontset-info 0))
517 (height (aref fontset-info 1))
518 (fonts (and print-fonts (aref fontset-info 2)))
519 (xlfd-fields (x-decompose-font-name fontset))
520 style)
521 (if xlfd-fields
522 (let ((weight (aref xlfd-fields xlfd-regexp-weight-subnum))
523 (slant (aref xlfd-fields xlfd-regexp-slant-subnum)))
524 (if (string-match "^bold$\\|^demibold$" weight)
525 (setq style (concat weight " "))
526 (setq style "medium "))
527 (cond ((string-match "^i$" slant)
528 (setq style (concat style "italic")))
529 ((string-match "^o$" slant)
530 (setq style (concat style "slant")))
531 ((string-match "^ri$" slant)
532 (setq style (concat style "reverse italic")))
533 ((string-match "^ro$" slant)
534 (setq style (concat style "reverse slant")))))
535 (setq style " ? "))
536 (beginning-of-line)
537 (insert fontset)
538 (indent-to 58)
539 (insert (if (> size 0) (format "%2dx%d" size height) " -"))
540 (indent-to 64)
541 (insert style "\n")
542 (when print-fonts
543 (insert " O Charset / Fontname\n"
544 " - ------------------\n")
545 (sort-charset-list)
546 (let ((l charset-list)
547 charset font-info opened fontname)
548 (while l
549 (setq charset (car l) l (cdr l))
550 (setq font-info (assq charset fonts))
551 (if (null font-info)
552 (setq opened ?? fontname "not specified")
553 (if (nth 2 font-info)
554 (if (stringp (nth 2 font-info))
555 (setq opened ?o fontname (nth 2 font-info))
556 (setq opened ?- fontname (nth 1 font-info)))
557 (setq opened ?x fontname (nth 1 font-info))))
558 (insert (format " %c %s\n %s\n"
559 opened charset fontname)))))))
560
561 ;;;###autoload
562 (defun describe-fontset (fontset)
563 "Display information of FONTSET.
564
565 It prints name, size, and style of FONTSET, and lists up fonts
566 contained in FONTSET.
567
568 The column WDxHT contains width and height (pixels) of each fontset
569 \(i.e. those of ASCII font in the fontset). The letter `-' in this
570 column means that the corresponding fontset is not yet used in any
571 frame.
572
573 The O column of each font contains one of the following letters.
574 o -- font already opened
575 - -- font not yet opened
576 x -- font can't be opened
577 ? -- no font specified
578
579 The Charset column of each font contains a name of character set
580 displayed by the font."
581 (interactive
582 (if (not window-system)
583 (error "No window system being used")
584 (let ((fontset-list (mapcar '(lambda (x) (list x)) (fontset-list)))
585 (completion-ignore-case t))
586 (list (completing-read
587 "Fontset (default, used by the current frame): "
588 fontset-list nil t)))))
589 (if (= (length fontset) 0)
590 (setq fontset (cdr (assq 'font (frame-parameters)))))
591 (if (not (query-fontset fontset))
592 (error "Current frame is using font, not fontset"))
593 (let ((fontset-info (fontset-info fontset)))
594 (with-output-to-temp-buffer "*Help*"
595 (save-excursion
596 (set-buffer standard-output)
597 (insert "Fontset-Name\t\t\t\t\t\t WDxHT Style\n")
598 (insert "------------\t\t\t\t\t\t ----- -----\n")
599 (print-fontset fontset t)))))
600
601 ;;;###autoload
602 (defun list-fontsets (arg)
603 "Display a list of all fontsets.
604
605 It prints name, size, and style of each fontset.
606 With prefix arg, it also lists up fonts contained in each fontset.
607 See the function `describe-fontset' for the format of the list."
608 (interactive "P")
609 (with-output-to-temp-buffer "*Help*"
610 (save-excursion
611 (set-buffer standard-output)
612 (insert "Fontset-Name\t\t\t\t\t\t WDxHT Style\n")
613 (insert "------------\t\t\t\t\t\t ----- -----\n")
614 (let ((fontsets (fontset-list)))
615 (while fontsets
616 (print-fontset (car fontsets) arg)
617 (setq fontsets (cdr fontsets)))))))
618
619 ;;;###autoload
620 (defun list-input-methods ()
621 "Print information of all input methods."
622 (interactive)
623 (with-output-to-temp-buffer "*Help*"
624 (princ "LANGUAGE\n NAME (`TITLE' in mode line)\n")
625 (princ " SHORT-DESCRIPTION\n------------------------------\n")
626 (setq input-method-alist
627 (sort input-method-alist
628 (function (lambda (x y) (string< (nth 1 x) (nth 1 y))))))
629 (let ((l input-method-alist)
630 language elt)
631 (while l
632 (setq elt (car l) l (cdr l))
633 (when (not (equal language (nth 1 elt)))
634 (setq language (nth 1 elt))
635 (princ language)
636 (terpri))
637 (princ (format " %s (`%s' in mode line)\n %s\n"
638 (car elt) (nth 3 elt)
639 (let ((title (nth 4 elt)))
640 (string-match ".*" title)
641 (match-string 0 title))))))))
642
643 ;;; DIAGNOSIS
644
645 ;; Insert a header of a section with SECTION-NUMBER and TITLE.
646 (defun insert-section (section-number title)
647 (insert "########################################\n"
648 "# Section " (format "%d" section-number) ". " title "\n"
649 "########################################\n\n"))
650
651 ;;;###autoload
652 (defun mule-diag ()
653 "Display diagnosis of the multilingual environment (MULE).
654
655 It prints various information related to the current multilingual
656 environment, including lists of input methods, coding systems,
657 character sets, and fontsets (if Emacs running under some window
658 system)."
659 (interactive)
660 (with-output-to-temp-buffer "*Mule-Diagnosis*"
661 (save-excursion
662 (set-buffer standard-output)
663 (insert "\t###############################\n"
664 "\t### Diagnosis of your Emacs ###\n"
665 "\t###############################\n\n"
666 "CONTENTS: Section 1. General Information\n"
667 " Section 2. Display\n"
668 " Section 3. Input methods\n"
669 " Section 4. Coding systems\n"
670 " Section 5. Character sets\n")
671 (if window-system
672 (insert " Section 6. Fontsets\n"))
673 (insert "\n")
674
675 (insert-section 1 "General Information")
676 (insert "Version of this emacs:\n " (emacs-version) "\n\n")
677
678 (insert-section 2 "Display")
679 (if window-system
680 (insert "Window-system: "
681 (symbol-name window-system)
682 (format "%s" window-system-version))
683 (insert "Terminal: " (getenv "TERM")))
684 (insert "\n\n")
685
686 (if (eq window-system 'x)
687 (let ((font (cdr (assq 'font (frame-parameters)))))
688 (insert "The selected frame is using the "
689 (if (query-fontset font) "fontset" "font")
690 ":\n\t" font))
691 (insert "Coding system of the terminal: "
692 (symbol-name (terminal-coding-system))))
693 (insert "\n\n")
694
695 (insert-section 3 "Input methods")
696 (save-excursion (list-input-methods))
697 (insert-buffer-substring "*Help*")
698 (insert "\n")
699 (if default-input-method
700 (insert "Default input method: " default-input-method "\n")
701 (insert "No default input method is specified\n"))
702
703 (insert-section 4 "Coding systems")
704 (save-excursion (list-coding-systems t))
705 (insert-buffer-substring "*Help*")
706 (save-excursion (list-coding-categories))
707 (insert-buffer-substring "*Help*")
708 (insert "\n")
709
710 (insert-section 5 "Character sets")
711 (save-excursion (list-character-sets t))
712 (insert-buffer-substring "*Help*")
713 (insert "\n")
714
715 (when window-system
716 (insert-section 6 "Fontsets")
717 (save-excursion (list-fontsets t))
718 (insert-buffer-substring "*Help*"))
719 (help-mode))))
720
721
722 ;;; DUMP DATA FILE
723
724 ;;;###autoload
725 (defun dump-charsets ()
726 "Dump information of all charsets into the file \"CHARSETS\".
727 The file is saved in the directory `data-directory'."
728 (let ((file (expand-file-name "CHARSETS" data-directory))
729 buf)
730 (or (file-writable-p file)
731 (error "Can't write to file %s" file))
732 (setq buf (find-file-noselect file))
733 (save-window-excursion
734 (save-excursion
735 (set-buffer buf)
736 (setq buffer-read-only nil)
737 (erase-buffer)
738 (list-character-sets t)
739 (insert-buffer-substring "*Help*")
740 (let (make-backup-files
741 coding-system-for-write)
742 (save-buffer))))
743 (kill-buffer buf))
744 (if noninteractive
745 (kill-emacs)))
746
747 ;;;###autoload
748 (defun dump-codings ()
749 "Dump information of all coding systems into the file \"CODINGS\".
750 The file is saved in the directory `data-directory'."
751 (let ((file (expand-file-name "CODINGS" data-directory))
752 buf)
753 (or (file-writable-p file)
754 (error "Can't write to file %s" file))
755 (setq buf (find-file-noselect file))
756 (save-window-excursion
757 (save-excursion
758 (set-buffer buf)
759 (setq buffer-read-only nil)
760 (erase-buffer)
761 (list-coding-systems t)
762 (insert-buffer-substring "*Help*")
763 (list-coding-categories)
764 (insert-buffer-substring "*Help*")
765 (let (make-backup-files
766 coding-system-for-write)
767 (save-buffer))))
768 (kill-buffer buf))
769 (if noninteractive
770 (kill-emacs)))
771
772 ;;; mule-diag.el ends here