目的
TFSの変更箇所のパス、ファイル名の一覧を作成する必要があり、数が多い時に手間だった。
省力化したかったので、サクラエディタのマクロを利用してみた。
単純な置換処理
サクラエディタのマクロを使った単純な置換処理の方が需要あると思うので、最初にまとめます。
やりたいこと
「C:\work\folder1\file1.txt」をファイル名のみの「file1.txt」に置換する。
マクロ
サクラエディタのマクロはキーマクロ, JavaScript, VBS等で記述可能です。
詳しくは、「サクラエディタ/マクロについて」を参照してください。
ここではJavaScriptでマクロを記載します。
本題から外れますが、サクラエディタ上での操作をキーマクロとして保存することが可能で、便利なのでオススメしておきます。
// Replaceオプションのリファレンス; https://sakura-editor.github.io/help/HLP000292.html
// 0x020:先頭(末尾)から再検索する, 0x008:見つからないときにメッセージを表示
// 行先頭から\までの文字列削除 (例) C:\aaa\bbb\ccc.txt -> ccc.txt
ReplaceAll('^.*\\\\', '', 20+8);
ReDraw();
<使い方>
- 上記の内容でgetFileName.jsを保存する。
- サクラエディタで置換したい文字列を用意する。
- サクラエディタのメニューで「ツール」/「名前を指定してマクロ実行」を選択して、getFileName.jsを開く。
- 置換結果を確認する。
<補足説明>
ReplaceAllで置換処理を行っています。
正規表現で「^.*\」(行先頭から\までの文字列)を検索して空文字列に置換することで削除していますが、サクラエディタのマクロ用のエスケープのため、さらに\マークのエスケープが2倍になっています。
ReDrawでサクラエディタで再描画しています。
TFSの変更箇所行の取得
やりたいこと
TFSでシェルブセット等を作成した時に変更箇所を取得すると以下のようになっています。
$/aaa/bbb/ccc
$/aaa/bbb/ccc/ddd.txt 編集
$/aaa/bbb/ccc/fff.txt 追加
$/aaa/bbb/ccc/ggg.txt
編集・追加した箇所だけを取得し、パスとファイル名を分離したいです。
<取得イメージ>
$/aaa/bbb/ccc ddd.txt
$/aaa/bbb/ccc fff.txt
マクロ
// パラメータ設定(ただし、\はエスケープして\\にすること)
var sakura = 'C:\\Program Files (x86)\\sakura\\sakura.exe';
var outputFolder = 'C:\\work\\sakura';
var key = '編集|追加';
var tempFile = 'temp.txt';
var outputFile1 = 'filePath.txt';
var outputFile2 = 'fileName.txt';
// Grepオプションのリファレンス; https://sakura-editor.github.io/help/HLP000109.html
// R:正規表現, P:該当行を出力, 3:結果出力形式;結果のみ, H:ヘッダー・フッターを出力しない, U:標準出力に出力し、Grep画面にデータを表示しない
var option = 'RP3H';
// テキストの一時保存
FileSaveAs(outputFolder + '\\' + tempFile)
// 全クリア
SelectAll();
Delete();
// Grep
// ExecuteCommandのリファレンス; https://sakura-editor.github.io/help/HLP000103.html
// 0x10:標準入力をUnicodeで行う, 0x01:標準出力を得ます
ExecCommand('"' + sakura + '" -CODE=3 -GREPMODE -GCODE=99 -GOPT=U' + option +
' -GKEY="'+ key +'" -GFILE="' + tempFile +
'" -GFOLDER="'+ outputFolder +'"', 10+1);
// Replaceオプションのリファレンス; https://sakura-editor.github.io/help/HLP000292.html
// 0x020:先頭(末尾)から再検索する, 0x008:見つからないときにメッセージを表示
// 行先頭から\までの文字列削除し、編集,追加を削除 (例) aaa\bbb\ccc.txt 編集 -> ccc.txt
ReplaceAll('^.*/', '', 20+8);
ReplaceAll('\\t編集|\\t追加', '', 20+8);
ReDraw();
FileSaveAs(outputFolder + '\\' + outputFile2)
// 全クリア
SelectAll();
Delete();
// Grep
ExecCommand('"' + sakura + '" -CODE=3 -GREPMODE -GCODE=99 -GOPT=U' + option +
' -GKEY="'+ key +'" -GFILE="' + tempFile +
'" -GFOLDER="'+ outputFolder +'"', 10+1);
// 最後の\から行末までの文字列削除 (例) aaa\bbb\ccc.txt 編集 -> aaa\bbb
ReplaceAll('/[^/]*$', '', 20+8);
ReDraw();
FileSaveAs(outputFolder + '\\' + outputFile1)
// ファイル表示
ExecCommand('"' + sakura + '" ' + outputFolder + '\\' + outputFile2)
<使い方>
- 上記の内容でgetTFSModified.jsを保存する。その際、outputFolder(出力先フォルダ)等のパラメータは環境に合わせて設定すること。
- サクラエディタで置換したい文字列を用意する。
- サクラエディタのメニューで「ツール」/「名前を指定してマクロ実行」を選択して、getTFSModified.jsを開く。
- 出力先フォルダにパス用、ファイル名用の2ファイル出力されるので、内容を確認する。
<補足説明>
サクラエディタのテキストを一時保存しています。
keyの文字列で(編集|追加)ファイルのGrepを行います。
ExecCommand, Grep等のオプションの説明はリファレンスを参照してください。
パス用とファイル名用の置換を行って、ファイルに保存しています。
最後に保存したファイルを全部表示するようにしています。
課題
ファイルに保存してまでやる作業かというと微妙ですね。(本当はメモリ上で完結させたかったのですが、サクラエディタのコマンドラインから「編集中のテキストから検索」は呼び出せない(未実装)ようなので妥協しました。)
無理にサクラエディタを使わずとも、JavaやC#等で作成した方が楽かなという気もしますが、気軽にカスタマイズできるという点でサクラエディタのマクロにもメリットがあると感じています。