カーソル位置の取得についてNo.05542
三丁目の秀さん さん 07/05/05 10:28
 
お世話になります。三丁目の秀さんです。

カーソル・クリップボード系の質問がございます
現在のカーソル位置(行、列)を取得する関数はございませんでしょうか?
目的は、文章(文字列)上のカーソル位置から右クリックをしたらをの位置から改行
位置までの文字を
切り取ってクリップボードに保存を行うマクロを作成したいのですが、秀丸マクロマ
ニュアルで
探してみましたがそれらしきマクロ関数が無かった様なのでこの場をお借りして質問
させていただきす。
また上記のような機能をもったマクロをご存知でしたら教えていただければ幸いです。

以上宜しくお願いいたします。

[ ]
RE:05542 カーソル位置の取得についてNo.05543
K'zawa さん 07/05/05 11:45
 
三丁目の秀さん、こんにちは。
K'zawa/ユーザーです。

>現在のカーソル位置(行、列)を取得する関数はございませんでしょうか?

関数ではなく、キーワードで取得できます。
[マクロヘルプ]-[内部的な値を表現するキーワード]
-[カーソル関連キーワード]
x,y,column,lineno等


>目的は、文章(文字列)上のカーソル位置から右クリックをしたらをの位置から改行
>位置までの文字を
>切り取ってクリップボードに保存を行うマクロを作成したいのですが、秀丸マクロマ
>ニュアルで
>探してみましたがそれらしきマクロ関数が無かった様なのでこの場をお借りして質問
>させていただきす。
>また上記のような機能をもったマクロをご存知でしたら教えていただければ幸いです。

-----------------------------------------------------
setclipboard gettext2(column,lineno,linelen2,lineno);
deleteafter;
-----------------------------------------------------

または、

------------------
beginsel;
golineend2;
cut;
------------------

[ ]
RE:05543 カーソル位置の取得についてNo.05544
三丁目の秀さん さん 07/05/05 12:45
 
今日はK'zawaさん早速の回答ありがとうございます
思い通りの動作をいたしました。
しかし数十行、数百行の切り貼りを行うにはやはり辛いものがあります(´・ω・`)ショ
ボーン 
実は秀丸マクロライブラリでSnippet.mac v3.02 ◆コードスニペット挿入(入力補
完マクロ CompleteXのプラグイン)
なるものを見つけMFCの関数の辞書を作成しようとMSDNから切り張りしているのです
が、膨大な数なので飽きてしまい
手っ取り早く先の趣旨のマクロを作成してやろうとしましたが大間違いでしたww
やはりここはきちんとマクロを組んで作業を行おうと思います、しかもWeb上のMSDN
ってソースって取得できないので
マウスで選択コピペしている次第です、取り合えずMFCの関数の中でも自分が良く使
うクラスのものから始めます。
ありがとうございました。

[ ]
RE:05544 カーソル位置の取得についてNo.05546
三丁目の秀さん さん 07/05/05 20:26
 
取り合えず、コピーした形式が"関数名”半角スペース”関数の説明”この様な場合
のマクロを書いてみました
具体的なURLで言いますと
Ex:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vclib/html/_mfc_cwnd_class_members.asp
この様なパターンです。

マクロを実行すると【新規秀丸1】【新規秀丸2】に下記のように出力されますComple
teXで使う処の
辞書ファイル、コメントファイルが作成できます。

【Ex】
    【元ファイル】
         Attach Windows ハンドルを CWnd オブジェクトに関連付けます。
         CalcWindowRect クライアントの四角形からウィンドウ四角形を計算するた
めに呼び出されます。

    【辞書ファイル】
         Attach
         CalcWindowRect

     【コメントファイル】
         Windows ハンドルを CWnd オブジェクトに関連付けます。
         クライアントの四角形からウィンドウ四角形を計算するために呼び出され
ます。

全てがこのパターンならいいのですが、他にもパターンがあるので、おいおい作って
いきます。
半角文字、全角文字のチェック等全然やっていないので、バグる可能性もありますの
で今は完成度が低いですヽ(´ー`)ノ
実際このマクロを上記のURLからコピペして実行しても30秒程掛かりますが、完全に
手動で行う事を考えれば格段に作業性はよくなりました
しかしCompleteXは非常に素晴らしいマクロだと思いますが辞書作りが大変です┐
(´ー`)┌

/********************************************************************

        MSDN整形マクロ      DEBUG Ver 0.1
        2007/05/05          三丁目の秀さん

********************************************************************/

#HWND = hidemaruhandle(0);              // 現在のウィンドウのウィンドウハン
ドルを取得

newfile;                                // 新規ウィンドウ1を開く
#HWND_NEW = hidemaruhandle(0);          // 今開いたウィンドウのウィンドウハ
ンドルを取得
showwindow 0;

newfile;                                // 新規ウィンドウ2を開く
#HWND_NEW_NEW = hidemaruhandle(0);      // 今開いたウィンドウのウィンドウハ
ンドルを取得
showwindow 0;

setactivehidemaru #HWND;                // 元のウィンドウ
##max = linecount2;
##i = 0;

call Regular;
showwindow 0;

while( ##i < ##max ){
    golinetop;
    $$text = gettext2( 0,lineno, linelen2, lineno );
    ##len = strlen( $$text );
    ##pos = strstr( $$text, " " );

    $$left_strings = midstr( $$text, 0, ##pos );
    $$right_strings = rightstr( $$text, ##len - ##pos);

    setactivehidemaru #HWND_NEW;        // コピー先1ウィンドウに移動

    insert $$right_strings;
    insertreturn;

    setactivehidemaru #HWND_NEW_NEW;    // コピー先2ウィンドウに移動
    insert $$left_strings;
    insertreturn;

    setactivehidemaru #HWND;            // コピー元ウィンドウに移動
    movetolineno 0, lineno + 1;
    ##i = ##i + 1;
}

setactivehidemaru #HWND;
showwindow 1;

setactivehidemaru #HWND_NEW;            // コピー先1ウィンドウに移動
call Regular;
showwindow 1;

setactivehidemaru #HWND_NEW_NEW;        // コピー先2ウィンドウに移動
call Regular;
showwindow 1;

endmacro;

// 行の前後を整形
Regular:
    replaceallfast "^ +", "", regular;
    replaceallfast " +\\n", "\\n", regular;
return;

[ ]
RE:05546 カーソル位置の取得についてNo.05547
h-tom さん 07/05/06 00:30
 

h-tom です。

>取り合えず、コピーした形式が"関数名"半角スペース”関数の説明”この様な場合
>のマクロを書いてみました
余計なお世話かもしれませんが。

フォーマットが、
 "関数名" 半角スペース "関数の説明"
なら、同じ内容を2つコピーし、
・関数名側は、最初のスペースより後ろ
・関数の説明側は、最初のスペースよりも前
を、置換で一括削除すればいいのでは?

それと、内容にもよるけど、htmlのソース側を直接処理した方がいい場合もある。
(タグで分けられているので、パターンが決まっているなら、探しやすい)

[ ]
RE:05547 カーソル位置の取得についてNo.05548
アルビレオ さん 07/05/06 01:18
 
アルビレオです。

>それと、内容にもよるけど、htmlのソース側を直接処理した方がいい場合もある。
>(タグで分けられているので、パターンが決まっているなら、探しやすい)

やってみました。
インラインフレームになっているのでソースの取得は難しいですが、がんばって
左サイドバーのHTMLソースを取得すれば

1.リスト部分を抽出、整形
検索:<a href='([^']+)'[^<>]+>([^<>]+)</a>
置換:\n\2\thttp://msdn.microsoft.com\1\n

2.不要な部分を削除
検索:^[^\t]*\n
置換:

これで
 キーワード<TAB>参照URL
形式のリストが作れます。
ただし、MSDNライブラリの内容がすべて同じ形式で格納されているとは限らない
ので、うまくいかない場合があるかもしれません。
私が試したのは
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpref/html/cpref_start.asp
だけで、他では確認していません。

[ ]
RE:05548 カーソル位置の取得についてNo.05549
三丁目の秀さん さん 07/05/06 12:34
 
お世話になりますこんにちはh-tom さん、アルビレオさん。
三丁目の秀さんです。

>フォーマットが、
> "関数名" 半角スペース "関数の説明"
>なら、同じ内容を2つコピーし、
>・関数名側は、最初のスペースより後ろ
>・関数の説明側は、最初のスペースよりも前
>を、置換で一括削除すればいいのでは?

下記のように書き直しましたが正規表現で置換する分若干早くなった気はしますが、
項目数×2回のループを行うので
当然の事ながら、速度が前回の2倍までとは行きませんがかなり掛かります。

>それと、内容にもよるけど、htmlのソース側を直接処理した方がいい場合もある。
確かにそう思います。

>やってみました。
>インラインフレームになっているのでソースの取得は難しいですが、がんばって
>左サイドバーのHTMLソースを取得すれば

(-”-;)うーんなかなか出来ないな、左サイドバーのHTMLソースって右クリックで
対象をファイルに保存で出来るのだろうか?
私は出来ません・・・


/********************************************************************

        MSDN整形マクロ      DEBUG Ver 0.1
        2007/05/05          三丁目の秀さん

********************************************************************/

#HWND = hidemaruhandle(0);   //現在のウィンドウのウィンドウハンドルを取得

newfile;       // 新規ウィンドウ1を開く
#HWND_NEW = hidemaruhandle(0);  // ウィンドウハンドルを取得

newfile;       // 新規ウィンドウ2を開く
#HWND_NEW_2 = hidemaruhandle(0); // ウィンドウハンドルを取得

setactivehidemaru #HWND;   // コピー元ウィンドウに移動

call COPY;
setactivehidemaru #HWND_NEW;  // コピー先1ウィンドウに移動
call PASTE;
setactivehidemaru #HWND_NEW_2;  // コピー先2ウィンドウに移動
call PASTE;

setactivehidemaru #HWND_NEW;  // コピー先1ウィンドウに移動
$$target = "(^* )(.*)";
$$object = "\\1";
call Replace $$target, $$object;

setactivehidemaru #HWND_NEW_2;  // コピー先2ウィンドウに移動
$$target = "(^* )(.*)";
$$object = "\\2";
call Replace $$target, $$object;

endmacro;
// コピー
COPY:
 setactivehidemaru #HWND;  // コピー元ウィンドウに移動
 selectall;
 copy;
return;

// ペースト
PASTE:
 paste;
return;

// 置換
Replace:
##max = linecount2;
##i = 0;
while( ##i < ##max ){
    golinetop;
    replaceallfast $$1, $$2, regular;
    movetolineno 0, lineno + 1;
    ##i = ##i + 1;
}
return;

[ ]
RE:05548 カーソル位置の取得についてNo.05550
白雲斎 さん 07/05/06 13:48
 
白雲斎です。

HTMLソースからのマクロ例:

// HTMLソースはコンテンツ(右側)
// タグ内部、<TD>要素が改行していないことを前提
disabledraw;
replaceallfast "^[\t ]*\n", "", regular;
while(1)
{
    replaceallfast "</td>[\t ]*\n[\t ]*<td", "</td><td",
        regular, nocasesense;
    if( result < 1 ) break;
}
// 念のため
replaceallfast "<tr[^>]*>|</tr>", "\n", regular, nocasesense;
enabledraw;
#html = hidemaruhandle(0);
localgrep "<td[^>]*> *<a href=\"[^/]+?\\.asp\"> *\\w+ *</a>",
    regular, nocasesense;
if( result < 1 ) quit;
closehidemaruforced #html;
disabledraw;
replaceallfast "^[^:]+: +", "", regular;
replaceallfast "</td><td[^>]*>", "\x0c", regular, nocasesense;
replaceallfast "</?[^>]+>", "", regular;
replaceallfast "^[\t ]+|[\t ]+$", "", regular;
selectall;
copy;
escape;
replaceallfast "\x0c.+", "", regular;
enabledraw;
newfile;
disabledraw;
paste;
replaceallfast "^.+?\x0c", "", regular;
enabledraw;
endmacro;

[ ]
RE:05550 カーソル位置の取得についてNo.05551
白雲斎 さん 07/05/06 13:55
 
白雲斎です。

訂正します。
処理変更後の不要な物を削除し忘れました。

// HTMLソースはコンテンツ(右側)
// タグ内部、<TD>要素が改行していないことを前提
disabledraw;
replaceallfast "^[\t ]*\n", "", regular;
replaceallfast "</td>[\t ]*\n[\t ]*<td", "</td><td",
    regular, nocasesense;
// 念のため
replaceallfast "<tr[^>]*>|</tr>", "\n", regular, nocasesense;
enabledraw;
#html = hidemaruhandle(0);
localgrep "<td[^>]*> *<a href=\"[^/]+?\\.asp\"> *\\w+ *</a>",
    regular, nocasesense;
if( result < 1 ) quit;
closehidemaruforced #html;
disabledraw;
replaceallfast "^[^:]+: +", "", regular;
replaceallfast "</td><td[^>]*>", "\x0c", regular, nocasesense;
replaceallfast "</?[^>]+>", "", regular;
replaceallfast "^[\t ]+|[\t ]+$", "", regular;
selectall;
copy;
escape;
replaceallfast "\x0c.+", "", regular;
enabledraw;
newfile;
disabledraw;
paste;
replaceallfast "^.+?\x0c", "", regular;
enabledraw;
endmacro;

[ ]
RE:05549 カーソル位置の取得についてNo.05552
h-tom さん 07/05/06 13:56
 

h-tom です。

>下記のように書き直しましたが正規表現で置換する分若干早くなった気はしますが、
>項目数×2回のループを行うので
>当然の事ながら、速度が前回の2倍までとは行きませんがかなり掛かります。
なんか、意図が伝わっていないですね。

1行づつ処理するから時間がかかるので、置換でまとめてやればいいって事。
そうすれば、置換処理は各一回で済む。

replaceallfast(高速全置換)を各行分やる必要はない。

[ ]
RE:05552 カーソル位置の取得についてNo.05553
三丁目の秀さん さん 07/05/07 21:26
 
>>白雲斎さん、h-tomさんどうもお世話になります。三丁目の秀さんです。
HTMLを整形した方がミスが少なくなりますが、MSDNを幾つかのパターンに正規化しな
いと駄目ですね。
>>replaceallfast(高速全置換)を各行分やる必要はない。
そういう事だったんですね、無知でした。
どうもみなさんありがとうございました。

[ ]