mew-search-with-builtin for BG

# mew-search-with-builtin for BG
拙作 [mew-search-with-builtin](https://qiita.com/s-fubuki/items/ea748215336e7ffd48bf) を thread 関数を使って裏スレッドで動くようにしてみました。
ここで言うスレッドとは mew で言うフォルダのスレッドのことではなく並列処理のことです。

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

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

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

# インストール
`mew-search-with-builtin` をインストール済みの人は、[ココ](https://gist.github.com/s-fubuki/4e4d5c6a6a7a4af0b08afaabf2514fb5)からコピーして本体ファイルだけ置き換えてから Emacs を再起動するだけで OK です。
はじめての人は[コレ](https://gist.github.com/s-fubuki/ee7ce186e99a77171085c011283e02fa)もコピーして先のファイルと一緒に `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-time` を `nil` にしておくと全文サーチも BG 動作せず、従来と同じになります。

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

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

```emacs-lisp:.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秒)にエコーエリアに

<!-- > -- x(Unix)%%-  Mew: +inbox        Bot C0    (Summary) Sat... -->
> Searching `正規表現' at +from/folder... (Total 65%)

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

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

> ```emacs-lisp:sample
> M-x mbs-kill-idle
> ```

# サーチ完了時の挙動
サーチが完了して結果ウィンドウが開かれてもそこをカレントバッファに変更しません。
完了するといきなりウィンドウが開くので、他のことをしていたときの事故防止のためですが、変数 `mbs-thread-unswitch` が `nil` だとカーソルも持っていきます。デフォルトの動作値は `'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 のメールフォルダを使って最終テストしました。

````emacs-lisp: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")
```

# 関連ページ
- 過去版 (基本的な使い方があります) [mew-builtin-search](https://qiita.com/s-fubuki/items/ea748215336e7ffd48bf)
- [mew.org](https://www.mew.org/ja/)
- [GNU.org/emacs](https://www.gnu.org/software/emacs/)