Find and Replaceのreplaceの所をシェルスクリプトにする、Find and Shell Script、略してFAScript。
VSCodeのFind and Replaceのようなインターフェースで、Replaceの所をシェルスクリプトにしたい。 シェルスクリプトを書くのを手抜きにするために、終わりの位置も検索で指定出来るようにしてある。
指定された範囲を$INPUT
という名前でシェルスクリプトを書き、$OUTPUT
というファイルに結果を出すと、
Submitボタンを押すと指定された範囲を$OUTPUT
のファイルに置換する。
シェルスクリプトの結果をpreviewで確認しつつシェルスクリプトを書いて、良さそうならsubmitを押すと次に行き、 そのままsubmit submit submitとやっていくと順番に置換がされる。 飛ばしたい時はskip。previewの時点ではファイルは変更されない。(apply)
例えば以下のようなコードがあった時に、
#ifdef ENABLE_CPP14_AUTO
auto guard1 = Locker(mutex1);
auto guard2 = Locker(mutex2);
#endif
以下のような編集をしたい、
GRD guard1 = Locker(mutex1);
GRD guard2 = Locker(mutex2);
ようするに
というような事を簡単に書いて、それをapplyしていくかどうかをプレビュー付きで出来るようにしたい。
無事行いたい作業は行える所までは出来て、git pushする所までは進めたのでひとまず開発は一区切り。 本当はappとしてどこかに置いて第三者が試せる所までやりたい気もするんだが、 どうせ試す人は居なさそうなのでそこまで労力掛けるのもな〜と思い、 とりあえずコードだけ公開しておいてひとまずは区切りとする。
またこれを使う作業があってその時気が向いたら続きをやりたい。
以下は作っていた時のメモです。
言語と環境は何にするかなぁ。Electronでいい気もするが、F#とphotinoでもいい気もする。うーん。
nodeのfile-matcher - npmで1と2は良い気がする。という事でとりあえずElectronで作る。>行が取れなかったので結局globで自分で書く事に…
少し作ろうとしてみたが結構面倒くさい。 もっと作るものを楽に出来ないだろうか?
ようするに、やりたい事はsedで書けるので、
が出来ればいいんじゃないか。
shell script的に分解出来ないだろうか? 一覧はagで最初の一覧を作り、ファイル単位ではgrepで十分だろう。
位置に対して、その位置より後ろの一番近いgrepで範囲が作れる。
範囲を一時ファイルに抜き出して、何か処理をする。
この範囲と処理結果をpreviewとして表示し、yだったらその範囲を置き換えて、nだったら次に行く。
うーん、けどシェルスクリプトとかを書いて試すのはGUIで何度も試行錯誤したいんだよなぁ。
1と3はセットの何かだろう。2は独立している気もする。
2は$input
という変数に入ったファイルを入力として$output
というファイルに結果を入れる、というシェルスクリプトをユーザーは書いて、
その結果を見て適用するかどうかを決められればいいだろう。
アプリとしては、ファイル名を渡されると立ち上がってシェルスクリプトを入れる所、入力のプレビュー、出力のプレビュー、リロードボタン(reapplyボタン)、Submit、Skip、QuitのボタンがあるGUIアプリでいいんじゃないか。
うーむ、作れそうな気はするが、別のアプリに分けるのはまぁまぁ面倒な気もする割にご利益が微妙だな。 同じアプリにする方がいいか。
ただ機能的にはかなり直行しているな。
置き換えると行数が変わるので、2の部分は毎回そのファイル内をgrepし直す感じで、けれどsubmitした時に必ず次に行くように次の行という指定は考える必要がありそう。