Merge from trunk.
[bpt/emacs.git] / leim / quail / uni-input.el
CommitLineData
7115232b
DL
1;;; uni-input.el --- Hex Unicode input method
2
ab422c4d 3;; Copyright (C) 2001-2013 Free Software Foundation, Inc.
5df4f04c 4;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
698218a2
KH
5;; National Institute of Advanced Industrial Science and Technology (AIST)
6;; Registration Number H14PRO021
7115232b
DL
7
8;; Author: Dave Love <fx@gnu.org>
9;; Keywords: i18n
10
041f4d74
PJ
11;; This file is part of GNU Emacs.
12
3d544458 13;; GNU Emacs is free software: you can redistribute it and/or modify
7115232b 14;; it under the terms of the GNU General Public License as published by
3d544458
GM
15;; the Free Software Foundation, either version 3 of the License, or
16;; (at your option) any later version.
7115232b 17
3d544458 18;; GNU Emacs is distributed in the hope that it will be useful,
7115232b
DL
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
3d544458 24;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
7115232b
DL
25
26;;; Commentary:
27
28;; Provides an input method for entering characters by hex unicode in
29;; the form `uxxxx', similarly to the Yudit editor.
30
31;; This is not really a Quail method, but uses some Quail functions.
32;; There is probably A Better Way.
33
d6e5e4db
DL
34;; You can get a similar effect by using C-q with
35;; `read-quoted-char-radix' set to 16.
7115232b 36
5d9c1e7a
DL
37;; Note that this only allows you to enter BMP values unless someone
38;; extends it to use variable numbers of digits.
39
7115232b
DL
40;;; Code:
41
42(require 'quail)
43
ad7d24c4
KH
44(defun ucs-input-insert-char (char)
45 (insert char)
46 (move-overlay quail-overlay (overlay-start quail-overlay) (point)))
47
7115232b
DL
48(defun ucs-input-method (key)
49 (if (or buffer-read-only
50 (and (/= key ?U) (/= key ?u)))
51 (list key)
52 (quail-setup-overlays nil)
ad7d24c4 53 (ucs-input-insert-char key)
7115232b
DL
54 (let ((modified-p (buffer-modified-p))
55 (buffer-undo-list t)
56 (input-method-function nil)
57 (echo-keystrokes 0)
58 (help-char nil)
59 (events (list key))
60 (str " "))
61 (unwind-protect
62 (catch 'non-digit
63 (progn
64 (dotimes (i 4)
65 (let ((seq (read-key-sequence nil))
66 key)
67 (if (and (stringp seq)
68 (= 1 (length seq))
69 (setq key (aref seq 0))
70 (memq key '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 ?a
d6e5e4db 71 ?b ?c ?d ?e ?f ?A ?B ?C ?D ?E ?F)))
7115232b
DL
72 (progn
73 (push key events)
ad7d24c4 74 (ucs-input-insert-char key))
7115232b
DL
75 (quail-delete-region)
76 (throw 'non-digit (append (reverse events)
77 (listify-key-sequence seq))))))
78 (quail-delete-region)
d6e5e4db
DL
79 (let ((n (string-to-number (apply 'string
80 (cdr (nreverse events)))
81 16)))
82 (if (characterp n)
83 (list n)))))
7115232b
DL
84 (quail-delete-overlays)
85 (set-buffer-modified-p modified-p)
86 (run-hooks 'input-method-after-insert-chunk-hook)))))
87
88(defun ucs-input-activate (&optional arg)
89 "Activate UCS input method.
90With arg, activate UCS input method if and only if arg is positive.
91
92While this input method is active, the variable
93`input-method-function' is bound to the function `ucs-input-method'."
94 (if (and arg
95 (< (prefix-numeric-value arg) 0))
96 (unwind-protect
97 (progn
ad7d24c4 98 (quail-hide-guidance)
7115232b
DL
99 (quail-delete-overlays)
100 (setq describe-current-input-method-function nil))
101 (kill-local-variable 'input-method-function))
72b255c7 102 (setq deactivate-current-input-method-function 'ucs-input-deactivate)
7115232b
DL
103 (setq describe-current-input-method-function 'ucs-input-help)
104 (quail-delete-overlays)
105 (if (eq (selected-window) (minibuffer-window))
106 (add-hook 'minibuffer-exit-hook 'quail-exit-from-minibuffer))
7115232b
DL
107 (set (make-local-variable 'input-method-function)
108 'ucs-input-method)))
109
72b255c7
PE
110(defun ucs-input-deactivate ()
111 "Deactivate UCS input method."
7115232b
DL
112 (interactive)
113 (ucs-input-activate -1))
114
72b255c7
PE
115(define-obsolete-function-alias
116 'ucs-input-inactivate
2a1e2476 117 'ucs-input-deactivate "24.3")
72b255c7 118
7115232b
DL
119(defun ucs-input-help ()
120 (interactive)
121 (with-output-to-temp-buffer "*Help*"
122 (princ "\
e4208ff7 123Input method: ucs (mode line indicator:U+)
7115232b
DL
124
125Input as Unicode: U<hex> or u<hex>, where <hex> is a four-digit hex number.")))
126
ad7d24c4
KH
127;; The file ../leim-ext.el contains the following call.
128;; (register-input-method "ucs" "UTF-8" 'ucs-input-activate "U+"
129;; "Unicode input as hex in the form Uxxxx.")
7115232b
DL
130
131(provide 'uni-input)
132
133;;; uni-input.el ends here