Добрых суток, ЛОР.
Хочется мне, допустим, в английской раскладке иметь на клавишах сперва английские кавычки, а в русской — на тех же клавишах сперва русские. В Иксах тут никаких проблем нет. В Емаксе на первый взгляд тоже ничего сложного:
(quail-define-package
"test" "Test" "XX" nil
""
nil t t nil t nil nil nil nil nil t)
(quail-define-rules
("«" ?‘)
("»" ?’)
("‘" ?«)
("“" ?„)
("’" ?»)
("”" ?“))
(set-input-method 'test)
Однако если в направлении «
→ ‘
все работает, то ‘
→ «
— и не думает.
Документация по «Квэйлу» как-то скудновата, но из собственно quail.el
, а именно из quail-simple-translation-keymap
[0] становится понятно, что символы дальше 255-го по-умолчанию просто не обрабатываются, а из quail-define-package
[1] улавливается, что их должно быть можно включить в обработку вот так:
(quail-define-package
"test" "Test" "XX" nil
""
'(("‘" . quail-self-insert-command)
("’" . quail-self-insert-command)
("“" . quail-self-insert-command)
("”" . quail-self-insert-command))
t t nil t nil nil nil nil '() t)
После этого еще раз (quail-define-rules ...)
и (set-input-method 'test)
— и однако нифига.
Чего я не понимаю?
-- Приложения --
[0]
(defvar quail-simple-translation-keymap
(let ((map (make-keymap))
(i 0))
(while (< i ?\ )
(define-key map (char-to-string i) 'quail-other-command)
(setq i (1+ i)))
(while (< i 127)
(define-key map (char-to-string i) 'quail-self-insert-command)
(setq i (1+ i)))
(setq i 128)
(while (< i 256)
(define-key map (vector i) 'quail-self-insert-command)
(setq i (1+ i)))
(define-key map "\177" 'quail-delete-last-char)
(define-key map [delete] 'quail-delete-last-char)
(define-key map [backspace] 'quail-delete-last-char)
;;(let ((meta-map (make-sparse-keymap)))
;;(define-key map (char-to-string meta-prefix-char) meta-map)
;;(define-key map [escape] meta-map))
map))
[1]
(defun quail-define-package (name language title
&optional guidance docstring translation-keys
forget-last-selection deterministic
kbd-translate show-layout create-decode-map
maximum-shortest overlay-plist
update-translation-function
conversion-keys simple)
(let (translation-keymap conversion-keymap)
(if deterministic (setq forget-last-selection t))
(if translation-keys
(progn
(setq translation-keymap (copy-keymap
(if simple quail-simple-translation-keymap
quail-translation-keymap)))
(dolist (trans translation-keys)
(define-key translation-keymap (car trans) (cdr trans))))
(setq translation-keymap
(if simple quail-simple-translation-keymap
quail-translation-keymap)))
(when conversion-keys
(setq conversion-keymap (copy-keymap quail-conversion-keymap))
(dolist (conv conversion-keys)
(define-key conversion-keymap (car conv) (cdr conv))))
(quail-add-package
(list name title (list nil) guidance (or docstring "")
translation-keymap
forget-last-selection deterministic kbd-translate show-layout
(if create-decode-map (list 'decode-map) nil)
maximum-shortest overlay-plist update-translation-function
conversion-keymap simple))
;; Update input-method-alist.
(let ((slot (assoc name input-method-alist))
(val (list language 'quail-use-package title docstring)))
(if slot (setcdr slot val)
(setq input-method-alist (cons (cons name val) input-method-alist)))))
(quail-select-package name))