2015年に行った helm-agの変更

helm-agを今年いろいろ変更したのでそれについてまとめていこうと思います.

## 親ディレクトリの検索(1月 9日)

- https://github.com/syohex/emacs-helm-ag/pull/48
- https://github.com/syohex/emacs-helm-ag/pull/49

![parent-dir](https://cloud.githubusercontent.com/assets/554281/5664929/98c1c44e-9797-11e4-8f7a-0ae6482e4efa.gif)

あるディレクトリ以下を検索するとき, 一つ上のディレクトリで検索したいと思うことがよくあります. その実現です. `helm-ag`, `helm-do-ag`ともに `C-l`で一つ上のディレクトリに移動して検索できます. 一つ上のディレクトリ以下に膨大なファイルがある場合は危険ですのでご注意ください(`~/work/`から `~/`へ移動など). 一応リポジトリのトップらしきディレクトリ(`.git`等がある)より上に行こうとすると警告は出ます.


## grepの ignoreリストを追加するフラグの追加(1月 14日)

- https://github.com/syohex/emacs-helm-ag/pull/50

`grep-find-ignored-files`及び`grep-find-ignored-directories`を検索対象外にする. `helm-ag-use-grep-ignore-list`を non-nilにすることで有効になる. デフォルト無効. 個人的には微妙な機能.


## helm-do-agの `C-u`つきの挙動を helm-do-grepと同じにする(1月 20日)

- https://github.com/syohex/emacs-helm-ag/pull/55

![like-helm-do-grep](https://cloud.githubusercontent.com/assets/554281/5819338/45300260-a100-11e4-9ff1-6a614bb93f97.gif)

`C-u`をつけると, ファイルパターンを追加で指定できるようになった. しかし `helm-do-grep`が削除されてしまった今, 微妙である. `helm-do-ag`は `helm-do-grep`みたいなものを作ってくれと言われて作りましたけど, 個人的には面倒なので `helm-ag`派です.

## fuzzy matchの対応(1月 27日)

https://github.com/syohex/emacs-helm-ag/pull/61

helmが fuzzy match(個人的にあまりこれを fuzzy matchと呼びたくないが)に対応したということでその対応. デフォルト無効. `helm-ag-fuzzy-match`を non-nilすることで有効になる. この手のよくある fuzzy matchは英語圏以外の人では利用が難しいと思う. 学習方法にもよるんだろうけど, foobarbazを fbbととっさに打つのは難しい.


## 編集機能の追加(2月 16日)

- https://github.com/syohex/emacs-helm-ag/pull/69

![edit](https://cloud.githubusercontent.com/assets/554281/7630050/43994288-fa6d-11e4-96fc-8bfe221f10b2.gif)

`helm-ag`を公開した直後から要望されていた検索した行を編集, 反映させる機能. 個人的にいらないし, 作り方わからねーってことで放置していたが, [helm-swoop](https://github.com/ShingoFukuyama/helm-swoop)で実現されており, そのコード見ればなんとかなるだろってことでようやく今年に実装を開始. ほとんどコードは helm-swoopだけど, メンテのために必要最低限の機能だけ取り込む. 実装してみて, 使ってみたところ便利だった. 思いこみはよくないなぁと考えさせられた作業だった.


## プロジェクトルートからの検索機能(3月 19日)

- https://github.com/syohex/emacs-helm-ag/pull/81

簡易 [projectile](https://github.com/bbatsov/projectile). projectileを使っていないけど, プロジェクトルートから検索したいことがたまにあるなぁということで追加. `helm-ag`版が `helm-ag-project-root`で, `helm-do-ag`版が `helm-do-ag-project-root`です.


## 正規表現周りの改善(3月 21日)

- https://github.com/syohex/emacs-helm-ag/pull/83
- https://github.com/syohex/emacs-helm-ag/pull/84
- https://github.com/syohex/emacs-helm-ag/pull/97

ag(the silver searcher)は PCREを受け取るので, 結果をハイライトするときに直接それを使うとうまくいかないという問題があった(Emacs Lispと PCREの正規表現が完全に一致しないため). そのため簡易な変換を行い, ハイライトをうまく行うように修正. がちなものは作れなかったのでグルーピングや OR検索等に限られる.


## 編集バッファでの `next-error`, `previous-error`の対応(3月 30日)

- https://github.com/syohex/emacs-helm-ag/pull/90

`M-x grep`や `M-x compile`同様に next-error, previous-errorでその行に飛べるように対応. `M-x compile`由来なんだろうけど, 名前が一致しなさすぎる.


## 現在開いているバッファに対して, 検索を行う機能(4月 29日)

- https://github.com/syohex/emacs-helm-ag/pull/106

`helm-ag-buffers`, `helm-do-ag-buffers`の実装. 要望されて作ったがいるのか ?


## 現在開いているファイルのみに helm-do-agを適用(6月 17日)

- https://github.com/syohex/emacs-helm-ag/pull/123

`helm-do-ag-this-file`コマンドの追加. 微妙に使っている.

## 複数パターン検索の改善(6月 30日)

- https://github.com/syohex/emacs-helm-ag/pull/131
- https://github.com/syohex/emacs-helm-ag/pull/135

`helm-do-ag`で使われる helmの別プロセスとのやりとりの機構を使うと入力がそのままプロセスに投げられてしまう. これでは通常の helmと挙動が異なる. 例えば `foo bar`と入力した場合 `foo bar`を含む行でなく, `foo`と `bar`を順不同に含む行にマッチして欲しい. これを実現するための修正. `foo bar`が来たら, `(?=.*foo.*)(?=.*bar.*)`のように変換しています. このあたりを実現するのに[正規表現技術入門](http://gihyo.jp/book/2015/978-4-7741-7270-5)が大変役に立ちました(理論的な部分は私の頭では理解が困難でしたが... 勉強しないといけませんね).

ちなみにこの機能は PCRE互換の検索ツール(ag, ack等)しか使えません. Go製のツール(the platinum searcher, sift)では無理です. Goの正規表現は遅くなりづらい利点はあるけど, その分表現力を犠牲にしているので, 検索ツールにはあまり向かないのではないかと個人的に思っています.


## プロジェクトルートにある `.agignore`を利用するフラグの追加(6月 30日)

- https://github.com/syohex/emacs-helm-ag/pull/136

agは通常ホームディレクトリかカレントディレクトリにある ignoreファイルしかみない. そのためプロジェクトルートに置いていてもそれ以下のディレクトリで検索を行ったらそれが利用されない. なのでそのようなとき, `helm-ag-use-agignore`を non-nilにすると, コマンドラインオプションを使い, プロジェクトルートの ignoreファイルを指定する. agは gitignoreは見にいってくれるので基本不要と思う.

## helm-do-agで直接コマンドラインオプションを受け付けるようにする(9月 14日).

- https://github.com/syohex/emacs-helm-ag/pull/167

![direct-option](https://cloud.githubusercontent.com/assets/554281/9848195/d42b0b12-5b19-11e5-98f8-ac3b302d8136.gif)

今までは prefixキーでオプションを指定する必要があったが, めんどいということで, 入力を解析し, ハイフンで始まるものはコマンドラインオプションとしてプロセスに渡すように修正.


## 検索パターンにコロンが含まれると正しくファイルにジャンプできない問題の修正(10月 28日)

- https://github.com/syohex/emacs-helm-ag/pull/182

よくいままで気付かなかったものだ. 以外とコロンを検索する機会は少ない ?


## 否定パターンの入力の改善(11月 28日)

- https://github.com/syohex/emacs-helm-ag/pull/182
- https://github.com/syohex/emacs-helm-ag/pull/189

`!pattern`と入力すると `pattern`を含まない行にマッチする機能の追加. 先ほどの変換同様 `^(?!.*pattern).+$"`と変換している. PCRE検索ツール限定


## おわりに

いろいろ変更したものだ. この大半は自分の要望ではなく issueとして挙げられたものですが, もっと **NO**というべきだったように思えます. 実装しても良かったと言える機能もいくつかありましたが, 同程度に全く不要だったのではないかと思う機能もありました. メンテナンスしていくためにも NOというべきだったのではと反省しています. しかし異国の人に **NO**というのはなかなか難しいです. 自分の英語力で相手を納得させる必要があります. 大量の英語で畳み込まれそうなときも反発するだけの英語力が必要です. 来年というか今後は **NO**と言えるために, 英語力を高めていきたいと思います.