summaryrefslogtreecommitdiff
path: root/lisp/international
diff options
context:
space:
mode:
authorJuri Linkov <juri@linkov.net>2020-11-06 10:31:58 +0200
committerJuri Linkov <juri@linkov.net>2020-11-06 10:31:58 +0200
commitaf6891629d48f348b6458384898a637cc7ce16e7 (patch)
treee88c153ad14a9d4866548e5a24aa5d2fa1fa0247 /lisp/international
parent2180ccbe29701f274d8390355d13ee41cf9727be (diff)
downloademacs-af6891629d48f348b6458384898a637cc7ce16e7.tar.gz
Support transient input methods in Isearch mode (bug#44266)
* doc/emacs/mule.texi (Select Input Method): Rename transient-input-method to activate-transient-input-method. * doc/emacs/search.texi (Special Isearch): Document isearch-transient-input-method. * lisp/international/isearch-x.el (isearch-transient-input-method): New function. (isearch-process-search-multibyte-characters): Call 'deactivate-transient-input-method' after 'read-string'. * lisp/international/mule-cmds.el (mule-menu-keymap): Remove duplicate menu item 'describe-input-method'. Add new menu item 'activate-transient-input-method'. (default-transient-input-method): Rename from transient-input-method. (current-transient-input-method) (previous-transient-input-method): New buffer-local variables. (deactivate-input-method): Don't add current-transient-input-method to input-method-history. (toggle-input-method): Call deactivate-transient-input-method when current-transient-input-method is non-nil. (activate-transient-input-method): Rename from transient-input-method. (deactivate-transient-input-method): New function with body from renamed function transient-input-method. * lisp/isearch.el (isearch-menu-bar-map): Add new menu item 'isearch-transient-input-method'. (isearch-mode-map): Bind 'C-x \' to isearch-transient-input-method. (isearch-forward): Add isearch-transient-input-method to docstring. (isearch-message-prefix): Use shorter string for narrowed buffer.
Diffstat (limited to 'lisp/international')
-rw-r--r--lisp/international/isearch-x.el12
-rw-r--r--lisp/international/mule-cmds.el95
2 files changed, 70 insertions, 37 deletions
diff --git a/lisp/international/isearch-x.el b/lisp/international/isearch-x.el
index d77234ec77b..f50f86a035f 100644
--- a/lisp/international/isearch-x.el
+++ b/lisp/international/isearch-x.el
@@ -51,6 +51,17 @@
(setq input-method-function nil)
(isearch-update))
+;;;###autoload
+(defun isearch-transient-input-method ()
+ "Activate transient input method in interactive search."
+ (interactive)
+ (let ((overriding-terminal-local-map nil))
+ (activate-transient-input-method))
+ (setq isearch-input-method-function input-method-function
+ isearch-input-method-local-p t)
+ (setq input-method-function nil)
+ (isearch-update))
+
(defvar isearch-minibuffer-local-map
(let ((map (copy-keymap minibuffer-local-map)))
(define-key map [with-keyboard-coding] 'isearch-with-keyboard-coding)
@@ -117,6 +128,7 @@
(cons last-char unread-command-events))
;; Inherit current-input-method in a minibuffer.
str (read-string prompt isearch-message 'junk-hist nil t))
+ (deactivate-transient-input-method)
(if (or (not str) (< (length str) (length isearch-message)))
;; All inputs were deleted while the input method
;; was working.
diff --git a/lisp/international/mule-cmds.el b/lisp/international/mule-cmds.el
index dc435d9b170..439843aaf8e 100644
--- a/lisp/international/mule-cmds.el
+++ b/lisp/international/mule-cmds.el
@@ -55,7 +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)
+(define-key ctl-x-map "\\" 'activate-transient-input-method)
(defvar describe-language-environment-map
(let ((map (make-sparse-keymap "Describe Language Environment")))
@@ -140,8 +140,8 @@
`(menu-item "Set Coding Systems" ,set-coding-system-map))
(bindings--define-key map [separator-input-method] menu-bar-separator)
- (bindings--define-key map [describe-input-method]
- '(menu-item "Describe Input Method" describe-input-method))
+ (bindings--define-key map [activate-transient-input-method]
+ '(menu-item "Transient Input Method" activate-transient-input-method))
(bindings--define-key map [set-input-method]
'(menu-item "Select Input Method..." set-input-method))
(bindings--define-key map [toggle-input-method]
@@ -1345,10 +1345,10 @@ This is the input method activated automatically by the command
mule-input-method-string)
:set-after '(current-language-environment))
-(defcustom transient-input-method nil
+(defcustom default-transient-input-method nil
"Default transient input method.
This is the input method activated by the command
-`transient-input-method' (\\[transient-input-method])."
+`activate-transient-input-method' (\\[activate-transient-input-method])."
:link '(custom-manual "(emacs)Input Methods")
:group 'mule
:type '(choice (const nil)
@@ -1356,6 +1356,18 @@ This is the input method activated by the command
:set-after '(current-language-environment)
:version "28.1")
+(defvar current-transient-input-method nil
+ "The current input method temporarily enabled by `activate-transient-input-method'.
+If nil, that means no transient input method is active now.")
+(make-variable-buffer-local 'current-transient-input-method)
+(put 'current-transient-input-method 'permanent-local t)
+
+(defvar previous-transient-input-method nil
+ "The input method that was active before enabling the transient input method.
+If nil, that means no previous input method was active.")
+(make-variable-buffer-local 'previous-transient-input-method)
+(put 'previous-transient-input-method 'permanent-local t)
+
(put 'input-method-function 'permanent-local t)
(defvar input-method-history nil
@@ -1490,7 +1502,8 @@ If INPUT-METHOD is nil, deactivate any current input method."
(defun deactivate-input-method ()
"Turn off the current input method."
(when current-input-method
- (add-to-history 'input-method-history current-input-method)
+ (unless current-transient-input-method
+ (add-to-history 'input-method-history current-input-method))
(unwind-protect
(progn
(setq input-method-function nil
@@ -1531,36 +1544,6 @@ 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 a transient input method for the current buffer.
-If `transient-input-method' was not yet defined, prompt for it."
- (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.
@@ -1582,7 +1565,9 @@ which marks the variable `default-input-method' as set for Custom buffers."
(if toggle-input-method-active
(error "Recursive use of `toggle-input-method'"))
(if (and current-input-method (not arg))
- (deactivate-input-method)
+ (if current-transient-input-method
+ (deactivate-transient-input-method)
+ (deactivate-input-method))
(let ((toggle-input-method-active t)
(default (or (car input-method-history) default-input-method)))
(if (and arg default (equal current-input-method default)
@@ -1601,6 +1586,42 @@ which marks the variable `default-input-method' as set for Custom buffers."
(when interactive
(customize-mark-as-set 'default-input-method)))))))
+(defun activate-transient-input-method (&optional arg interactive)
+ "Select and enable a transient input method for the current buffer.
+If `default-transient-input-method' was not yet defined, prompt for it."
+ (interactive "P\np")
+ (when (or arg (not default-transient-input-method))
+ (let* ((default (or (car input-method-history) default-input-method))
+ (input-method
+ (read-input-method-name
+ (format-prompt "Transient input method" default)
+ default t)))
+ (setq default-transient-input-method input-method)
+ (when interactive
+ (customize-mark-as-set 'default-transient-input-method))))
+ (let* ((clearfun (make-symbol "clear-transient-input-method"))
+ (exitfun
+ (lambda ()
+ (deactivate-transient-input-method)
+ (remove-hook 'input-method-after-insert-chunk-hook clearfun))))
+ (fset clearfun (lambda () (funcall exitfun)))
+ (add-hook 'input-method-after-insert-chunk-hook clearfun)
+ (setq previous-transient-input-method current-input-method)
+ (when previous-transient-input-method
+ (deactivate-input-method))
+ (activate-input-method default-transient-input-method)
+ (setq current-transient-input-method default-transient-input-method)
+ exitfun))
+
+(defun deactivate-transient-input-method ()
+ "Disable currently active transient input method for the current buffer."
+ (when current-transient-input-method
+ (deactivate-input-method)
+ (when previous-transient-input-method
+ (activate-input-method previous-transient-input-method)
+ (setq previous-transient-input-method nil))
+ (setq current-transient-input-method nil)))
+
(autoload 'help-buffer "help-mode")
(defun describe-input-method (input-method)