マクロ内でフォルダを探したいNo.39722
Y_H さん 22/05/16 10:04
 
マクロについて質問させていただきます。

TortoiseSVNで管理しているフォルダ内のファイルに対して、
秀丸エディタから直接差分やログなどを表示するマクロとして、
以下のようなものを使っています。

run "TortoiseProc.exe /command:diff /path:" + filename2;
run "TortoiseProc.exe /command:log /path:" + filename2;

ところが、TortoiseGitも使うようになり、
TortoiseGitで管理しているフォルダ内のファイルに対しては、
TortoiseProc.exeではなくTortoiseGitProc.exeを呼び出したいと思っています。

一つのマクロの中で、filename2に対してフォルダを親方向に辿っていって、
.svnフォルダが見つかったらTortoiseProc.exe、
.gitフォルダが見つかったらTortoiseGitProc.exe、
見つからないままルートまで行ってしまったらエラー扱い、
というようにできれば行けるかもと思っているのですが、
filename2を使ってそのような判定を行うことはできますでしょうか。

もしくは、もっと簡単な判定方法はありますでしょうか。
よろしくお願いいたします。

[ ]
RE:39722 マクロ内でフォルダを探したいNo.39723
こさく さん 22/05/16 11:09
 
単なるユーザのこさくと申します。

秀丸エディタのマクロライブラリに登録されているか判りませんが
私は以下のマクロを非常に便利に使わせていただいています。

vcs_diff.mac
http://tipszone.jp/20121226_vcs_diff/

git、svnを自動で判別しています。

参考になれば幸いです。

[ ]
RE:39722 マクロ内でフォルダを探したいNo.39724
秀丸担当 さん 22/05/16 11:36
 
こさくさんが示されたマクロで目的のことはできると思いますが、参考までにマクロ
の方法を書いておきます。

フォルダがあるかどうかを調べるには、existfileを使うのが簡単です。例えば以下
のようにします。

$d=directory2;
$svn=$d+"\\.svn";
if( (existfile($svn,1)&0x10)!=0 ) {
  message $svn+"\nはあります";
} else {
  message $svn+"\nはないです";
}
endmacro;

FileSystemObjectでもできると思います。

親のパスを取得するには、パスの文字列でstrrstrで最後の\を探したりleftstrした
りで一応できますが、ルートのドライブの判断とかUNCパスを考えると面倒なので、
こちらの場合はFileSystemObjectを使うのが手っ取り早いです。
例えば以下のようにします。

$d=directory2;
call GetParent $d;
message $d+"\nの親は\n"+$$return;
endmacro;

GetParent:
  ##fso=createobject("Scripting.FileSystemObject");
  $$p=callmethod_returnstr( ##fso, "GetParentFolderName", $$1 );
  releaseobject ##fso;
  return $$p;

[ ]
RE:39722 マクロ内でフォルダを探したいNo.39725
Y_H さん 22/05/16 12:42
 
こさくさん、秀丸担当さん、解説ありがとうございます。

やはり、existfileで.svnや.gitを見つける処理を、
親フォルダの方向に繰り返して呼ぶことになるのですね。
このへんのwhileループがvcs_diff.macにもありました。

差分表示だけでなく、TortoiseSVNやTortoiseGitのログ画面の起動にも使いたいので、
呼び出すコマンドはsvnやgitではなく、TortoiseProcやTortoiseGitProcになると思
いますが、
こさくさんや秀丸担当さんのサンプルを元に、挑戦してみたいと思います。
ありがとうございます。

[ ]
RE:39722 マクロ内でフォルダを探したいNo.39726
Y_H さん 22/05/16 19:13
 
こさくさんと秀丸担当さんから頂いたサンプルを元に以下のマクロを作ってみたとこ
ろ、
Subversionで管理されているフォルダはTortoiseProc、
Gitで管理されているフォルダはTortoiseGitProcを使って、
差分表示ができるようになりました。

また、/command:diffの部分を/command:logにするだけで、ログの表示もできました。

秀丸マクロを自作するのは初めてなので、
もしまずい書き方をしているところがあれば、教えていただけると嬉しいです。
アドバイスありがとうございました。

--------
// TortoiseSVNやTortoiseGitで差分を表示

if (strlen(filename2) > 0) {
 $d = directory2;
 while ($d != "") {
  // .svn
  $svn = $d + "\\.svn";
  if ((existfile($svn, 1) & 0x10) != 0) {
   run "TortoiseProc.exe /command:diff /path:\"" + filename2 + "\"";
   endmacro;
  }

  // .git
  $git = $d + "\\.git";
  if ((existfile($git, 1) & 0x10) != 0) {
   run "TortoiseGitProc.exe /command:diff /path:\"" + filename2 + "\"";
   endmacro;
  }

  call GetParent $d;
  $d = $$return;
 }
}

message "バージョン管理されているファイルではありません。";
endmacro;

GetParent:
 ##fso = createobject("Scripting.FileSystemObject");
 $$p = callmethod_returnstr(##fso, "GetParentFolderName", $$1);
 releaseobject ##fso;
 return $$p;

[ ]