アウトライン解析の枠についてNo.09060
ohtorii さん 19/08/26 19:32
 
お疲れさまです。

秀丸マクロから「アウトライン解析の枠」の以下情報を取得したいです。

 ・見出し
 ・行番号

見出しは「7171 ツリー表示:ツリーそのものをコピー」をsendmessageすることで取
得できますが、
行番号を取得できず困っております。

見出しと行番号を以下擬似コードのように取得できると個人的にはうれしいです。

#num=sendmessage(outlinehandle,0x111/*WM_COMMAND*/,アウトライン解析の枠に表
示されている個数,0);
#i=0;
while(#i<#num){
 $heading=sendmessage(outlinehandle,0x111,アウトライン解析の枠の見出し取得,
#i);
 #lineno=sendmessage(outlinehandle,0x111,アウトライン解析の枠の行番号取得, #i);

 #num=#num+1;
}


私の勝手な想像ですが、
アウトライン解析の枠で行番号が非表示状態でも、見出しをクリックすると対応する
行へジャンプできます。

なので、秀丸エディタが内部で持っている行番号をマクロから取得できるように繋げ
ればよいので、
大きな作業量には発展しないと想像しています。


ご検討いただければ幸いです、
よろしくお願いいたしますm(__)m

[ ]
RE:09060 アウトライン解析の枠についてNo.09061
秀丸担当 さん 19/08/27 11:04
 

アウトライン解析の枠で行番号を得る方法としては、現状では、nextoutlineitemで
カーソル移動しつつ取得することになると思います。
例えば以下のようにします。

disabledraw;
#xOrg=x;
#yOrg=y;
setclipboard "";
gofiletop;
while(1){
  #x=x;
  #y=y;
  nextoutlineitem;
  if(#x==x&&#y==y){
    break;
  }
  addclipboard str(lineno) + " : " + gettext2(0,lineno,linelen2,lineno)+"\n";
  title str(lineno);
}
moveto #xOrg,#yOrg;
newfile;
paste;

今気づいたのですが、nextoutlineitemでresultが常に0なので、成否をresultで取得
できたほうがよさそうです。これは修正したいと思います。

sendmessageで得るとしたら、WM_COMMAND(=0x0111)は適切ではないので、マクロヘル
プの「目次− DLL側から秀丸エディタの関数呼び出し−情報取得のメッセージ」にあ
るような、ユーザーメッセージのほうが適切かもしれません。
しかし文字列の取得は、DLLであればできますが、マクロのsendmessage関数からはで
きないです。

見出しの文字列も取得するとしたら、それ専用のマクロの関数の追加が必要だと思い
ます。
それか、メッセージで済ますとしたら、クリップボードを使ってしまってよければ、
見出しだけクリップボードにコピーするようなメッセージも考えられると思います。
ということでやるとしたら少々追加が必要なことになるのですが、最初の例のような
マクロだと現状でもできますが、どうでしょうか。

[ ]
RE:09061 アウトライン解析の枠についてNo.09062
ohtorii さん 19/08/27 19:44
 
お疲れさまです。

教えていただいたマクロで何とかなりそうです。
ありがとうございます\(^O^)/


ただ、やりたいこと(行番号を取得)に対して実現する方法(今回のマクロ)が複雑
なので、
将来的には関数か文になると素直で良いと思いました。

*擬似コード
#count=heading_count;//アウトラインの項目数
#i=0;
while(#<#count){
 $text=heading_text(#i);//アウトラインの見出し
 #lineno=heading_lineno(#i);//見出しの行番号
 
 #i=#i+1;
}


以下、別件になります。
今思ったのですが、クリップボードはpush/popできたほうが良いかもしれません。
(Windopws的に難しいかも知れませんが…)

*擬似コード
//クリップボードを待避する
push_clipboard;

クリップボードを汚す処理。

//クリップボードを元に戻す。
pop_clipboard;


よろしくお願いいたします。

[ ]
RE:09062 アウトライン解析の枠についてNo.09063
秀丸担当 さん 19/08/28 10:56
 

アウトライン解析の枠の情報取得は、そういうネタということにしておこうと思いま
す。

クリップボードの退避は、テキストだけで使用するメモリがどれだけとか、限定的な
条件であればできなくもないと思いますが、完全に保証するというのは難しいかもし
れません。

クリップボード履歴を有効にしている場合、以下のようにする方法も考えられます。

disablehistory 0x0040; //クリップボード履歴を一時的に無効

(今回のサンプルマクロ)

getcliphist 0; //最新のクリップボード履歴の内容に戻す

[ ]