RandomThoughts

RandomThoughts

FAScript

Contents:
  1. 概要
  2. ユースケース
  3. 一区切り 2023-11-19 (日)
  4. たたき台
  5. もっと手抜き出来ないか?

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);

ようするに

  1. 適当な検索条件でヒットした行から、endifまでの間を
  2. autoをGRDに置換して
  3. ifdefの行とendifの行を消す

というような事を簡単に書いて、それをapplyしていくかどうかをプレビュー付きで出来るようにしたい。

一区切り 2023-11-19 (日)

無事行いたい作業は行える所までは出来て、git pushする所までは進めたのでひとまず開発は一区切り。 本当はappとしてどこかに置いて第三者が試せる所までやりたい気もするんだが、 どうせ試す人は居なさそうなのでそこまで労力掛けるのもな〜と思い、 とりあえずコードだけ公開しておいてひとまずは区切りとする。

またこれを使う作業があってその時気が向いたら続きをやりたい。


以下は作っていた時のメモです。

たたき台

  1. 特定のディレクトリ以下、特定の拡張子のファイル一覧に対して
  2. 検索をして対象となる所をリストアップする
  3. 2でヒットした各場所に対して、そこから相対的に終わりを規定する検索条件を書く、この2と3で編集対象領域が決まる
  4. 編集対象領域に対してアクションを複数書く
  5. アクションを適用した結果のプレビューが出る、その後はy, y, yという感じでどれに適用してどれに適用しないかが選べる

言語と環境は何にするかなぁ。Electronでいい気もするが、F#とphotinoでもいい気もする。うーん。

nodeのfile-matcher - npmで1と2は良い気がする。という事でとりあえずElectronで作る。>行が取れなかったので結局globで自分で書く事に…

もっと手抜き出来ないか?

少し作ろうとしてみたが結構面倒くさい。 もっと作るものを楽に出来ないだろうか?

ようするに、やりたい事はsedで書けるので、

  • 範囲を切り出す
  • sedを実行する
  • 結果を置換する

が出来ればいいんじゃないか。

shell script的に分解出来ないだろうか? 一覧はagで最初の一覧を作り、ファイル単位ではgrepで十分だろう。

位置に対して、その位置より後ろの一番近いgrepで範囲が作れる。

範囲を一時ファイルに抜き出して、何か処理をする。

この範囲と処理結果をpreviewとして表示し、yだったらその範囲を置き換えて、nだったら次に行く。

うーん、けどシェルスクリプトとかを書いて試すのはGUIで何度も試行錯誤したいんだよなぁ。

  1. 範囲を切り出す
  2. 指定されたファイルにシェルスクリプトを実行してそれを見る機能
  3. 結果を元に反映して保存して次に行く機能

1と3はセットの何かだろう。2は独立している気もする。

2は$inputという変数に入ったファイルを入力として$outputというファイルに結果を入れる、というシェルスクリプトをユーザーは書いて、 その結果を見て適用するかどうかを決められればいいだろう。 アプリとしては、ファイル名を渡されると立ち上がってシェルスクリプトを入れる所、入力のプレビュー、出力のプレビュー、リロードボタン(reapplyボタン)、Submit、Skip、QuitのボタンがあるGUIアプリでいいんじゃないか。

うーむ、作れそうな気はするが、別のアプリに分けるのはまぁまぁ面倒な気もする割にご利益が微妙だな。 同じアプリにする方がいいか。

ただ機能的にはかなり直行しているな。

  1. 範囲の最初の一覧(ag、またはfile-matcherで良さそう)
  2. ファイルと行数を渡されて、終わりを返す機能
  3. ファイル名と行数の開始と終了を渡すと一時ファイルに切り出す機能
  4. 一時ファイルにシェルスクリプトを実行して、その結果をcommitするかどうか選べる機能
  5. 結果の一時ファイルを元のファイルの指定範囲と置き換える機能、またはスキップして次に行く機能

置き換えると行数が変わるので、2の部分は毎回そのファイル内をgrepし直す感じで、けれどsubmitした時に必ず次に行くように次の行という指定は考える必要がありそう。