秀丸でもDLLを直接呼び出したいNo.03701
緒方聡 さん 09/09/08 17:57
 
以前、秀丸メールのマクロ呼び出しに

 DLL|hogehoge.dll,FunctionName

という呼び出し方を追加してもらいました。
おかげさまで非常に快適です。

これと同じことを秀丸でもできるようにすることは可能でしょうか。

例えば grep 結果に常駐するマクロ(grep 結果でカーソルを上下するだけで対象行
を別の秀丸に次々に表示させる)を使用中に、新たに別のことを行いたい場合、マク
ロを中断しなければなりません。

特に私の場合、Enter キーや Home キー、Ctrl-V、Ctrl-S、マウスダブルクリック、
F10(タグジャンプもマクロ化)など非常に汎用的なキーもにマクロが割り当てられ
ており、これらが使えなくなるため泣く泣くそれまでのマクロを中断しています。

[ ]
RE:03701 秀丸でもDLLを直接呼び出したいNo.03720
秀丸担当 さん 09/09/09 09:44
 

>これと同じことを秀丸でもできるようにすることは可能でしょうか。

秀丸エディタでも「DLL|」の指定をできるようにしてもいいかもしれないですが、
はたしてそれで目的を達成できるかどうかが疑問です。
完全に独自なDLLの処理かtkinfo.dllなどのDLLを呼び出す処理であればいいです
が、DLL内からマクロの文を呼び出すようなことはできないです。

ちなみに本題とは違うかもしれないですが、「次の結果」「前の結果」というコ
マンドが追加されていて、grep結果があるときに実行すると簡単にタグジャンプ
できるという方法もありますがどうでしょうか。

[ ]
RE:03720 秀丸でもDLLを直接呼び出したいNo.03728
緒方聡 さん 09/09/09 11:08
 
回答ありがとうございます。
うすうすできないっぽいことはなんとなくわかってはいました。

標準的な機能をマクロで置き換えるのが縁の下の力持ち的にとても便利なのですが、
他のマクロが起動中だと実質何もできなくなってしまうのがとても痛いので、何かう
まい方法を検討したいです。

前の結果、次の結果は知りませんでした。
知っているけど使っていない便利っぽい機能や(デスクトップ保存とか新しいとこで
はエクスプローラ枠とか)、存在すら知らない機能がいっぱいあるなと驚きます。

参考までにマクロを貼り付けておきます。

このマクロは誰が作成されたものなのかわかりませんが
マクロがわからない友達に改造を依頼されて
それ以降私も愛用しています。
grep 結果が何百もあるときに重宝します。

とりあえずこのマクロに関しては、開始時にキー割り当てを変更して、終了時にキー
割り当てを元に戻す、ということをすればとりあえずはしのげるのかな、という気が
してきました(そんな機能があるのかどうかは調べていません)。

---- macro start ----
//デバック時は、以下の2行のコメントを外すこと
//debuginfo 1;
//#debug = 1;

if(filetype != "grep"){
    message "Cannot run outside of a grep search";
    endmacro;
}

// >>>> ogata
loaddll macrodir + "\\DengakuDLL.dll";
if (!result) loaddll hidemarudir + "\\DengakuDLL.dll";
// <<<< ogata


//検索関連の設定保護
$BAK_SEARCHBUFFER  = searchbuffer;
#BAK_SEARCHOPTION  = searchoption;
#BAK_HILIGHTING    = foundhilighting;
$BAK_REPLACEBUFFER = replacebuffer;
if(#BAK_HILIGHTING) hilightfound 0;
//メインgrep画面のハンドルを取得
#main = hidemaruhandle(0);
//検索のベースフォルダ
$base = directory + "\\";
//秀丸の検索数
#max = hidemarucount - 1;
//マクロ終了時にビュアー画面を閉じるない場合は1 閉じるなら0
#view_close = 1;

//メイン画面の座標、ウィンドウサイズを保存
#pos_x = windowposx;
#pos_y = windowposy;
#width  = windowcx;
#height = windowcy;

//タブモードの場合はループの最大を変更
if(tabmode) #max = tabgrouptotal - 1;

//横に並べるを使う都合上、表示する秀丸以外は最小化する。
//ウィンドウを並べないのなら不要なコード
if(#max > 0){
    #cnt = 0;
    while(#cnt < #max){
        if(tabmode == 0){
            #list[#cnt] = hidemaruhandle(#cnt + 1);
        }else{
            #list[#cnt] = getcurrenttab( true, #cnt + 1);
        }
//        call DBOUT str(#cnt) + ":" + str(#list[#cnt]);
        #cnt = #cnt + 1;
    }
    //起動した秀丸(grep)以外は最小化
    #cnt = 0;
    while(#cnt < #max){
        setactivehidemaru hidemaruhandle(#list[#cnt]);
        showwindow 2;
        #cnt = #cnt + 1;
    }
    setactivehidemaru #main;
}

//ビューア用の秀丸を開く
call openview;
//ウィンドウの並びを設定
//ウィンドウの配置を換えたい場合、このルーチンを書き換えること。
call set_window;
//メインをアクティブ化
setactivehidemaru #main;
//grepの出力形式判定
//フルパス(ネットワークドライブ)かどうか
gofiletop;
searchdown "\\(([0-9]+)\\):(?\\1)", regular;
if(result){
    escape;
    beginsel;
    golinetop2;
    $chk_name = gettext(seltopx, seltopy, selendx, selendy);
    if(strstr($chk_name, ":\\") == 1 || leftstr($chk_name,2) == "\\\\") $bas
e = "";
}
//先頭の内容を表示
title "EXIT grep View Mode [esc]" +  directory2 + "\\" + grepfilebuffer;
gofiletop;
#lineno = lineno;
call grep_view;
//ループでキー入力待ち受け
disablebreak;
while(1){
    // >>>> ogata
    if (loaddllfile != "") n = dllfunc("SLEEP", 50);
    // <<<< ogata
    #getkey = keypressed;
    //[esc]
    if(#getkey == 0x1b){
        setactivehidemaru #view;
        if(result){
            //範囲選択、閲覧モードを解除
            escape;
            if(browsemode) browsemodeswitch;
        }
        break;
    }
    //[up] or [left]
    if(#getkey == 0x26 || #getkey == 0x25) movetolineno column, lineno - 1;
    //[down] or [right]
    else if(#getkey == 0x28 || #getkey == 0x27) movetolineno column, lineno
+ 1;
    //[PageUp]
    else if(#getkey == 0x21) halfprevpage;
    //[PageDown]
    else if(#getkey == 0x22) halfnextpage;
    //[Enter] 動作しないと思う
    else if(#getkey == 0x0D) #ret = 1;
    //カーソル位置が変更されていればビューアを更新
    if(#lineno != lineno || #ret == 1){
        call grep_view;
        #lineno = lineno;
    }
    #ret = 0;
}

//他のウィンドウを復元
#cnt = #max - 1;
while(#cnt > -1){
    setactivehidemaru hidemaruhandle(#list[#cnt]);
    //念のため明示的に元に戻す
    //showwindow 1;
    #cnt = #cnt - 1;
}

//ビューア秀丸を復元?
if(#view_close == 1){
    setactivehidemaru #view;
    if(tabmode){
        settabgroup #view, #tg_id;
    }else{
        setwindowpos #pos_x_1, #pos_y_1, #width_1, #height_1;
    }
}else{
    setactivehidemaru #main;
    closehidemaruforced #view;
}
//
setactivehidemaru #main;
title 0;
//座標、ウィンドウサイズを復元
setwindowpos #pos_x, #pos_y, #width, #height;
setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION;
setreplace $BAK_REPLACEBUFFER;
if(#BAK_HILIGHTING) hilightfound 1;

// >>>> ogata
if (loaddllfile != "") freedll;
// <<<< ogata

endmacro;

//grepの結果から、ファイル名と行番号を取得し、ビューに表示
//"finename(num): "を検索し、行番号とファイル名を取得し表示
grep_view:
    disabledraw;
    golinetop2;
    searchdown "\\(([0-9]+)\\):(?\\1)", regular;
    if(result){
        #line = val(gettext(foundtopx, foundtopy, foundendx, foundendy));
        searchup "(";
        if(result){
            escape;
            beginsel;
            golinetop2;
            $fname = gettext(seltopx, seltopy, selendx, selendy);
            enabledraw;
            if(existfile($base + $fname) == 0){
                message "Cannot find file. \n" + $base + $fname;
                return;
            }
            setactivehidemaru #view;
            if(!result){
                //ビュー用の秀丸を開く
                call openview;
                //ウィンドウの並びを設定
                call set_window;
                #set_result = true;
                $bak_fname = "";
                setactivehidemaru #view;
            }
            if($fname != $bak_fname){
                loadfile $base + $fname;
                if(browsemode == 0) browsemodeswitch;
            }else{
                escape;
            }
            movetolineno 0, #line;
            // >>>> ogata
            setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION;
            setreplace $BAK_REPLACEBUFFER;
            if(#BAK_HILIGHTING) hilightfound 1;
            selectline;
            // <<<< ogata
            setactivehidemaru #main;
            $bak_fname = $fname;
        }
    }else{
        enabledraw;
    }
    // >>>> ogata
    setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION;
    setreplace $BAK_REPLACEBUFFER;
    if(#BAK_HILIGHTING) hilightfound 1;
    // <<<< ogata
return;

//ビューア用の秀丸を開き、各種設定取得
openview:
    newfile;
    #view = hidemaruhandle(0);
    #pos_x_1 = windowposx;
    #pos_y_1 = windowposy;
    #width_1  = windowcx;
    #height_1 = windowcy;
    if(tabmode){
        #tg_id = tabgroup;
        settabgroup #view, -1;
    }
    // >>>> ogata
    setsearch $BAK_SEARCHBUFFER, #BAK_SEARCHOPTION;
    setreplace $BAK_REPLACEBUFFER;
    if(#BAK_HILIGHTING) hilightfound 1;
    // <<<< ogata
return;

//秀丸ウィンドウの表示設定
set_window:
    setactivehidemaru #main;
   
    //横に並べる場合
    windowhorz;
   
    //縦に並べる場合
    //windowvert
   
    //現状の幅のまま、画面の上下に並べる
//    ##set_hi = cyworkarea / 2;
//    ##set_x = windowposx;
//    ##set_w = windowcx;
//    setwindowpos ##set_x, 0, ##set_w, ##set_hi;
//    setactivehidemaru #view;
//    setwindowpos ##set_x, ##set_hi, ##set_w, ##set_hi;
    //現状の幅のまま、画面の上下に並べる

//    //現在のウィンドウの下に固定幅で配置
//    ##set_hi = 350;
//    ##set_y = windowposy;
//    ##set_x = windowposx;
//    ##set_w = windowcx;
//    ##set_h = windowcy;
//    ##all_hi = windowposy + windowcy + ##set_hi;
//    if(cyworkarea < ##all_hi){
//        ##set_y = windowposy - (##all_hi - cyworkarea);
//        if(##set_y < 0){
//            ##set_h = ##set_h + ##set_y;
//            ##set_y = 0;
//        }
//    }
//    setwindowpos ##set_x, ##set_y, ##set_w, ##set_h;
//    setactivehidemaru #view;
//    setwindowpos ##set_x, ##set_y + ##set_h, ##set_w, ##set_hi;
//    //現在のウィンドウの下に固定幅で配置
   
    //
    setactivehidemaru #main;
return;

//----------------------//
//  デバック出力ルーチン
//  デバックツールは「DBCon」等を使用する事
//「http://www.htosh.com/
//----------------------//
DBOUT:
    if(#debug == 1 && findwindowclass("DBConClass") != 0) debuginfo $$1 + "\n";
return;

[ ]
RE:03728 秀丸でもDLLを直接呼び出したいNo.03763
IKKI さん 09/09/09 22:15
 
こんにちは。ユーザの IKKI です。

> このマクロは誰が作成されたものなのかわかりませんが

かなり改造されていますが、元は h-tom さん作「ビューア機能付きGrep」ですね。
http://homepage3.nifty.com/_htom/macro/macro_etc.html#label-34

と、ここだけ反応して失礼します。

# 常駐系マクロを作っても多重実行ができないと事実上使えない、という問題は
# 私も感じているのですが、うまい解決策を提案できる心境に達していません。

[ ]
RE:03763 秀丸でもDLLを直接呼び出したいNo.03764
緒方聡 さん 09/09/09 22:38
 
こんにちは IKKI さん。

>かなり改造されていますが、元は h-tom さん作「ビューア機能付きGrep」ですね。
>http://homepage3.nifty.com/_htom/macro/macro_etc.html#label-34

確かにそのとおりのようですね。

友達に送ってもらった時点でマクロファイル名が変わってしまっていたので、探し出
せませんでした。

秀丸 ver 8 から、sleep が追加されたんですね。
今でもなおバージョンアップに余念がないのがすばらしいです。

[ ]
RE:03728 秀丸でもDLLを直接呼び出したいNo.03774
カモノハシ さん 09/09/10 06:54
 
こんにちは、いつもお世話になっております。カモノハシです。
横から失礼いたします。
> 秀丸担当 様
変換モジュールを指定することはできませんでしょうか?
引数はなしでもいいので、編集結果だけでも反映されればと。


> とりあえずこのマクロに関しては、開始時にキー割り当てを変更して、終了時にキー
> 割り当てを元に戻す、ということをすればとりあえずはしのげるのかな、という気が
> してきました(そんな機能があるのかどうかは調べていません)。
 拙作の AssignReg.dll を使うと、一部制限がありますが、不可能ではないです。
http://members.jcom.home.ne.jp/c-spencer/program/piece/index.html#key
最近前々更新していないので、古いですが……。

[ ]
RE:03774 秀丸でもDLLを直接呼び出したいNo.03783
秀丸担当 さん 09/09/10 10:56
 

>変換モジュールを指定することはできませんでしょうか?
>引数はなしでもいいので、編集結果だけでも反映されればと。

確かにマクロ実行中に変換モジュールを呼び出すことはマクロ重複実行の弊害に
はならないと思います。
昔からある変換コマンド以外の変換モジュールのキー割り当ては、マクロでやる
ということになっているので、キー割り当てしたものができないのは不便かもし
れません。
やるかどうかはわかりませんが、そういうネタとして参考にさせていただきます。

ちなみにキー割り当てで「その他編集」系に「変換」というコマンドがあって、
編集メニューから選ぶより少しだけ素早く選ぶこともできます。

[ ]
RE:03701 秀丸でもDLLを直接呼び出したいNo.03796
緒方聡 さん 09/09/10 15:58
 
>特に私の場合、Enter キーや Home キー、Ctrl-V、Ctrl-S、
> マウスダブルクリック、F10(タグジャンプもマクロ化)など
> 非常に汎用的なキーもにマクロが割り当てられており、
> これらが使えなくなるため泣く泣くそれまでのマクロを
> 中断しています。

ちなみにどんなことをやっているのか、というのを簡単に説明します。

Enter:
  "if (result) { // コメント" みたいな状態で Enter を押すと
  期待通りにインデントが行われないのを改善

Home:
  Visual Studio や Eclipse と同じ動作になるように

Ctrl-V:
  Eclipse のように、貼り付けた先にあわせて自動的にインデントを
  調節してくれるように

Ctrl-S:
  世代バックアップ

Delete:
  削除時にインデントもまとめて削除

マウスダブルクリック:
  単語の選択される範囲を調整

F10:
  タグジャンプ時に検索ワードを .hilight ファイルレベルで強調

マウストリプルクリック:
  grep 結果ならタグジャンプ

Ctrl-F:
  検索ダイアログの動作をカスタマイズ

Ctrl-R:
  置換ダイアログの動作をカスタマイズ

Ctrl-Left, Ctrl-Right:
  単語移動の動作をカスタマイズ

Tab:
  インデント時に行頭にコメントがある場合は、
  コメントの後ろからインデント

エディタの動作を自分の好みに変えられるというのは、
本当にすばらしいです。

[ ]