(U-00020643): Apply new conventions for glyph granularity.
[chise/xemacs-chise.git-] / lisp / code-cmds.el
1 ;;; code-cmds.el --- Commands for manipulating coding systems..
2
3 ;; Copyright (C) 1995,1999 Electrotechnical Laboratory, JAPAN.
4 ;; Licensed to the Free Software Foundation.
5 ;; Copyright (C) 2000 Free Software Foundation
6 ;; Copyright (C) 1997 MORIOKA Tomohiko
7
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 ;;
27 ;; This code defines the keybindings and utility commands for the
28 ;; user to manipulate coding systems.
29 ;; This code used to be in mule-cmds.el which now only needs the
30 ;; additional bindings/commands that are avaible on the real mule.
31
32
33 ;;; Code:
34
35 ;;; Coding related key bindings and menus.
36
37 (defvar coding-keymap (make-sparse-keymap "Mule/Conding")
38   "Keymap for Mule and Coding cystem specific commands.")
39
40 ;; Keep "C-x C-m ..." for mule specific commands.
41 (define-key ctl-x-map "\C-m" coding-keymap)
42
43 (define-key coding-keymap "f" 'set-buffer-file-coding-system)
44 (define-key coding-keymap "F" 'set-default-buffer-file-coding-system) ; XEmacs
45 (define-key coding-keymap "t" 'set-terminal-coding-system)
46 (define-key coding-keymap "p" 'set-buffer-process-coding-system)
47 ;(define-key coding-keymap "x" 'set-selection-coding-system)
48 ;(define-key coding-keymap "X" 'set-next-selection-coding-system)
49 (define-key coding-keymap "c" 'universal-coding-system-argument)
50 ;;(define-key coding-keymap "c" 'list-coding-system-briefly) ; XEmacs
51 ;;(define-key coding-keymap "C" 'describe-coding-system)         ; XEmacs
52
53
54 (defun coding-system-change-eol-conversion (coding-system eol-type)
55   "Return a coding system which differs from CODING-SYSTEM in eol conversion.
56 The returned coding system converts end-of-line by EOL-TYPE
57 but text as the same way as CODING-SYSTEM.
58 EOL-TYPE should be `lf', `crlf', `cr' or nil.
59 If EOL-TYPE is nil, the returned coding system detects
60 how end-of-line is formatted automatically while decoding.
61
62 EOL-TYPE can be specified by an symbol `unix', `dos' or `mac'.
63 They means `lf', `crlf', and `cr' respectively."
64   (if (symbolp eol-type)
65       (setq eol-type (cond ((or (eq eol-type 'unix)
66                                 (eq eol-type 'lf))
67                             'eol-lf)
68                            ((or (eq eol-type 'dos)
69                                 (eq eol-type 'crlf))
70                             'eol-crlf)
71                            ((or (eq eol-type 'mac)
72                                 (eq eol-type 'cr))
73                             'eol-cr)
74                            (t eol-type))))
75   (let ((orig-eol-type (coding-system-eol-type coding-system)))
76     (if (null orig-eol-type)
77         (if (not eol-type)
78             coding-system
79           (coding-system-property coding-system eol-type))
80       (let ((base (coding-system-base coding-system)))
81         (if (not eol-type)
82             base
83           (if (= eol-type orig-eol-type)
84               coding-system
85             (setq orig-eol-type (coding-system-eol-type base))
86             (if (null orig-eol-type)
87                 (coding-system-property base eol-type))))))))
88
89
90 (defun universal-coding-system-argument ()
91   "Execute an I/O command using the specified coding system."
92   (interactive)
93   (let* ((default (and buffer-file-coding-system
94                        (not (eq (coding-system-type buffer-file-coding-system)
95                                 t))
96                        (coding-system-name buffer-file-coding-system)))
97          (coding-system
98           (read-coding-system
99            (if default
100                (format "Coding system for following command (default, %s): "
101                        default)
102              "Coding system for following command: ")
103            default))
104          (keyseq (read-key-sequence
105                   (format "Command to execute with %s:" coding-system)))
106          (cmd (key-binding keyseq)))
107     (let ((coding-system-for-read coding-system)
108           (coding-system-for-write coding-system))
109       (message "")
110       (call-interactively cmd))))
111
112 (defun set-default-coding-systems (coding-system)
113   "Set default value of various coding systems to CODING-SYSTEM.
114 This sets the following coding systems:
115   o coding system of a newly created buffer
116   o default coding system for terminal output
117   o default coding system for keyboard input
118   o default coding system for subprocess I/O
119   o default coding system for converting file names."
120   (check-coding-system coding-system)
121   ;;(setq-default buffer-file-coding-system coding-system)
122   (set-default-buffer-file-coding-system coding-system)
123   ;; (if default-enable-multibyte-characters
124   ;;     (setq default-file-name-coding-system coding-system))
125   ;; If coding-system is nil, honor that on MS-DOS as well, so
126   ;; that they could reset the terminal coding system.
127   ;; (unless (and (eq window-system 'pc) coding-system)
128   ;;   (setq default-terminal-coding-system coding-system))
129   (set-terminal-coding-system coding-system)
130   ;;(setq default-keyboard-coding-system coding-system)
131   (set-keyboard-coding-system coding-system)
132   ;;(setq default-process-coding-system (cons coding-system coding-system))
133   ;; Refer to coding-system-for-read and coding-system-for-write
134   ;; so that C-x RET c works.
135   (add-hook 'comint-exec-hook
136             `(lambda ()
137                (let ((proc (get-buffer-process (current-buffer))))
138                  (set-process-input-coding-system
139                   proc (or coding-system-for-read ',coding-system))
140                  (set-process-output-coding-system
141                   proc (or coding-system-for-write ',coding-system))))
142             'append)
143   (setq file-name-coding-system coding-system))
144
145 (defun prefer-coding-system (coding-system)
146   "Add CODING-SYSTEM at the front of the priority list for automatic detection.
147 This also sets the following coding systems:
148   o coding system of a newly created buffer
149   o default coding system for terminal output
150   o default coding system for keyboard input
151   o default coding system for converting file names.
152
153 If CODING-SYSTEM specifies a certain type of EOL conversion, the coding
154 systems set by this function will use that type of EOL conversion.
155
156 This command does not change the default value of terminal coding system
157 for MS-DOS terminal, because DOS terminals only support a single coding
158 system, and Emacs automatically sets the default to that coding system at
159 startup."
160   (interactive "zPrefer coding system: ")
161   (if (not (and coding-system (find-coding-system coding-system)))
162       (error "Invalid coding system `%s'" coding-system))
163   (let ((coding-category (coding-system-category coding-system))
164         (base (coding-system-base coding-system))
165         (eol-type (coding-system-eol-type coding-system)))
166     (if (not coding-category)
167         ;; CODING-SYSTEM is no-conversion or undecided.
168         (error "Can't prefer the coding system `%s'" coding-system))
169     (set-coding-category-system coding-category (or base coding-system))
170     ;; (update-coding-systems-internal)
171     (or (eq coding-category (car (coding-category-list)))
172         ;; We must change the order.
173         (set-coding-priority-list (list coding-category)))
174     (if (and base (interactive-p))
175         (message "Highest priority is set to %s (base of %s)"
176                  base coding-system))
177     ;; If they asked for specific EOL conversion, honor that.
178     (if (memq eol-type '(lf crlf mac))
179         (setq coding-system
180               (coding-system-change-eol-conversion base eol-type))
181       (setq coding-system base))
182     (set-default-coding-systems coding-system)))
183
184 ;;; Commands
185
186 (defun set-buffer-process-coding-system (decoding encoding)
187   "Set coding systems for the process associated with the current buffer.
188 DECODING is the coding system to be used to decode input from the process,
189 ENCODING is the coding system to be used to encode output to the process.
190
191 For a list of possible values of CODING-SYSTEM, use \\[list-coding-systems]."
192   (interactive
193    "zCoding-system for process input: \nzCoding-system for process output: ")
194   (let ((proc (get-buffer-process (current-buffer))))
195     (if (null proc)
196         (error "no process")
197       (check-coding-system decoding)
198       (check-coding-system encoding)
199       (set-process-coding-system proc decoding encoding)))
200   (force-mode-line-update))
201
202 (provide 'code-cmds)
203
204 ;;; code-cmds.el ends here