パスワードを忘れた? アカウント作成
173269 journal

soltioxの日記: [備忘]apsaly / miko スクリプト

日記 by soltiox

apsalyエディタで使えるスクリプトを試したので、
備忘を兼ねてメモ。

・キホンはcライク。
・関数が二種類(普通のとリレー関数)
 普通の関数は普通。
 リレー関数は、シングルクォート+関数名で、
 通常は何かのオブジェクトにぶら下げ(後置)。
・変数は定義不要だが、配列は定義が必要。

///////////////////////////////////////////////////////////
// 実験スクリプト
// 選択範囲を、その直後にコピーする
///////////////////////////////////////////////////////////
'AddScope( ::Apsaly );
 
( StartLine, EndLine ) = GetSelRange( 0 );
// 0 最小と最大の表示行インデックス
LineDist = EndLine;
 
MoveTo( LineDist++'VLi );
Insert( "\n", 0 );    // 0 行頭挿入指示
 
for( LinePos = StartLine; LinePos < EndLine; LinePos++ ){
 
    strBuf = GetLineText( LinePos'VLi );
 
    MoveTo( LineDist++'VLi );
    Insert( strBuf, 0 );    // 0 行頭挿入指示
 
}
 
MoveTo( LineDist++'VLi );
Insert( "\n", 0 );    // 0 行頭挿入指示

テキスト内で、ある行を選択して呼び出すと、
選択された行を複写するスクリプト。

'AddScope云々は、ビルトイン関数を呼び出す時に
"::Apsaly."という文字列をタイプする手間を省くことが出来る。

MoveTo関数やGetLineText関数は、
リレー関数の合わせ技で使う。

行選択時に、カーソルが次行冒頭にあるか、
最終行末尾にあるかで、振る舞いが変わる。
カーソル位置を読み取り、動作を変えればいいかも。

///////////////////////////////////////////////////////////
// 実験スクリプト
// 選択範囲だけに置換を適用させる
///////////////////////////////////////////////////////////
'AddScope( ::Apsaly );
 
( StartLine, EndLine ) = GetSelRange( 0 );
// 0 最小と最大の表示行インデックス
 
MoveTo( StartLine'VLi );
SetFindCond( "ひでぶ", "RG" );
while( FindFwd() >= 0 )
    if( 'VLi < EndLine ) Replace( "ぽぷよん" );
    else break;
 
MoveTo( EndLine'VLi, 'LineTop );

テキストの中の、ある特定の部分にのみ、変更を加えるテスト。
'VLiで、カーソルの表示行位置を取得できる。

こまかい置換がいっぱいある場合は、正規表現をこねくりまわすよりか、
MoveToでピンポンさせて、簡単な置換命令を何度か走らせた方が、
何かと見通しがいいかも知れない。

///////////////////////////////////////////////////////////
// 実験スクリプト
// 選択範囲を切り出し
///////////////////////////////////////////////////////////
'AddScope( ::Apsaly );
 
strAry'new!;
 
( StartLine, EndLine ) = GetSelRange( 0 );
// 0 最小と最大の表示行インデックス
LineDist = EndLine;
 
MoveTo( LineDist++'VLi );
Insert( "\n", 0 );
 
for( LinePos = StartLine; LinePos < EndLine; LinePos++ ){
 
    MoveTo( LinePos'VLi );
    GetLineText()'split( $"\s+", strAry );
 
    MoveTo( LineDist++'VLi );
    Insert( "%-8s %d\n"'fmt( strAry[0], strAry[1]'int ), 0 );
 
}
 
MoveTo( LineDist++'VLi );
Insert( "\n", 0 );

正規表現による文字列の切り出し('split)と、
書式命令('fmt)、あと、配列の定義('new!)のテスト。
これは、連想配列の定義命令。
連想配列でないと、文字列型が使えないっぽい?

///////////////////////////////////////////////////////////
// 実験スクリプト
// 棒グラフ
///////////////////////////////////////////////////////////
'AddScope( ::Apsaly );
'AddScope( ::Math );
 
AryText'new!;
AryCapt'new!;
AryVal'new!;
 
GraphLength = 50; // グラフ表示幅
MaxVal = 0;
MinVal = 0;
Total = 0;
AryCount = 0;
 
( StartLine, EndLine ) = GetSelRange( 0 );
// 0 最小と最大の表示行インデックス
LineDist = EndLine;
 
for( LinePos = StartLine; LinePos < EndLine; LinePos++ ){
 
    MoveTo( LinePos'VLi );
    GetLineText()'split( $"\s+", AryText );
 
    AryCapt[AryCount] = AryText[0];
    AryVal[AryCount] = AryText[1]'int;
 
    if( MaxVal == 0 ){
        MaxVal = AryVal[AryCount];
        MinVal = AryVal[AryCount];
    } else {
        if( MaxVal < AryVal[AryCount] ) MaxVal = AryVal[AryCount];
        if( MinVal > AryVal[AryCount] ) MinVal = AryVal[AryCount];
    }
    Total += AryVal[AryCount];
    AryCount++;
 
}
 
Average = ( Total / AryCount );
DivVal = ( MaxVal / GraphLength ) + 1;
MoveTo( LineDist++'VLi );
Insert( "\n", 0 );
MoveTo( LineDist++'VLi );
Insert( "Max %d / Min %d / Records %d / Average %d / * = %d\n"'fmt(
        MaxVal, MinVal, AryCount, Average, DivVal ), 0 );
DispAverage = ( Average / DivVal );
 
for( LinePos = 0; LinePos < ( EndLine - StartLine ); LinePos++ ){
 
    DispVal = ( AryVal[LinePos] / DivVal );
    if( DispVal < DispAverage ){
        strGraph =    "*"'rep( DispVal ) +
                    "."'rep( DispAverage - DispVal - 1 ) +
                    ":";
    } else {
        strGraph =    "*"'rep( DispAverage - 1 ) +
                    "#" +
                    "*"'rep( DispVal - DispAverage );
    }
 
    MoveTo( LineDist++'VLi );
    Insert( "%-8s %4d %-s\n"'fmt(
        AryCapt[LinePos], AryVal[LinePos]'int, strGraph ), 0 );
 
}
 
MoveTo( LineDist++'VLi );
Insert( "\n", 0 );

こないだawkで書いた、横向きヒストグラムもどき。
AddScopeで、数学関数の読み込みを追加したけど、
数学関数使ってなかったり。
htmlタグとか吐き出すようにしても、面白いかも。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

ソースを見ろ -- ある4桁UID

読み込み中...