教えて下さい。No.00817
だいちゃん さん 99/11/05 14:50
 
はじめまして、だいちゃんと申します。秀丸のマクロについて
わからないことがあるので教えて下さい。

質問を端的に申しますと、「秀丸を立ち上げてから終了するまで
の間、マクロで作業をするために固定的に使用できるメモリ領域
は存在するか、もしくは確保できるか」です。1回1回のマクロ
の起動で変数や配列を確保することはもちろん可能なのですが、
私の乏しい知識ではマクロを立ち上げるごとに新たに変数や配列
の領域を設定し直すしかできません。できればマクロが何回起動
しようと現在の状態が持続して適当に内容を変更できるメモリ領
域が欲しいのです。

質問が抽象的なのでもう少し具体的に説明します。実はマクロで
以下のような単語補間を実現したいのです。まず秀丸を起動する、
あるいは、マクロを最初に起動すると、辞書ファイルから辞書内
容自体を読み込みます。そして単語補間の際には、先頭の一文字
を入力した後に、特定のキー(たとえば CTRL-P とします)に割
り当てた補間のためのマクロを起動すると、辞書をサーチして単
語を補完します。この際に辞書には複数の補間候補があるとしま
す。そして CTRL-P を押すつど2番目、3番目の候補が出るよう
にします。さらに、ここが重要なのですが、『学習機能を持たせ
て最近補間された単語の方が優先的に出てくるようにし、しかも
秀丸を終了した後には辞書ファイルにその優先順序で単語が並ん
でいるようにしたい』のです。
 この最後の学習機能を実現するために、今のところ私は1回の
補間ごとに、つまり CTRL-P を押すごとに、レジストリあるいは
ファイルに毎回辞書を書き出して内容を更新しております。これ
ではハードディスクがカリカリ言ってどうにも気になって仕方が
ないのです。できれば秀丸を起動したら、ある領域に辞書ファイ
ルを読み込み、最後の秀丸を終了するときにだけ最新の学習状態
を辞書ファイルに書き出す、という形にしたいのですが...

質問が長くなって申し訳ありません。もし明快なお答がありまし
たらぜひ教えていただきたいと思います。よろしくお願いいたし
ます。

[ ]
RE:00817 教えて下さい。No.00819
ENCODINGSHIFTJIS さん 99/11/05 15:58
 

>質問を端的に申しますと、「秀丸を立ち上げてから終了するまで
>の間、マクロで作業をするために固定的に使用できるメモリ領域
>は存在するか、もしくは確保できるか」です。

機能の大部分は秀丸には関係が無いかもしれません。
かな漢字変換ソフトのメーカーでは[済み]の事でしょうから。
(変換ソフトのメーカーがフットワーク軽くてユーザーカスタマイズ
できる設定ができるといいのですが)

それはともかく、変数機構はシンプルですから裏技は無いと思います。
(DB再接続、永続変数、execmacroの引数、マクロ間の変数渡し..X)

辞書がテキスト形式ならば辞書を秀丸で開いておき、編集画面で検索
辞書更新してゆく手があります。ただ辞書保存が手操作になり
保証されません。(on終了)手続きなどは設定できないので
操作ミスで保存せず閉じてしまう恐れはある。
setwindowpos cxworkarea-222,0,222,22;// 辞書画面はこんなのがよい
 ステルスやdisabledraw;は効かない画面移動するとdrawになるため
 画面のチラツキを少なくするのに画面をもっと寄せられるが
 そこまでしても。

本格的な辞書(DB的に使う物)を求めるなら、DDEサーバー
の作者にも相談したほうがよいでしょう。

<end/>

[ ]
RE:00817 教えて下さい。No.00820
番頭++ さん 99/11/05 16:43
 
秀まるおさんのホームページに、「マクロ衆」があります。
その中に、KZ_FillStr1.mac があります。

$word_list = hidemarudir + "\\KZ_Words1.txt";

$word_list = hidemarudir + "\\KZ_Words2.txt";
に変えて、

$str_find2 = "\\<" + $str_find1 + "[^\\t-\\-;-\\?\\[\\]\\^`{-゚\x81\x40-K]+";

$str_find2 = "^" + $str_find1 + ".+$";
に変えて、

========================================================================
KZ_Words2.txt - 1999/11/03

秀丸
秀丸エ
秀丸エディタ

[End_of_Data]

このファイルは「秀丸エディタ」のディレクトリに置いて下さい。

./end
========================================================================

の行を対象とした入力ホカンもどきになります。

KZ_Words2.txt のオープンを毎回せずに、すでに開いているときには、
それを使用するように変更して下さい。
今は、KZ_Words2.txt を閉じていますが、
入力したデータをファイルの先頭に移動して、<== ファイルの先頭から検索。
クローズせずに、showwindow 2; でアイコン化にします。

この処理は、個人によって好みがあり過ぎるので、気分で処理を変えています。


[ ]
RE:00819 教えて下さい。 spNo.00822
ENCODINGSHIFTJIS さん 99/11/08 14:24
 

Excelなどのアプリに付属している入力補完をイメージするなら、
秀丸にもあるべき機能かもしれない。でもどんな設計にするかは?

項目という区切りがない、語、過去、似た部分...定義はさまざま。
マクロには B*-tree,Hash は縁がないし、見える辞書画面開きっぱなし
がイヤなら(get/write)ini(str/num) くらいしか使えるのが無いです。

こうゆう実は内部で細かく複雑なデータ構造を操作したいときは、
マクロで直接扱うのでなく外部の物で処理して結果だけ受け取る
ような形のほうがいいと思う。コンテナクラスを提供するような
サーバーとか。マクロはプログラム言語だからあらゆる変数の
使い方ができると思ったら大間違い。エディターという環境内部
での動作のみ許可されている。
使える物
        マクロ変数(ポインタは無いので内部機構を指していじる
                    裏技は使えない)
        編集画面(最強の操作体系を持つ、カーソルを意識する文字列操作、
                  マクロの基本は1画面内で済ませられたら最高。
                  複数画面同時使用の事はあまり考えていない。画面往復
                  画面のチラツキに注意(デスクトップに開いている画面に
         のみ切り替えできる,アイコン/ステルスはだめ)
                  部分範囲処理の扱いは人それぞれ)
        クリップボード(外部プログラムと交信できる)
        ini/reg ファイル(連想辞書&永続)
       
        DDE サーバー(GUI作成が主なものらしい,ActiveXクライアント
                      ができればIEで帳票入力してクリップボード
                      で受けられるのに )

(秀丸のマクロは構文はC風ですが文字列型があり、
ポインタ型(頭がツーンとする)が無い、ですから気分はPascal。
シンプルなバランスがマクロのとっつきやすさに貢献している。
機能の拡張でバランスを壊してほしくない。)

 <end/>

[ ]
RE:00817 教えて下さい。DDEで外部と交信No.00918
ENCODINGSHIFTJIS さん 99/12/16 16:22
 
>質問を端的に申しますと、「秀丸を立ち上げてから終了するまで
>の間、マクロで作業をするために固定的に使用できるメモリ領域
>は存在するか、もしくは確保できるか」です。

>あるいは、マクロを最初に起動すると、辞書ファイルから辞書内
>容自体を読み込みます。そして単語補間の際には、先頭の一文字
>を入力した後に、特定のキー(たとえば CTRL-P とします)に割
>り当てた補間のためのマクロを起動すると、辞書をサーチして単

様々なアプローチ:Win にはアプリケーション間で交信する仕組みがある。
Clipboard(手動操作用)、DDE,OLE,Winsock 。秀丸ではDDEが使える。

// Msaccess のDDE呼び出し
// ddeaccess.mac
//
// マクロ名が自動的にddeexecute で使えるしDoCmd()を発行できる
//  ddeexecute "[コマンド文字列]" ;
// 起動や交信のやり方が複数あってどれが現在の版に最適なのかは
// 分らなかった。DDEの欠点は新作ソフトでDDEを持つのは無い事だ。
// COM をマイクロソフトはプッシュしているから。
//
// レコード追加などは以下を参考に
// http://support.microsoft.com/kb/articles/Q89/5/86.ASP
//
// 一般的調査 Win95 Access97(8.05) でテストした

ddeinitiate "Msaccess","System";
if(!result){run "C:\\Program Files\\Microsoft Office\\Office\\"+
"MSACCESS.EXE";                         // それぞれ調整
ddeinitiate "Msaccess","System";
if(!result)endmacro }
call P "1",dderequest("Topics");// mdb を開いている状況で変わる
ddeterminate
//
ddeinitiate "Msaccess","ShellSystem";
if(!result){menu "ShellSystem";endmacro}
call P "2",dderequest("SysItems");
ddeterminate
//
ddeinitiate "Msaccess","System";
if(!result){menu "System";endmacro}
call P "3",dderequest("SysItems");
call P "4",dderequest("Formats");
call P "5",dderequest("Status");
ddeterminate
//
// SQL LIKE演算子のパーターンマッチングで辞書引きの例
//  Accessをあらかじめ開いておけばDDE交信は早い。
//
//データベース名=DDEdict.MDB
//テーブル名=HOKANdictionary
//主キー=ShortName
//HOKANdictionary.txt  
//ID,ShorName,LongName
//1,"ふかきょん","深田恭子"
//2,"太シス","太陽とシスコムーン"
//3,"モー娘。","モーニング娘。"
//4,"のりか","藤原紀香"
//5,"ヒロスエ","広末涼子"
//6,"じゅうく","19"
//
// .MDB を開いた状態で実行すること
//
ddeinitiate "Msaccess","DDEdict";
call P "table-",dderequest("TableList");
call P "Query-",dderequest("QueryList");
call P "Form-",dderequest("FormList");
call P "Report-",dderequest("ReportList");
call P "Macro-",dderequest("MacroList");// 名前を確認できる
call P "Module-",dderequest("ModuleList");
ddeterminate
//  ddeinitiate は頭のexecuteも含められるらしい。便利!
$inSTR="モ";// 検索元
ddeinitiate "Msaccess",
"DDEdict;SQL SELECT * FROM HOKANdictionary WHERE ShortName LIKE "+
"'"+$inSTR+"*';" ;
$HIT=dderequest("FirstRow");
call P "検索結果−",$HIT;
ddeterminate
//
endmacro
// 末尾書出し
P: gofileend insert $$1;insert $$2;insertreturn return;
//

1SystemC:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\WZLIB80.MDEC:\MY DOCUMENTS\D
DEDICT.MDB
2StatusFormatsSysItemsTopics
3StatusFormatsSysItemsTopics
4TextCSVXLTable
5Ready
table-HOKANdictionary
Query-
Form-
Report-
Macro-
Module-
検索結果−3モー娘。モーニング娘。

でした。

[ ]
RE:00918 教えて下さい。DDEで外部と交信No.00919
ENCODINGSHIFTJIS さん 99/12/16 16:25
 
// http://support.microsoft.com/kb/articles/Q113/3/00.ASP
も参考に。

[ ]
RE:00822 教えて下さい。 sp sampleNo.00921
ENCODINGSHIFTJIS さん 99/12/17 16:25
 
内部起動マクロへのパラメータ渡し。

早そうなのは Clipboard 経由
Clipboard履歴の汚れが気になる人は、あらかじめEnvの履歴数を
ゼロにしてenvchanged、それからマクロ本体実行して。全マクロ
終了時にClipboardを空にして履歴数を戻してから復帰する。
(今のところ)

// 引数セット
setclipboard "[xMacroPara]";
addclipboard "\n#Xsize=0990";
addclipboard "\n$Ystr=asdfasdf";
addclipboard "\n";
//execmacro "xMacro.mac";
// GetOpts 的処理
 beginclipboardread;
 $P=getclipboard;$P=leftstr($P,strlen($P)-1);// chop \x0A
if("[xMacroPara]"!=$P){menu "? xMacroPara ID";endmacro}
 $P=getclipboard;$P=leftstr($P,strlen($P)-1);// chop \x0A
 if(leftstr($P,strlen("#Xsize="))!="#Xsize=")
   {menu "? xMacroPara "+$P;endmacro}
#Xsize=val(rightstr($P,strlen($P)-strlen("#Xsize=")));
 $P=getclipboard;$P=leftstr($P,strlen($P)-1);// chop \x0A
 if(leftstr($P,strlen("$Ystr="))!="$Ystr=")
   {menu "? xMacroPara "+$P;endmacro}
$Ystr=rightstr($P,strlen($P)-strlen("$Ystr="));
// 〜〜〜
setclipboard "[xMacroReturn]";// 返り値をセット
addclipboard "\n$retVal=lkjhlkjh";
addclipboard "\n";
endmacro// 戻る
// 呼び出し側で返り値を回収,普通は編集画面を加工してそのまま返る

データ形式はもっと単純でもかまわないと思う。汎用libじゃないのだから。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−

グローバル変数を使うのも処理によっては必要になる。
グローバル変数は .ini 用の文、関数が使える。

作業用に複数画面を使うときのテクニックとしては
使用するウィンドウハンドルをあらかじめ変数に準備しておく方がよい。
2画面では nexthidemaru prevhidemaru の切り替えを頭でできるが
3画面以上で不規則な画面切り替えが起きるときは対応できない。
例:
// 内部起動マクロにウィンドウハンドルを引数で渡す
// 数値変数は一度文字列にして渡し受け取り側で数値に戻す。
// 数値配列なども考えるとかったるい処理だ。
//
#hwndKidou=hidemaruhandle(0);// 現在画面
openfile "jisho.dic";       // 排他制御と関連
#hwndDic=hidemaruhandle(0);// 辞書画面
openfile "";// 排他に関係しない複数開ける
#hwndWork=hidemaruhandle(0);// 作業画面

setclipboard str(#hwndKidou)+
         ","+str(#hwndDic)+
         ","+str(#hwndDic);
//execmacro "Hokan.mac" // −−−−−−−−−−
beginclipboardread
 $P=getclipboard;                #P=strstr($P,",");
#hwndKidou=val(leftstr($P,#P));
 $P=rightstr($P,strlen($P)-#P-1);#P=strstr($P,",");
#hwndDic=val(leftstr($P,#P));
 $P=rightstr($P,strlen($P)-#P-1);#P=strstr($P,",");
#hwndWork=val(leftstr($P,#P));
//
setactivehidemaru #hwndKidou;// 画面切り替えジャンプ
closehidemaruforced #hwndWork;// 作業画面消去
endmacro// 呼び出し側に戻る。
// 〜〜〜










[ ]
RE:00919 教えて下さい。 ソケット通信でNo.00976
ENCODINGSHIFTJIS さん 00/02/01 17:17
 
localhost 内で通信もナンだと思うけど、しょうがない。

// AppRun.mac
//初期化に時間のかかる、あるいは継続記憶させておくアプリを
//実行待ちさせておき、秀丸から呼び出す、試みです。

//      大きなマクロを持っている人の避難所になるか ?
//      この例(無操作)で、1秒以下の応答だった。
//      現代的なプログラム言語(スクリプト、コンパイルどちらでも)
//      ならいずれでも、仕組みは流用できる。

// △Windows のソケット通信を使いアプリ実行・完了同期をおこなう。
// 秀丸から実行同期のプログラム起動
//   実行同期のプログラムから実行待ちしているプログラムに通信
//     1回転分の処理を実行、その後再び実行待ちに入る。

//  処理データのやり取りは Clipboard 経由。

//ActiveX,DDE などの直接同期できる仕組みが使えないとき用。
// 秀丸と外部でいい通信手段がほしいものだ。
// DDE はOffice2000でも使えるけれど。
// VAB マクロみたいに文や関数の文字列を1つずつ投げつける
// タイプでもよいが。
//そのほかに同期の仕組みは?
//
//WSH2.0 の AppActivateメソッド、SendKeysメソッド で呼び出しは
//  ダメだった、Ruby側でSendKeysの受けができないようだ。
//自分で画面を開くタイプのプログラムでないとダメということ。
//  Winフレームは MS-DOSプロンプト+Ruby が出している為か?

//
if(!selecting)endmacro
copy// 処理データを Clipboard に送る。
     // .INI のwrite get をしても即時に作られない。
runsync2 "d:\\Ruby\\rbcw142\\Ruby.exe AppRun_cl.rb";// 実行同期プロ
     // 待機解除// 完了待ち
paste              // Clipboard から処理結果取り出し。

endmacro
// -----------------------------

▲ここからは Ruby スクリプト
# AppRun_cl.rb  -------------------------------
#実行同期用クライアント

require 'socket'

  sc= TCPsocket.open('localhost',4446)
p sc.gets# 実行完了待ち
  sc.close

# 秀丸にエラー通知は、何かのファイルを生成する?。
#

# AppRun_sv.rb ------------------------------
# 実行待機サーバー
##起動は事前にしておく MS-DOSプロンプト> Ruby AppRun_sv.rb
#[ruby-list:19230] Re: Clipboard  を  Ruby  で使うには?
# ? hmem と pmem の値は同じ、違うのはデータの型だけ。
# はたして GlobalLock は win32 で必要なのか?moveableでないし

require 'socket'
require 'clipbrd'

#時間のかかる初期化や継続使用する変数の準備 <<<<<<

gs = TCPserver.open(4446)
  addr = gs.addr
print "server is on ";p addr

# for ^C trap を可能にする ピコピコ表示 STD I/O を操作する。
Thread.start do
  while TRUE
    print "|\b"; STDOUT.flush;    sleep 2
    print "-\b"; STDOUT.flush;    sleep 2
  end
end
#         ----

# server thread
while TRUE
  select( [gs]) # クライアントからの接続待ち
  newsc = gs.accept
  print(newsc.peeraddr.join(":"), " is accepted\n")
    sc = newsc
    str=Clipboard.GetText               # データ受け取り
        Clipboard.SetText('Ruby:= '+str) # 加工して返す。
    sc.write("\n")                        # 完了通知
    sc.close
end

サーバー実行メッセージの例
15:22 D:\Program Files\Hidemaru\MAC\ruby apprun_sv.r
server is on ["AF_INET", 4446, "0.0.0.0", "0.0.0.0"]
|F_INET:1068:localhost:127.0.0.1 is accepted
AF_INET:1069:localhost:127.0.0.1 is accepted
AF_INET:1070:localhost:127.0.0.1 is accepted
-

//

[ ]
RE:00976 教えて下さい。 最初の質問に近No.01019
ENCODINGSHIFTJIS さん 00/02/14 19:22
 
// hokan.mac
// テキスト補完 (対話モードの重要機能)

// 語の登録は書いてないが、形はこのようなもの。
// カーソル位置など細かな所はやっていない。
// 最初の質問に一番近い形だと思う。

// ----------------------------------------- 準備
$dicname="d:\\tmp\\hokan.dic";

#hwnd=hidemaruhandle(0);// 編集テキスト

   #z=findhidemaru($dicname);
if(#z== -1){// 補完辞書が開かれていなかった。
openfile $dicname;
// 安定したら非表示にする ? 辞書は閉じない
 }
#hwnddic=hidemaruhandle(#z);// 辞書テキスト
// -----------------------------------------
// 入力は?
left;selectword $w=gettext(seltopx,seltopy,selendx,selendy);
//
setactivehidemaru #hwnddic;// ソート済み辞書に切替え
gofiletop
searchdown "^"+$w,regular;
              if(!result){setactivehidemaru #hwnd; endmacro }
// 同一頭部の複数の単語をまとめる。
          #wc=0;// 語数
while(1){ #wc=#wc+1;selectword
     $ary[#wc-1]=gettext(seltopx,seltopy,selendx,selendy);
 searchdown "^"+$w,regular; if(!result)break // 次の語は?
 }
setactivehidemaru #hwnd;// 元の編集画面に
// メニュー選択
menuarray $ary,#wc; #result=result; if(0==#result)endmacro
// 置換
selectword insert $ary[#result-1];

endmacro;


// mi   na

---------   d:\tmp\hokan.dic ------------
// 第1行のおまじない
mandate
maps
markup
message
metadata
method
mimimal
min
mind
model
much
namespace
NCName
number


[ ]
RE:01019 教えて下さい。 ウィンドウ非表No.01020
ENCODINGSHIFTJIS さん 00/02/15 13:02
 
辞書画面の非表示に関連して。
//
#handle = hidemaruhandle(0);// 自画面
                       // WM_SYSCOMMAND SC_MINIMIZE
#result = sendmessage( #handle, 0x0112, 0xF020, 0 );// 最小化(N)
// タスクバーアイコンはSENDMESSAGE では消せない。/h 非表示は無理 ?
// 細かい事を言い出すとWin32 API 全部背負わないといけなくなる。
//    /h 非表示で迷子になった秀丸画面を回収するには ?
//     メニューコマンドの「次の秀丸」では非表示画面に
//      回らない、マクロの nexthidemaru を使う、「元のサイズ」
//       で表示される。


[ ]
RE:01019 強調&補完 の例 JAVANo.01149
ENCODINGSHIFTJIS さん 00/03/06 21:26
 
java.hilight を種に作ってみました、補完は手間がかかる。
inputchar の表示の粘りけがほしい。
conhilight.mac が補完を処理
addhilight.mac が語の登録をします。

java2.hilight ---- 強調と補完で共用する ---------------------------
035,_BindingIteratorImplBase
035,_BindingIteratorStub
035,_NamingContextImplBase
035,_NamingContextStub
099,abstract
035,AbstractAction
035,AbstractBorder
035,AbstractButton
// ,AbstractButtonA
035,AbstractButton.AccessibleAbstractButton
035,AbstractButton.ButtonChangeListener
035,AbstractCollection
035,AbstractColorChooserPanel
035,AbstractDocument
035,AbstractDocument.AbstarctElement
以下同様
--------------------------------
// conhilight.mac ///////////////////////////////////////
//選択された語範囲を強調定義ファイルにより補完します。
//手順
//・選択語をコピー
//・hilightファイル面に移行、同一頭部位置を検索
//・補完入力モードで語を選択
//・元の面に戻る、補完語を挿入
//
//強調定義ファイルの形
////        コメントは頭スペースを多めに
//// ,Words補完語 頭は // , 固定
//000,Words補完&強調語 強調IDは3桁固定 強調のみ、はない。
//      (Wordsはsortでソート済み).BAT>sort /+5 IN.file > OUT.file
//              もし秀丸文字列比較と順が異なったら手で移動する。
//
//java.hilight をボーと眺めていたら補完にも使えるのでは!
//  漢字を含む語はかな漢字ソフトに任せます、英数補完用です。
//  JAVA ソースの語を想定しているから汎用ではないです。
//各々、ソースの種類で調整が必要です。補完は難しい。
//      
if (1/2 == 0 && version < 302) {
message "田楽.DLLには秀丸の Ver.3.02 以降が必要です。";
endmacro;
}
goto main;
// -----------------
//田楽DLLのロード
dgload: // 秀丸面 毎に接続
loaddll(hidemarudir + "\\DengakuDLL.dll"); if (!result) {
message "田楽.DLL をロードできませんでした。";endmacro; }
return;
//
getdicword:// 語移動毎に取得
golinetop right 4; beginsel golineend  // 折り返し文字数より短いこと
$dicword= gettext(seltopx,seltopy,selendx,selendy);
return;
// 秀丸マクロの文字列比較は辞書順らしい
// 大小を意識する処理では文字コードを使う、"A"!="a" "a"<"B"
//
main:// =========================================
//
#hwnd=hidemaruhandle(0);
// ctrl+shift+← などキーで単語選択できるような状況を仮定している
if(!selecting){left; selectword }
$word= gettext(seltopx,seltopy,selendx,selendy);
if(0 <= strstr($word,"\n")){menu "改行不可";endmacro }
moveto seltopx,seltopy; // 書き戻し用カーソル位置
//
setactivehidemaru findhidemaru("java2.hilight");
if(!result){menu " .hilight ファイルを開いて下さい。";endmacro }
call dgload;
// 頭出し
//gofiletop // searchdown "^//<BODY>",regular;
// 秀丸search regularではcasesense になってしまう?
//  同一頭部を見つけて補完入力モードに入る
#wlen=strlen($word); // 書き戻すときの元の長さ
//menu $word;endmacro
atamadasi:
// 2分法 語数は少なすぎないこと eof前のコメントX
                  #step=linecount2/2; moveto 0,#step;// 中央開始位置
while(#step > 6){ #step=#step/2+1;
call getdicword;
  if($dicword >  $word)up #step; else down #step;
  if(eof==code)                         up #step;
 }
up #step;
//
while(eof!=code){ // 最終行にも改行を   // 大小比較
call getdicword;
//  menu $WORD+"/"+$DICWORD;
if($dicword >=  $word) break     // 補完モードへ
 down;                          // 次行へ
 } // while loop
//
// 補完モード
// ガイド表示は searchによる一時反転表示 / title どちらがよいか?
//                                         とても面倒 改良が必要
hmode:
#ll=strlen($word); #lr=strlen($dicword)-#ll;
#inkey=inputchar(leftstr($dicword,#ll)+">"+rightstr($dicword,#lr));
// 途中で画面を切り替えると inputchar の表示は消えるが
// input待ちのマクロ実行は続いている。チョット注意
if(0x1B==#inkey)goto modoru;   // [ESC] 補完とりやめ
if(0x0D==#inkey)goto uwagaki; // {ENTER] 確定
if(0x1E==#inkey)goto setu;   // [TAB or ->] 次の節目に
if(0x1C==#inkey)goto back1; // [<- ] 一文字前に戻る
if(0x1D==#inkey){up;   goto recon;}// [UP]   再構築
if(0x1F==#inkey){down; goto recon;}// [DOWN] 再構築
if(''==#inkey)goto setu;
if(('A'<=#inkey) & (#inkey<='Z'))goto next1;//1文字進む
if(('a'<=#inkey) & (#inkey<='z'))goto next1;//1文字進む
// 特殊記号 同一頭部の次の節目を探す
//menu "特殊";//endmacro ------------------------------
while(1){
                                     #lr=strlen($dicword)-#ll;
       #pos=strstr(rightstr($dicword,#lr),char(#inkey));
 if(0<=#pos)break
  down; call getdicword;      // 次行を当たってみる
//menu $dicword+" "+$word;
  if(leftstr($dicword,#ll)!=$word){up;call getdicword; // ハズレ
                                    beep goto hmode; }
 }
$word=leftstr($dicword,#ll+#pos+1);
//menu "特の節"+$word;//endmacro
goto hmode; // 特殊−−−−
// AbstractDocument.Content ========================
uwagaki: // menu "確定";//endmacro
setactivehidemaru #hwnd;//元の画面
beginsel right #wlen;insert $dicword;
endmacro
// ===================================
setu: // menu "次節";//endmacro// 英大小の切れ目の直前
while(1){                  // 文字コードにしないと大小はわからない
         #s=ascii(midstr($dicword,#ll,1));// 次の1文字
//menu "大小決定文字"+char(#s);//endmacro
 if('A'<=#s && #s<='Z'){#ra='a';#rz='z';}else{#ra='A';#rz='Z';}
       #x=#ll+1;
 while(#x<strlen($dicword)){
       #s=ascii(midstr($dicword,#x,1)); if(#ra<=#s && #s<=#rz)break
       #x=#x+1; }
    if(#x<strlen($dicword))break// 切れ目あり
  down; call getdicword;      // 次行を当たってみる
  if(leftstr($dicword,#ll)!=$word){up;call getdicword; //頭部不一致
                                    beep goto hmode; }
 }
$word=leftstr($dicword,#x);
//menu "次の節"+$word;//endmacro
goto hmode; // 特殊−−−−
// Ab
// AccessControlContext ========================
back1: // menu "1文字戻り";//endmacro;
$word=leftstr($word,#ll-1); goto atamadasi; // とりあえず動けばよい
// −−−−−−−−−−−−−−−−−−−−−−−−−−−
recon: // menu "再構築";//endmacro
call getdicword; $word=$dicword; goto hmode;
// −−−−−−−−−−−−−−−−−−−−−−−−−−
next1: // menu "1文字進む";//endmacro
while(1){ // "A"=="a" と見るには
//menu char(#inkey)+midstr($dicword,#ll,1);
    $inS =       dllfuncstr("TOUPPER",char(#inkey));
          $midS= dllfuncstr("TOUPPER",midstr($dicword,#ll,1));
 if($inS==$midS) break // この行でよし
  down; call getdicword;      // 次行を当たってみる
  if(leftstr($dicword,#ll)!=$word){up;call getdicword; // 頭部不一致
                                   beep goto hmode; }
 }

$word=leftstr($dicword,#ll+1);
//menu "進み1"+$word;//endmacro
goto hmode; // −−−−−−−−−−−−−−−−−−−−
//
modoru://
setactivehidemaru #hwnd;

endmacro
//menu "endmacro"; endmacro

// AbstractButton.AccessibleAbstractButzn
// AbstractDocument
// _NamingContextImplBase
---------------------------------------
// addhilight.mac  ////////////////////////////////////////
//選択された語範囲を強調定義ファイルに登録します。
//手順
//・選択語をコピー、補完のみ/強調IDを選択し
//・hilightファイル面に移行、挿入位置を検索、重複警告
//・語を追加
//・元の面に戻る
//
//強調定義ファイルの形
////        コメントは頭スペースを多めに
//// ,Words補完語 頭は // , 固定
//000,Words補完&強調語 強調IDは3桁固定 強調のみ、はない。
//      (Wordsはsortでソート済み).BAT>sort /+5 IN.file > OUT.file
//
//java.hilight をボーと眺めていたら補完にも使えるのでは!
//  漢字を含む語はかな漢字ソフトに任せます、英数補完用です。
//  JAVA ソースの語を想定しているから汎用ではないです。
//各々、ソースの種類で調整が必要です。補完は難しい。
//
goto main;
// -----------------
//Regexquote:// メタ文字をエスケープ
//$$wordrg=""; #c=strlen($$1);
//while(#c>0){ #c=#c-1;              $$m=midstr($$1,#c,1);
//   if(-1 == strstr("[]()^$.*+?|\\",$$m))
//      $$wordrg=     $$m+$$wordrg;
// else $$wordrg="\\"+$$m+$$wordrg;
// }               return $$wordrg;
// 結局不使用
//? $word に正規表現メタ文字が入っているなら?
//call Regexquote $word; $wordrg=$$return;
//                menu $wordrg;

getdicword:// 語移動毎に取得
golinetop right 4; beginsel golineend  // 折り返し文字数より短いこと
$dicword= gettext(seltopx,seltopy,selendx,selendy);
return;
// 秀丸の文字列大小比較は辞書順 ヘルプに一言ほしい。
//
main:// =========================================
//
#hwnd=hidemaruhandle(0);
// ctrl+shift+← などキーで単語選択できるような状況を仮定している
if(!selecting)selectword
$word= gettext(seltopx,seltopy,selendx,selendy);
if(0 <= strstr($word,"\n")){menu "改行不可";endmacro }
//
menu "補完のみ","特に &1","特に &2","強調 &4";
        if(!result)endmacro
     if( 1==result) $kflag="// ";
else if( 2==result) $kflag="035";
else if( 3==result) $kflag="099";
else if( 4==result) $kflag="225";
//             menu $kflag;
//
setactivehidemaru findhidemaru("java2.hilight");
if(!result){menu ".hilight ファイルを開いて下さい。";endmacro }

// 頭出し
//gofiletop // searchdown "^//<BODY>",regular;
// 秀丸search regularではcasesense になってしまう?
//  間を見つけて新規追加
// menu $word+$WORD;
// 2分法 語数は少なすぎないこと eof前のコメントX
                  #step=linecount2/2; moveto 0,#step;// 中央開始位置
while(#step > 6){ #step=#step/2+1;
call getdicword;
  if($dicword >  $word)up #step; else down #step;
  if(eof==code)                         up #step;
 }
up #step;
//
while(eof!=code){ // 最終行にも改行を   // 大小比較
call getdicword;
// menu $DICWORD;
if($dicword <  $word){ down; continue } // 次行へ
if($dicword == $word)     goto jyuuhuku;// 同一語
// 挿入位置発見
//  menu $WORD+"/"+$DICWORD;
break
 } // while loop
golinetop insertline insert $kflag+","+$word; // 新規追加
                                   goto modoru;
// ----------------------------
jyuuhuku: // 完全一致
menu "重復しています?";if(!result)goto modoru; // [ESC]元の面に戻る
golinetop beginsel right 3; insert $kflag;
                                   goto modoru; // 同じ語に再設定
// Float と float を登録したいときは手動で
// ----------------------------------------
modoru://
setactivehidemaru #hwnd;

endmacro
//menu "endmacro"; endmacro

// @@
// AbstractButton.AccessibleAbstractButzn
// Float
// SYYYY
// zz

http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/
サポート会議室の グローバル変数の議論も見てください。

__END__

[ ]
RE:01149 tags補完No.01332
ENCODINGSHIFTJIS さん 00/04/17 11:17
 

// directHOKAN.mac
//
// 短い入力補完。辞書名&ファイル位置固定なので本格的には
// 使えないが。

// 日本語
//left; directtagjump searchdown ":"; right 2; selectword copy
//        backtagjump selectword paste
//endmacro

// 英単語
//left; directtagjump searchdown "="; right; selectword copy
//        backtagjump selectword paste
//endmacro


// btj --> backtagjump
// 選択 --> 単語選択

------------- tags --------------
tags(1): 選択
tags(2): 単語選択
tags(3): dtj=directtagjump
tags(4): btj=backtagjump
tags(5): tj=tagjump

__END__

[ ]