マクロのコンパイラーは無いですか。No.00666
YK さん 99/07/23 23:27
 
みなさん今日は。YKと申します。
マクロのコンパイラー(みたいな機能)は有りませんか。

秀丸はマクロが実行される度に、そのマクロをコンパイルしてしますよ
ね。そして、そのコンパイル時間は、そんなに短くないような気がして
います。

せっかくコンパイルしたその結果を捨てないで、次からそれを使って少
しでも速くマクロが立ち上がってくれないかなと考えています。そのよ
うな機能は、有りませんか?

(マクロを作るときは毎回コンパイルは都合が良いのですが、一度マクロ
が完成してしまうと、マクロを使うたびにコンパイルするのはもったい
ない。と思うのは私だけですか)

[ ]
RE:00666 マクロのコンパイラーは無いですNo.00667
杉浦 まさき さん 99/07/24 01:01
 
YK さん、はじめまして。
杉浦 まさき と申します。

>マクロのコンパイラー(みたいな機能)は有りませんか。

ありません。

>(マクロを作るときは毎回コンパイルは都合が良いのですが、一度マクロ
>が完成してしまうと、マクロを使うたびにコンパイルするのはもったい
>ない。と思うのは私だけですか)

ご安心下さい(^^;。もう一人ここにいますσ(^^)。


[ ]
RE:00666 マクロのコンパイラーは無いですNo.00668
きいろいまふらあ さん 99/07/24 01:10
 
まふです。

YK wrote on Fri, 23 Jul 1999 23:27:35 +0900
> せっかくコンパイルしたその結果を捨てないで、次からそれを使って少
> しでも速くマクロが立ち上がってくれないかなと考えています。そのよ
> うな機能は、有りませんか?

いまのとこ、ないですね。
大昔、どこか(ニフティあたり)で、同じ話をしてたのは私だったか。(^^;

> (マクロを作るときは毎回コンパイルは都合が良いのですが、一度マクロ
> が完成してしまうと、マクロを使うたびにコンパイルするのはもったい
> ない。と思うのは私だけですか)

うんうん、もったいないですよね。
確か当時の秀丸担当さん(だったか?)のコメントによれば、
秀丸マクロはインタプリタ型(解釈しながら実行)ではなく、
最初に一旦すべて中間コードにコンパイルしてから実行している、
だったかな?

この中間コードの状態でファイルに保存する機能と、
そのファイルを読み込んで、マクロとして実行する機能があればよいですね。

ま、当時に比べると(まふの手元の)ハードがずいぶん進化して、
そーいう機能が欲しいという気持ちもちょっと萎えてます。(^^;

ところで、私はここの会議室、メールで読み書きしてるんですが、
私がポストした発言のメールのFrom:ヘッダを見ると、
「From: "きいろいまふらあ" <xxxxxxxxxxx@maruo.co.jp>」
って「hidesoft」の途中に変なピリオドが入ってしまうです。なんで?(^^;

まふ

[ ]
RE:00666 コメントNo.00669
YK さん 99/07/24 11:12
 
杉浦 まさき様、きいろいまふらあ様

コメントありがとうございます。YKです。
そうですか、無いんですか。
残念です。マクロの機能を上げると、確実にコンパイル時間が増えてい
くのに、一方、実行速度の改善は大変ですよね。
新しいマシンがゴミの日に落ちていれば、話は簡単ですが。

そもそも、マクロあっての秀丸ですよね(言い過ぎか)。そのマクロにコ
ンパイラーがないなんて... 惜しすぎる。

まふ様>大昔、どこか(ニフティあたり)で、同じ話をしてたのは私だったか。(^^;

このときに出来ていればよかったのに...

まふ様>ま、当時に比べると(まふの手元の)ハードがずいぶん進化して、

うらやましい。

>(マクロを作るときは毎回コンパイルは都合が良いのですが、一度マクロ
>が完成してしまうと、マクロを使うたびにコンパイルするのはもったい
>ない。と思うのは私だけですか)

杉浦様>ご安心下さい(^^;。もう一人ここにいますσ(^^)。

必要ですよねえ。

[ ]
RE:00669 コメントNo.00670
える さん 99/07/24 12:39
 
>そもそも、マクロあっての秀丸ですよね(言い過ぎか)。そのマクロにコ
>ンパイラーがないなんて... 惜しすぎる。

想像の範疇でしかないのですが、このような場合のマクロの中間コードというのは、
実メモリのポインタが含まれていたり、各種ソースコード時にあった範囲や機能のチ
ェックがないと思います。
そして、中間コードのファイルが生成できるようになれば、コーディングでお金を取
って生活をしているような人の中にはマクロそのものを中間コードの形式で配布しよ
うと考える人もでると思います。
# 中間コードのソースコードとの可逆性によりますが

そうなると、さまざまな問題や危険性が出てきます。
ポインタのような値が書き込まれていれば、それが秀丸上の相対的なものであったと
しても、ちょっと書きかえるだけでさまざまな情報を読み書きできます。
可逆性が悪い状態であれば悪意のあるコードを簡単に埋め込み実行させることも可能
になってきます。

Java のクラスファイルや、VB の P-CODE ファイルでもそうですが、それらではそう
いった行為に対する対策が練られて実装されています。
秀丸エディタも、そういう機能を持たないと危険な状況になるでしょう。

そうなると開発コストはとても大きなものになってしまい、辛くなるのではないでし
ょうか。

たとえば、

現在は「マクロフォルダ」が1つ指定できるだけですが、これに加えて「プリコンパ
イルマクロフォルダ」の指定機能を追加する。
そして、秀丸(や常駐秀丸)が最初に起動したときに、そこのフォルダの内容は中間
コードになってメモリ上に保持される。
マクロ実行時には、マクロフォルダとプリコンパイルマクロフォルダからマクロが検
索され、プリコンパイルフォルダでは、中間コードの生成時間に対してマクロファイ
ルが新しい時のみコンパイルが走る。

というような実装も考えられないことはないと思います。
常駐秀丸を StartUp に置いて利用しているような方であれば十分な実装ではないで
しょうか。

こういうのを「遅い初期化」「早い初期化」などと呼ばれることがありますが、たと
えば、Navigator の JVM はアプレットを発見すると JVM の起動をはじめる遅い初期
化です。
現状の秀丸のマクロも同様だと思います。
Navigator では -start_java というオプションで早い初期化が行え、アプレットを
発見する前から JVM を起こした状態にできます。
秀丸でも、前述のような早い初期化のオプションがあれば十分ではないかと考えまし
た。

[ ]
RE:00668 マクロのコンパイラーは無いでNo.00671
ひろ さん 99/07/24 14:56
 
 きいろいまふらあさん今日は、ひろです。
> > (マクロを作るときは毎回コンパイルは都合が良いのですが、一度マクロ
> > が完成してしまうと、マクロを使うたびにコンパイルするのはもったい
> > ない。と思うのは私だけですか)
>
> うんうん、もったいないですよね。
 確かにもったいないとは思いますが、それほど macro の compile に時間
がかかっているのでしょうか? 最近の hard は処理速度が速くなったので、
compile にかかる時間は無視できる程度のような気がします。
 また今更 compile した物を使用するようになると、混乱を招くような気
が....。<-これが一番多き(^^;。

[ ]
RE:00671 マクロのコンパイラーは無いでNo.00672
きいろいまふらあ さん 99/07/24 17:35
 
まふです。

> 確かにもったいないとは思いますが、それほど macro の compile に時間
>がかかっているのでしょうか? 最近の hard は処理速度が速くなったので、

というニュアンスのことも#00668には書いたつもりだったのですが。(^^;

もっとも、マクロの性格にもよるかもしれません。
(某整形マクロみたいに(^^;)「よし、使うぞ」と気合い入れて使うものは、
あまり気にならないかもしれません。
直前(および直後)の改行のみの行にジャンプするマクロを作って、
ctrl+↑、↓に割り付けて使ったりするようなものは、
ちょっとでも処理時間が短い方がいいような気がします。
#それさえも最近のマシンのスペックでは問題にならない、のかな?

となると、#00670で、えるさんがおっしゃっている「早い初期化」が
まさに望むべきものであるような気もしてきます。
#深くは考えてないんですけど。

まふ

[ ]
RE:00670 コメントNo.00675
YK さん 99/07/28 00:23
 
えるさん。こんにちは。初めまして、YKと申します。

>現在は「マクロフォルダ」が1つ指定できるだけですが、これに加えて「プリコン
>パイルマクロフォルダ」の指定機能を追加する。
>そして、秀丸(や常駐秀丸)が最初に起動したときに、そこのフォルダの内容は中間
>コードになってメモリ上に保持される。
>マクロ実行時には、マクロフォルダとプリコンパイルマクロフォルダからマクロが
>検索され、プリコンパイルフォルダでは、中間コードの生成時間に対してマクロフ
>ァイルが新しい時のみコンパイルが走る。

これ、いいですね。秀丸の起動時オプションで、起動時にコンパイルするマクロが一
つ指定できるだけでも全然違うのですが。しかし、いずれにしても、今ないのだった
ら先が長いですよね。残念です。

マクロのコンパイラーが欲しいと思う人の条件を考えました。

(よく使用するマクロは実行の際に動作パラメータ聞いて来ないタイプ)and
(また、そのマクロのサイズは比較的大きい)and
(マクロが実行する動作環境は比較的遅い)

結局、困る人より困っていない人の方が多いから、現時点でサポートされていないと
いう事と考えています。

[ ]
RE:00666 マクロのコンパイラーは無いですNo.00731
ENCODINGSHIFTJIS さん 99/09/01 15:39
 
>みなさん今日は。YKと申します。
>マクロのコンパイラー(みたいな機能)は有りませんか。
>
>秀丸はマクロが実行される度に、そのマクロをコンパイルしてしますよ
>ね。そして、そのコンパイル時間は、そんなに短くないような気がして
>います。
>
>せっかくコンパイルしたその結果を捨てないで、次からそれを使って少
>しでも速くマクロが立ち上がってくれないかなと考えています。そのよ
>うな機能は、有りませんか?
>
>(マクロを作るときは毎回コンパイルは都合が良いのですが、一度マクロ
>が完成してしまうと、マクロを使うたびにコンパイルするのはもったい
>ない。と思うのは私だけですか)

動きを早くするなら見える形のコンパイル以外に
キャッシングもあると思います。最近実行の物を
[ユーザーに触らせない形]で保存して再利用する。
保存のやり方は、画面単位、起動単位、常駐単位
最低限クリアーキャッシュ機能を付ければ
間違いは少ないでしょう。コンパイルを利用するには
リビジョン管理とか依存関係makeを
監視したりするのが横に無いと。

[ ]
RE:00731 マクロのコンパイラーは無いですNo.00732
ENCODINGSHIFTJIS さん 99/09/01 17:36
 
>>みなさん今日は。YKと申します。
>>マクロのコンパイラー(みたいな機能)は有りませんか。
>>
>>秀丸はマクロが実行される度に、そのマクロをコンパイルしてしますよ
>>ね。そして、そのコンパイル時間は、そんなに短くないような気がして
>>います。
>>
>>せっかくコンパイルしたその結果を捨てないで、次からそれを使って少
>>しでも速くマクロが立ち上がってくれないかなと考えています。そのよ
>>うな機能は、有りませんか?
>>
>>(マクロを作るときは毎回コンパイルは都合が良いのですが、一度マクロ
>>が完成してしまうと、マクロを使うたびにコンパイルするのはもったい
>>ない。と思うのは私だけですか)
>
イベントを監視して動くような物はエディター
組み込みマクロ等を使わないとダメですが、

バッチ系の処理なら癖の強い物から離れる方向もあると
思います。WSHのようにオブジェクト化したエディター
と外部のスクリプトをつなぐ形です。いろいろなスクリプト
が使えれば分野ごとにDDE等を拡張建設しなくて済む。

バッチ処理ではJPerlと結合できれば起動しているPerlに
引数コミでcallbackできる。



[ ]
RE:00732 マクロのコンパイラーは無いですNo.00733
YK さん 99/09/02 00:47
 
今日は、YKです。コメントありがとう御座います。ただ、内容が私の
理解できる域を軽く超えていますので、とんちんかんなことを書いてい
るかもしれません。ご容赦を。

>動きを早くするなら見える形のコンパイル以外に
>キャッシングもあると思います。最近実行の物を

やりたいことは、編集中の文書に対して、実行マクロで新たな編集を加
えることです。そのため、キャッシュでは速くならないかなと思いまし
た。

>イベントを監視して動くような物はエディター
>組み込みマクロ等を使わないとダメですが、

上で書いた私がやりたいことというのは、「イベントを監視して動くよ
うな物」でしょうか?

>バッチ系の処理なら癖の強い物から離れる方向もあると
>思います。WSHのようにオブジェクト化したエディター
>と外部のスクリプトをつなぐ形です。いろいろなスクリプト
>が使えれば分野ごとにDDE等を拡張建設しなくて済む。

>バッチ処理ではJPerlと結合できれば起動しているPerlに
>引数コミでcallbackできる。

残念ですが、難しくてよく解りません。作ったマクロを別の言語で再度
作り直す必要があるという事でしょうか。別の言語で作り直すのは、私
には敷居が高いです。

[ ]
RE:00733 マクロのコンパイラーは無いですNo.00735
ENCODINGSHIFTJIS さん 99/09/02 19:13
 
>
>やりたいことは、編集中の文書に対して、実行マクロで新たな編集を加
>えることです。そのため、キャッシュでは速くならないかなと思いまし
>た。

スクリプト言語ならばコンパイルの話はついて回ります。Perlにも常駐とか
コンパイル済モジュールの話、JavaにはHotSpotや静的ネイティブコンパイル...。
マクロソースの前処理も考えられる、コンパイルほどはかっこよくない。
(余分なコメント改行空白除去、変数名の短縮書き換え等、MS-DOS VZ
では有効でした)
遅い原因の細かい話、行数の多いマクロ?、辞書等マクロ内で使う大きな
データの初期化?。行数の多いのは何かの常駐キャッシングかコンパイルしか
早くできないでしょう、(ユーザーに見えるかは別にして)。MIFESにはカレント
マクロの再実行があります(高速化になっているかはわからないが)、
最新9本くらいのマクロが高速化できればいいのだが1本では有難み少ない。
大データの初期化はマクロ終了後も残る「永続変数(プレジステント)」とか
リソースファイルみたいな物のI/Oでやれるからコンパイラーほど難しくないでし
ょう。

編集の処理の形は何? 割り付け整形:は一括範囲処理だから早さの切れ味とは
あまり関係ないし、「制約」:入力値や行の状態を監視して辞書を当てて見ている
ような物(イベントは見てないと言うし)、短縮入力/入力補完(辞書使いますね)
/文脈を見る入力ウィザードかな??

秀丸→JPerl起動→秀丸 で大きな一括処理できそうです。Perlパッケージありました。
use Win32::Clipboard;
$clip = Win32::Clipboard();
print "Clipboard Content:\n\n";
print $clip->Get();
print "\n";
$clip->Empty();
$clip->Set("ciao mondo!");
print "\nLook at your clipboard now!\n\n";
マクロ/DDE 以外にも「スクリプトに愛される秀丸」の道もありと思います。
JAVAとかメジャー&フリーなスクリプトと仲よくできれば一括処理のタイプの
機能の肥大化に気を使う事はなくなるでしょう。新機能追加競争にも有利。

<END/>

[ ]
RE:00735 マクロのコンパイラーは無いですNo.00736
YK さん 99/09/03 00:55
 
こんにちは。

>遅い原因の細かい話、行数の多いマクロ?、辞書等マクロ内で使う大きな
>データの初期化?。行数の多いのは何かの常駐キャッシングかコンパイルしか
>早くできないでしょう、(ユーザーに見えるかは別にして)。MIFESにはカレント

私の動作環境では、マクロ(1200行)のコンパイルに1s、内容によります
が処理にだいたい0.3s程度かかります。コンパイルにずいぶん時間をと
られているなと考えています。

>編集の処理の形は何? 割り付け整形:は一括範囲処理だから早さの切れ味とは
>あまり関係ないし、「制約」:入力値や行の状態を監視して辞書を当てて見ている
>ような物(イベントは見てないと言うし)、短縮入力/入力補完(辞書使いますね)
>/文脈を見る入力ウィザードかな??

処理の内容は、文章中の各行の左桁(インデント位置)・右桁(改行位置)
を揃えて整形し直すことです。文章の状況に合わせて、適切な整形をさ
せようとマクロを作っているうちに、ふえてしまいました。

数行を入力する度に実行するマクロが、私の動作環境ではだいたい約1.3s
かかり、その時間のなかで1200行のマクロのコンパイルに75%が費やされ
ています。もし、マクロのコンパイラーがすでに有れば、たとえ処理自
体のスピードが全く上がらなくても、処理時間が25%に短縮できるのにと
思って、コンパイラーはありませんかと投稿しました。

新しいマシンを買わずに、コンパイル時間を1/2にするにはマクロの半分
の600行(やる人の技量にもよるのでしょうが)を外に出さなくてはいけま
せん。これは、私の実力ではしんどいなと感じます。

>秀丸→JPerl起動→秀丸 で大きな一括処理できそうです。Perlパッケージありまし
>た。

Perlなどの処理でどういったことができるか、現在、私には想像も出来
ない世界です。

[ ]
RE:00736 マクロのコンパイラーは無いですNo.00737
ENCODINGSHIFTJIS さん 99/09/03 17:07
 
>
>処理の内容は、文章中の各行の左桁(インデント位置)・右桁(改行位置)
>を揃えて整形し直すことです。文章の状況に合わせて、適切な整形をさ
>せようとマクロを作っているうちに、ふえてしまいました。
>
 1パスコンパイラのTurboPascalや他のスクリプトでもコンパイル時間は
そんなものですね。処理は段落書式整形でしょうか、両端位置、禁則、
ハイフォネーション、欧文語間、分禁、箇条自動番号付け、右寄せ,表組
アウトライン編集モード、状態問い合わせ(ページ数.)、URL形式チェック..
やり始めたら切りないです、それくらいの行数にはなるでしょうね。
 普通の対応は強いWYSIWYGならワープロに行ってしまうか、
弱いWYSIWYGならマークアップで整形・印刷・ビュアー
(roff,TeX,PS,HTML,CSS,XSL,WinLprt?)に投げて目検チェックです。
今のテキスト処理はタグ付き(マークアップ方式)で大変盛り上がっている。
 全角半角ベースの書式を持っている仮想の記入用紙を追求するなら秀丸
のソースを改造する秀丸ワープロ化になってしまいます。
 現状なら常用するマクロを全部抱え込んだ終了しないマクロで常駐するしか
ないですね、でも入力イベントをWAITで待っていて、自分に関係ない
物はそのまま秀丸に渡して処理し、関係ある物をマクロ内で振り分ける
のは書けるかどうかわからない?(MIFESは不完全だが書ける)
 マクロコンパイルの中間コードは?今ならCソース、JAVAソース、バイトコード?
 Officeを使う人なら秀丸内でVBAを使いたくなるかもしれない。
===ここからは会議室とはちょっと
---------------------------- やってみました
//秀丸−クリップボード−JPerl 往復dan.mac
//選択範囲をクリップボードにコピー
//パールスクリプト起動実行中はエディター操作を消したいな。
//書き戻し
copy2;runsync2 "JPerl dan.pl";paste;
−−−−−−−−−−−−−
#JPerl の3字下げdan.pl
    use Win32::Clipboard;
$clip = Win32::Clipboard();
$rettext="";
$instr= $clip->Get();
$instr=~tr/  \012\015//d; # 半角全角空白改行 全削除
while(length($instr)) # 3字下げ9byte取り出し削除.改行
          {$rettext.=("_" x 3).substr($instr,0,9,"")."\n";}
$clip->Set($rettext);
#substrは日本語非対応なので正規表現で書き換えすべき
#でしょう。 s/.{9}//
多数あるモジュール全体のイメージをつかむまで時間がかかる。
探して、テストして、使い方に慣れるまで。不完全日本語化だから。
---------気力体力が充実してないとPerlに手は出ないと思います。
こんなもんです。全体の処理時間は100行処理で2秒ほど、
文字処理実行時間よりもMS-DOSプロンプトの開閉とかに1秒くらいかかっている
プロパティ等を調整の余地はあるようだ。簡単なことは何でやっても簡単
なので参考にならないかも。

<END/>

[ ]
RE:00737 マクロのコンパイラーは無いですNo.00738
YK さん 99/09/05 08:20
 
>多数あるモジュール全体のイメージをつかむまで時間がかかる。
>探して、テストして、使い方に慣れるまで。不完全日本語化だから。
>---------気力体力が充実してないとPerlに手は出ないと思います。

 今日は。
 気力充分でないので、現時点ですぐに取りかかる気は起きて無いの
ですが、とりあえず、Jperlがどういったものかホームパージを回っ
ているところです。
 コメントありがとうございました。

[ ]
RE:00738 マクロのコンパイラーは無いですNo.00739
ENCODINGSHIFTJIS さん 99/09/06 14:59
 
>>ているところです。

ClipBoard話のついでにjava版も動きます。起動は遅い(知っての通り)
DDEサーバーのような動かし方にしないと遅いと思う。
処理の粒の大きさに気を使うスクリプト言語ではないので
定型的書き方(おまじない)の量は多い、国際化ロケールとか
ユニコードなど奥深い所がある。1文字刻みタイプの処理とか
辞書、複雑なデータ構造を使いたければ良いかも。その他
XML検証とかjavaのモジュールを使いたいとき。
-----// javac Cli.java  // java Cli  :: コンパイル&Run
copy2;runsync2 "java Cli";paste;です。

//java2
import java.awt.*;
import java.awt.datatransfer.*;
public class Cli extends Frame implements ClipboardOwner{// init
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
public Cli(){ String s1,s2;
// paste from the system clipboard
Transferable tf = clip.getContents(this); s1 ="";
if(tf != null){
  try{ s1 =(String)tf.getTransferData(DataFlavor.stringFlavor);}catch
  (Exception e){ }  }
System.out.println("getsting=" + s1);
s2 = "return value =" +s1;
clip.setContents(new StringSelection(s2),this);
System.exit(0);// この後でクリップボードを見てみる。
}
public void lostOwnership(Clipboard c, Transferable t){}
public static void main(String[] args){
System.out.println("Clipboard");
new Cli();System.exit(0);}
}

[ ]
RE:00739 マクロのコンパイラーは無いですNo.00740
ENCODINGSHIFTJIS さん 99/09/14 17:53
 
>>>ているところです。
>  +
ClipBoard は使えるかどうか分らないが、
「JPerl や JDK をインストールするのが面倒」な人は、
JScriptやVBScriptを使って見てください。
 PerlのようなフリーではないがWinの中ではフリーです。

JavaScriptの文字処理部分はPerlのパクリ(影響を受けた)
ですから学習負荷は軽いでしょう。確認:最初にWSH対応か
どうか確認する、IE5.0が有ればそうなっていると思う。
(wscript.exe と打ってダイアログが出るか見る。)ダメなら
http://www.microsoft.com/Japan/Developer/Scripting/default.htm?/Japan/Develo
per/Scripting/windowshost/download/default.htm
から辿って入れる。
動かし方:1)htmlを生成しIE下で動作させる、表示物に便利。
うまく整形できれば印刷もできる。
2)wscript.exe xxxx.JS    をrunさせる。
逆にスクリプトから秀丸マクロ動作はできません、
秀丸自身は ActiveX オブジェクトではないため。


[ ]
RE:00736 マクロのコンパイラーは無いですNo.00755
ENCODINGSHIFTJIS さん 99/09/27 18:44
 
lenadj.mac ver1.1 を見て直ぐ分るのは UndoGo をexecmacro に
できるぐらいしかありません。関連する定数は$undoMark
だけみたいですから。(わずかな行数)後は、EnterKey
の重複サブルーチン化かな。現在の文字を確認3個、文末禁則処理2個、
文頭禁則処理2個。
気になるのは段落を1行化するまでにAi的に行をなめる
処理が重複しているように見えること。最初の範囲選択確認の時
処理行を見ているのだから(範囲選択onでもHanniSentakuを
通過させるようにはできると思う)以降の処理に必要な行の
情報を配列変数に格納して利用する。ZenkakuHennkannIndentIti
等は短くできると思う。カーソルの動きと連動して配列を更新するのは
神経使うけど。位置はともかく空白行扱い、見出し扱い、左右の
文字の特徴、インデント量、左右連結可能性は一回で拾えるハズ?
−−−−−−−−−−−−−−−−−−−−−−−−−−−
キーマクロを補助するために生まれたマクロの類というより
ブラウザーのplug-inのような作り方ですね。(マクロ処理の
縁石走行、文字単位操作中心で検索履歴を壊さないようにsearch
すら使っていない!、こうゆう制約は一般人にはきらわれるけど
エディターマクロだからしょうがないかな。でもプログラム構造は
ともかく現代的なデータ構造(コンテナ)は欲しいです、連想配列
があれば少しは短く書けるだろう)表に見える文字だけで処理するのは
限界がある。

[ ]
RE:00755 マクロのコンパイラーは無いですNo.00756
ENCODINGSHIFTJIS さん 99/09/28 14:01
 
あと、マクロを短くするアイディアとしては、秀丸組み込みの
機能を借りる方向があります。完全カスタマイズの快適さは
無いですが。

// 1行整形 (案)// 細かな注意はしてません。
//  改行ぶら下がり+禁則+自動インデント modeで実行します。
// 行末のカーソルの動きは予測できなかった。keyの時とmouseの時でも
// 違うし、65桁でも66にカーソルが置けるときがある。golineend;で
// 全角1文字分短いときも多い。けっこうラフ
//−−−−−−−−−−−−−−−−−−−−−−−−−−
// type1現在行のインデント継続
//golinetop;down;// 次行インデント消し
//while(0x20==code||0x9==code||code==0x8140)right;deletebefore;
//up;golineend;if(0xD==code){delete;golineend;}insertreturn;
//−−−−−−−−−−−−−−−−−−−−−−−−−−
// type2  カーソル位置から流し込み
//#indent=x;golinetop;
//while(0x20==code||0x9==code||code==0x8140)right;deletebefore;
//insert leftstr("                          ",#indent);
//以下 type1 と同様。

[ ]
RE:00756 マクロのコンパイラーは無いですNo.00757
YK さん 99/09/29 00:41
 
>lenadj.mac ver1.1 を見て直ぐ分るのは UndoGo をexecmacro に

今日は。コメントありがとう御座います。
マクロのコンパイラの話は、まさにlenadj.macのスピードアップ化がや
りたくて始めました。lenadj.macはようやく作ったものの、マクロ行数
の増加と共に重くなり、クロック166MHzの私の環境では、スカスカとは
いきません。(でも便利)

>気になるのは段落を1行化するまでにAi的に行をなめる
>処理が重複しているように見えること。最初の範囲選択確認の時
>処理行を見ているのだから(範囲選択onでもHanniSentakuを
>通過させるようにはできると思う)以降の処理に必要な行の
>情報を配列変数に格納して利用する。ZenkakuHennkannIndentIti

私も気になってはいます。作っているとき、私も配列化でできないか考
えましたが、その時は大きな文書の全文処理等による配列オーバーの可
能性が嫌だったのと、御指摘の配列の更新が難しそうだったから止めま
した。しかし、内部のこんな所までよく見えるものですねえ。

>神経使うけど。位置はともかく空白行扱い、見出し扱い、左右の
>文字の特徴、インデント量、左右連結可能性は一回で拾えるハズ?

これが私には難しい。

>キーマクロを補助するために生まれたマクロの類というより
>ブラウザーのplug-inのような作り方ですね。(マクロ処理の
>縁石走行、文字単位操作中心で検索履歴を壊さないようにsearch
>すら使っていない!、こうゆう制約は一般人にはきらわれるけど

ありがとう御座います(別にほめられちゃいないか...)。searchを使わな
かったのは、遠くまで探しにいって、なにかとんでもないことをやらな
いかも心配だったから。石橋叩きながら、暴走させないように足下だけ
を見ながら作りました。

>あと、マクロを短くするアイディアとしては、秀丸組み込みの
>機能を借りる方向があります。完全カスタマイズの快適さは
>無いですが。

何しろコンパイル時間を半分にするには、600行の削減が必要ですから、
殆ど全てに手を入れて、短縮文に(処理スピードも気になる)書き換えし
なければならず、ちょっと元気が出ません。
バージョンアップのときに、多少手をいれるとしても、あまりに遠い。
まして石橋派の私には。

[ ]
RE:00757 マクロのコンパイラーは無いですNo.00759
ENCODINGSHIFTJIS さん 99/09/29 20:44
 

// マクロのポイントは改行を消して再度入れて自動インデントを
// 働かせるところだ。(人手作業のシミュレート)
// 行末の禁則文字&カーソル&改行コードの動きもチョット????
// エディタモードの使える組み合わせもよく分からない。
if(!selecting)          {call Reform1;endmacro;} // 1行処理
   #seltopy=seltopy;#selendy=selendy;escape;     //  整形範囲
if(#seltopy+1>=#selendy){moveto 0,#seltopy;      //  2行以下なら
                         call Reform1;endmacro;} // 1行処理
//
disabledraw; // マクロらしくなってきた。お好みにより設定
// マーク行をマクロで判定できないx 設定はできるが 
// 範囲処理の終わりに使いたい。別fileを開くしか確実な方法は無いか?
// 論理行数カウントはめんどくさい、カーソルの動きは神経質!
// うまく行く理由も、うまく行かない理由も解らない。
moveto 0,#selendy;golineend;insert "J"; // 外字マークで代用
moveto 0,#seltopy;
//
// 判定の式とcall文を1行にするとcallネストが深すぎerrorが出る?
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
}
// マクロ文の改行分割位置の入れ方で動作が変わってしまう !
// 経験浅いので、特徴はわからない。Mifesのように1行1文も何だし。
golinetop;replacedown "J","";
// 止めマーク消し ラッキーとしか言いようない。【疲れた】
enabledraw; // どうする?
//
endmacro;
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y;                 // 元の行位置
golinetop;down;       // 次行インデント消し 行末移動
while(0x20==code||0x9==code)right;deletebefore;left;
if(return)delete;     // 次に改行を入れるため
if(#y!=y)left;        // 行長一杯の時カーソルは下に行くので戻す
else golineend;       // 連結して長くなった行末の文字に
if(!return){right;insertreturn;}  // 自動インデント
    return;//-------------------------------------------------
// 2回やってダメなら手修正,マクロに頭を使うより体を使う。
// 実操作時間としては1行ずつやってもあまり違わないと思う。
// 改善点:行中の空白によりインデント位置がずれる。
//         その時は、もう一回。そういう行はたいてい整形対象外の
//                         割り付け固定行。軽く判定できそうならどうぞ  ?
// マクロ起動のカーソル位置を段落の第2行からのほうがいいかも?
// ごくわずかkey数は少ない、ただ解りやすさの障害がある。
//     これは、第1行スタートだが。
// カーソル位置を頭に置いて行末付近で動くのは疲れる。

[ ]
RE:00759 マクロのコンパイラーは無いですNo.00760
ENCODINGSHIFTJIS さん 99/10/01 22:01
 
 1ページ以上のマクロは管理しがたい。
そこそこ動きました。テストの文書はLENADJ.TXT です。
LeastMac.mac
// 直前1段落整形マクロ再実行
//
if(!selecting)
{
        writeinistr "LeastMac.INI","HMACRO","isRep","rep1";
execmacro "reforD0.mac"; } // rep1 はこの中でoff
execmacro getinistr("LeastMac.INI","HMACRO","arg0");
 endmacro;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
reforD0.mac
//  主にキーボード操作の場合の入り口 マウス操作なら行範囲選択、
//   直接右メニューREFORDx 起動ができる
$DantouC=" ((";   // 段頭にありそうな文字 要調整
//
//     選択中の inputchar 対策 、IME on ですると選択範囲が!
             #imesave=imestate;if(imestate)imeswitch;
   Selected:
if(selecting){   //  急ぐより選択範囲を良く見て確認した方がよい
//
if(getinistr("LeastMac.INI","HMACRO","isRep")=="rep1")  // 再実行
{writeinistr "LeastMac.INI","HMACRO","isRep","";endmacro;}
//
             #Char=inputchar(
             "<P> <DL> <UL> <OL> 段落整形 頭文字enter");
          if(#Char>'Z')#Char=#Char-32;       // 大文字化
// ここで選択範囲を修正できる、ようにできる。
     if('P'==#Char)execmacro "REFORDp.mac";  // 通常段落
else if('D'==#Char)execmacro "REFORDd.mac";  // 定義箇条書
else if('U'==#Char)execmacro "REFORDu.mac";  // 番号無し箇条書
else if('O'==#Char)execmacro "REFORDo.mac";  // 番号付き箇条書
if(#imesave)imeswitch;endmacro;}
//
disabledraw;  // やらなくても良い、好みだね
// 現在行から上下のstop行まで選択  1段のみ
                     #starty=y;
while(1){call isStopl '↓';  // 移動方向パラ
        if(##return=='空'||##return=='段') {#selendy=y-1;break;}
              golineend2;right;if(!result) {#selendy=y  ;break;} }
            moveto 0,#starty;
while(1){call isStopl '↑';
        if(##return=='段') {#seltopy=y  ;break;}
   else if(##return=='空') {#seltopy=y+1;break;}
              golinetop2;left; if(!result) {#seltopy=y  ;break;} }
        if(#seltopy>=#selendy){beep;endmacro;}  // stop行の上だった
//                                         // 1行整形macroでやって
moveto 0,#seltopy;beginsel;moveto 0,#selendy;golineend;
enabledraw;
goto Selected;
//
// =============================================================
isStopl:      // 空白行、見出しらしい行?
golineend;
while(' '==code||code==' '||code==0x9||0xD==code||eof==code){
                                      if(!x)return '空';left;}
// 空白行を空白・改行1個にしたら?どうなるか
// 行は通常段落の頭にありそうな文字で開始か?強い制約だ
if(y!=#starty||##1=='↑'){              // 開始行の段頭は判定しない
golinetop;while(code==' '||code==0x9)right;
if(strstr($DantouC,char(code))>=0)return '段';  }  // 段頭
                                  return '属';     // 付属行
//
// これでは箇条書きを必ず空行で切らないといけない。要調整?
// -------------------------------------------------------------
// -------------------------------------------------------------
// マクロソース終了を指示する物があれば実行が早くなるかな
// Perl なら特殊リテラルの __END__ とか __DATA__
//     あれば埋め込みドキュメントを置ける。
//
// 段落整形は 文字列選択したものを、挿入BOX範囲に貼り付け
// 流し込みできれば、その流し込みオプションで解決できる。
// ワープロのように表示で見える文字と連動する裏の割り付け
// 制御データを持てないのだから常時整形を保つのはできない。
// Ai判定もナカナカ、マークアップもどき入力も隠し味で必要になる
// 文体別にしか対応できない。
//  仕様:1段整形、stop行パターンは各自調整してください
// 処理の流れ
//   REFORD0  行範囲決定
//   REFORDx  各種段落形
//  =======================================================
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
REFORDp.mac
// 通常段落整形
// マクロのポイントは改行を消して再度入れて自動インデントを
// 働かせるところだ。(人手作業のシミュレート)
// 行末の禁則文字&カーソル&改行コードの動きもチョット????
// エディタモードの使える組み合わせもよく分からない。
//
//          直前マクロ再実行準備 自分の名前は取得できないので
//          マクロ名変更時には修正せよ。
writeinistr "LeastMac.INI","HMACRO","arg0","REFORDp.mac";
//
if(!selecting)          {call Reform1;endmacro;} // 1行処理
   #seltopy=seltopy;#selendy=selendy;escape;     //  整形範囲
if(#seltopy+1>=#selendy){moveto 0,#seltopy;      //  2行以下なら
                         call Reform1;endmacro;} // 1行処理
//
disabledraw; // マクロらしくなってきた。お好みにより設定
// マーク行をマクロで判定できないx 設定はできるが 
// 範囲処理の終わりに使いたい。別fileを開くしか確実な方法は無いか?
// 論理行数カウントはめんどくさい、カーソルの動きは神経質!
// うまく行く理由も、うまく行かない理由も解らない。
moveto 0,#selendy;golineend;insert "J"; // 外字マークで代用
moveto 0,#seltopy;
//
// 判定の式とcall文を1行にするとcallネストが深すぎerrorが出る?
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
}
// マクロ文の改行分割位置の入れ方で動作が変わってしまう !
// 経験浅いので、特徴はわからない。Mifesのように1行1文も何だし。
golinetop;replacedown "J","";
// 止めマーク消し ラッキーとしか言いようない。【疲れた】
// 次の空白類でない文字
while(' '==code||' '==code||0x9==code||0xD==code){
right;if(!result)break;}
enabledraw; // どうする?
//
endmacro;
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y;                 // 元の行位置
golinetop;down;       // 次行インデント消し 行末移動
while(0x20==code||0x9==code)right;deletebefore;left;
if(0xD==code)delete;     // 次に改行を入れるため
if(#y!=y)left;        // 行長一杯の時カーソルは下に行くので戻す
else golineend;       // 連結して長くなった行末の文字に
if(0xD!=code){right;insertreturn;}  // 自動インデント
    return;//-------------------------------------------------
// 2回やってダメなら手修正,マクロに頭を使うより体を使う。
// 実操作時間としては1行ずつやってもあまり違わないと思う。
// 改善点:行中の空白によりインデント位置がずれる。
//         その時は、もう一回。そういう行はたいてい整形対象外の
//                         割り付け固定行。軽く判定できそうなら?
// マクロ起動のカーソル位置を段落の第2行からのほうがいいかも?
// ごくわずかkey数は少ない、ただ解りやすさの障害がある。
//     これは、第1行スタートだが。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
REFORDd.mac
// 定義箇条書き段落整形
//   第1行は独立で連結しない
//    行頭位置だけの簡単な処理 利口じゃない カーソルがビュンビュン
//     作業用の画面に流し込む処理形式じゃないと何回もなめてしまう。
//
//          直前マクロ再実行準備 自分の名前は取得できないので
//          マクロ名変更時には修正せよ。
writeinistr "LeastMac.INI","HMACRO","arg0","REFORDd.mac";
//
if(!selecting){beep;endmacro;}        // 1行処理 はあり得ない
   #seltopy=seltopy;#selendy=selendy;escape;     //  整形範囲
if(#seltopy==#selendy){beep;endmacro;} // 1行処理
//
//disabledraw; // マクロらしくなってきた。お好みにより設定
moveto 0,#seltopy;while(' '==code||code==0x9)right;#firstInd=x;
 golineend2;right;while(' '==code||code==0x9)right;#seconInd=x;
//
                    #subtopy=#selendy+1;
while(#subtopy>#seltopy){
           #subendy=#subtopy-1;moveto 0,#subendy;  // 1条選択
while(1){call isForS;   // ↑ 処理方向
   if(##return=='開') {#subtopy=y;break;}
   if(y<=#seltopy)    {#subtopy=y;break;} golinetop2;left; }  //
//
moveto 0,#subtopy;golineend2;if(y<#subendy){ // 第2行があるか?
// 第2行以降整形
moveto 0,#subendy;golineend;insert "J"; // 外字マークで止める
moveto 0,#subtopy;golineend2;right;      // 第2行頭出し
while(' '==code||0x9==code)right;deletebefore;
insert leftstr( "                                     ",#seconInd);
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
}
golinetop;replacedown "J","";}          // 止めマーク消し
// 第1行整形
moveto 0,#subtopy;while(' '==code||0x9==code)right;deletebefore;
insert leftstr("                                      ",#firstInd);
while(!return){golineend;right;insertreturn;}
} // --------------------- sub loop
//
// 次の空白でない段
while(1){golineend2;                    right;if(!result)break;
while(' '==code||' '==code||0x9==code){right;if(!result)break;}
                                 if(code==0xD||eof==code)break;
}  // 空白行捜し
while(' '==code||' '==code||0x9==code||0xD==code){
                            right;if(!result)break;}
enabledraw; // どうする?
//
endmacro;
// ============================================================
//------------------------------------------------------
isForS:      // インデント比較 どちらに近いか
golinetop2;while(code==' '||0x9==code){right;if(!result)break;}
if(0x9==code||eof==code)return '空';
if(#firstInd<=#seconInd){    // 普通の形
  if(x<=#firstInd)return '開';if(x>=#seconInd)return '続';
  if((x-#firstInd)<(#seconInd-x))return '開'; return '続';
  }else{
                             // 中央揃え
  if(x>=#firstInd)return '開';if(x<=#seconInd)return '続';
  if((#firstInd-x)<(x-#seconInd))return '開'; return '続';
  }
endmacro; // error
// -----------------------------------------------------
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y;                 // 元の行位置
golinetop;down;       // 次行インデント消し 行末移動
while(0x20==code||0x9==code)right;deletebefore;left;
if(0xD==code)delete;     // 次に改行を入れるため
if(#y!=y)left;        // 行長一杯の時カーソルは下に行くので戻す
else golineend;       // 連結して長くなった行末の文字に
if(0xD!=code){right;insertreturn;}  // 自動インデント
    return;//-------------------------------------------------
//
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
REFORDu.mac
// 番号無し箇条書き段落整形
//   第1行も連結する。
//    行頭位置だけの簡単な処理 利口じゃない カーソルがビュンビュン
//     作業用の画面に流し込む処理形式じゃないと何回もなめてしまう。
//
//          直前マクロ再実行準備 自分の名前は取得できないので
//          マクロ名変更時には修正せよ。
writeinistr "LeastMac.INI","HMACRO","arg0","REFORDu.mac";
//
//
if(!selecting){beep;endmacro;}        // 1行処理 はあり得ない
   #seltopy=seltopy;#selendy=selendy;escape;     //  整形範囲
if(#seltopy==#selendy){beep;endmacro;} // 1行処理
//
//disabledraw; // マクロらしくなってきた。お好みにより設定
moveto 0,#seltopy;while(' '==code||code==0x9)right;#firstInd=x;
 golineend2;right;while(' '==code||code==0x9)right;#seconInd=x;
//
                    #subtopy=#selendy+1;
while(#subtopy>#seltopy){
           #subendy=#subtopy-1;moveto 0,#subendy;  // 1条選択
while(1){call isForS;   // ↑ 処理方向
   if(##return=='開') {#subtopy=y;break;}
   if(y<=#seltopy)    {#subtopy=y;break;} golinetop2;left; }  //
//
#flagF='F';  // インデント処理用
moveto 0,#subendy;golineend;insert "J"; // 外字マークで止める
// 1条整形
moveto 0,#subtopy;while(' '==code||0x9==code)right;deletebefore;
insert leftstr("                                      ",#firstInd);
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
if(#flagF=='F'&&y>#subtopy){ #flagF='S'; // インデント変更
if(#firstInd<#seconInd)
  insert leftstr( "                                     ",
                                     #seconInd-#firstInd);
else if(#firstInd>#seconInd)
     {left #firstInd-#seconInd;deletebefore;}
} }
golinetop;replacedown "J","";          // 止めマーク消し
} // --------------------- sub loop
//
// 次の空白でない段に移動
while(1){golineend2;                    right;if(!result)break;
while(' '==code||' '==code||0x9==code){right;if(!result)break;}
                                 if(code==0xD||eof==code)break;
}
while(' '==code||' '==code||0x9==code||0xD==code)right;
enabledraw; // どうする?
//
endmacro;
// ============================================================
//------------------------------------------------------
isForS:      // インデント比較 どちらに近いか
golinetop2;while(code==' '||0x9==code){right;if(!result)break;}
if(0x9==code||eof==code)return '空';
if(#firstInd<=#seconInd){    // 普通の形
  if(x<=#firstInd)return '開';if(x>=#seconInd)return '続';
  if((x-#firstInd)<(#seconInd-x))return '開'; return '続';
  }else{
                             // 中央揃え
  if(x>=#firstInd)return '開';if(x<=#seconInd)return '続';
  if((#firstInd-x)<(x-#seconInd))return '開'; return '続';
  }
endmacro; // error
// -----------------------------------------------------
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y;                 // 元の行位置
golinetop;down;       // 次行インデント消し 行末移動
while(0x20==code||0x9==code)right;deletebefore;left;
if(0xD==code)delete;     // 次に改行を入れるため
if(#y!=y)left;        // 行長一杯の時カーソルは下に行くので戻す
else golineend;       // 連結して長くなった行末の文字に
if(0xD!=code){right;insertreturn;}  // 自動インデント
    return;//-------------------------------------------------
//
// どうしても長くなってしまう!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
REFORDo.mac
// 長くなりすぎたので作らない、やっぱり短くならない。

[ ]
RE:00760 マクロのコンパイラーは無いですNo.00764
ENCODINGSHIFTJIS さん 99/10/04 15:32
 
%%% 結論は // 空白の解釈はマークアップしない限り正確に行かない。
少しのバグ取りと、行末字上げを追加 <P> 以外は記憶します。
記憶のある操作体系は解りやすく作るのが難しい。  以上でおしまいです。
//
%%%% REFORD0.MAC
//  主にキーボード操作の場合の入り口 マウス操作なら行範囲選択、
//   直接右メニューREFORDx 起動ができる
$DantouC=" ((";   // 段頭にありそうな文字 要調整
//
//     選択中の inputchar 対策 、IME on ですると選択範囲が!
             #imesave=imestate;if(imestate)imeswitch;
   Selected:
if(selecting){   //  急ぐより選択範囲を良く見て確認した方がよい
//
if(getinistr("LeastMac.INI","HMACRO","isRep")=="rep1")  // 再実行
{writeinistr "LeastMac.INI","HMACRO","isRep","";endmacro;}
//
   #Char=inputchar("P DL UL OL 段落整形 頭文字/行末字上enter");
if(#Char>'Z')#Char=#Char-32;       // 大文字化
// ここで選択範囲を修正できる、ようにできる。
                              #Indr=-1;
while('0'<=#Char&&#Char<='9'){#Indr=#Char-'0'; // 行末字上げ数
   #Char=inputchar("P DL UL OL 段落整形 頭文字/行末字上enter");
if(#Char>'Z')#Char=#Char-32; }                 // 大文字化
//
if(0>#Indr){                                  // 字上げ数変更無し
     if('P'==#Char)execmacro "REFORDp.mac";  // 通常段落
else if('D'==#Char)execmacro "REFORDd.mac";  // 定義箇条書
else if('U'==#Char)execmacro "REFORDu.mac";  // 番号無し箇条書
else if('O'==#Char)execmacro "REFORDo.mac";  // 番号付き箇条書
}else{
     if('P'==#Char){
     writeininum "LeastMac.INI","HMACRO","pIndR",#Indr;
                   execmacro "REFORDp.mac";} // 通常段落
else if('D'==#Char){
     writeininum "LeastMac.INI","HMACRO","dIndR",#Indr;
                   execmacro "REFORDd.mac";} // 定義箇条書
else if('U'==#Char){
     writeininum "LeastMac.INI","HMACRO","uIndR",#Indr;
                   execmacro "REFORDu.mac";} // 番号無し箇条書
else if('O'==#Char){
     writeininum "LeastMac.INI","HMACRO","oIndR",#Indr;
                   execmacro "REFORDo.mac";} // 番号付き箇条書
}
if(#imesave)imeswitch;endmacro;}
//
disabledraw;  // やらなくても良い、好みだね
// 現在行から上下のstop行まで選択  1段のみ
                     #starty=y;
while(1){call isStopl '↓';  // 移動方向パラ
        if(##return=='空'||##return=='段') {#selendy=y-1;break;}
              golineend2;right;if(!result) {#selendy=y  ;break;} }
            moveto 0,#starty;
while(1){call isStopl '↑';
        if(##return=='段') {#seltopy=y  ;break;}
   else if(##return=='空') {#seltopy=y+1;break;}
              golinetop2;left; if(!result) {#seltopy=y  ;break;} }
        if(#seltopy>=#selendy){beep;endmacro;}  // stop行の上だった
//                                         // 1行整形macroでやって
moveto 0,#seltopy;beginsel;moveto 0,#selendy;golineend;
enabledraw;
goto Selected;
//
// =============================================================
isStopl:      // 空白行、見出しらしい行?
golineend;
while(' '==code||code==' '||code==0x9||0xD==code||eof==code){
                                      if(!x)return '空';left;}
// 空白行を空白・改行1個にしたら?どうなるか
// 行は通常段落の頭にありそうな文字で開始か?強い制約だ
if(y!=#starty||##1=='↑'){              // 開始行の段頭は判定しない
golinetop2;while(code==' '||code==0x9)right;
if(strstr($DantouC,char(code))>=0)return '段';  }  // 段頭
                                  return '属';     // 付属行
//
// これでは箇条書きを必ず空行で切らないといけない。要調整?
// -------------------------------------------------------------
// -------------------------------------------------------------
// マクロソース終了を指示する物があれば実行が早くなるかな
// Perl なら特殊リテラルの __END__ とか __DATA__
//     あれば埋め込みドキュメントを置ける。
//
// 段落整形は 文字列選択したものを、挿入BOX範囲に貼り付け
// 流し込みできれば、その流し込みオプションで解決できる。
// ワープロのように表示で見える文字と連動する裏の割り付け
// 制御データを持てないのだから常時整形を保つのはできない。
// Ai判定もナカナカ、マークアップもどき入力も隠し味で必要になる
// 文体別にしか対応できない。
//  仕様:1段整形、stop行パターンは各自調整してください
// 処理の流れ
//   REFORD0  行範囲決定
//   REFORDx  各種段落形
//  =======================================================
%%%%%%  LeastMac.mac
// 直前1段落整形マクロ再実行
if(!selecting){
writeinistr "LeastMac.INI","HMACRO","isRep","rep1";
execmacro "reforD0.mac"; } // rep1 はこの中でoff
execmacro getinistr("LeastMac.INI","HMACRO","arg0");
 endmacro;
%%%%%%  REFORDp.mac
// 通常段落整形
// マクロのポイントは改行を消して再度入れて自動インデントを
// 働かせるところだ。(人手作業のシミュレート)
// 行末の禁則文字&カーソル&改行コードの動きもチョット????
// エディタモードの使える組み合わせもよく分からない。
//
//          直前マクロ再実行準備 自分の名前は取得できないので
//          マクロ名変更時には修正せよ。
writeinistr "LeastMac.INI","HMACRO","arg0","REFORDp.mac";
//
if(!selecting)          {call Reform1;endmacro;} // 1行処理
   #seltopy=seltopy;#selendy=selendy;escape;     //  整形範囲
if(#seltopy+1>=#selendy){moveto 0,#seltopy;      //  2行以下なら
                         call Reform1;endmacro;} // 1行処理
//
disabledraw; // マクロらしくなってきた。お好みにより設定
// マーク行をマクロで判定できないx 設定はできるが 
// 範囲処理の終わりに使いたい。別fileを開くしか確実な方法は無いか?
// 論理行数カウントはめんどくさい、カーソルの動きは神経質!
// うまく行く理由も、うまく行かない理由も解らない。
moveto 0,#selendy;golineend;insert "J"; // 外字マークで代用
moveto 0,#seltopy;
#Indr=getininum("LeastMac.INI","HMACRO","pIndR"); // 行末字上げ数
        // <BLOCKQUOTE> として見なすので単発扱い // 行末字上げreset
writeininum "LeastMac.INI","HMACRO","pIndR",0;
insert leftstr("         ",#Indr);                // 準備
//
// 判定の式とcall文を1行にするとcallネストが深すぎerrorが出る?
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
}
// マクロ文の改行分割位置の入れ方で動作が変わってしまう !
// 経験浅いので、特徴はわからない。Mifesのように1行1文も何だし。
replacedown "J","";#y=y;
// 止めマーク消し ラッキーとしか言いようない。【疲れた】
golinetop;beginrect;moveto #Indr,#seltopy;delete;  // 行末字上げ
// 次の空白類でない文字
moveto 0,#y+1;
while(' '==code||' '==code||0x9==code||0xD==code){
                            right;if(!result)break;}
enabledraw; // どうする?
//
endmacro;
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y;                 // 元の行位置
                      // 次行インデント消し(連結準備)
golineend;right;while(0x20==code||0x9==code)right;deletebefore;
left;if(0xD==code)delete;     // 次行とつなげる。
     if(#y!=y)insertreturn;   // 行長一杯の時カーソルは下に行く
else if(!return){golineend;right;insertreturn;} // 長くなった行末
            //insertreturn により自動インデントが働く。
    return;//-------------------------------------------------
// 2回やってダメなら手修正,マクロに頭を使うより体を使う。
// 実操作時間としては1行ずつやってもあまり違わないと思う。
// 改善点:行中の空白によりインデント位置がずれる。
//         その時は、もう一回。そういう行はたいてい整形対象外の
//                         割り付け固定行。軽く判定できそうなら?
// マクロ起動のカーソル位置を段落の第2行からのほうがいいかも?
// ごくわずかkey数は少ない、ただ解りやすさの障害がある。
//     これは、第1行スタートだが。
%%%%% REFORDd.mac
// 定義箇条書き段落整形
//   第1行は独立で連結しない
//    行頭位置だけの簡単な処理 利口じゃない カーソルがビュンビュン
//     作業用の画面に流し込む処理形式じゃないと何回もなめてしまう。
//
//          直前マクロ再実行準備 自分の名前は取得できないので
//          マクロ名変更時には修正せよ。
writeinistr "LeastMac.INI","HMACRO","arg0","REFORDd.mac";
//
if(!selecting){beep;endmacro;}        // 1行処理 はあり得ない
   #seltopy=seltopy;#selendy=selendy;escape;     //  整形範囲
if(#seltopy==#selendy){beep;endmacro;} // 1行処理
//
//disabledraw; // マクロらしくなってきた。お好みにより設定
#Indr=getininum("LeastMac.INI","HMACRO","dIndR"); // 行末字上げ数
moveto 0,#seltopy;while(' '==code||code==0x9)right;#firstInd=x;
golineend2;right; while(' '==code||code==0x9)right;#seconInd=x;
//
moveto 0,#selendy;golineend;insert "@"; // 総範囲
                    #subtopy=#selendy+1;
while(#subtopy>#seltopy){
           #subendy=#subtopy-1;moveto 0,#subendy;  // 1条選択
while(1){call isForS;   // ↑ 処理方向
   if(##return=='開') {#subtopy=y;break;}
   if(y<=#seltopy)    {#subtopy=y;break;} golinetop2;left; }  //
//
moveto 0,#subtopy;golineend2;if(y<#subendy){ // 第2行があるか?
// 第2行以降整形
moveto 0,#subendy;golineend;insert "J"; // 外字マークで止める
moveto 0,#subtopy;golineend2;right;      // 第2行頭出し
while(' '==code||0x9==code)right;deletebefore;
insert leftstr( "                               ",#seconInd+#Indr);
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
}
replacedown "J","";}          // 止めマーク消し
// 第1行整形
moveto 0,#subtopy;while(' '==code||0x9==code)right;deletebefore;
insert leftstr("                                ",#firstInd+#Indr);
while(!return){golineend;right;insertreturn;}
} // --------------------- sub loop
//
replacedown "@","";#y=y;
golinetop;beginrect;moveto #Indr,#seltopy;delete;  // 行末字上げ
// 次の空白でない段
moveto 0,#y+1;
while(' '==code||' '==code||0x9==code||0xD==code){
                            right;if(!result)break;}
enabledraw; // どうする?
//
endmacro;
// ============================================================
//------------------------------------------------------
isForS:      // インデント比較 どちらに近いか
golinetop2;while(code==' '||0x9==code){right;if(!result)break;}
if(0x9==code||eof==code)return '空';
if(#firstInd<=#seconInd){    // 普通の形
  if(x<=#firstInd)return '開';if(x>=#seconInd)return '続';
  if((x-#firstInd)<(#seconInd-x))return '開'; return '続';
  }else{
                             // 中央揃え
  if(x>=#firstInd)return '開';if(x<=#seconInd)return '続';
  if((#firstInd-x)<(x-#seconInd))return '開'; return '続';
  }
endmacro; // error
// -----------------------------------------------------
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y;                 // 元の行位置
                      // 次行インデント消し(連結準備)
golineend;right;while(0x20==code||0x9==code)right;deletebefore;
left;if(0xD==code)delete;     // 次行とつなげる。
     if(#y!=y)insertreturn;   // 行長一杯の時カーソルは下に行く
else if(!return){golineend;right;insertreturn;} // 長くなった行末
            //insertreturn により自動インデントが働く。
    return;//-------------------------------------------------
//
%%%%% REFORDu.mac
// 番号無し箇条書き段落整形
//   第1行も連結する。
//    行頭位置だけの簡単な処理 利口じゃない カーソルがビュンビュン
//     作業用の画面に流し込む処理形式じゃないと何回もなめてしまう。
//
//          直前マクロ再実行準備 自分の名前は取得できないので
//          マクロ名変更時には修正せよ。
writeinistr "LeastMac.INI","HMACRO","arg0","REFORDu.mac";
//
//
if(!selecting){beep;endmacro;}        // 1行処理 はあり得ない
   #seltopy=seltopy;#selendy=selendy;escape;     //  整形範囲
if(#seltopy==#selendy){beep;endmacro;} // 1行処理
//
//disabledraw; // マクロらしくなってきた。お好みにより設定
#Indr=getininum("LeastMac.INI","HMACRO","dIndR"); // 行末字上げ数
moveto 0,#seltopy;while(' '==code||code==0x9)right;#firstInd=x;
 golineend2;right;while(' '==code||code==0x9)right;#seconInd=x;
//
moveto 0,#selendy;golineend;insert "@"; // 総範囲
                    #subtopy=#selendy+1;
while(#subtopy>#seltopy){
           #subendy=#subtopy-1;moveto 0,#subendy;  // 1条選択
while(1){call isForS;   // ↑ 処理方向
   if(##return=='開') {#subtopy=y;break;}
   if(y<=#seltopy)    {#subtopy=y;break;} golinetop2;left; }  //
//
#flagF='F';  // インデント処理用
moveto 0,#subendy;golineend;insert "J"; // 外字マークで止める
// 1条整形
moveto 0,#subtopy;while(' '==code||0x9==code)right;deletebefore;
insert leftstr("                                ",#firstInd+#Indr);
while(0>strstr(gettext(0,y,linelen,y),"J")){
call Reform1;
if(#flagF=='F'&&y>#subtopy){ #flagF='S'; // インデント変更
if(#firstInd<#seconInd)
  insert leftstr( "                                     ",
                                     #seconInd-#firstInd);
else if(#firstInd>#seconInd)
     {left #firstInd-#seconInd;deletebefore;}
} }
golinetop;replacedown "J","";          // 止めマーク消し
} // --------------------- sub loop
//
replacedown "@","";#y=y;
golinetop;beginrect;moveto #Indr,#seltopy;delete;  // 行末字上げ
// 次の空白でない段に移動
moveto 0,#y+1;
while(' '==code||' '==code||0x9==code||0xD==code){
                            right;if(!result)break;}
enabledraw; // どうする?
//
endmacro;
// ============================================================
//------------------------------------------------------
isForS:      // インデント比較 どちらに近いか
golinetop2;while(code==' '||0x9==code){right;if(!result)break;}
if(0x9==code||eof==code)return '空';
if(#firstInd<=#seconInd){    // 普通の形
  if(x<=#firstInd)return '開';if(x>=#seconInd)return '続';
  if((x-#firstInd)<(#seconInd-x))return '開'; return '続';
  }else{
                             // 中央揃え
  if(x>=#firstInd)return '開';if(x<=#seconInd)return '続';
  if((#firstInd-x)<(x-#seconInd))return '開'; return '続';
  }
endmacro; // error
// -----------------------------------------------------
// ============================================================
Reform1:// 現在行のインデント継続 1行整形/秀丸禁則に依存する
#y=y;                 // 元の行位置
                      // 次行インデント消し(連結準備)
golineend;right;while(0x20==code||0x9==code)right;deletebefore;
left;if(0xD==code)delete;     // 次行とつなげる。
     if(#y!=y)insertreturn;   // 行長一杯の時カーソルは下に行く
else if(!return){golineend;right;insertreturn;} // 長くなった行末
            //insertreturn により自動インデントが働く。
    return;//-------------------------------------------------
//
// どうしても長くなってしまう!

[ ]
RE:00764 マクロのコンパイラーは無いですNo.00765
ENCODINGSHIFTJIS さん 99/10/05 13:56
 
正誤表
REFORDu.mac番号無し箇条書き段落整形

正:
#Indr=getininum("lastMac.INI","HMACRO","uIndR"); // 行末字上げ数
#Indr=getininum("lastMac.INI","HMACRO","dIndR"); // 行末字上げ数
誤:

正:
     {golinetop;right #firstInd-#seconInd;deletebefore;}
               {left; #firstInd-#seconInd;deletebefore;}
誤:

正:
left;replacedown "@","";#y=y;   // 1段のみの時[@J]になるため
     replacedown "@","";#y=y;
誤:

<END/>

[ ]
RE:00765 マクロのコンパイラーは無いですNo.00766
ENCODINGSHIFTJIS さん 99/10/05 17:57
 
他の「桁折り・整形」マクロにも目を通しました。ユーザーインターフェイス
とAi判断の重さで行数が膨らんでいるようだ。コンパイラが欲しくなるのも解ります。
1行整形から出発して、何も考えないシンプル規則で、
繰り返すのも、アリの解答だと思います。
-------------------------
javaのソース逆解析を妨害するユーティリティーのような加工を
.mac にかけたらどうでしょう。不要なコメント.空白類の除去、
および変数名を短縮.ランダム化。バイト数が減って2倍速くらいには
なると思います。

[ ]
RE:00766 マクロのコンパイラーは無いですNo.00770
ENCODINGSHIFTJIS さん 99/10/07 15:48
 
//秀丸.mac  秀丸マクロのソース圧縮 1行処理+
// インデント コメント 除去
//
//                H.ini の初期消去は手でします。
//               書き替え済みの行を更に書き替えると X
//
$FOLLOW=" /*+-&|%^=<>!,;)"; // 変数名 後続の可能な文字集合
#Vcount=getininum("H.INI","HMdic","Vcount");// 1行処理の残り 無害
//
while(eof!=code){
//
golinetop2;
while(' '==code||code==0x9)right;deletebefore;// インデント消し
while(1){
while('/'!=code&&code!=0xD){right;if(!result)break;}
   if('/'==code){right;if('/'==code){left;deleteafter;} } // コ発見
   if(0xD==code||code==eof){                    // 行末より前の空白
     while(0<x){left;if(' '!=code&&code!=0x9){right;break;} }
          deleteafter;break;} //空行残す
}                             // 変数名付け替え処理のため
// 除去完了
// 変数名の短縮 連想配列の出番です
golinetop2;
while(1){
while('#'!=code&&code!='$'&&0xD!=code){right;if(!result)break;}
   if('#'==code||code=='$'){ #x=x;#y=y;#c =code;// 変数の頭 発見
                            right;if(#c==code)right;// ## or $$
while(('0'<=code&&code<='9')||
      ('A'<=code&&code<='Z')||
      ('a'<=code&&code<='z')  )right;// 名前文字
if(0>strstr($FOLLOW,char(code)))
                          {message "変数名の末尾?";continue;}
                       $V=gettext(#x,#y,x,y);
           $W=rightstr($V,strlen($V)-2);
if(leftstr($V,2)=="##"||leftstr($V,2)=="$$"){ // 書き替えない?
        if($W=="return")                          continue;
 if(strlen($W)==1&&ascii($W)>='1'&&'9'>=ascii($W))continue; }
//                H.ini の初期消去は手でして
   $VV=getinistr("H.INI","HMdic",$V);      // 連想
if($VV==""){                      #Vcount=1+#Vcount;
      writeininum "H.INI","HMdic","Vcount", #Vcount;
   $H=leftstr($V,2);if("##"==$H||$H=="$$")
        $VV=leftstr($V,2)+"Z"+str(#Vcount);// 新変数名
   else $VV=leftstr($V,1)+"Z"+str(#Vcount);
     writeinistr "H.INI","HMdic",$V,$VV;  }
//   付け替え
beginsel;left strlen($V);delete;insert $VV;
//
}else if(0xD==code)break; }
right;// 次行へ
//
}
//
// その他の物は見ながら全置換した方がよいのでは
// 人により文体が違う、演算子や括弧類の前後の空白;との空きなど
// 使用例: lenadj.mac 45KB → 22KB ->手作業全置換-> 20KB
// 全置換  = 前後の空白消し、( )前後の空白消し
//    細かい所は解らないが元と同じように動いている。
//    綺麗なソースで助かった。早さ?遅くはならないと思うが。

[ ]
RE:00770 マクロのコンパイラーは無いですNo.00773
YK さん 99/10/08 12:57
 
>.mac にかけたらどうでしょう。不要なコメント.空白類の除去、
>および変数名を短縮.ランダム化。バイト数が減って2倍速くらいには
>なると思います。

>// その他の物は見ながら全置換した方がよいのでは
>// 人により文体が違う、演算子や括弧類の前後の空白;との空きなど
>// 使用例: lenadj.mac 45KB → 22KB ->手作業全置換-> 20KB
>// 全置換  = 前後の空白消し、( )前後の空白消し
>//    細かい所は解らないが元と同じように動いている。

こんにちは。
じつは私もコメントと空白行の削除は試してみたことがあるのです。
(変数名の短縮は思いつきもしませんでしたが...)

そのときは、45KB -> 25KBの圧縮で、数行からなる典型的な段落の処理
時間(コンパイル時間を含む)は、私の環境(クロック166MHz)で次のとお
りでした。
45KBのときは、1800mS±30mS程度(何度かやっての平均)
25KBのときで、1780mS±30mS程度(同上)

時間短縮の寄与が3%位にすぎなく、デメリットが大と判断して、やめま
した。圧縮すると、非常に見づらくて、圧縮版しかない場合(人)アレン
ジが出来ないと考えました。

秀丸がコンパイルする際に、コメントや空白の無視に掛ける時間は、全
体(私の環境ではコンパイルだけで1100mS程度)に対して小さいようです。

[ ]
RE:00770 マクロのコンパイラーは無いですNo.00774
ENCODINGSHIFTJIS さん 99/10/08 16:04
 
//秀丸.mac  秀丸マクロのソース圧縮 1行処理+
// インデント コメント 除去 【末尾の注意を見よ】
//
$FOLLOW=" /*+-&|%^=<>!,;)]["; // 変数名 後続の可能な文字集合
#Vcount=getininum("H.INI","HMdic","Vcount");// 1行処理の残り 無害
//
while(eof!=code){
//  -------------  第1行/最終行は?  ** 両側空白除去 **
golinetop2;            //searchとwhileどちらが解りやすくて早い?
left;searchdown"[^ ]",  regular; deletebefore;    // インデント消
left;searchdown"\n|(//)",regular;if('/'==code)deleteafter;//コメ消
right;searchup "^|[^ ]",regular;                 // 行末の空白消
if(' '!=code&&code!=0x9&&0xD!=code)right; deleteafter;
//空行残す,変数名付け替え処理のため&行の対応を解りやすくデバッグ用。
// 空白除去完了
// -------------- ** 変数名の短縮 連想配列の出番です **
golinetop2;
while(1){                 // 1歩1歩前進するのにはsearchは?
left;searchdown"\n|[#$]",regular;
               if(!result)break;if(0xD==code)break;     // 1行完了
#x=x;#y=y;#c=code;right;if(#c==code)right; // ## $$  変数の頭 発見
left;searchdown "[^0-9A-Za-z_]",regular;   // 名前文字
               if(0>strstr($FOLLOW,char(code)))
                          {message "変数名の末尾?";continue;}
                       $V=gettext(#x,#y,x,y);// 全体
           $H=leftstr ($V,2);                // 頭2文字
//                        // 固定の変数名? 書き替えせず
 if($H=="##"||$H=="$$"){$W=rightstr($V,strlen($V)-2);  // 名前部
        if($W=="return")                          continue;
 if(strlen($W)==1&&ascii($W)>='1'&&'9'>=ascii($W))continue; }
//
   $VV=getinistr("H.INI","HMdic",$V);      // 連想配列 登録済み?
if($VV==""){                      #Vcount=1+#Vcount;
      writeininum "H.INI","HMdic","Vcount", #Vcount;
      if("##"==$H||$H=="$$")
           $VV=leftstr($V,2)+"_"+str(#Vcount);// 新変数名
      else $VV=leftstr($V,1)+"_"+str(#Vcount);//旧と一致するか?
 if(strlen($VV)>=strlen($V)) $VV=$V;   //長くなるときは・難しい!
 writeinistr "H.INI","HMdic",$V,$VV;  }
beginsel;left strlen($V);insert $VV;   //   付け替え
}
right;// 次行へ
}
// __END__
// その他の物は見ながら全置換した方がよいのでは
// 人により文体が違う、演算子や括弧類の前後の空白;との空きなど
// 使用例: lenadj.mac 45KB → 22KB ->手作業全置換-> 20KB
//         htmltag.mac 61KB → 37KB
// 全置換  = 前後の空白消し、( )前後の空白消し
//    細かい所は解らないが元と同じように動いている。
//    綺麗なソースで助かった。
// 早さ?遅くはならないと思うが。1000行以上でないとわからんのでは。
//
//        ファイルの第2行にカーソルを置いてから実行
//      H.ini の初期消去は手でします。!!! !!! !!! !!!
//               書き替え済みの行を更に書き替えると X
//      新変数名の頭文字は事前検索で既存の物と重複しないことを
//    確認する事。
// SGMLのPUBLIC識別子内の // 等は事前に%%等に置き換えておき
//   処理後に戻す。(そのほか :// //DTD //EN、いろいろ考えて)
// 例:
// replaceallfast "-//","-%%";
//                            execmacro "CpressHM.mac";
// replaceallfast "%%","//";
//
// FOLLOW集合に改行は入っていない。改行を含む長い式・文のソース
// は希で、演算子の移動などでも解決できる。改行を追加もできる。
//            なかなか解らなかった。事
//Ver. 3.01
//left;searchdown "$",regular;無効 "\n" は有効
//right;searchup  "^",regular;有効
//if(!result)break;if(0xD==code)break; これをまとめると動作が?
//if(!result||0xD==code)break;          おかしい。
//

[ ]
RE:00774 マクロのコンパイラーは無いですNo.00775
安久津 さん 99/10/08 18:54
 
こんにちは ENCODINGSHIFTJIS さん、安久津といいます。
マクロの while ループの中に continue をたくさん使っていますが、
秀丸の continue にはバグがあります。
入れ子になっている while ループの中で continue を使うと、
予期せぬ所へ処理が移る場合があります。
いまのところ問題が無いのであれば、このことは忘れて下さい。m(__)m

ではでは。

[ ]
RE:00774 マクロのコンパイラーは無いですNo.00776
YK さん 99/10/09 00:36
 
こんにちは。
わたしは、てっきりコンパイル時の高速化をねらっているのだと思って
いたのですが、実行速度の改善も含めてなんですね。

安久津さん指摘のバグが発生しているどうかは、別として(文書内容によ
って見えてくるのかどうか分かりませんが、テストした文書ではOKで
した。)返還後のマクロの処理速度は、13%程度速くなっています。変数
名だけでこれほどの効果があるとは驚きです。

コンパイル後にも、長い変数名をこれほど引きずっているとは思っても
いませんでした。

500行の処理で確認したところ、次の通りでした。
マクロ返還前:47.2秒(マクロのコンパイル時間を含む)
マクロ変換後:41.1秒(同上)

[ ]
RE:00776 マクロのコンパイラーは無いですNo.00782
ENCODINGSHIFTJIS さん 99/10/12 11:49
 
結局 コンパイル時間に関しては無効ですね。改めて秀丸マクロはちゃん
とできているを実感。昔のTurboPascalの気分を味わえた、TPのように.obj
を出力できれば少しはマシかもしれないがプログラム開発環境で食ってい
る訳じゃないからねー。瞬間起動の気分を味わうには0.5秒以下の動作
が必要だから400〜500行くらいがマクロ1本の限界でしょう。

コンパイル&起動時間を測定してみました。

            #tm=tickcount;
execmacro "lenadj.mac";//中でも先頭で message str(tickcount);実行
message str(#tm);

コ+起動時間は msec の1桁しか違わないくらい安定している。

さて、DataBunkatu: は必要だろうか?マクロの開始でimestateを保存して
IME-off(imeswitch)にしてからinputすればいいのでは?
endmacroの直前でimestateを元に戻す。
もしもkeyドライバーがカタカナコードを出すと困るが、Win95以後で
直接入力でカタカナの出るキーボードはあるか?
知らないが、昔98キーボードの人々用でも全角の部分は消せるだろう。

UndoGo:もins/delは何処でも何回でもできるから。X,Yカーソル戻しも
文字列記録しなくとも戻すポイントで何かのマークをins/delすれば
できるだろう。(selectでないようにしておいてから)
行数的にはわずか。

あとは、他のマクロが使えなくなる終了しないマクロ。
例: 編集画面とマクロ保持用の空画面を開いておく
// loop Mac  編集画面からマクロ起動
prevhidemaru;// 空に
while(1){
   #char=inputchar("起動待機中");
if(#char==' '){quit;endmacro};
prevhidemaru;// 編集画面に
golinetop;beginsel;golineend;copy;right;paste;insertreturn;
prevhidemaru;// 空に
}
//
編集画面←→待機画面に移動するには手操作。
これは冗談みたいな物だが、こうゆう仕組みが複数個使えれば
マクロキャッシングしたことになる。

<END/>

[ ]
RE:00775 マクロのコンパイラーは無いですNo.00796
ENCODINGSHIFTJIS さん 99/10/19 16:20
 
>
>秀丸の continue にはバグがあります。

// たしかに、そうですね。
// 文の入れ子のレベルが変わると
// continue; が解除されてしまう。
// 何か使い道のあるバグか?ないなー
while(1){
message "tooranai 0";
         continue;// 次のwhile の中に突入する。
message "tooranai 1";// ここだけ ok
while(1){message "in 1";break;}
message "tooranai 2";
while(1){message "in 2";break;}
message "tooranai 3";
break;}


[ ]
RE:00740 マクロのコンパイラーは無いですNo.00904
ENCODINGSHIFTJIS さん 99/12/08 18:42
 

[ruby-list:19230]clipbrd.rb
により秀丸とRubyのClipBoard接続ができました。

testClipbrd.mac  -----------------------------------------
beginsel;right 9;copy;left 9;
runsync2 "D:\\Ruby\\rbcw142\\Ruby.exe D:\\Ruby\\rbcw142\\sample\\testClipBrd.
rb";
// RUBYLIB,RUBYPATH  ??
paste;

testClipBrd.rb  ------------------------------------------
require 'clipbrd.rb'
cstr = Clipboard.GetText
       Clipboard.SetText("=Ruby:"+ cstr+ ";")

秀丸run文でのPath展開やRubyの検索Pathの具合は神経使います。
.BAT では処理時間にひびくし、runの前にカレントDIRとか
環境変数を設定できるとよいのだが。



[ ]