自動起動マクロについてNo.06611
ohtorii さん 11/04/24 14:03
 
こんにちわ、ohtoriiです。


自動起動マクロを使って括弧の補完を行なおうとしています、

このような補完です、
   (  → ()


正しく動作したので、次のステップとして選択範囲がある状態で ( を
入力すると、選択範囲の前後を括弧で閉じるようにしたいのですが

    |1+2|  → (1+2)     ※|は選択範囲

選択が解除された状態でマクロが呼ばれるようです。
何かいい手がないでしょうか。


あと、もう一点(undo動作について)
本マクロで行なった編集を1回のundo動作で元に戻したいのですが
出来ませんでした。(2回のundoで元に戻ります)
こちらも、何かいい手がないでしょうか。


---- マクロここから ----
//
//編集後タイマー 0ms
//

if(5!=event){
    //! 編集後タイマー
    endmacro;
}

if(0 != geteventparam(0)){
    //! 通常の編集
    endmacro;
}

if(0 != geteventparam(3)){
    //! 延滞時間==0
    endmacro;
}
if('(' != geteventparam(4)){
    endmacro;
}

if(selecting){
    //テスト。
    //選択中であってもここにこない
    insert("HOGE");
}else{
    insert(")");
}
left;   //括弧の中へ移動
---- ここまで ----

[ ]
RE:06611 自動起動マクロについてNo.06612
IKKI さん 11/04/24 22:40
 
ohtorii さん、こんにちは。ユーザの IKKI です。

> 選択が解除された状態でマクロが呼ばれるようです。
編集後タイマは編集が終わった後で呼ばれるものなので、仕様通りですね。

> 何かいい手がないでしょうか。
●解1:
//------------------------------------------------------------
##c = column - 1;
##e = strlen(gettext2(column, lineno, linelen2, lineno));
undo;
undo;
$$s = gettext2(##c, lineno, linelen2 - ##e, lineno);
redo;
redo;
begingroupundo;
insert $$s + "閉じ括弧";
endgroupundo;
//------------------------------------------------------------
ただし、次のような場合を考えると、もっと複雑なマクロが必要です。
・入力された文字が ASCII 1 文字でない場合
・選択範囲が複数行にまたがっている場合
・BOX 選択の場合
・行内にサロゲートペアや合字がある場合
・カーソルから行末までが文字列変数に収まりきらないほど長い場合

●解2: 自動起動マクロ「編集前」の追加を秀丸担当さんにお願いする。

●解3: キーボードフック系の常駐ソフトを使ってキーコードを書き換える。
例えば AutoHotkey で次のスクリプトを作って常駐させておき、秀丸側では
Ctrl+8 に括弧で囲むマクロを割り当てれば、目的の使い心地が得られます。
;------------------------------------------------------------
#IfWinActive ahk_class Hidemaru32Class
+8:: Send, ^{8}
;------------------------------------------------------------

●解4: あきらめる。
私も一時期 Eclipse の真似事がしたくなり、編集後タイマを駆使していろいろ
頑張ってみたりもしたのですが、補完でコケたりキーリピートが遅くなったりと
弊害が多かったため、編集後タイマの活用はあきらめました。
その代わり、Ctrl キーを押しやすい位置に配置した上で、たとえば
 ・Shift+8 = 「(」を入力 (標準の動作)
 ・Ctrl+8 = 「()」で囲む
のように連想しやすいキー割り当てをして、手動で使い分けています。


> 本マクロで行なった編集を1回のundo動作で元に戻したいのですが
> 出来ませんでした。(2回のundoで元に戻ります)
> こちらも、何かいい手がないでしょうか。
上述のように begingroupundo; と endgroupundo; を組み合わせて使います。

# マクロ内で undo する場合は、ひょっとすると注意が必要かもしれません。
# 現在のバージョンでは大丈夫ということになっていますが…
# 参照 http://www.maruo.co.jp/turukame/3/x04531_.html

[ ]
RE:06612 自動起動マクロについてNo.06613
ohtorii さん 11/04/26 21:44
 
こんにちわ。
アドバイスありがとうございました参考になりました。

当方キーボードフックを行なう「のどか」を導入しているので以下の合わせ技で何と
かなりそうです。
  秀丸だけ「Shift-8」を「Ctrl-8」に置き換える。
  「Ctrl-8」にマクロを割り当てて諸々処理する。

秀丸の外側で細工してやれば出来なくもないと言ったところです。

秀丸本体へ色々追加して頂くと、下位互換を維持するためにはずことが出来なくなる
ので、まずは自力で何とかしてみます。



[ ]