From: Juri Linkov Date: Sun, 1 Nov 2020 21:35:41 +0000 (+0200) Subject: Transient input methods bound to 'C-x \' (bug#44266) X-Git-Tag: emacs-28.0.90~5287^2~4 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=030ab2dad50a448bd5cf3ef06f5d768717cdac70;p=emacs.git Transient input methods bound to 'C-x \' (bug#44266) * lisp/international/mule-cmds.el (ctl-x-map): Bind 'C-x \' to 'transient-input-method'. (input-method-function): New defcustom. (transient-input-method): New command. * doc/emacs/mule.texi (Select Input Method): Document transient-input-method. --- diff --git a/doc/emacs/mule.texi b/doc/emacs/mule.texi index b78019020a6..d4ad1d6d5e2 100644 --- a/doc/emacs/mule.texi +++ b/doc/emacs/mule.texi @@ -578,6 +578,11 @@ Enable or disable use of the selected input method (@code{toggle-input-method}). @item C-x @key{RET} C-\ @var{method} @key{RET} Select a new input method for the current buffer (@code{set-input-method}). +@item C-x \ @var{method} @key{RET} +Temporarily enable the selected transient input method, and +automatically disable it after inserting a single character +(@code{transient-input-method}). + @item C-h I @var{method} @key{RET} @itemx C-h C-\ @var{method} @key{RET} @findex describe-input-method @@ -675,6 +680,16 @@ character. input methods. The list gives information about each input method, including the string that stands for it in the mode line. +@findex transient-input-method +@kindex C-x \ + To insert only a single character using a transient input method you +can first select a transient input method by typing @kbd{C-u C-x \}. +Then typing @kbd{C-x \} (@code{transient-input-method}) will +temporarily enable the selected transient input method, and disable it +automatically after using the activated input method to insert +a single character. This is useful to insert a character from input +methods with rare Unicode characters. + @node Coding Systems @section Coding Systems @cindex coding systems diff --git a/etc/NEWS b/etc/NEWS index 7bf212dd134..1061a15cd23 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -132,14 +132,6 @@ Emacs to break lines after more characters than just whitespace characters. In particular, this significantly improves word-wrapping for CJK text mixed with Latin text. ---- -** New input method 'compose' based on X Multi_key sequences. - ---- -** Improved language transliteration in Malayalam input methods. -Added a new Mozhi scheme. The inapplicable ITRANS scheme is now -deprecated. Errors in the Inscript method were corrected. - --- ** Rudimentary support for the 'st' terminal emulator. Emacs now supports 256 color display on the 'st' terminal emulator. @@ -629,6 +621,23 @@ recorded for the purpose of 'view-lossage'. The menu bar "Help" menu now has a "Show Recent Inputs" item under the "Describe" sub-menu. +** Input methods + ++++ +*** 'C-x \' temporarily enables a transient input method. +'C-u C-x \' can be used to select a transient input method, e.g. +'C-u C-x \ compose RET' selects the 'compose' input method. Then typing +'C-x \ 1 2' will insert the character '½', and disable the input method +afterwards. + +--- +*** New input method 'compose' based on X Multi_key sequences. + +--- +*** Improved language transliteration in Malayalam input methods. +Added a new Mozhi scheme. The inapplicable ITRANS scheme is now +deprecated. Errors in the Inscript method were corrected. + ** Ispell +++ diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el index e3155dfc52c..c5a01451637 100644 --- a/lisp/international/mule-cmds.el +++ b/lisp/international/mule-cmds.el @@ -55,6 +55,7 @@ ;; Keep "C-x C-m ..." for mule specific commands. (define-key ctl-x-map "\C-m" mule-keymap) +(define-key ctl-x-map "\\" 'transient-input-method) (defvar describe-language-environment-map (let ((map (make-sparse-keymap "Describe Language Environment"))) @@ -1344,6 +1345,16 @@ This is the input method activated automatically by the command mule-input-method-string) :set-after '(current-language-environment)) +(defcustom transient-input-method nil + "Default transient input method. +This is the input method activated automatically by the command +`transient-input-method' (\\[transient-input-method])." + :link '(custom-manual "(emacs)Input Methods") + :group 'mule + :type '(choice (const nil) + mule-input-method-string) + :set-after '(current-language-environment)) + (put 'input-method-function 'permanent-local t) (defvar input-method-history nil @@ -1519,6 +1530,35 @@ To deactivate it programmatically, use `deactivate-input-method'." (defvar toggle-input-method-active nil "Non-nil inside `toggle-input-method'.") +(defun transient-input-method (&optional arg interactive) + "Enable transient input method for the current buffer." + (interactive "P\np") + (when (or arg (not transient-input-method)) + (let* ((default (or (car input-method-history) default-input-method)) + (input-method + (read-input-method-name + (if default "Transient input method (default %s): " "Transient input method: ") + default t))) + (setq transient-input-method input-method) + (when interactive + (customize-mark-as-set 'transient-input-method)))) + (let* ((previous-input-method current-input-method) + (history input-method-history) + (clearfun (make-symbol "clear-transient-input-method")) + (exitfun + (lambda () + (deactivate-input-method) + (when previous-input-method + (activate-input-method previous-input-method)) + (setq input-method-history history) + (remove-hook 'input-method-after-insert-chunk-hook clearfun)))) + (fset clearfun (lambda () (funcall exitfun))) + (add-hook 'input-method-after-insert-chunk-hook clearfun) + (when previous-input-method + (deactivate-input-method)) + (activate-input-method transient-input-method) + exitfun)) + (defun toggle-input-method (&optional arg interactive) "Enable or disable multilingual text input method for the current buffer. Only one input method can be enabled at any time in a given buffer.