soltioxの日記: [備忘]apsaly / miko スクリプト
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タグとか吐き出すようにしても、面白いかも。
[備忘]apsaly / miko スクリプト More ログイン