Ticket #241 (assigned 不具合)

Opened 2 years ago

Last modified 2 years ago

isearch時のIME制御方法

Reported by: R Assigned to: horiguti (accepted)
Priority: major Milestone:
Component: UI Version: 3.00 (開発中)
Keywords: Cc:

Description

Meadow2のころまでは下記の設定でisearch-modeをでのIMEを制御していましたが、Meadow3では正常に動かなくなりました。mw32-ime-stateは廃止されたようですが下記のような設定を実現する代替方法は無いものでしょうか?

;; ime がオンなら isearch に入るときに呼ばれる isearch-mode でオフにする
(add-hook 'isearch-mode-hook
          (lambda ()
            (when (fep-get-mode) 
	      (fep-force-off)
	      )))

;; ime がオンだったのなら isearch を出るときに呼ばれる isearch-done でオンに戻す
(add-hook 'isearch-mode-end-hook
          (lambda ()
            (when mw32-ime-state 
	      (fep-force-on)
	       )))

Attachments

isearch-fep.el (1.4 kB) - added by anonymous on 12/02/05 18:25:52.
migemo.diff (2.8 kB) - added by anonymous on 02/11/06 17:31:49.
オリジナルのmigemoに対するパッチ

Change History

11/25/05 13:11:17 changed by horiguti

  • owner set to horiguti.
  • status changed from new to assigned.

以下で同じことができると思います. どうでしょうか.

(add-hook 'isearch-mode-end-hook
          (lambda ()
            (when (equal current-input-method "MW32-IME") 
	      (fep-force-on)
	       )))

11/25/05 13:37:47 changed by horiguti

でも Meadow3 ではバッファの切り替え時に IME のモードを同期させるようになっているので, このやり方だと 2文字目以降にIMEの状態が戻りませんか?
以下のようにすれば期待した動作になると思います.

(defun isearch-mode-end-ime-on ()
  (toggle-input-method)
  (remove-hook 'isearch-mode-end-hook 'isearch-mode-end-ime-on))


(add-hook 'isearch-mode-hook
	  (lambda ()
	    (when (equal current-input-method "MW32-IME")
	      (add-hook 'isearch-mode-end-hook 
			'isearch-mode-end-ime-on)
	      (toggle-input-method))))

重い?

12/02/05 08:44:20 changed by R

返答ありがとうございます。気づきませんで遅くなりました。

私の書いた設定ですが実は下記のisearchの途中でIMEを使用する 「ekb-isearch」と「isearch-fep」をさらにカスタマイズする設定でした。 http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=ekb-isearch

情報が不完全でお手数かけます。 そこで、「ekb-isearch」と「isearch-fep」自体がMeadow3で動かないため(Meadow2までは動きます) 教えていただいた設定の正しい確認は取れていません。

移植するとなると大変でなのですが、とりあえずデフォルトのisearchでのIMEの入力挙動の要望として あげておきます。

・isearchでIMEからの入力をしたい(「(define-key isearch-mode-map "\C-k" 'isearch-edit-string)」ではインクリメンタルサーチではないので・・・)

・isearchをC-sで開始した後、IMEの起動切り替えができるようにして欲しい

・IME入力中に確定前文字がminibufferの位置に表示して欲しい。

ユーザーがカスタマイズせずとも使いやすい環境がそろうようになればと思います。

12/02/05 18:25:52 changed by anonymous

  • attachment isearch-fep.el added.

12/02/05 18:28:41 changed by anonymous

isearch-fep.el を適当に書き直してみたけど、どうかな。

最初に書いてある事を実現するには自前の変数でIMEの状態を覚えとけばいいと思う。

12/03/05 15:04:19 changed by horiguti

isearch は変更しません. その代わりに IME も quial と同様に同期的な(Elsip 内でinput-metdho-function を使う ) 入力方法に直そうと思います. これで基本的にはウィンドウ移動などの際の状態の同期も不要になります.

ただし, APIででだけ制御していると IME を ON にしても変換ができなくなくなることがあります. これは Windows のバグっぽい(IEとかでも出るようです)のですがこのフォローのために kanji キーはAPI呼び出しに入れ替えたくないので若干の同期機構は残ります. これらの同期機構は advice などを使って meadow.el にすべて閉じ込めます.

この結果手元のMeadowでは quail と同じ動作を IME で実現できていると思います. まだ不安定なところもあるようなのでもうちょっと確認/整理したら Meadow3 に入れようと思います.

表から見たときの従来との違いは以下のとおり.

  • iserach での IME 利用を可能にした. 使い勝手は quail と同じ.
  • IMEの切り替えは印字可能キーの入力時にON, 確定時にOFF となる. (IMEツールバーを見ていれば分かります)
  • 今までは C-\ で ON にした IME が動作しなくなったときは入力した文字がそのままバッファに入っていたが, これがバッファに文字が入らなくなる. (症状が違うだけで従来どおりKANJIキーによる IME ON/OFF で直ります. だれかこの状態を検知/修復する方法を知っている方はいないでしょうか)

12/06/05 01:31:24 changed by R

反応が遅くてすみません。

12/02/05 18:28:41: anonymous による修正

isearch-fep.el を適当に書き直してみたけど、どうかな。

ありがとうございます。 インクリメンタルサーチ中にIMEの切り替えおよび確定前文字が ミニバッファに表示されることを確認しました。 ただ、次の状態で不具合が出ております (Meadow3 -qにてisearch-fep.elを読み込み・・・)

aaaあああ■

上記のようにファイルの最後で「aaaあああ」と入力し他直後に 「C-s aaaあああ」と入力すると「aaa」の部分は水色に変わりますが 「あああ」の部分は変わりません。もう一度「C-s」か「C-r」を押すと 全体が赤っぽく色変更されます(こちらは正常)。 アルファベット以外のマッチング文字も色変更できれば幸いです。

また、次のコードがあるとミニバッファでIME入力からの日本語入力 ができませんでした(Meadow2ではOKでした)。

(wrap-function-to-control-ime 'read-from-minibuffer nil nil)

こちらは.emacsの設定をとりあえずマスクすることにします。

11/25/05 13:37:47: horiguti による修正

以下のようにすれば期待した動作になると思います.

horigutiさんのコードにより、インクリメンタルサーチをデフォルトで IMEをOFFにするという挙動が確認できました(isearch-fep.elを入れた上で)。 私はC++のソースを中心に編集していますので助かりました。

12/03/05 15:04:19: horiguti による修正

isearch は変更しません. その代わりに IME も quial と同様に同期的な(Elsip 内でinput-metdho-function を使う ) 入力方法に直そうと思います. これで基本的にはウィンドウ移動などの際の状態の同期も不要になります.

何かまたいろいろ変わりそうで楽しみですが、Meadow3の制作がんばってください。

12/14/05 01:07:39 changed by horiguti

というわけで r3999 でやってみました. mw32-input-method を新設して, MW32-IME 起動時に input-method-function にこれを設定します. これで基本的に quail と同様のインタフェースになるのでほかの機能からのinput-method の普通の使われ方でそれなりに動くようになったと思います. isearch については大体ちゃんと動いていると思います.

通常の入力もこれを mw32-input-method で行うようにはできるのですが, 入力の勢いがよすぎるとやはり結構きついようで時々妙な動きをします. そのため通常のバッファでの入力は従来どおり起動している IME からの入力としています. 人柱希望 な人は (setq mw32-ime-cont-on nil) とすると新しい日本語入力モード(前のコメントで書いたような仕様)になります. このモードでは入力時に IME を起動しない文字をmw32-input-method-noconv-regexp で設定できます. 使い勝手は微妙ですが.. なお, mw32-ime-cont-on を変更した後は一旦 IME を Off にしてください.

どちらのモードを使うかにかかわらずこの修正に伴って migemo で Meadow の非互換対策として加えられていたコードが不要になっています. これが残っているとかえって妙なことになるので以下のパッチをあててください.

--- migemo.el.old       2005-12-03 23:54:02.962361600 +0900
+++ migemo.el   2005-12-12 15:22:09.950125000 +0900
@@ -89,7 +89,4 @@
   "*Path of migemo frequent alist file. If nil, don't save and restore the fil
.")

-(defconst migemo-mw32-input-method (and (featurep 'meadow) "MW32-IME")
-  "Support \"MW32-IME\" for Meadow.")
-
 ;; internal variables
 (defvar migemo-process nil)
@@ -522,8 +519,4 @@
             (boundp 'current-input-method))
     (setq migemo-current-input-method current-input-method)
-    (when (and migemo-mw32-input-method
-              (stringp migemo-current-input-method)
-              (string= migemo-current-input-method migemo-mw32-input-method))
-      (set-input-method nil))
     (setq current-input-method nil)))

@@ -534,8 +527,4 @@
   (when (and migemo-isearch-enable-p
             (boundp 'current-input-method))
-    (when (and migemo-mw32-input-method
-              (stringp migemo-current-input-method)
-              (string= migemo-current-input-method migemo-mw32-input-method))
-      (set-input-method migemo-current-input-method))
     (setq current-input-method migemo-current-input-method)))

@@ -617,5 +606,10 @@
     (unless (or isearch-regexp isearch-word)
       (discard-input)
-      (setq migemo-isearch-enable-p (not migemo-isearch-enable-p)))
+      (if (setq migemo-isearch-enable-p (not migemo-isearch-enable-p))
+         (when (boundp 'current-input-method)
+           (setq migemo-current-input-method current-input-method)
+           (setq current-input-method nil))
+       (when (boundp 'current-input-method)
+         (setq current-input-method migemo-current-input-method))))
     (isearch-message))

01/14/06 15:58:56 changed by anonymous

r4012で、上記のmigemoのパッチをあててmigemoを使用しているのですが、以下の手順を踏んだ場合、元のバッファのcurrent-input-method-titleとしてはOFF状態であるが、IMEはONになります。

1. IMEがOFFの状態でCtrl+sでisearchを起動する。
2. 漢字キーを押してIMEをONにする。
3. 適当な検索文字を入力してRETキーを押して確定させる。
4. RETキーを押してisearchから抜け、元のバッファに戻る。

IMEの状態は、以下のhookを使ってカーソルの色で確認しています。

(add-hook 'mw32-ime-on-hook
          (function (lambda () (set-cursor-color "Red"))))
(add-hook 'mw32-ime-off-hook
          (function (lambda () (set-cursor-color "LightGray"))))

02/11/06 17:29:09 changed by anonymous

migemoを使用した場合、上記の手順で、current-input-method-titleとIMEで差分が出るのは、migemoではcurrent-input-methodで制御していて、isearchではinput-method-functionで制御しているためでした。
一応、添付のパッチのように、migemo.elでdefadviceしているisearch-modeとisearch-doneを修正すれば、以前の動作に近くなりました。(ただ、migemo-isearch-toggle-migemoも修正する必要があるのですが、状態遷移によっては、current-input-methodとinput-method-functionとの間で不整合となるため、おかしくなります。実際、どちらの変数でIMEを制御すべきなのでしょうか?)

02/11/06 17:31:49 changed by anonymous

  • attachment migemo.diff added.

オリジナルのmigemoに対するパッチ

03/13/06 03:33:42 changed by horiguti

ころころとやり方を変えてすみませんが, どうやら input-method-function をIMEで実装しきることができなさそうなのでこの方針はとりあえず破棄することにします(r4051). 以降大きな方針変更はないと思います.

ただし, 完全に元に戻すとIMEの制御もきれいにならないので isearch の際のIMEの制御をさらに変えています. IME切り替えと isearch, migemo の切り替えの動作については migemo に上記のパッチを当てた状態を前提に meadow.el に修正をかけてしまっています.

このあたりはもうちょっと整理させてください.


Add/Change #241 (isearch時のIME制御方法)




Change Properties
Action