Package: emacs;
Reported by: Jean Louis <bugs <at> gnu.support>
Date: Wed, 2 Dec 2020 10:51:01 UTC
Severity: normal
Tags: fixed, patch
Fixed in version 28.0.50
Done: Juri Linkov <juri <at> linkov.net>
Bug is archived. No further changes may be made.
Message #13 received at 45005 <at> debbugs.gnu.org (full text, mbox):
From: Jean Louis <bugs <at> gnu.support> To: Juri Linkov <juri <at> linkov.net> Cc: 45005 <at> debbugs.gnu.org Subject: Re: bug#45005: 28.0.50; input method does not switch back Date: Tue, 8 Dec 2020 13:10:15 +0300
* Juri Linkov <juri <at> linkov.net> [2020-12-08 12:10]: > tags 45005 + patch That is great if it is solved not to happen again. I cannot see through. Are you sure you found the right culprit? > > This is report for which I do not think that it is reproducible as I > > tried to invoke it with emacs -Q and I would need to perform some work > > from which I could not find out what invokes the bug. > > > > My other input method is by default set to german-postfix. > > > > My Emacs uptime now is about 1 day, 15 hours. About 15 hours ago, I > > could observe that I cannot turn off the input method with C-\ but > > that it remains engaged. > > > > Mode line may show DE<U: and when I press C-\ it shows U: but again I > > can write ü ö ä and some words in other languages collide. I am using > > other few input methods for other languages, then it becomes difficult > > writing English as some combinations of letters get converted in other > > letters, then I have to delete, etc. If I make new session it will of > > course be alright. For my last 5 years I have not encountered this > > situation that input-method kind of remains turned on even if I turn > > it off. > > This problem can happen only when the default global value of > input-method-function is changed, so it still translates keys > while the input method is disabled. > > When an input method is activated, 'quail-activate' uses > > (setq-local input-method-function #'quail-input-method) > > to set the buffer-local value, and when an input method is deactivated, > removes the buffer-local value: > > (kill-local-variable 'input-method-function) > > So it doesn't change its default global value. > > The only place on the whole Emacs tree that can change the > default global value of input-method-function is 'isearch-done': > > (if isearch-input-method-local-p > (setq input-method-function isearch-input-method-function) > (kill-local-variable 'input-method-function)) > > Many functions in international/isearch-x.el set isearch-input-method-local-p > to 't', but never set it to 'nil'. So when after using an input method > in Isearch (enabling and disabling it) on exiting Isearch, this code > always changes the default global value of input-method-function. > > Instead of this, this code should use the same logic as used by > 'quail-activate': when a previous input method should be re-activated, > then set its buffer-local value, otherwise use kill-local-variable. > > This logic will obsolete the variable isearch-input-method-local-p: > > diff --git a/lisp/isearch.el b/lisp/isearch.el > index a0aa250c4b..69c553deda 100644 > --- a/lisp/isearch.el > +++ b/lisp/isearch.el > @@ -965,10 +965,6 @@ isearch-hidden > ;; The value of input-method-function when isearch is invoked. > (defvar isearch-input-method-function nil) > > -;; A flag to tell if input-method-function is locally bound when > -;; isearch is invoked. > -(defvar isearch-input-method-local-p nil) > - > (defvar isearch--saved-overriding-local-map nil) > > ;; Minor-mode-alist changes - kind of redundant with the > @@ -1238,7 +1234,6 @@ isearch-mode > search-ring-yank-pointer nil > isearch-opened-overlays nil > isearch-input-method-function input-method-function > - isearch-input-method-local-p (local-variable-p 'input-method-function) > regexp-search-ring-yank-pointer nil > > isearch-pre-scroll-point nil > @@ -1259,8 +1254,6 @@ isearch-mode > ;; We must bypass input method while reading key. When a user type > ;; printable character, appropriate input method is turned on in > ;; minibuffer to read multibyte characters. > - (or isearch-input-method-local-p > - (make-local-variable 'input-method-function)) > (setq input-method-function nil) > > (looking-at "") > @@ -1418,8 +1411,8 @@ isearch-done > (set-window-group-start (selected-window) found-start t)))) > > (setq isearch-mode nil) > - (if isearch-input-method-local-p > - (setq input-method-function isearch-input-method-function) > + (if isearch-input-method-function > + (setq-local input-method-function isearch-input-method-function) > (kill-local-variable 'input-method-function)) > > (if isearch-tool-bar-old-map > diff --git a/lisp/international/isearch-x.el b/lisp/international/isearch-x.el > index f50f86a035..94716721b5 100644 > --- a/lisp/international/isearch-x.el > +++ b/lisp/international/isearch-x.el > @@ -35,8 +35,7 @@ isearch-toggle-specified-input-method > (interactive) > (let ((overriding-terminal-local-map nil)) > (toggle-input-method t)) > - (setq isearch-input-method-function input-method-function > - isearch-input-method-local-p t) > + (setq isearch-input-method-function input-method-function) > (setq input-method-function nil) > (isearch-update)) > > @@ -46,8 +45,7 @@ isearch-toggle-input-method > (interactive) > (let ((overriding-terminal-local-map nil)) > (toggle-input-method)) > - (setq isearch-input-method-function input-method-function > - isearch-input-method-local-p t) > + (setq isearch-input-method-function input-method-function) > (setq input-method-function nil) > (isearch-update)) > > @@ -57,8 +55,7 @@ isearch-transient-input-method > (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 isearch-input-method-function input-method-function) > (setq input-method-function nil) > (isearch-update)) > > diff --git a/lisp/language/korea-util.el b/lisp/language/korea-util.el > index 3821785da7..13cd6a015d 100644 > --- a/lisp/language/korea-util.el > +++ b/lisp/language/korea-util.el > @@ -70,8 +70,7 @@ isearch-toggle-korean-input-method > (interactive) > (let ((overriding-terminal-local-map nil)) > (toggle-korean-input-method)) > - (setq isearch-input-method-function input-method-function > - isearch-input-method-local-p t) > + (setq isearch-input-method-function input-method-function) > (setq input-method-function nil) > (isearch-update)) > > @@ -79,8 +78,7 @@ isearch-hangul-switch-symbol-ksc > (interactive) > (let ((overriding-terminal-local-map nil)) > (quail-hangul-switch-symbol-ksc)) > - (setq isearch-input-method-function input-method-function > - isearch-input-method-local-p t) > + (setq isearch-input-method-function input-method-function) > (setq input-method-function nil) > (isearch-update)) > > @@ -88,8 +86,7 @@ isearch-hangul-switch-hanja > (interactive) > (let ((overriding-terminal-local-map nil)) > (quail-hangul-switch-hanja)) > - (setq isearch-input-method-function input-method-function > - isearch-input-method-local-p t) > + (setq isearch-input-method-function input-method-function) > (setq input-method-function nil) > (isearch-update)) >
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.