LoginSignup
2

More than 1 year has passed since last update.

posted at

mew-search-with-builtin for BG

mew-search-with-builtin for BG

拙作 mew-search-with-builtin を thread 関数を使って裏スレッドで動くようにしてみました。
ここで言うスレッドとは mew で言うフォルダのスレッドのことではなく並列処理のことです。

BGサーチ実行中に他のファイルの読み書き、 メールの送受信整理フォルダサーチの実行、 dired でファイルのコピー削除、GnuPG でデコード/エンコード...等々普段してることは一通り試していますが、普通に裏で動いています。

が、タイマー割り込みをして細やかに動かしている show-paren-mode やカーソルブリンク等が重くなって事実上使えなくなるのが時々つらいです。

閉じた環境でテストの日もまだ浅いので、その辺を加味した上で注意をお願いします。

インストール

mew-search-with-builtin をインストール済みの人は、ココからコピーして本体ファイルだけ置き換えてから Emacs を再起動するだけで OK です。
はじめての人はコレもコピーして先のファイルと一緒に load-path の通った場所に置き .mew.el 等で require してください。
実行にはふたつのファイルが必要です。

前版との互換性

BG 対応はサーチ時間のかかる全文検索 k /(mew-summary-selection-by-search) のみで、他の k ?(mew-summary-search), /(mew-summary-selection-by-pick), ?(mew-summary-pick) などはフォア実行しいじっていません。

mbs-thread-slice-timenil にしておくと全文サーチも BG 動作せず、従来と同じになります。

待てど暮せど結果が出ない

相性の悪いプログラムがあり、たまにサーチしている裏スレッドがいつのまにかひっそり終わってしまっていることがあります。

ウチではチャイルドプロセスの .exe と併用する版である cmigemo がソレで C-s して文字を入れるとあっさり裏スレッドが落ちます。(単純な bg-grep では平気なのでメールの場合 MIMEデコード処理等で重いせいなのでしょう)
できれば両立させたかったのですが、未熟なため実現できなかったのでその手のものを hook からオン/オフできるようにしました。

.mew.el
;; 実行中 migemo サーチを切る. 以下を .mew.el などに追記.
(add-hook 'mbs-front-hook
          #'(lambda () (and migemo-isearch-enable-p (migemo-isearch-toggle-migemo))))
(add-hook 'mbs-after-hook
          #'(lambda () (or migemo-isearch-enable-p (migemo-isearch-toggle-migemo))))

all-threads を実行すると現在走っているスレッドが判ります。 その他のスレッドが無いとして裏でサーチが正常に動いていればスレッドがふたつ表示されますが、落ちていればひとつしか表示されません。

M-: (all-threads)

進捗状況モニタ

フォア実行だと実行中に進捗状況表示をフォルダ毎にしますが、BG実行の場合キーイン等が途絶えてから mbs-thread-idle秒後(デフォルトでは5秒)にエコーエリアに

Searching `正規表現' at +from/folder... (Total 65%)

のような形式で表示します。箸休めしているときに1度だけ表示する感じです。
パーセント表示はサーチ全体からの進捗割合でフォア版のそれ(フォルダ中の割合)とは異なります。

裏スレッドが途中で落ちて時々出る経過表示だけ残ってしまった場合、以下で収まるかもしれません。

sample
M-x mbs-kill-idle

サーチ完了時の挙動

サーチが完了して結果ウィンドウが開かれてもそこをカレントバッファに変更しません。
完了するといきなりウィンドウが開くので、他のことをしていたときの事故防止のためですが、変数 mbs-thread-unswitchnil だとカーソルも持っていきます。デフォルトの動作値は 'open です。

またこの変数が t または 'silent なら、結果ウィンドウは開かず裏でひっそり終わるようになります。
この場合も終わったとき通常通りエコーエリアには "Scanning *ワード...done" 等と表示されます。が、何かしているとかき消されて気づかないことも多いです。

mbs-thread-unswitch 結果バッファを...
nil 開いてカレントにする
'open 開くだけ(デフォルト)
'silent ひっそり終了

mew の標準の全文検索との互換性

変数 mew-search-method で検索エンジンの切り換えができる体にはなってはいますが、元々 mew でサポートされているエンジンはテストしていないので、他のエンジンを設定してもそろそろ動かくなっているかもしれないです。 元々のものに戻したい場合はこの拡張を load しないのが正解です。

mew で検索エンジンと呼ばれている機構である全文検索が実装されたとき wds を利用して何度か試したのですが、
wds 自体がよく判っていなかったせいもあり、 検索してみて正常に動いているのか動いていないのかの手応えがなく(おそらく動いていなかった) 何だかよく判らないまま使わくなってしまった経緯があるので、 更めてまたセットアップしてテストするのも負担が大きくつらいのでそちらのテストはしていません。

テスト環境

  • GNU Emacs 26.3 (build 1, x86_64-w64-mingw32) of 2019-08-29
  • mew 6.8

$HOME に 以下の内容のテキストを mew-test.el の名前で置き
emacs -Q からそのファイルを開いて eval-buffer して C-u M-x mew して
普段使っている POP のメールフォルダを使って最終テストしました。

mew-test.el
(cd "~")
(setq load-path (cons "~/.emacs.d/mew-6.8" load-path))
(setq mew-rc-file "~/mew-test.el")
(setq exec-path (cons "c:/emacs-26.3-x86_64/libexec/emacs/26.3/mew" exec-path))
(load "mew")
(setq load-path (cons "." load-path))
(load "mew-search-with-builtin.el")

関連ページ

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2