【fish】fishingz の要件定義/基本設計編【fishingz】

fishingz - ファイルシステム高速アクセッサの要件定義/基本設計編

fishingz のトップに戻る

作成した経緯

CUI にて、 fzf によりディレクトリやファイルを選択し、そのパスを使って何かしらのアクション(ディレクトリ移動やファイルを開く)をさせる操作は非常に楽であった。
ただし、(贅沢ながら)以下のように小さな不満が心の中で燻ぶり続けて作成するに至った。
 


fzf + find によるファイルオープン zfディレクトリ移動 zd の実行は楽だで (^_^)
 
しばらく使い込む
 
それにしても、zf, zd にパスを与えることが面倒だな。
カレントディレクトリで zf や zd を実行すると上階層に移動できないのか。 *1
何よりいちいち zf や zd を入力することすら面倒だ。
f:id:dnkrnka:20180624233348p:plain:w100
 
どうせなら、ファイルシステム全体に対して fzf でパスを絞り込んで欲しいもんだぎゃ。
f:id:dnkrnka:20180624234747p:plain:w50
 
そして、パスを選択したら次のように動作してほしい。
  ディレクトリなら移動
  TEXTファイルなら nvim で開く
  HTMLなら google-chrome で開く
  PNG, JPEGなら画像ビューアで開く
 
あと、grep や ls コマンドの引数にパスが必要なことが多々あるので取り出したい (clipboard へコピーしたい)。
 
これを実現するためには、パス情報を事前に持たせておくしかない。
 
パス情報は locate で収集できたと思うが、管理者権限が必要だったはず。
 自宅PC なら管理者はあるが、自宅外では不可だ。。
  find でパス情報を洗い出して DB を作るか。あ〜面倒。
  find を並列化しないとパス情報収集が激遅だぞ。あ〜面倒。
f:id:dnkrnka:20180624233348p:plain:w100
  parallel や xarg で並列化は実現可能ですが、リダイレクト先の競合確率は99%です
f:id:dnkrnka:20180625001937p:plain:w100
  これではデータが壊れてしまい、理解不能です
f:id:dnkrnka:20180625001937p:plain:w100
  並列処理も自作するしかないのです
f:id:dnkrnka:20180625000523p:plain:w100
  DB の更新には cron 、 at が使えない前提で進めるしかないのです
f:id:dnkrnka:20180625000523p:plain:w100
  トリガを設けて自動更新させるしかないのです
f:id:dnkrnka:20180625000523p:plain:w100

 
という経緯で fishingz を作成した。
なお、fish シェル専用としたのは、単に fish-shellscript の勉強のためである。
また、fishingz という名称は fish + fzf + anything を組み合わせた造語である。

イルカやクジラは fish という区分では無いかと思いますが、見た目の都合でアイコンを使っています。
 
 

作成するうえでの方針

不必要に機能拡張しない

他のツールやプラグインでできることは実装しない
操作速度を低下させてまで機能の実装はしない
 
前者については、「コマンドラインにパスを入力した状態で fishingz を呼び出したら、全ファイルシステムのパスでは無く、その階層以下のファイルやディレクトリ情報のみを表示させるようにしては」というものがある。
これは fishingz で実装しなくても、 fzf の ctrl-t や、find と fzf を組み合わせて関数化すれば簡単に実現できるものであり、fishingz に取り込む必要性を感じない。
くわえて、ファイルシステムの最新状態に即座に追従できない fishingz にさせる仕事でも無い。
 
後者については、「開いたDBからパスを選択して、grep を実行する」というものである。
これも、いちいちパスを選択したうえで、検索パターンを入力する必要があり、結果を得るために手番をいくつも経ることになり速度が悪るすぎる。
何よりも、このような機能は Vim の Unite や、 Emacs の Anything で実現できるので、わざわざ作る必要性もない。
fishingz としては、せいぜい DB からパスを clipboard へコピーする程度の機能に留めている。(コピーしたパスを貼り付けて grep の引数にすれば良いだけである)
 

root 権限が無い前提での実装とする

root 権限が使える前提であれば、そもそも DB 構築には locate や updatedb を使っているし、
DB の更新も inotify-tool を使ってリアルタイムに更新させている。
 
 

*1:fzf の bind を使えば上位階層の探索もできるのかも知れない