isearch つくった

メンテ出来てなかったので、atom.io から削除(unpublish)しました。 2016.8.3.

# [isearch](https://atom.io/packages/isearch)


インクリメンタル・サーチが出来る

![gif](https://raw.githubusercontent.com/t9md/t9md/f7f57e9b165c36d4fc3bd6bc3dd10614264f189f/img/atom-isearch.gif)

# 開発状況
~~Very Alpha.~~ Beta

[注意] リファクタリング、仕様が固まるまでは、style や、keymap が変わる可能性あり.

# 機能

* インクリメンタル・サーチ(キーをタイプする度に、マッチ箇所にスクロール)
* 標準の Find and Replace と異なり、あえて `onDidStopChanging` ではなく、`onDidChange` を使っている。サーチ結果がすぐに UI にフィードバックされるように。
* マッチした数と、現在のインデックスをインプットパネルに表示(将来的に色もインデックスに応じて変える)。
* 決定するまではカーソル位置を動かさない([cursor-history](https://atom.io/packages/cursor-history)の様な Package はカーソル位置を保存するので、重要)。
* インプットエリアにカーソル配下の単語を keymap で挿入。
* 元のカーソル位置をハイライト。サーチ中、カレントマッチをフラッシュ(瞬間点滅)。
* WildCard サポート。好きな文字を wild card として設定可能

# コマンド

* `isearch:search-forward`: 前方サーチ
* `isearch:search-backward`: 後方サーチ
* `isearch:fill-cursor-word`: カーソル配下の単語をインプットエリアに挿入
* `isearch:cancel`: キャンセルしてインプットパネルを閉じる

# 使い方

1. サーチ開始 `isearch:search-forward`.
2. サーチする文字を打ち込む
3. 元カーソル位置、マッチ箇所のハイライト。最初のマッチに自動スクロール
4. `core:confirm` で着地。`isearch:cancel` でキャンセル(元のカーソル位置に戻る)

# Keymap

デフォルト・キーマップは無し。

e.g.

```coffeescript
'atom-workspace':
  'ctrl-s':     'isearch:search-forward'
  'ctrl-cmd-r': 'isearch:search-backward'

'.platform-darwin atom-text-editor.isearch':
  'ctrl-s': 'isearch:search-forward'
  'ctrl-r': 'isearch:search-backward'
  'ctrl-cmd-r': 'isearch:search-backward'
  'ctrl-g': 'isearch:cancel'
  'cmd-e':  'isearch:fill-cursor-word'
```

私の設定。とても実験的。
`[`, `]`, `;` がサーチできないが、移動や、決定が楽なので良しとする。
最悪、Find and Replace を使えば良い。

```coffeescript
'atom-text-editor.vim-mode.command-mode':
  's': 'isearch:search-forward'
  'S': 'isearch:search-backward'

'.platform-darwin atom-text-editor.isearch[mini]':
  'ctrl-g': 'isearch:cancel'
  'ctrl-u': 'editor:delete-to-beginning-of-line'
  ']':      'isearch:search-forward'
  '[':      'isearch:search-backward'
  ';':      'core:confirm'
```

# 類似プロジェクト

* [incremental-search](https://atom.io/packages/incremental-search)

# TODO

* [x] コードを綺麗にする。
* [x] ワイルドカードサポート
* [ ] marker の destroy() 漏れが無いよう、見直す(リファクタとセット)
* [ ] スタイルをカスタマイズ出来るように。
* [ ] [smalls](https://atom.io/packages/smalls) と統合?
* [ ] マッチ箇所全てにマルチカーソルを置く。
* [ ] Excursion mode をつけて、vim-like に `hjkl`, `gg` とかでマッチを移動できるように?
* [ ] Regexp, Ignore case 等の検索オプション対応、検索パネルにオプション状態を反映。
* [ ] パフォーマンス改善。見えている範囲を素早く decorate して、画面外は delay させてやるとか。
* [ ] マッチ箇所の色区別。`top`, `bottom` がすぐ分かるように。`nomatch` が直ぐに分かる様に画面フラシュとか？

# メモ

[smalls をつくった](http://qiita.com/t9md/items/bca96d45af1a5244b5d1) 時、jumpy を書き換えることからスタートした。
今回も同様のアプローチをしてみようと考え、[incremental-search](https://atom.io/packages/incremental-search) を folk して書き換え始めたが、
古いAPI満載、そもそも動いてない(?) とかで、やめて、いちからつくった。
動作は Emacs の isearch を参考にしている。
改善の予定、余地は大幅にある。数週間後には Done になっている予定。
smalls と Rapid cursor positioning(高速カーソル配置)という目的ではかぶるので、実験的に統合してみようかとも考えている。
Emacs の AceJump の [FAQ](https://github.com/winterTTr/ace-jump-mode/wiki/AceJump-FAQ#there-is-only-one-query-char-for-word-why-dont-you-add-more
) でも isearch と、ace-jump の使い分けについて言及されており、

* 目的地が見えていれば: ace-jump (Atom: smalls に相当)
* 見えていなければ: isearch (Atom: isarch に相当)

と書いてある。
しかし、人間の脳は、もっと曖昧にキータイプしたいもので、明確に使い分けるのは疲れるものだ。
もっと気まぐれに、isearch や、ラベルジャンプ(smalls) が出来るように、統合してみるのはやってみたい。

そういえば、[vim-easymotion](http://haya14busa.com/mastering-vim-easymotion/) でも、検索機能の拡張で、
スクロール出来るようだ。このアプローチは、smalls に scroll 機能をつけるようなものだが、どっちを主にすべきか。
私は、isearch の方が頻度が多い(他のPaneに飛ぶより、現在バッファを移動する方が多い)ので、isearch にラベルジャンプをつける方が、使い勝手が良いと思う。
何にしろ、実装して、自分で使って、感触を確かめてから決めよう。