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

Import from CVS: tag r20-4b2
author cvs
date Mon, 13 Aug 2007 10:03:52 +0200
parents 850242ba4a81
children 41ff10fd062f
comparison
equal deleted inserted replaced
206:d3e9274cbc4e 207:e45d5e7c476e
27 27
28 ;;; MULE related key bindings and menus. 28 ;;; MULE related key bindings and menus.
29 29
30 (defvar mule-keymap (make-sparse-keymap "MULE") 30 (defvar mule-keymap (make-sparse-keymap "MULE")
31 "Keymap for MULE (Multilingual environment) specific commands.") 31 "Keymap for MULE (Multilingual environment) specific commands.")
32 (fset 'mule-prefix mule-keymap)
33 32
34 ;; Keep "C-x C-m ..." for mule specific commands. 33 ;; Keep "C-x C-m ..." for mule specific commands.
35 (define-key ctl-x-map "\C-m" 'mule-prefix) 34 (define-key ctl-x-map "\C-m" mule-keymap)
36 35
37 (define-key mule-keymap "f" 'set-buffer-file-coding-system) 36 (define-key mule-keymap "f" 'set-buffer-file-coding-system)
38 (define-key mule-keymap "F" 'set-default-buffer-file-coding-system) ; XEmacs 37 (define-key mule-keymap "F" 'set-default-buffer-file-coding-system) ; XEmacs
39 (define-key mule-keymap "t" 'set-terminal-coding-system) 38 (define-key mule-keymap "t" 'set-terminal-coding-system)
40 (define-key mule-keymap "k" 'set-keyboard-coding-system) 39 (define-key mule-keymap "k" 'set-keyboard-coding-system)
41 (define-key mule-keymap "p" 'set-current-process-coding-system) 40 (define-key mule-keymap "p" 'set-buffer-process-coding-system)
42 (define-key mule-keymap "P" 'set-default-process-coding-system) ; XEmacs
43 (define-key mule-keymap "\C-\\" 'select-input-method) 41 (define-key mule-keymap "\C-\\" 'select-input-method)
44 (define-key mule-keymap "c" 'list-coding-system-briefly) ; XEmacs 42 (define-key mule-keymap "c" 'universal-coding-system-argument)
43 ;;(define-key mule-keymap "c" 'list-coding-system-briefly) ; XEmacs
45 (define-key mule-keymap "C" 'list-coding-system) ; XEmacs 44 (define-key mule-keymap "C" 'list-coding-system) ; XEmacs
46 (define-key mule-keymap "r" 'toggle-display-direction) ; XEmacs 45 (define-key mule-keymap "r" 'toggle-display-direction) ; XEmacs
47 (define-key mule-keymap "l" 'set-language-environment) 46 (define-key mule-keymap "l" 'set-language-environment)
48 47
49 (define-key help-map "\C-L" 'describe-language-support) 48 (define-key help-map "\C-L" 'describe-language-support)
50 (define-key help-map "L" 'describe-language-environment) 49 (define-key help-map "L" 'describe-language-environment)
51 (define-key help-map "\C-\\" 'describe-input-method) 50 (define-key help-map "\C-\\" 'describe-input-method)
52 (define-key help-map "I" 'describe-input-method) 51 (define-key help-map "I" 'describe-input-method)
53 (define-key help-map "C" 'describe-current-coding-system) 52 (define-key help-map "C" 'describe-coding-system)
54 (define-key help-map "h" 'view-hello-file) 53 (define-key help-map "h" 'view-hello-file)
55 54
56 ;; Menu for XEmacs were moved to x11/x-menubar.el. 55 ;; Menu for XEmacs were moved to x11/x-menubar.el.
57 56
58 57
69 (interactive) 68 (interactive)
70 ;; We have to decode the file in any environment. 69 ;; We have to decode the file in any environment.
71 (let ((coding-system-for-read 'iso-2022-7)) 70 (let ((coding-system-for-read 'iso-2022-7))
72 (find-file-read-only (expand-file-name "HELLO" data-directory)))) 71 (find-file-read-only (expand-file-name "HELLO" data-directory))))
73 72
73 (defun universal-coding-system-argument ()
74 "Execute an I/O command using the specified coding system."
75 (interactive)
76 (let* ((coding-system
77 (read-coding-system "Coding system for following command: "))
78 (keyseq (read-key-sequence
79 (format "Command to execute with %s:" coding-system)))
80 (cmd (key-binding keyseq)))
81 (let ((coding-system-for-read coding-system)
82 (coding-system-for-write coding-system))
83 (message "")
84 (call-interactively cmd))))
85
86 (defun set-default-coding-systems (coding-system)
87 "Set default value of various coding systems to CODING-SYSTEM.
88 The follwing coding systems are set:
89 o coding system of a newly created buffer
90 o default coding system for terminal output
91 o default coding system for keyboard input
92 o default coding system for subprocess I/O"
93 (check-coding-system coding-system)
94 ;;(setq-default buffer-file-coding-system coding-system)
95 (set-default-buffer-file-coding-system coding-system)
96 ;;(setq default-terminal-coding-system coding-system)
97 (setq terminal-coding-system coding-system)
98 ;;(setq default-keyboard-coding-system coding-system)
99 (setq keyboard-coding-system coding-system)
100 ;;(setq default-process-coding-system (cons coding-system coding-system))
101 (add-hook 'comint-exec-hook
102 (lambda ()
103 (let ((proc (get-buffer-process (current-buffer))))
104 (set-process-input-coding-system proc coding-system)
105 (set-process-output-coding-system proc coding-system)
106 )))
107 (setq file-name-coding-system coding-system)
108 )
109
110 (defun prefer-coding-system (coding-system)
111 "Add CODING-SYSTEM at the front of the priority list for automatic detection.
112 This also sets the following coding systems to CODING-SYSTEM:
113 o coding system of a newly created buffer
114 o default coding system for terminal output
115 o default coding system for keyboard input
116 o default coding system for subprocess I/O"
117 (interactive "zPrefer coding system: ")
118 (if (not (and coding-system (coding-system-p coding-system)))
119 (error "Invalid coding system `%s'" coding-system))
120 (let ((coding-category (coding-system-category coding-system))
121 (parent (coding-system-parent coding-system)))
122 (if (not coding-category)
123 ;; CODING-SYSTEM is no-conversion or undecided.
124 (error "Can't prefer the coding system `%s'" coding-system))
125 (set coding-category (or parent coding-system))
126 (if (not (eq coding-category (car coding-category-list)))
127 ;; We must change the order.
128 (setq coding-category-list
129 (cons coding-category
130 (delq coding-category coding-category-list))))
131 (if (and parent (interactive-p))
132 (message "Highest priority is set to %s (parent of %s)"
133 parent coding-system))
134 (set-default-coding-systems (or parent coding-system))))
135
74 136
75 ;;; Language support staffs. 137 ;;; Language support staffs.
76
77 (defvar primary-language "English"
78 "Name of a user's primary language.
79 Emacs provide various language supports based on this variable.")
80 138
81 (defvar language-info-alist nil 139 (defvar language-info-alist nil
82 "Alist of language names vs the corresponding information of various kind. 140 "Alist of language names vs the corresponding information of various kind.
83 Each element looks like: 141 Each element looks like:
84 (LANGUAGE-NAME . ((KEY . INFO) ...)) 142 (LANGUAGE-NAME . ((KEY . INFO) ...))
139 (progn 197 (progn
140 (setq key-slot (list key)) 198 (setq key-slot (list key))
141 (setcdr lang-slot (cons key-slot (cdr lang-slot))))) 199 (setcdr lang-slot (cons key-slot (cdr lang-slot)))))
142 ;; Setup menu. 200 ;; Setup menu.
143 (cond ((eq key 'documentation) 201 (cond ((eq key 'documentation)
144 ;; (define-key-after mule-describe-language-support-map 202 ;; (define-key-after
203 ;; (if (consp info)
204 ;; (prog1 (symbol-value (cdr info))
205 ;; (setq info (car info)))
206 ;; describe-language-environment-map)
145 ;; (vector (intern language-name)) 207 ;; (vector (intern language-name))
146 ;; (cons language-name info) 208 ;; (cons language-name 'describe-specified-language-support)
147 ;; t) 209 ;; t)
210 (if (consp info)
211 (setq info (car info)))
148 (eval-after-load "x-menubar" 212 (eval-after-load "x-menubar"
149 `(add-menu-button '("Mule" "Describe Language Support") 213 `(add-menu-button
150 (vector ,language-name ',info t))) 214 '("Mule" "Describe Language Support")
215 (vector ,language-name
216 '(describe-language-environment ,language-name)
217 t)))
151 ) 218 )
152 ((eq key 'setup-function) 219 ((eq key 'setup-function)
153 ;; (define-key-after mule-set-language-environment-map 220 ;; (define-key-after
221 ;; (if (consp info)
222 ;; (prog1 (symbol-value (cdr info))
223 ;; (setq info (car info)))
224 ;; setup-language-environment-map)
154 ;; (vector (intern language-name)) 225 ;; (vector (intern language-name))
155 ;; (cons language-name info) 226 ;; (cons language-name 'setup-specified-language-environment)
156 ;; t) 227 ;; t)
228 (if (consp info)
229 (setq info (car info)))
157 (eval-after-load "x-menubar" 230 (eval-after-load "x-menubar"
158 `(add-menu-button '("Mule" "Set Language Environment") 231 `(add-menu-button
159 (vector ,language-name ',info t))) 232 '("Mule" "Set Language Environment")
233 (vector ,language-name
234 '(set-language-environment ,language-name)
235 t)))
160 )) 236 ))
237
238 (setcdr key-slot info)
161 )) 239 ))
162 240
163 (defun set-language-info-alist (language-name alist) 241 (defun set-language-info-alist (language-name alist)
164 "Set for LANGUAGE-NAME the information in ALIST. 242 "Set for LANGUAGE-NAME the information in ALIST.
165 ALIST is an alist of KEY and INFO. See the documentation of 243 ALIST is an alist of KEY and INFO. See the documentation of
176 This returns a language name as a string." 254 This returns a language name as a string."
177 (let* ((completion-ignore-case t) 255 (let* ((completion-ignore-case t)
178 (name (completing-read prompt 256 (name (completing-read prompt
179 language-info-alist 257 language-info-alist
180 (function (lambda (elm) (assq key elm))) 258 (function (lambda (elm) (assq key elm)))
181 t nil nil default))) 259 t nil default)))
182 (if (and (> (length name) 0) 260 (if (and (> (length name) 0)
183 (get-language-info name key)) 261 (get-language-info name key))
184 name))) 262 name)))
185 263
186 ;;; Multilingual input methods. 264 ;;; Multilingual input methods.
309 nil t nil 'input-method-history) 387 nil t nil 'input-method-history)
310 ;;default) 388 ;;default)
311 )) 389 ))
312 (if (> (length input-method) 0) 390 (if (> (length input-method) 0)
313 input-method 391 input-method
314 ;; If we have a default, use it, otherwise check inhibit-null 392 (if inhibit-null
315 (if default 393 (error "No valid input method is specified")))))
316 default
317 (if inhibit-null
318 (error "No valid input method is specified"))))))
319 394
320 (defun activate-input-method (input-method) 395 (defun activate-input-method (input-method)
321 "Turn INPUT-METHOD on. 396 "Turn INPUT-METHOD on.
322 If some input method is already on, turn it off at first." 397 If some input method is already on, turn it off at first."
323 (if (symbolp input-method) 398 (if (symbolp input-method)
371 else turn on an input method selected last time 446 else turn on an input method selected last time
372 or the default input method (see `default-input-method'). 447 or the default input method (see `default-input-method').
373 448
374 When there's no input method to turn on, turn on what read from minibuffer." 449 When there's no input method to turn on, turn on what read from minibuffer."
375 (interactive "P") 450 (interactive "P")
376 (if (eq arg 1)
377 (setq arg nil))
378 (let* ((default (or (car input-method-history) default-input-method))) 451 (let* ((default (or (car input-method-history) default-input-method)))
379 (if (and current-input-method (not arg)) 452 (if (and current-input-method (not arg))
380 (inactivate-input-method) 453 (inactivate-input-method)
381 (activate-input-method 454 (activate-input-method
382 (if (or arg (not default)) 455 (if (or arg (not default))
426 default-input-method 499 default-input-method
427 (read-input-method-name "Input method: " nil t))) 500 (read-input-method-name "Input method: " nil t)))
428 (if (and input-method (symbolp input-method)) 501 (if (and input-method (symbolp input-method))
429 (setq input-method (symbol-name input-method))) 502 (setq input-method (symbol-name input-method)))
430 (let ((current-input-method input-method)) 503 (let ((current-input-method input-method))
431 (read-string prompt initial-input nil nil t))) 504 ;; FSFmacs
505 ;; (read-string prompt initial-input nil nil t)))
506 (read-string prompt initial-input nil)))
432 507
433 ;; Variables to control behavior of input methods. All input methods 508 ;; Variables to control behavior of input methods. All input methods
434 ;; should react to these variables. 509 ;; should react to these variables.
435 510
436 (defcustom input-method-verbose-flag t 511 (defcustom input-method-verbose-flag t
477 input method temporalily. After the key is handled, the input method is 552 input method temporalily. After the key is handled, the input method is
478 back on. 553 back on.
479 But, if this flag is non-nil, the input method is never back on.") 554 But, if this flag is non-nil, the input method is never back on.")
480 555
481 556
482 ;;; Language specific setup functions. 557 (defun setup-specified-language-environment ()
483 ;; (defun set-language-environment (language-name) 558 "Set up multi-lingual environment convenient for the specified language."
484 ;; "Setup a user's environment for LANGUAGE-NAME. 559 (interactive)
485 ;; 560 (let (language-name)
486 ;; To setup, a fucntion returned by: 561 (if (and (symbolp last-command-event)
487 ;; (get-language-info LANGUAGE-NAME 'setup-function) 562 (or (not (eq last-command-event 'Default))
488 ;; is called." 563 (setq last-command-event 'English))
489 ;; (interactive (list (read-language-name 'setup-function "Language: "))) 564 (setq language-name (symbol-name last-command-event)))
490 ;; (let (func) 565 (set-language-environment language-name)
491 ;; (if (or (null language-name) 566 (error "Bogus calling sequence"))))
492 ;; (null (setq func 567
493 ;; (get-language-info language-name 'setup-function)))) 568 (defvar current-language-environment "English"
494 ;; (error "No way to setup environment for the specified language")) 569 "The last language environment specified with `set-language-environment'.")
495 ;; (funcall func))) 570
571 (defun set-language-environment (language-name)
572 "Set up multi-lingual environment for using LANGUAGE-NAME.
573 This sets the coding system priority and the default input method
574 and sometimes other things."
575 (interactive (list (read-language-name 'setup-function
576 "Set language environment: ")))
577 (if language-name
578 (if (symbolp language-name)
579 (setq language-name (symbol-name language-name)))
580 (setq language-name "English"))
581 (if (null (get-language-info language-name 'setup-function))
582 (error "Language environment not defined: %S" language-name))
583 (funcall (get-language-info language-name 'setup-function))
584 (setq current-language-environment language-name)
585 (force-mode-line-update t))
496 586
497 ;; Print all arguments with `princ', then print "\n". 587 ;; Print all arguments with `princ', then print "\n".
498 (defsubst princ-list (&rest args) 588 (defsubst princ-list (&rest args)
499 (while args (princ (car args)) (setq args (cdr args))) 589 (while args (princ (car args)) (setq args (cdr args)))
500 (princ "\n")) 590 (princ "\n"))
501 591
502 (defun describe-language-support (language-name) 592 ;; Print a language specific information such as input methods,
503 "Describe how Emacs supports LANGUAGE-NAME.
504
505 For that, a function returned by:
506 (get-language-info LANGUAGE-NAME 'describe-function)
507 is called."
508 (interactive (list (read-language-name 'documentation "Language: ")))
509 (let (func)
510 (if (or (null language-name)
511 (null (setq func
512 (get-language-info language-name 'describe-function))))
513 (error "No documentation for the specified language"))
514 (funcall func)))
515
516 ;; Print LANGUAGE-NAME specific information such as input methods,
517 ;; charsets, and coding systems. This function is intended to be 593 ;; charsets, and coding systems. This function is intended to be
518 ;; called from various describe-LANGUAGE-support functions defined in 594 ;; called from the menu:
519 ;; lisp/language/LANGUAGE.el. 595 ;; [menu-bar mule describe-language-environment LANGUAGE]
520 (defun describe-language-support-internal (language-name) 596 ;; and should not run it by `M-x describe-current-input-method-function'.
521 (with-output-to-temp-buffer "*Help*" 597 (defun describe-specified-language-support ()
522 (let ((doc (get-language-info language-name 'documentation))) 598 "Describe how Emacs supports the specified language environment."
599 (interactive)
600 (let (language-name)
601 (if (not (and (symbolp last-command-event)
602 (setq language-name (symbol-name last-command-event))))
603 (error "Bogus calling sequence"))
604 (describe-language-environment language-name)))
605
606 (defun describe-language-environment (language-name)
607 "Describe how Emacs supports language environment LANGUAGE-NAME."
608 (interactive
609 (list (read-language-name
610 'documentation
611 "Describe language environment (default, current choise): ")))
612 (if (null language-name)
613 (setq language-name current-language-environment))
614 (if (or (null language-name)
615 (null (get-language-info language-name 'documentation)))
616 (error "No documentation for the specified language"))
617 (if (symbolp language-name)
618 (setq language-name (symbol-name language-name)))
619 (let ((doc (get-language-info language-name 'documentation)))
620 (with-output-to-temp-buffer "*Help*"
523 (if (stringp doc) 621 (if (stringp doc)
524 (princ-list doc))) 622 (progn
525 (princ "-----------------------------------------------------------\n") 623 (princ-list doc)
526 (princ-list "List of items specific to " 624 (terpri)))
527 language-name 625 (let ((str (get-language-info language-name 'sample-text)))
528 " support") 626 (if (stringp str)
529 (princ "-----------------------------------------------------------\n") 627 (progn
530 (let ((str (get-language-info language-name 'sample-text))) 628 (princ "Sample text:\n")
531 (if (stringp str) 629 (princ-list " " str)
532 (progn 630 (terpri))))
533 (princ "<sample text>\n") 631 (princ "Input methods:\n")
534 (princ-list " " str)))) 632 (let ((l input-method-alist))
535 (princ "<input methods>\n") 633 (while l
536 (let ((l (get-language-info language-name 'input-method))) 634 (if (string= language-name (nth 1 (car l)))
537 (while l 635 (princ-list " " (car (car l))
538 (princ-list " " (car (car l))) 636 (format " (`%s' in mode line)" (nth 3 (car l)))))
539 (setq l (cdr l)))) 637 (setq l (cdr l))))
540 (princ "<character sets>\n") 638 (terpri)
541 (let ((l (get-language-info language-name 'charset))) 639 (princ "Character sets:\n")
542 (if (null l) 640 (let ((l (get-language-info language-name 'charset)))
543 (princ-list " nothing specific to " language-name) 641 (if (null l)
544 (while l 642 (princ-list " nothing specific to " language-name)
545 (princ-list " " (car l) ": " 643 (while l
546 (charset-description (car l))) 644 (princ-list " " (car l) ": "
547 (setq l (cdr l))))) 645 (charset-description (car l)))
548 (princ "<coding systems>\n") 646 (setq l (cdr l)))))
549 (let ((l (get-language-info language-name 'coding-system))) 647 (terpri)
550 (if (null l) 648 (princ "Coding systems:\n")
551 (princ-list " nothing specific to " language-name) 649 (let ((l (get-language-info language-name 'coding-system)))
552 (while l 650 (if (null l)
553 (princ-list " " (car l) ":\n\t" 651 (princ-list " nothing specific to " language-name)
554 (coding-system-docstring (car l))) 652 (while l
555 (setq l (cdr l))))))) 653 (princ ; (format " %s (`%c' in mode line):\n\t%s\n"
654 ;; In XEmacs, `coding-system-mnemonic' returns string.
655 (format " %s (`%s' in mode line):\n\t%s\n"
656 (car l)
657 (coding-system-mnemonic (car l))
658 (coding-system-doc-string (car l))))
659 (setq l (cdr l))))))))
556 660
557 ;;; Charset property 661 ;;; Charset property
558 662
559 ;; (defsubst get-charset-property (charset propname) 663 ;; (defsubst get-charset-property (charset propname)
560 ;; "Return the value of CHARSET's PROPNAME property. 664 ;; "Return the value of CHARSET's PROPNAME property.
566 ;; "Store CHARSETS's PROPNAME property with value VALUE. 670 ;; "Store CHARSETS's PROPNAME property with value VALUE.
567 ;; It can be retrieved with `(get-charset-property CHARSET PROPNAME)'." 671 ;; It can be retrieved with `(get-charset-property CHARSET PROPNAME)'."
568 ;; (set-charset-plist charset 672 ;; (set-charset-plist charset
569 ;; (plist-put (charset-plist charset) propname value))) 673 ;; (plist-put (charset-plist charset) propname value)))
570 674
571 ;;; Character code property 675 (defvar char-code-property-table
572 ;; (put 'char-code-property-table 'char-table-extra-slots 0) 676 (make-char-table 'generic)
573 677 "Char-table containing a property list of each character code.
574 ;; (defvar char-code-property-table
575 ;; (make-char-table 'char-code-property-table)
576 ;; "Char-table containing a property list of each character code.
577 ;; 678 ;;
578 ;; See also the documentation of `get-char-code-property' and 679 See also the documentation of `get-char-code-property' and
579 ;; `put-char-code-property'") 680 `put-char-code-property'")
580
581 ;; (defun get-char-code-property (char propname)
582 ;; "Return the value of CHAR's PROPNAME property in `char-code-property-table'."
583 ;; (let ((plist (aref char-code-property-table char))) 681 ;; (let ((plist (aref char-code-property-table char)))
584 ;; (if (listp plist) 682 (defun get-char-code-property (char propname)
585 ;; (car (cdr (memq propname plist)))))) 683 "Return the value of CHAR's PROPNAME property in `char-code-property-table'."
586 684 (let ((plist (get-char-table char char-code-property-table)))
587 ;; (defun put-char-code-property (char propname value) 685 (if (listp plist)
588 ;; "Store CHAR's PROPNAME property with VALUE in `char-code-property-table'. 686 (car (cdr (memq propname plist))))))
589 ;; It can be retrieved with `(get-char-code-property CHAR PROPNAME)'." 687
590 ;; (let ((plist (aref char-code-property-table char))) 688 (defun put-char-code-property (char propname value)
591 ;; (if plist 689 "Store CHAR's PROPNAME property with VALUE in `char-code-property-table'.
592 ;; (let ((slot (memq propname plist))) 690 It can be retrieved with `(get-char-code-property CHAR PROPNAME)'."
593 ;; (if slot 691 (let ((plist (get-char-table char char-code-property-table)))
692 (if plist
693 (let ((slot (memq propname plist)))
694 (if slot
695 (setcar (cdr slot) value)
696 (nconc plist (list propname value))))
697 (put-char-table char (list propname value) char-code-property-table)
698 )))
594 ;; (setcar (cdr slot) value) 699 ;; (setcar (cdr slot) value)
595 ;; (nconc plist (list propname value)))) 700 ;; (nconc plist (list propname value))))
596 ;; (aset char-code-property-table char (list propname value))))) 701 ;; (aset char-code-property-table char (list propname value)))))
597 702
598 ;;; mule-cmds.el ends here 703 ;;; mule-cmds.el ends here