デスクトップ復元の問題を自動起動マクロNo.11679
かこん さん 06/12/09 11:34
 
デスクトップ復元の諸問題をIranoanさんのご助言いただいたマクロを使う方法で回
避できないかといろいろと試行錯誤を繰り返して下のようなマクロを作りましたが、
またまたで申し訳ないのですがいろいろと問題を見つけてしまいました。初めてのマ
クロなのでひょっとすると他にも良い方法があるかもしれませんが、現状ですとこれ
らの問題が解決されない限り、このマクロでも動作的には不十分と言わざるを得ない
ようです。

なお、それぞれの問題はなるべく関連性がないように分割してこのスレッドのコメン
トという形でサブスレッドを作りましたのでご検討ください。

// 「ファイルを開いた直後」と「新規作成直後」の自動起動マクロに登録 //
$r = "\x0a";
debuginfo 1;
debuginfo "filename = [" + filename + "], tabgrouptotal = " + str(tabgroupto
tal) + ", tabtotal = " + str(tabtotal) + $r;
if (tabgrouptotal != 1 || tabtotal != 1)
{
    endmacro;
}
$f = filename;
debuginfo "restoredesktop" + $r;
restoredesktop;
if ($f == "")
{
    endmacro;
}
#w = findhidemaru($f);
if (#w == -1)
{
    debuginfo "openfile = [" + $f + "]" + $r;
    openfile $f;
    endmacro;
}
debuginfo "setactivehidemaru" + $r;
setactivehidemaru #w;

[ ]
RE:11679 新規ファイルが「新規作成直後のNo.11680
かこん さん 06/12/09 11:34
 
起動時にファイルを指定しない場合、(無題)タブが開かれてマクロが呼び出される。
起動時に新規ファイルを指定した場合、新規タブが開かれるがマクロが呼び出されな
い。

このため起動時にファイルを指定しない、新規ファイルを指定する、既存ファイルを
指定する、という3通りのうち、新規ファイルを指定するだけがマクロの自動呼出し
が行なえない状態です。新規ファイルの場合もファイルを指定しない場合と同様に
「新規作成直後の自動起動マクロ」を呼び出すようにして頂けないでしょうか?

[ ]
RE:11679 自動起動マクロからデスクトップNo.11681
かこん さん 06/12/09 11:35
 
通常のマクロからrestoredesktopを呼び出した時は、デスクトップ復元でファイルが
開いても「ファイルを開いた直後の自動起動マクロ」が呼び出されることはないです
が、何故か自動起動マクロからrestoredesktopを呼び出すと、復元が完了してからそ
れぞれのファイルに対して「ファイルを開いた直後の自動起動マクロ」が呼び出され
ます(*)。しかも、自動起動マクロが完了してから「ファイルを開いた直後の自動
起動マクロ」が呼び出されているみたいで、このためか自動起動マクロでrestoredes
ktopを呼出し後にopenfileやsetactivehidemaruを行なって特定のタブをアクティブ
にしても、マクロ完了後に他のタブがアクティブになってしまいます。

(1)自動起動マクロからのrestoredesktopの動作を通常のマクロと同様に「ファイ
ルを開いた直後の自動起動マクロ」を呼び出さないようにして頂けないでしょうか?

(2)逆に「ファイルを開いた直後の自動起動マクロ」が呼び出されるのが正しい、
つまり、通常のマクロの方が間違っていると仮定すると、自動起動マクロが完了して
からアクティブなタブが変わらないようには出来ないでしょうか?

(*)実際には1番左のタブのファイルは呼び出されず、左から2番目以降のタブの
ファイルは呼び出されます。

[ ]
RE:11679 自動起動マクロからデスクトップNo.11682
かこん さん 06/12/09 11:35
 
起動するときに自動、ウィンドウメニューから、通常のマクロからrestoredesktop、
という3通りの方法でデスクトップ復元を行なった場合には、保存時にアクティブだ
ったタブも復元してくれますが、どういうわけか自動起動マクロからrestoredesktop
を呼び出してデスクトップ復元を行なった場合は、アクティブだったタブを復元して
くれません。どちらかというとランダムなタブがアクティブにされてしまいます。こ
れを他の方法と同じようにアクティブだったタブも復元するようにして頂けないでし
ょうか?

[ ]
RE:11679 デスクトップ復元中にhidemarucoNo.11683
かこん さん 06/12/09 11:36
 
起動するときに自動、もしくは、ウィンドウメニューからデスクトップ復元中に「フ
ァイルを開いた直後の自動起動マクロ」が呼び出されますが、その自動起動マクロの
中でhidemarucountとtabtotalを取得すると、例えば4つのファイルが順番に復元さ
れる場合に、両方の値が順番に2、3、4、4というように帰ってきます。これは1、
2、3、4と帰ってくるべきではないでしょうか?

また、関連があるように見受けられますが、この異常な動作をした場合、デスクトッ
プ復元後に秀丸はおろかデスクトップのどのウィンドウもフォーカスが当たっていな
い状態になります。ちなみにこのフォーカスの問題はマクロファイルが空でも「ファ
イルを開いた直後の自動起動マクロ」が有効になっている限り発生します。

[ ]
RE:11679 秀丸が起動した数を示すマクロのNo.11686
かこん さん 06/12/10 00:57
 
残念ながら以上の問題がすべて解決しても回避できない仕様上の問題があります。そ
れはこのマクロからだと1つめに開かれるファイルが最初に起動した秀丸からなのか、
ファイルがすべて閉じられてから開かれたファイルなのか判断できません。

例えば、ファイルが開かれている状態でCtrl+F4ですべてのタブを一旦閉じ、開いて
いるファイルが無題だけになります。この状態で次に既存のファイルを開くとこのマ
クロが実行されますが、tabgrouptotalとtabtotalが共に1の状態になりますのでデ
スクトップの復元が実行されてしまいます。残念ながら私の知識ではこれを回避する
良い方法は思いつきませんでした。

そこで要望なのですが、hidemarucountの派生でhidemarurancountみたいなマクロを
用意できないでしょうか?つまり、最初の秀丸プロセスが起動した時点で1に初期化
され、プロセスが実行されるたびに1つインクリメントしていく全プロセスでグロー
バルな値です。そうすればマクロでhidemarurancountを見て1であれば最初に起動さ
れた秀丸と分かるのでこの問題が解決でき、かつ、さらに簡素に実装できます。

よろしくご検討ください。

[ ]
RE:11686 秀丸が起動した数を示すマクロのNo.11697
Iranoan さん 06/12/11 13:40
 
 かこんさん今日は、Iranoan です。
 「11681〜11683 はマクロとメニューからで動作が違う」ということのような
ので、秀丸担当さんにお任せするとして、11680 と関係するこのスレッドに対
してのみ、返信します。
> 例えば、ファイルが開かれている状態でCtrl+F4ですべてのタブを一旦閉じ、開いて
> いるファイルが無題だけになります。この状態で次に既存のファイルを開くとこのマ
> クロが実行されますが、tabgrouptotalとtabtotalが共に1の状態になりますのでデ
> スクトップの復元が実行されてしまいます。残念ながら私の知識ではこれを回避する
> 良い方法は思いつきませんでした。
 こちらについては、「常の既存の秀丸エディタのウィンドウから呼び出した
時は、自動起動のマクロを実行しないようにしたい」ということでしょうか?
 そうであるなら、
//--------------------------------------------------------------------
OPEN;
//--------------------------------------------------------------------
という一行だけのマクロを登録しておき、このマクロを「開く」の変わりに使
うようにすれば良いと思います。マクロで開いたファイルに対しては、自動起
動が働かないはずなので。

[ ]
RE:11680 新規ファイルが「新規作成直後のNo.11700
秀丸担当 さん 06/12/11 16:18
 

>このため起動時にファイルを指定しない、新規ファイルを指定する、既存ファイルを
>指定する、という3通りのうち、新規ファイルを指定するだけがマクロの自動呼出し
>が行なえない状態です。新規ファイルの場合もファイルを指定しない場合と同様に
>「新規作成直後の自動起動マクロ」を呼び出すようにして頂けないでしょうか?

確認することができました。
存在しないファイルを指定した場合は「新規作成直後」を呼び出すようにしたほ
うがよさそうです。
そのように修正させていただきます。

[ ]
RE:11681 自動起動マクロからデスクトップNo.11701
秀丸担当 さん 06/12/11 16:24
 

>(1)自動起動マクロからのrestoredesktopの動作を通常のマクロと同様に「ファイ
>ルを開いた直後の自動起動マクロ」を呼び出さないようにして頂けないでしょうか?

そのように修正したいと思います。
自動起動中にrestoredesktopしたりopenfileしたりすることは想定していないの
ですが、実行の制限はしていないです。
通常のコマンドによるデスクトップ復元の最中は、「ファイルを開いた直後」が
呼び出されますが、この最中にさらにファイルを開いたりしても、現状でも収拾
がつかないので、とにかくデスクトップ復元中は実行しないように変更します。

[ ]
RE:11682 自動起動マクロからデスクトップNo.11702
秀丸担当 さん 06/12/11 16:25
 

>起動するときに自動、ウィンドウメニューから、通常のマクロからrestoredesktop、
>という3通りの方法でデスクトップ復元を行なった場合には、保存時にアクティブだ
>ったタブも復元してくれますが、どういうわけか自動起動マクロからrestoredesktop
>を呼び出してデスクトップ復元を行なった場合は、アクティブだったタブを復元して
>くれません。どちらかというとランダムなタブがアクティブにされてしまいます。こ
>れを他の方法と同じようにアクティブだったタブも復元するようにして頂けないでし
>ょうか?

こちらは再現できませんでした。
restoredesktop後の自動実行マクロが影響してしまっていたのかもしれません。
実行しないようにすることで直るかもしれません。

[ ]
RE:11683 デスクトップ復元中にhidemarucoNo.11703
秀丸担当 さん 06/12/11 16:26
 

>起動するときに自動、もしくは、ウィンドウメニューからデスクトップ復元中に「フ
>ァイルを開いた直後の自動起動マクロ」が呼び出されますが、その自動起動マクロの
>中でhidemarucountとtabtotalを取得すると、例えば4つのファイルが順番に復元さ
>れる場合に、両方の値が順番に2、3、4、4というように帰ってきます。これは
>1、
>2、3、4と帰ってくるべきではないでしょうか?
>
>また、関連があるように見受けられますが、この異常な動作をした場合、デスクトッ
>プ復元後に秀丸はおろかデスクトップのどのウィンドウもフォーカスが当たっていな
>い状態になります。ちなみにこのフォーカスの問題はマクロファイルが空でも「ファ
>イルを開いた直後の自動起動マクロ」が有効になっている限り発生します。

これらの問題は、自動実行マクロが呼び出されないことで問題では無くなると思
います。

[ ]
RE:11697 秀丸が起動した数を示すマクロのNo.11704
秀丸担当 さん 06/12/11 16:33
 

>そこで要望なのですが、hidemarucountの派生でhidemarurancountみたいなマクロを

あったらあったいいかもしれないですが、複数開いているうちの1つ秀丸エディ
タを終了しても減らない値で、デスクトップ復元のためだけに用意されたようで、
なんとなくスッキリしないです。
常駐秀丸エディタの存在はカウントに入れるかどうかも謎です。

geteventparam()という関数が追加されましたが、これでどのようにして起動さ
れたか(開かれたか)が分かるようにするというのではどうでしょうか。
外部からhidemaru.exeを使って起動されたか、自身または他の秀丸エディタから
開いたか、常駐秀丸エディタから起動したかを知ることができるようにするとか。

[ ]
RE:11697 秀丸が起動した数を示すマクロのNo.11717
かこん さん 06/12/12 00:53
 
Iranoan さん、ご助言ありがとうございます。

>という一行だけのマクロを登録しておき、このマクロを「開く」の変わりに使
>うようにすれば良いと思います。マクロで開いたファイルに対しては、自動起
>動が働かないはずなので。

なるほど、秀丸担当さんのコメントでも頂きましたが、マルロに対しては自動起動は
働かないというのが仕様だったのですね。

残念ながら、実際に私が困ったと感じたのは、ファイルをすべて閉じた後に、ファイ
ルヒストリやフォルダヒストリからファイルを選択したときにマクロが実行されてし
まうようなケースでした。

ヒストリ機能は多用するのでマクロでは代用できなさそうです。

[ ]
RE:11704 秀丸が起動した数を示すマクロのNo.11718
かこん さん 06/12/12 00:55
 
>geteventparam()という関数が追加されましたが、これでどのようにして起動さ
>れたか(開かれたか)が分かるようにするというのではどうでしょうか。
>外部からhidemaru.exeを使って起動されたか、自身または他の秀丸エディタから
>開いたか、常駐秀丸エディタから起動したかを知ることができるようにするとか。

このgeteventparam()は使えそうですね。ただ、まだヘルプには載っていないようで
すし、過去ログを見てもいまいち使いかが分からないです。いろいろ試してみます。

[ ]
RE:11718 秀丸が起動した数を示すマクロのNo.11719
かこん さん 06/12/12 01:16
 
>>geteventparam()という関数が追加されましたが、これでどのようにして起動さ
>>れたか(開かれたか)が分かるようにするというのではどうでしょうか。
>>外部からhidemaru.exeを使って起動されたか、自身または他の秀丸Gディタから
>>開いたか、常駐秀丸エディタから起動したかを知ることができるようにするとか。
>
>このgeteventparam()は使えそうですね。ただ、まだヘルプには載っていないようで
>すし、過去ログを見てもいまいち使いかが分からないです。いろいろ試してみます。

あ、今試してたら思ったのですが、このgeteventparam()をファイルを開いた直後と
新規作成直後の自動起動マクロから実行した場合の動作に関してはまだ実装されてい
ないのでしょうか?コメントを読み直してみたところ、そのように受け取れましたの
で。

外部、自身(または他)、常駐の3通りを知ることが出来ればわたしの用途にとって
は使えそうです。

ところで、geteventparam()関数の引数はその情報の種類を指定するということでし
ょうか?例えば、開いた直後と新規作成直後の自動起動マクロからgeteventparam(0)
を呼び出すと、ファイルの開かれた状態を得られて、(1)を呼び出すと今後追加され
る他の情報を得られるとか?

また、seteventparam()というのはご予定ないのでしょうか?例えば、値にユーザー
に予約された範囲を設けるとか。

#e = geteventparam(32);
if (#e != 0)
{
    // 次回以降は実行しない
    endmacro;
}
else
{
    // 初回のみ実行する
    ...
    seteventparam(32, 1);
}

[ ]
RE:11719 秀丸が起動した数を示すマクロのNo.11724
秀丸担当 さん 06/12/12 09:54
 

>あ、今試してたら思ったのですが、このgeteventparam()をファイルを開いた直後と
>新規作成直後の自動起動マクロから実行した場合の動作に関してはまだ実装されてい
>ないのでしょうか?コメントを読み直してみたところ、そのように受け取れましたの
>で。
>外部、自身(または他)、常駐の3通りを知ることが出来ればわたしの用途にとって
>は使えそうです。

geteventparamの話は提案で、まだやっていません。
それが良さそうということであればそのようにしたいと思います。

>ところで、geteventparam()関数の引数はその情報の種類を指定するということでし
>ょうか?例えば、開いた直後と新規作成直後の自動起動マクロからgeteventparam(0)
>を呼び出すと、ファイルの開かれた状態を得られて、(1)を呼び出すと今後追加され
>る他の情報を得られるとか?

その通りです。geteventparamは、自動起動がどのようにして実行されたかを知
るものとして追加しました。
ぼちぼちヘルプにも書きます。

>また、seteventparam()というのはご予定ないのでしょうか?例えば、値にユーザー
>に予約された範囲を設けるとか。

グロバールな値を扱いたい場合は、INIファイル系やレジストリ系の文を使うこ
とでできます。
ただこれだと増える一方でリセットされないですが。
geteventparamはどのような条件かを知るためのもので、値を記憶させておくた
めに使うのはちょっと違います。

[ ]
RE:11724 秀丸が起動した数を示すマクロのNo.11725
かこん さん 06/12/12 10:24
 
>geteventparamの話は提案で、まだやっていません。
>それが良さそうということであればそのようにしたいと思います。

そうですね。ではそれが良さそうだということで提案しておきますのでよろしくお願
いします。

>グロバールな値を扱いたい場合は、INIファイル系やレジストリ系の文を使うこ
>とでできます。
>ただこれだと増える一方でリセットされないですが。

同じように考えていたのですが、自動的にリセットさせるような方法がないために今
回の用途には使えませんでした。

>geteventparamはどのような条件かを知るためのもので、値を記憶させておくた
>めに使うのはちょっと違います。

なるほどそういうわけでしたか。ただ、起動中のみグローバルな値をマクロから管理
できると使い勝手が良いかもしれません。

[ ]
RE:11717 秀丸が起動した数を示すマクロのNo.11726
Iranoan さん 06/12/12 13:25
 
 かこんさん今日は、Iranoan です。
> 残念ながら、実際に私が困ったと感じたのは、ファイルをすべて閉じた後に、ファイ
> ルヒストリやフォルダヒストリからファイルを選択したときにマクロが実行されてし
> まうようなケースでした。
 それならば、元々「デスクトップの復元」をしたいのは、I.E でソースを開
いたとき、等特定の時だけなのでしょうか? それならば、そちら側の設定を変
更した方が早い気がします。レジストリを直接編集する必要がありそうです
が...。

[ ]
RE:11726 秀丸が起動した数を示すマクロのNo.11727
かこん さん 06/12/12 17:13
 
> それならば、元々「デスクトップの復元」をしたいのは、I.E でソースを開
>いたとき、等特定の時だけなのでしょうか? それならば、そちら側の設定を変
>更した方が早い気がします。レジストリを直接編集する必要がありそうです
>が...。

いえ、主に「デスクトップの復元」をしたいのはコマンドラインから秀丸を起動(フ
ァイルなし、新規ファイル名、既存ファイル名)、もしくは、スタートメニューから
起動した時です。

IEでの問題は、「デスクトップの復元」を自動にしてても行なわれないので、その
時に「デスクトップの保存」を自動にしている時に、思わずその秀丸を終了してしま
うと、それまで例えば数十というファイルを開いていたら、それらを手動で開き直さ
ないといけないという点です。

他のエディタだと、大体は開かれていたファイルはどのように起動してもすべて自動
で開き直されるようになっており、それに慣れてしまっているために、秀丸をどうに
かして同じように動作するように出来ないかと思っている次第です。

[ ]
RE:11727 秀丸が起動した数を示すマクロのNo.11729
Iranoan さん 06/12/12 19:32
 
 かこんさん今日は、Iranoan です。
> いえ、主に「デスクトップの復元」をしたいのはコマンドラインから秀丸を起動(フ
> ァイルなし、新規ファイル名、既存ファイル名)、もしくは、スタートメニューから
> 起動した時です。
 そうでしたか。
 それなら専用のバッチ・ファイルを作っておいたり、使用しているシェルに
よってはエイリアスを定義しておけばよいでしょうが、秀丸の話題から離れて
しまうので、このぐらいにしておきます。

[ ]
RE:11679 V6.50β8で全て解決されました。No.11731
かこん さん 06/12/12 20:39
 
秀丸担当さま、

早速の対応ありがとうございました。
V6.50β8を試してみたところ、私がこのスレッドで指摘した問題はすべて解決できて
いるようです。下記のようなマクロを作り、「ファイルを開いた直後」と「新規作成
の直後」の両方の自動起動マクロに登録すれば、私が求めていた起動時のデスクトッ
プ自動復元を完璧に実現できました。ありがとうございました。

//----------

if (geteventparam(0) != 0 || tabgrouptotal != 1 || tabtotal != 1) endmacro;
$f = filename2;
restoredesktop;
if ($f == "") endmacro;
if (findhidemaru($f) == -1) openfile $f;
setactivehidemaru findhidemaru($f);

[ ]
RE:11727 秀丸が起動した数を示すマクロのNo.11746
アルビレオ さん 06/12/13 01:22
 
ユーザーのアルビレオです。

>IEでの問題は、「デスクトップの復元」を自動にしてても行なわれないので、その
>時に「デスクトップの保存」を自動にしている時に、思わずその秀丸を終了してしま
>うと、それまで例えば数十というファイルを開いていたら、それらを手動で開き直さ
>ないといけないという点です。

かこんさんの望んでいることを完全に把握しているわけではありませんが、実は
「全終了時にいっしょにデスクトップ保存を実行する」をOFFにすれば意外とあ
っさり解決するかも…

savedesktop;
saveexitall;

というマクロを作って適当なキーに割り当て、普段はこれを使って終了。

デスクトップ復元を実行しなかった場合だけ、標準の「全終了」や「全保存終
了」を使うと。
要は普段使っている場合の「終了」を標準機能ではなくマクロを使って終了する
癖をつけた方が、複雑な起動時マクロを組むより手軽なんじゃないかという気が
します。
どんなもんでしょう?

[ ]
RE:11746 秀丸が起動した数を示すマクロのNo.11751
かこん さん 06/12/13 02:24
 
ご助言ありがとうございます。

>要は普段使っている場合の「終了」を標準機能ではなくマクロを使って終了する
>癖をつけた方が、複雑な起動時マクロを組むより手軽なんじゃないかという気が
>します。

実際、当初はそのようなことも考えて試してはみたのですが、結局、普段使ってる状
態で自然とデスクトップを自動的に保存にしていないと保存し忘れてしまいますし、
そうすると今度は保存して欲しくない時でも保存してしまってデスクトップ状態を上
書きされてしまいますので、いつも問答無用で保存するというふうに統一した方が私
にとっては例外処理がなくなるので安心です。

そういった訳で否が応でもなんとかマクロで完全に実現できないか頑張ってみました。
^^;

[ ]
RE:11751 秀丸が起動した数を示すマクロのNo.11752
アルビレオ さん 06/12/13 03:50
 
アルビレオです。

>実際、当初はそのようなことも考えて試してはみたのですが、結局、普段使ってる状
>態で自然とデスクトップを自動的に保存にしていないと保存し忘れてしまいますし、

んだから「普段使ってる状態」の方を変えてしまえば、と思ったわけなんですが…
Ctrl+Qあたりに割り付けてあとは慣れるだけと。


じゃあ逆に普段は「全終了でデスクトップ自動保存」はONで、保存したくないと
きだけマクロで終了することにしますか?

○デスクトップを保存せずに全終了する
openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
writeregnum "AutoSaveDesktop", 0;
closereg;
envchanged;
saveupdatedall;//または exitall とか saveexitall とか

これで終了すると次に起動したとき自動保存がOFFになっているので

○デスクトップ自動保存をONに戻す
if(hidemarucount<=1){//遅くならないようにレジストリ書き換え回数を減らす
  openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
  writeregnum "AutoSaveDesktop", 1;
  closereg;
  envchanged;
}

を起動時実行マクロとして登録。

条件の切り分けが難しい自動復元をどうにかするより、自動保存を制御する方が
簡単だと思います。

[ ]
RE:11752 秀丸が起動した数を示すマクロのNo.11755
かこん さん 06/12/13 07:34
 
アルビレオさん、わざわざマクロの例まで出して頂いてありがとうございました。

ただ、このスレッドにコメントしたとおり、現状の復帰用のマクロを使うことにより
ほぼ私の希望がかなえられそうですので、やはり保存は一通りでいつも保存、復帰は
マクロで、というのが私の理想(一般的なエディタの動作)に一番近い動作となりそう
です。

[ ]
RE:11679 V6.50β10での自動デスクトップ復帰マクロ最終バージョNo.11895
かこん さん 06/12/19 14:21
 
V6.50β10で修正された問題を踏まえて、下記のマクロが最終バージョンとなりまし
た。今のところ動作は完璧のようです。

「ファイルを開いた直後」と「新規作成の直後」の両方の自動起動マクロに登録して
使用します。

//----------
if (geteventparam(0) != 0 || tabgrouptotal != 1 || tabtotal != 1) endmacro;
$o = filename;
$f = filename2;
restoredesktop;
if ($o == filename || $f == "") endmacro;
if (findhidemaru($f) == -1) openfile $f;
else setactivehidemaru findhidemaru($f);

[ ]