引越しのため、こちらのページは更新を停止しました。2006.07.20
新しい掲載先

Sakura Editor BBSからの抜粋もの

2006年7月2日

掲示板に投稿されたマクロ・正規表現の抜粋です。 元記事のリンクは過去ログに落ちるとデッドリンクになりますが現在は放置されています。 そのうち気が向けば、手直しします。

[sakura editor] [ユーザ会議室] [マクロ会議室] [YahooGroup] [マクロLINK] [マクロリファレンス]

免責事項

まとめるのに精一杯のため、動作確認も一切行っておりません。 細心の注意をもって作業しておりますが誤植の可能性もあります。 また、抜粋作業にあたり、質問者または回答者の意図を 正確に把握していない可能性があります。 あらかじめご了承願います。

目次

マクロ

現在行の #include で指定されたファイルを開く

' OpenIncludeFile.vbs
' 
' 現在行にある #include <file.h>、#include "file.h" のfile.hを開く。
' 検索対象は環境変数の INCLUDE と現在開いているファイルのフォルダ内

Call Main

' メイン処理
Sub Main()
    Dim objShell
    Dim sDistFileName, sCurDirName
    Dim i, pos

    Set objShell = CreateObject("Wscript.Shell")
    sIncPath = objShell.ExpandEnvironmentStrings("%INCLUDE%")

    sDistFileName = getIncludeFileName(Editor.GetLineStr(0))
    sCurDirName = getCurrentFolderName()

    If openFile(sCurDirName & sDistFileName) Then Exit Sub

    i = 1
    Do While True
        pos = InStr(i, sIncPath, ";")
        If IsNull(pos) Then Exit Do
        If pos = 0 Then
            If openFile(Mid(sIncPath, i)) Then Exit Sub
            Exit Do
        End If
        If openFile(Mid(sIncPath, i, pos - i)) Then Exit Sub
        i = pos + 1
    Loop
End Sub

' インクルードファイル名取得
Function getIncludeFileName(sLine)
    Dim pos, endpos
 
    getIncludeFileName = ""
    pos = InStr(1, sLine, "<")
    If pos = 0 Then
        pos = InStr(1, sLine, """")
        endpos = InStr(pos + 1, sLine, """")
    Else
        endpos = InStr(pos + 1, sLine, ">")
    End If

    If pos = 0 Or endpos = 0 Then Exit Function
    pos = pos + 1
    getIncludeFileName = Mid(sLine, pos, endpos - pos)
 
End Function

' 現在のフォルダ名取得
Function getCurrentFolderName()
    Dim pos
    Dim sCurFileName
 
    getCurrentFolderName = ""
 
    sCurFileName = GetFileName()
    pos = InStrRev(sCurFileName, "\")
    If pos = 0 Then Exit Function
    getCurrentFolderName = Mid(sCurFileName, 1, pos)
End Function

' ファイルが存在していたら開く
Function openFile(sPath)
    Dim fso
    Set fso = CreateObject("Scripting.FileSystemObject")
 
    openFile = False
    If (fso.FileExists(sPath)) Then
        Editor.FileOpen (sPath)
        openFile = True
    End If
 
End Function
2006/7/2 (日) 16:14:21 まくろ初心者  >>macro:290

現在のカーソル位置から指定行までを選択する

// 実行には PPA.DLL が必須です。
// マクロファイルの拡張子は .PPA でなくてはなりません。

// 現在のカーソル位置から指定行までを選択する。
// このマクロを使用すると、編集中ファイルの全ブックマークが解除されるので注意!!

var
        cx,cy:Integer;
        ty:Integer;
begin
        // 現在位置を cx,cy に記憶しておく。
        cx := StrToInt( S_ExpandParameter( '$x' ) );        // 実行開始時の列
        cy := StrToInt( S_ExpandParameter( '$y' ) );        // 実行開始時の行

        // 行番号を入力させる
        ty := StrToInt( InputBox( '行番号を入力' , '何行目までを選択しますか?' , '' ) );
        if( ty = 0 ) then        Exit;        // 何も入力されなかったら、ここでマクロ中断。

        S_BookmarkReset(0);        // ブックマークの全解除
        S_Jump(ty,0);                // 目的行まで飛ぶ
        S_BookmarkSet(0);        // ブックマーク設定・解除

        // カーソル位置を cx,cy へ戻す。
        S_Jump(cy,0);
        while ( StrToInt( S_ExpandParameter( '$x' ) ) < cx ) do        S_Right(0);        // カーソル右移動

        S_BeginSelect(0);        // 範囲選択開始

        if( cy < ty ) then
                begin        // ↓方向に選択する場合
                        S_BookmarkNext(0);        // 次のブックマークへ
                        S_BookmarkReset(0);        // ブックマークの全解除
                        S_Left(0);                        // カーソル左移動
                        S_Right(0);                        // カーソル右移動
                        S_Down(0);                        // カーソル下移動
                end
        else
                begin        // ↑方向に選択する場合
                        S_BookmarkPrev(0);        // 前のブックマークへ
                        S_BookmarkReset(0);        // ブックマークの全解除
                end
        ;
end;
2006/6/26 (月) 23:45:04 すい  >>一般:5295

相対パスを開く

//SakuraOpenner.js

var oFS = new ActiveXObject("Scripting.FileSystemObject");
var oShell = new ActiveXObject("WScript.Shell");

// 選択文字列を絶対(物理)パスに変換
var sPhysPath = oFS.GetAbsolutePathName( GetSelectedString(0) );

if( oFS.FileExists( sPhysPath ) ){
        //File Open
        Editor.FileOpen( sPhysPath );
}else{
        if( oFS.FolderExists( sPhysPath ) ){
                //Folder Open
                var oShellApp = new ActiveXObject("Shell.Application");
                oShellApp.Open( sPhysPath );
                oShellApp = null;
        }else{
                //Not Found
                oShell.Popup("そんなファイルなっしんぐ" + "\r\n" + sPhysPath
                                , 0, "SakuraOpenner", 0 );
        }
}
oShell = null;
oFS = null;
2006/6/6 (火) 12:54:11 di  >>macro:279

HTML閉じタグ補完

// HTMLのタグ入力時に閉じを作る(簡易)
// <html(カーソル)>  →  <html>(カーソル)</html>
//
// <html*> ←カーソルが * の位置にいないと(多分)ダメ。
// 挿入モードでないとダメ。

S_Left(0); // 単語の中へ
S_SelectWord(0); // 現在位置の単語選択
S_Copy(0); // コピー
S_Right(0); // 選択解除
S_Right(0); // タグの外へ
S_MoveHistSet(0); // 位置控え
S_Char(60); // 文字入力('<')
S_Char(47); // 文字入力('/')
S_Paste(0); // 貼り付け
S_Char(62); // 文字入力('>')
S_MoveHistPrev(0); // 元の位置(タグの間)へ

// Shift + Ctrl + Spaceとか登録しとくと入力補完とキー近くて便利かも。
// 1.タグの囲みを打つ <>
// 2.中にタグ名を打つ <html>
// 3.そのままこのマクロで閉じを補完  →<html></html>
// 4.そのままタグの中身を打っていける
2006/5/13 (土) 20:51:11 りっちゃん  >>MACRO:269

固定長テキストデータを改行

// タイトル:固定長テキストデータを改行
// LEFT_DOWN.PPA
// マクロを実行前に、カーソルを
// 最初に改行させたい位置に置きます。
// あらかじめ途中に改行の有るデータはそこまでで終了します。
var s1, s2 : String;
begin
  while True do
  begin
    S_Char(13);
    S_Left();
    s1 := S_ExpandParameter('$x');
    S_Down();
    s2 := S_ExpandParameter('$x');
    if StrToInt(s1) <> StrToInt(s2) then
      break; // EOFか、または全角文字で終わる。
  end;
end.
// index to >>Part7:23
2006/5/12 (金) 04:12:50 じゅうじ  >>MACRO:268

C++ 行コメントの追加

// C++ macro 範囲選択またはキャレット移動でC++行コメント
// 2006.02.27 by じゅうじ
// PPA.DLL を SAKURA.EXE と同じディレクトリに置く。
if nil = S_GetSelectedString(0)
  then  // 範囲選択なし
    begin
      S_GoLineTop(9);
      S_Replace('^(.*)\n', '//\1\n', 4); // 行頭置換(//は、C++行コメント)
      S_GoLineTop(9);
    end
  else S_ReplaceAll('^(.*)\n', '//\1\n', 132); // 選択範囲置換
S_SearchClearMark(0); // 検索マークのクリア
2006/2/27 (月) 22:05:26 じゅうじ  >>MACRO:250

次の差分へ(ブロック単位で移動)

' DiffNextBlock.vbs From Here --------------------------
' 連続した差分を飛ばしてブロック単位に移動
Do
    lngBefore = ExpandParameter("$y")
    DiffNext()
Loop While CLng(lngBefore) + 1 = CLng(ExpandParameter("$y"))
' DiffNextBlock.vbs To Here --------------------------
2006/2/22 (水) 00:13:30 maru  >>一般:5049

前の差分へ(ブロック単位で移動)

' DiffPrevBlock.vbs From Here -------------------------------
' 次の差分へ(ブロック単位で移動)の逆動作
Call Main
Sub Main
    lngBefore = ExpandParameter("$y")
    DiffPrev()
    If CLng(lngBefore) = CLng(ExpandParameter("$y")) Then Exit Sub
 
    Do While (1)
        lngBefore = ExpandParameter("$y")
        DiffPrev()
        Select Case CLng(ExpandParameter("$y"))
        Case CLng(lngBefore)
            Exit Sub
        Case CLng(lngBefore) - 1
        Case Else
            DiffNext()
            Exit Do
        End Select
    Loop
End Sub
' DiffPrevBlock.vbs To Here -------------------------------
2006/2/22 (水) 00:13:30 maru  >>一般:5049

TeX→PDF用マクロ

var objShell = new ActiveXObject("WScript.Shell");
var i;
var FileName;                //原型ファイル名格納用
var TeXFileName;        //TeXファイル名格納用
var DviFileName;        //DVIファイル名格納用
var PdfFileName;        //PDFファイル名格納用

Editor.FileSave();                //ファイル上書き保存
FileName=Editor.GetFileName();        //ファイルパスの取得
TeXFileName="";                        //初期化
DviFileName="";                        //初期化
PdfFileName="";                        //初期化

for(i=0;i<FileName.length;i++){
        if(FileName.charAt(i)=="\\"){        //ファイルパスの「\」を「/」に変換
                TeXFileName=TeXFileName+"/";
        }else{
                TeXFileName=TeXFileName+FileName.charAt(i);
        }
        if(i<FileName.length-3){        //拡張子をdvi、pdfに変換
                DviFileName=DviFileName+TeXFileName.charAt(i);
                PdfFileName=PdfFileName+FileName.charAt(i);
        }else{
                if(i==FileName.length-3)DviFileName=DviFileName+"d";
                if(i==FileName.length-2)DviFileName=DviFileName+"v";
                if(i==FileName.length-1)DviFileName=DviFileName+"i";
 
                if(i==FileName.length-3)PdfFileName=PdfFileName+"p";
                if(i==FileName.length-2)PdfFileName=PdfFileName+"d";
                if(i==FileName.length-1)PdfFileName=PdfFileName+"f";
        }
}
objShell.Run("C:/usr/local/bin/platex "+TeXFileName,1,1);        //TeXコンパイラ実行(各自でパス変更)
objShell.Run("C:/usr/local/bin/dvipdfmx "+DviFileName,1,1);        //PDFに変換(各自でパス変更)
objShell.Run('"C:\\Program Files\\Adobe\\Acrobat 7.0\\Acrobat\\Acrobat"'+PdfFileName,1,0);        //PDF表示(各自でパス変更)
2006/2/10 (金) 14:29:22 てふにしゃん  >>macro:246

Tex用数式挿入

//-------数式用 TeXmacroEqu.js
Editor.InsText('        \\begin{equation}\r\n');
Editor.InsText('                ■ \\label{eq:■}\r\n');
Editor.InsText('        \\end{equation}\r\n');
2006/2/9 (木) 11:36:02 てふにしゃん  >>macro:245

Tex用画像挿入

//-------画像用 TeXmacroFig.js
Editor.InsText('\\begin{figure}[h]\r\n');
Editor.InsText('        \\begin{center}\r\n');
Editor.InsText('                \\includegraphics[width=80mm,clip]{Fig■.eps}\r\n');
Editor.InsText('                \\caption{■}\r\n');
Editor.InsText('                \\label{fig:■}\r\n');
Editor.InsText('        \\end{center}\r\n');
Editor.InsText('\\end{figure}\r\n');
2006/2/9 (木) 11:36:02 てふにしゃん  >>macro:245

TeXでコンパイル→dvioutで表示

var objShell = new ActiveXObject("WScript.Shell");
var i;
var FileName;                //原型ファイル名格納用
var TeXFileName;        //TeXファイル名格納用
var DviFileName;        //DVIファイル名格納用

Editor.FileSave();                //ファイル上書き保存
FileName=Editor.GetFileName();        //ファイルパスの取得
TeXFileName="";                        //初期化
DviFileName="";                        //初期化

for(i=0;i<FileName.length;i++){
        if(FileName.charAt(i)=="\\"){        //ファイルパスの「\」を「/」に変換
                TeXFileName=TeXFileName+"/";
        }else{
                TeXFileName=TeXFileName+FileName.charAt(i);
        }
        if(i<FileName.length-3){        //拡張子をdviに変換
                DviFileName=DviFileName+TeXFileName.charAt(i);
        }else{
                if(i==FileName.length-3)DviFileName=DviFileName+"d";
                if(i==FileName.length-2)DviFileName=DviFileName+"v";
                if(i==FileName.length-1)DviFileName=DviFileName+"i";
        }
}
objShell.Run("C:/usr/local/bin/jlatex "+TeXFileName,1,1);                //TeXコンパイラ実行(各自でパス変更)
objShell.Run("C:/dviout/dviout.exe -1 "+DviFileName,1,0);        //DVIビューアの実行(各自でパス変更)(改良)
 
2006/2/8 (水) 10:37:49 てふにしゃん  >>macro:241

Count.js(文字数・バイト数カウント)

// Count.js ひよこ枕
var CR = 0xd;
var LF = 0xa;

var oShell = new ActiveXObject("WScript.Shell");
var str,msg;
var c,prec=0;
var i;
var iSize  = 0;
var i1Byte = 0;
var i2Byte = 0;
var iCRLF  = 0;
var iCR    = 0;
var iLF    = 0;

str = Editor.GetSelectedString(0);
//選択文字のサイズ(半角1、全角2でカウント)、半角文字数、全角文字数、改行数をカウント
for(i = 0; i < str.length; ++i) {
        c = str.charCodeAt(i);
        //半角文字にあたるコードの場合、1バイトとしてカウント。
        if ( (c >= 0x0 && c <= 0x7d) || (c == 0xf8f0) || (c >= 0xff61 && c <= 0xff9f) || (c >= 0xf8f1 && c < 0xf8f4)) {
                //1Byte文字
                iSize  += 1;
                //改行コード解析
                if       (c == CR) {
                        iCR += 1;
                } else if (c == LF) {
                        //前の文字がCRだったら
                        if (prec == CR) {
                                iCR -= 1;        //CR数を戻して
                                iCRLF += 1;        //CRLF数をインクリメント
                        } else {
                                iLF += 1;
                        }
                } else {
                        i1Byte += 1;
                }
        } else {
                //2Byte文字
                iSize  += 2;
                i2Byte += 1;
        }
        prec = c;//CRLF検査用に保存
        //oShell.Popup("第" + i + "文字:" + c , 0 , "マクロ実行の確認",1);
}

//出力文字列作成
msg  = "";
msg += "サイズ :" + iSize + "バイト\n";
msg += "半角文字:" + i1Byte + "文字\n" ;
msg += "全角文字:" + i2Byte + "文字\n" ;
//改行数は0の場合出さないようにしておく
if (iCR   > 0) msg += "CR改行 :" + iCR    + "文字\n" ;
if (iLF   > 0) msg += "LF改行 :" + iLF    + "文字\n" ;
if (iCRLF > 0) msg += "CRLF改行:" + iCRLF  + "文字" ;
oShell.Popup(msg,0,"文字数カウント結果",0);
2006/1/8 (日) 21:21:33 ひよこ枕  >>macro:229

リナンバリング PerlScript

# リナンバリング  ReNumber.pls
MoveHistSet();        # 現在位置を移動履歴に登録
$LineMax = GetLineCount(0);        # 全論理行数の取得
GoFileTop();        # ファイルの先頭に移動
$Line = ExpandParameter('$y') + 0;
$Num = ExpandParameter('$C');        # カーソル位置の単語
$Len = length($Num);
exit 0 if($Num !~ /\d+/);

$Num =~ /0*$/;
$Inc = ("1" . $&) * 1;
for($i=2; $i <= $LineMax; $i++){
  Jump($i,1);        # 指定行へジャンプ(論理行)
  $Num += $Inc;
  $outputText = sprintf('%0' . $Len . 'd', $Num);
  for($j=0; $j < $Len; $j++){
    Right_Sel();        # (選択)カーソル右移動;
  }
  InsText($outputText);        # テキストを貼り付け
}
Jump($Line,0);        # 元のカーソル行へジャンプ(物理行)
#...............................................................................
2005/11/20 (日) 23:31:11 りーや >>macro:228

固定タブ位置移動(前方) PerlScript

# 固定タブ位置で前方移動  PrevTab.pls
@TabPos = (7, 8, 12, 40, 73);        # Tab位置を昇順に指定
$CurCol = 0 + ExpandParameter('$x');        # 現在の桁位置(col)
@WkList = grep {$_ < $CurCol} @TabPos;
$NextPos = pop @WkList;
if($NextPos){
  for($i=0; ($CurCol - $i) > $NextPos; $i++) {
    Left();        # カーソル左移動
  }
} else {
  GoLineTop(0);        # 行頭に移動(折り返し単位)
  Left();        # カーソル左移動
}
#...............................................................................
2005/11/20 (日) 23:29:37 りーや >>macro:227

固定タブ位置移動(後方) PerlScript

# 固定タブ位置で後方移動  NextTab.pls
@TabPos = (7, 8, 12, 40, 73);        # Tab位置を昇順に指定
MoveHistSet();        # 現在位置を移動履歴に登録
$CurCol = 0 + ExpandParameter('$x');        # 現在の桁位置(col)
GoLineEnd();        # 行末に移動(折り返し単位)
$EndCol = 0 + ExpandParameter('$x');        # 現在の桁位置(col)
MoveHistPrev();        # 移動履歴:前へ
@WkList = grep {$_ > $CurCol} @TabPos;
$NextPos = shift @WkList;
if($NextPos){
  if($NextPos >= $EndCol) {
    GoLineEnd();        # 行末に移動(折り返し単位)
    if($NextPos > $EndCol) {
      $blanks = sprintf('%' . ($NextPos - $EndCol) . 's', ' ');
      InsText($blanks);        # テキストを貼り付け
    }
  } else {
    for($i=0; ($i + $CurCol) < $NextPos; $i++) {
      Right();        # カーソル右移動
    }
  }
} else {
  GoLineEnd();        # 行末に移動(折り返し単位)
  Right();        # カーソル右移動
}
#...............................................................................
#...............................................................................
2005/11/20 (日) 23:29:37 りーや >>macro:227

複数のパターンで置換処理を行う PerlScript

use strict;
use warnings;

use encoding 'cp932';
binmode(STDERR, ':raw :encoding(cp932)');

use Encode;

use Win32::OLE qw/CP_UTF8/;
Win32::OLE->Option(CP => CP_UTF8);			# OLE のインターフェイスを UTF8 に

# パターンファイルの名称取得
my $macfile = ExpandParameter('$M');		# マクロファイル名
(my $patfile = $macfile) =~ s/[^.]+$/txt/;	# パターンファイル名は拡張子を .txt にしたもの

# 選択部分の取得
unless (IsTextSelected()) {
	# 未選択時はパターンファイルを開いて終了
	FileOpen($patfile);
	exit(0);
}
my $seltext = GetSelectedString(0);

# パターンファイルの読み込み
$patfile = encode('cp932', $patfile);		# ファイル名は cp932
open PAT, "<:encoding(cp932)", $patfile or die "can't open $patfile: $!";
my @lines = <PAT>;
close PAT;

# 置換箇所のカウント
my $count = 0;

foreach my $line (@lines) {
	# 改行の除去
	$line =~ s/\r?\n//;
	my ($pattern, $replacement) = split(/\t/, $line, 2);
 
	# 置換処理の実行
	eval { $count += ($seltext =~ s/$pattern/$replacement/g); };
 
	# エラー時
	if ($@) {
		MsgBox($@);							# エラー表示
		FileOpen($patfile);					# パターンファイルを開く
		exit(1);
	}
}

# 置換結果の出力
InsText($seltext);

# 件数の出力
$count = 0 if $count eq '';
MsgBox(encode('cp932', "$count 箇所を置換しました。"));

#...............................................................................
#...............................................................................
#...............................................................................
#...............................................................................
2005/11/7 (月) 01:38:49 miau >>macro:226

PerlScirpt へのパディング処理を行う PerlScirpt

use strict;
use warnings;

use encoding 'cp932';
binmode(STDERR, ':raw :encoding(cp932)');

use Encode;

# パディングの設定
my $pad_char = ".";							# 2 文字目以降の文字
my $pad_columns = 80;						# 一行毎の文字数

# 改行コードの判別
my @retcodes = ("\r\n", "\r", "\n");
my $retcode = $retcodes[GetLineCode()];

# テキスト全体を取得
SelectAll();
my $seltext = GetSelectedString(0);

# バイト数取得
use bytes;
my $bytecount = length($seltext);
no bytes;

# 文字数の取得
my $seltext = decode('cp932', $seltext);
my $wordcount = length($seltext);

# 選択解除&ドキュメント末尾に移動
Right();

# 必要ぶん、適当な文字を挿入
my $count = $bytecount - $wordcount;	# 挿入が必要な文字数
my $instext = $retcode;					# 挿入に使用するバッファ。とりあえず改行文字。
while ($count > 0) {
	$instext .= '#' . $pad_char x ($pad_columns - 1) . $retcode;
	$count -= $pad_columns;
}
$instext = encode('cp932', $instext);	# 挿入前に CP932 にエンコード
InsText($instext);

#...............................................................................
#...............................................................................
2005/11/7 (月) 00:50:16 miau >>macro:225

タブ区切りのテーブル整形

# タブ区切りのテーブル整形
# table.pls
$[ = 1;                        # set array base to 1
$FS = "\t";                # set field separator
$blanks = sprintf('%100s', ' ');
$number = "^[+-]?([0-9,]+[.]?[0-9]*|[.][0-9]+)\$";

$str = $Editor->GetSelectedString(0);        # 選択部分の文字列を取得
if(! $str){exit;}        # 選択範囲がなければ終了

# 各行を一行ずつ処理、一巡目で各項目の最大桁取得
foreach(split(/\r\n/,$str)){
    chomp;        # strip record separator
        $NR++;
    @Fld = split($FS, $_, 9999);
    $row{$NR} = $_;                # 項目数
    for ($i = 1; $i <= $#Fld; $i++) {        # 各フィールドの処理
        if ($Fld[$i] =~ $number) {        # 数字
                if($Fld[$i] =~ /\./) {
                        ($int[$i], $fra[$i]) = split(/\./, $Fld[$i]);
                        $iwid{$i} = &max($iwid{$i}, length($int[$i]));        # 整数
                        $fwid{$i} = &max($fwid{$i}, length($fra[$i]));        # 小数
                        $nwid{$i} = &max($nwid{$i}, $iwid{$i}+$fwid{$i}+1);
                } else {
                        $iwid{$i} = &max($iwid{$i}, length($Fld[$i]));
                        $nwid{$i} = &max($nwid{$i}, $iwid{$i});
                }
                $wid{$i} = &max($wid{$i}, $nwid{$i});
        }
                $wid{$i} = &max($wid{$i}, length($Fld[$i]));
    }
}

# 各行を作業エリアから再処理、二巡目で編集出力
for ($r = 1; $r <= $NR; $r++) {
    $n = (@d = split($FS, $row{$r}, 9999));
    for ($i = 1; $i <= $n; $i++) {
                $sep = ($i < $n) ? '  ' : "\r\n";        #???
                if ($d[$i] =~ $number) {
                    $rtn .= sprintf('%' . $wid{$i} . 's%s', &numjust($i, $d[$i]), $sep);
                }
                else {
                    $rtn .= sprintf('%-' . $wid{$i} . 's%s', $d[$i], $sep);
                }
    }
}

$Editor->InsText($rtn);

sub max {
    my($X, $Y) = @_;
    (($X > $Y) ? $X : $Y);        #??? gt > chenge
}

sub numjust {
    my($n, $S) = @_;
    if($fwid{$n}){ # 小数以下部分あり
            my($i, $f) = split(/\./, $S);
            if($f){ # 小数以下の長さを最大合わせでスペースを補う
                    $S .= substr($blanks, 1, $fwid{$n} - length($f));
            } else { # 小数点の分1桁も足す
                    $S .= substr($blanks, 1, $fwid{$n} + 1);
            }
    }
    # position s in field n
    $S . substr($blanks, 1, int(($wid{$n} - $nwid{$n}) / 2));
}
__END__
プログラミング言語awkのサンプルからa2p変換して
さらに数値項目の小数点位置あわせを追加しました
「キー割り当て一覧のコピー」や表計算ソフトから
の出力などのタブ区切りの値をエディタ上で見易い
テーブル整形を行うPerlScriptです。
整形する範囲を選択してからこのマクロを実行。
end of script 
2005/9/25 (日) 09:45:20 りーや >>macro:220

複数行置換(Perl)

http://miau.s9.xrea.com/blog/index.php?itemid=398
2005/9/19 (月) 20:54:24 miau >>macro:200

マーク行をすべて削除

# MarkLineDelete.pls
MoveHistSet();
GoFileEnd();
$oldLn = ExpandParameter('$y') + 1;
BookmarkPrev();
$newLn = ExpandParameter('$y');
while($oldLn > $newLn){
        GoLineTop(1);
        if($oldLn > $newLn){
                LineDeleteToEnd();
                Delete();
                $oldLn = $newLn;
                BookmarkPrev();
                $newLn = ExpandParameter('$y');
        }
}
MoveHistPrev();
2005/9/11 (日) 09:56:38 りーや >>macro:199

マーク行を集めてクリップボード

# MarkLineClip.pls
MoveHistSet();
GoFileTop();
BookmarkNext();
$newLn = ExpandParameter('$y');
while($oldLn < $newLn){
        GoLineTop(1);
        GoLineEnd_Sel();
        $str = GetSelectedString(0);
        GoLineTop(1);
        if($oldLn < $newLn){
                $outStr = $outStr . $str . "\r\n";
                $oldLn = $newLn;
                BookmarkNext();
                $newLn = ExpandParameter('$y');
        }
}
use Win32::Clipboard;
$CLIP = Win32::Clipboard();
$str = GetSelectedString();
$CLIP->Set( $outStr );
MoveHistPrev();
2005/9/11 (日) 09:56:38 りーや >>macro:199

テキストブラウザ(use IE Ojbect)

'TextBrowser.vbs
Dim uri
uri = Editor.GetSelectedString(0)
If uri = "" Then
    uri = "http://www.yahoo.co.jp/"
Else
    If Left(uri, 7) <> "http://" And InStr(uri, "/") > 0 Then
        Editor.GoFileTop()
        Editor.GoLineEnd_Sel(0)
        uri = Right(uri, Len(uri) - InStr(uri, "/"))
        uri = Editor.GetSelectedString(0) & uri
    End If
End If

Editor.SelectAll()
Editor.InsText(uri & " を読み込み中...")
Editor.GoFileTop()
Editor.ReDraw()

Dim ie
Set ie = CreateObject("InternetExplorer.Application")

If Not ie Is Nothing Then
    ie.Visible = False
    ie.Navigate(uri)

    Do While ie.Busy
    Loop

    Dim body

    body = uri & vbCrLf
    body = body & ie.document.title & vbCrLf
    body = body & "------------------------------------------------------------" & vbCrLf
    body = body & get_html(ie.Document.Body.childNodes, "")

    Editor.SelectAll()
    Editor.InsText(body)
    Editor.GoFileTop()
    Editor.ReDraw()

    ie.Quit()
End If

Function get_html(ByVal document, ByVal margin)
    Dim v

    For Each v In document

        Select Case TypeName(v)
        Case "DispHTMLDOMTextNode":
            Dim dv, prev_dv
            dv = Trim(v.data)
            Do
                prev_dv = dv
                dv      = Replace(dv, "  ", " ")
            Loop While dv <> prev_dv

            If dv <> "" Then get_html = get_html & dv
        Case "HTMLAnchorElement":
            get_html = get_html & get_html(v.childNodes, margin)
            get_html = get_html & "<""" & v.href & """>"
        Case Else:
            Dim indent
            indent = ""

            Select Case v.tagName
            Case "P", "DIV", "TABLE", "TR":
                indent = Space(2)
                get_html = get_html & vbCrLf & margin
            End Select

            get_html = get_html & get_html(v.childNodes, margin & indent)

            If indent <> "" Then get_html = get_html & vbCrLf
        End Select
    Next
End Function
マクロ:2005/9/6 (火) 00:07:56 (全略)

テキストブラウザ化(Html Source View)

var selection = Editor.GetSelectedString(0);
if(selection.length == 0)
{
    selection = "http://www.yahoo.co.jp/";
}
else
{
    if(!selection.match(/:\/\/.*/))
    {
        Editor.GoFileTop();
        Editor.Down();
        Editor.GoLineEnd_Sel(0);
        selection = selection.replace(/^\//, "");
        selection = Editor.GetSelectedString(0) + selection;
    }
}

Editor.SelectAll();
Editor.InsText(selection + " を読み込み中...");
Editor.GoFileTop();
Editor.ReDraw();

var http = new ActiveXObject("Microsoft.XMLHTTP");

if(http != null)
{
    var uri = selection;
    http.open("GET", uri, false);
    http.send(null);
 
    var html = http.responseText;
    var result = "";
    result += "------------------------------------------------------------\r\n";
    result += selection + "\r\n";
    result += "------------------------------------------------------------\r\n";
    result += html;
 
    Editor.SelectAll();
    Editor.InsText(result);
    Editor.GoFileTop();
    Editor.ReDraw();
}
マクロ:2005/8/26 (金) 21:52:59 ぷる

選択行コメントアウト

//Comment.js
//拡張子別に行コメント文字を定義
var aExt = new Array();
aExt["c"] = "//";   aExt["cpp"] = "//"; aExt["h"] = "//";
aExt["js"] = "//";
aExt["vbs"] = "'";  aExt["bas"] = "'";  aExt["frm"] = "'";  aExt["cls"] = "'";
aExt["mac"] = "//";
aExt["pl"] = "#";   aExt["pm"] = "#";   aExt["cgi"] = "#";
aExt["tex"] = "%";
aExt["php"] = "//";
aExt["asm"] = ";";
aExt["uws"] = "//";
aExt["conf"] = ";"; aExt["cnf"] = ";";  aExt["ini"] = ";";  aExt["inf"] = ";";
aExt["ppa"] = "//";
aExt["cmd"] = "rem";    aExt["bat"] = "rem";

//行選択されていなくても
GoLineTop(13);
sSelect = GetSelectedString(0);
if (sSelect.length == 0) GoLineEnd_Sel();

//拡張子を切り出し
sExt = ExpandParameter("$f");
sExt = sExt.substring( sExt.lastIndexOf(".") + 1);
sExt = sExt.toLowerCase()

//選択範囲を置換
if (aExt[sExt] == "rem"){
    //コメントアウト用
    ReplaceAll ("^.", "rem\t$&", 148);
    //コメント解除用
    //ReplaceAll ("^([\t\s]*)rem[\t\s]", "$1", 148);
}
else {
    //コメントアウト用
    ReplaceAll ("^.", aExt[sExt] + "$&", 148);
    //コメント解除用
    //ReplaceAll ("^([\t\s]*)" + aExt[sExt], "$1", 148);
}
CancelMode();
SearchClearMark();
ReDraw(0);
一般:2005/7/21 (木) 00:03:54 maru

選択行コメントアウト解除

//CommentUndo.js
//拡張子別に行コメント文字を定義
var aExt = new Array();
aExt["c"] = "//";   aExt["cpp"] = "//"; aExt["h"] = "//";
aExt["js"] = "//";
aExt["vbs"] = "'";  aExt["bas"] = "'";  aExt["frm"] = "'";  aExt["cls"] = "'";
aExt["mac"] = "//";
aExt["pl"] = "#";   aExt["pm"] = "#";   aExt["cgi"] = "#";
aExt["tex"] = "%";
aExt["php"] = "//";
aExt["asm"] = ";";
aExt["uws"] = "//";
aExt["conf"] = ";"; aExt["cnf"] = ";";  aExt["ini"] = ";";  aExt["inf"] = ";";
aExt["ppa"] = "//";
aExt["cmd"] = "rem";    aExt["bat"] = "rem";

//行選択されていなくても
GoLineTop(13);
sSelect = GetSelectedString(0);
if (sSelect.length == 0) GoLineEnd_Sel();

//拡張子を切り出し
sExt = ExpandParameter("$f");
sExt = sExt.substring( sExt.lastIndexOf(".") + 1);
sExt = sExt.toLowerCase()

//選択範囲を置換
if (aExt[sExt] == "rem"){
    //ReplaceAll ("^.", "rem\t$&", 148);        //コメントアウト
    ReplaceAll ("^([\t\s]*)rem[\t\s]", "$1", 148);  //コメント解除
}
else {
    //ReplaceAll ("^.", aExt[sExt] + "$&", 148);        //コメントアウト
    ReplaceAll ("^([\t\s]*)" + aExt[sExt], "$1", 148);  //コメント解除
}
CancelMode();
SearchClearMark();
ReDraw(0);
一般:2005/7/21 (木) 00:03:54 maru

マクロ内でステータスバー情報の取得

'' AutoItX3でステータスバーを表示 StatusBar.vbs
Dim wkStr, I
Set oAutoIt = CreateObject("AutoItX3.Control")
Set WshShell = CreateObject("WScript.Shell")
oAutoIt.AutoItSetOption "WinTitleMatchMode", 2
For I = 1 To 7
  wkStr = wkStr & "|" & oAutoIt.StatusbarGetText( "sakura", "",I)
Next
WshShell.Popup wkStr, 0, "Status Bar", 1
AutoItXが必要。
マクロ:2005/7/17 (日) 02:05:41 りーや

MS-IME単語登録 PerlScript

# AddWordIME.pls
use Win32::GuiTest qw(FindWindowLike SetForegroundWindow SendKeys);
use Win32::Clipboard;
$CLIP = Win32::Clipboard();
$Win32::GuiTest::debug = 0;
$execComm = "C:\\WINDOWS\\ime\\IMJP8_1\\imjpdct.exe";
@windows = FindWindowLike(0, "\x92\x50\x8c\xea\x2f");
$kanji = GetSelectedString(0);
unless($kanji){
    SelectWord();
    $kanji = GetSelectedString(0);
}
Copy();
if (not @windows) {
    ExecCommand($execComm  , 0 );
    while(not @windows){
        sleep 1;
        @windows = FindWindowLike(0, "\x92\x50\x8c\xea\x2f");
    }
}
$imeWin = shift(@windows);
SetForegroundWindow($imeWin);
SendKeys("{PAUSE 300}");
SendKeys("%g");
SendKeys("^v");
$CLIP->Empty();
SendKeys("+{HOME}");
SendKeys("{F13}", 300);
SendKeys("{ESCAPE}", 200);
SendKeys("{ESCAPE}", 200);
SendKeys("+{END}");
SendKeys("^c");
$kana = $CLIP->GetText();
if($kana == $kanji){
    SendKeys("{F13}", 300);
    SendKeys("{ESCAPE}", 200);
    SendKeys("{ENTER}");
}
SendKeys("+{HOME}");
SendKeys("^c");
$kana = $CLIP->GetText();
SendKeys("{F13}", 300);
SendKeys("{ENTER}");
SendKeys("%y");
SendKeys("^v");
拡張モジュールのWin32::GuiTestが必要とのこと。
マクロ:2005/7/1 (金) 20:35:24 りーや

選択範囲またはカーソル位置の単語で音楽検索

'otw_music.vbs --------------------------------
'音楽検索
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://search.music.yahoo.co.jp/bin/musicsearch" _
    & "?cp=" & URLEncode(sWord) & "&cc=fs"
objIE.Navigate( naviURL )

Private Function URLEncode(sWord)
    For iCnt = 1 To Len(sWord)
        sHex = sHex & Hex(Asc(Mid(sWord, iCnt)))
    Next
    For iCnt = 1To Len(sHex) Step 2
        sUrl = sUrl & "%" & Mid(sHex, iCnt, 2)
    Next
    URLEncode = sUrl
End Function
マクロ:2005/6/26 (日) 02:35:51 maru

選択範囲またはカーソル位置の単語で価格.comを検索

'otw_kakaku.vbs --------------------------------
'価格.com
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://kakaku.com/txtsearch/txtsearch.asp" _
    & "?TopCategoryCD=&SearchWord=" & URLEncode(sWord)
objIE.Navigate( naviURL )

Private Function URLEncode(sWord)
    For iCnt = 1 To Len(sWord)
        sHex = sHex & Hex(Asc(Mid(sWord, iCnt)))
    Next
    For iCnt = 1To Len(sHex) Step 2
        sUrl = sUrl & "%" & Mid(sHex, iCnt, 2)
    Next
    URLEncode = sUrl
End Function
マクロ:2005/6/26 (日) 02:35:51 maru

選択範囲またはカーソル位置の単語でPerlリファレンス

'otw_perl_ref.vbs --------------------------------
'Perlリファレンス
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://www2u.biglobe.ne.jp/~MAS/cgi-bin/perl_ref.cgi" _
    & "?query=" & URLEncode(sWord)
objIE.Navigate( naviURL )

Private Function URLEncode(sWord)
    For iCnt = 1 To Len(sWord)
        sHex = sHex & Hex(Asc(Mid(sWord, iCnt)))
    Next
    For iCnt = 1To Len(sHex) Step 2
        sUrl = sUrl & "%" & Mid(sHex, iCnt, 2)
    Next
    URLEncode = sUrl
End Function
マクロ:2005/6/26 (日) 02:19:56 maru

選択範囲またはカーソル位置の単語で2chスレタイ検索

'otw_2ch.vbs --------------------------------
'2chスレタイ検索
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://www.domo2.net/search/search.cgi" _
    & "?word=" & URLEncode(sWord)
objIE.Navigate( naviURL )

Private Function URLEncode(sWord)
    For iCnt = 1 To Len(sWord)
        sHex = sHex & Hex(Asc(Mid(sWord, iCnt)))
    Next
    For iCnt = 1To Len(sHex) Step 2
        sUrl = sUrl & "%" & Mid(sHex, iCnt, 2)
    Next
    URLEncode = sUrl
End Function
マクロ:2005/6/26 (日) 02:19:56 maru

選択範囲でPCIベンダID検索

// otw_pci_deviceID.js -------------------------------------
// PCIベンダID検索
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var sWord = Editor.ExpandParameter("$C");

var naviURL = "http://www.pcidatabase.com/search.php" +
  "?vendor_search_str=" + sWord;
objIE.Navigate( naviURL );
マクロ:2005/6/26 (日) 02:18:28 maru

選択範囲でPCIデバイスID検索

// otw_pci_deviceID.js -------------------------------------
// PCIデバイスID検索
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var sWord = Editor.ExpandParameter("$C");

var naviURL = "http://www.pcidatabase.com/search.php" +
  "?device_search_str=" + sWord;
objIE.Navigate( naviURL );
マクロ:2005/6/26 (日) 02:18:28 maru

選択範囲のアドレスでnslookup

// otw_nslookup.js ---------------------------------------------
// nslookup
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var sWord = Editor.ExpandParameter("$C");
sWord = sWord.replace(/http:\/\//,'');
sWord = sWord.replace(/https:\/\//,'');
sWord = sWord.replace(/ftp:\/\//,'');
sWord = sWord.replace(/\/.*/,'');

var naviURL = "http://www.makko.biz/nslookup/nslookup.php" +
  "?q=" + sWord;
objIE.Navigate( naviURL );

マクロ:2005/6/26 (日) 02:18:28 maru

選択範囲のドメイン名でwhois検索

// otw_whois.js ------------------------------------------------
// whois検索
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var sWord = Editor.ExpandParameter("$C");
sWord = sWord.replace(/http:\/\//,'');
sWord = sWord.replace(/https:\/\//,'');
sWord = sWord.replace(/ftp:\/\//,'');
sWord = sWord.replace(/\/.*/,'');
sWord = sWord.match(/[^\.]+\.[^\.]+$/g);

var naviURL = "http://www.makko.biz/whois/whois.php" +
  "?q=" + sWord[0];
objIE.Navigate( naviURL );
マクロ:2005/6/26 (日) 02:18:28 maru

選択範囲のアドレスをインフォシークWeb翻訳

'otw_info_WebTrans.vbs --------------------------------
'インフォシークWeb翻訳
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://honyakuinfoseek.infoseek.co.jp/amiweb/browser.jsp" _
    & "?langpair=1%2C2&url=" & sWord _
    & "&display=2&lang=JA&toolbar=yes&c_id=honyakuinfoseek"
objIE.Navigate( naviURL )
マクロ:2005/6/26 (日) 01:01:37 maru

選択範囲またはカーソル位置の単語でMSDN検索

'otw_msdn.vbs --------------------------------
'MSDN
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://www.microsoft.com/japan/msdn/shared/components/mscomsearch30.aspx" _
    & "?SearchScope=2&qu=" & URLEncode(sWord)
objIE.Navigate( naviURL )

Private Function URLEncode(sWord)
    For iCnt = 1 To Len(sWord)
        sHex = sHex & Hex(Asc(Mid(sWord, iCnt)))
    Next
    For iCnt = 1To Len(sHex) Step 2
        sUrl = sUrl & "%" & Mid(sHex, iCnt, 2)
    Next
    URLEncode = sUrl
End Function

マクロ:2005/6/26 (日) 01:01:37 maru

選択範囲またはカーソル位置の単語で拡張子検索

'otw_ext.vbs ----------------------------------------
'拡張子検索
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://www.55555.to/ext/go/ext.cgi" _
    & "?text=" & sWord
objIE.Navigate( naviURL )
マクロ:2005/6/26 (日) 01:01:37 maru

選択範囲またはカーソル位置の単語でインフォシークカタカナ辞典を検索

'otw_info_katakana.vbs --------------------------------
'インフォシークカタカナ
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://jiten.www.infoseek.co.jp/Katakana" _
    & "?pg=result_kn.html&col=KN&sv=DC" _
    & "&qt=" & URLEncode(sWord)
objIE.Navigate( naviURL )

Private Function URLEncode(sWord)
    For iCnt = 1 To Len(sWord)
        sHex = sHex & Hex(Asc(Mid(sWord, iCnt)))
    Next
    For iCnt = 1To Len(sHex) Step 2
        sUrl = sUrl & "%" & Mid(sHex, iCnt, 2)
    Next
    URLEncode = sUrl
End Function
マクロ:2005/6/26 (日) 01:00:58 maru

選択範囲またはカーソル位置の単語でインフォシーク国語辞典を検索

'otw_info_kokugo.vbs ----------------------------------
'インフォシーク国語辞典
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://jiten.www.infoseek.co.jp/Kokugo" _
    & "?sm=1&pg=result_k.html&col=KO&sv=DC" _
    & "&qt=" & URLEncode(sWord)
objIE.Navigate( naviURL )

Private Function URLEncode(sWord)
    For iCnt = 1 To Len(sWord)
        sHex = sHex & Hex(Asc(Mid(sWord, iCnt)))
    Next
    For iCnt = 1To Len(sHex) Step 2
        sUrl = sUrl & "%" & Mid(sHex, iCnt, 2)
    Next
    URLEncode = sUrl
End Function
マクロ:2005/6/26 (日) 01:00:58 maru

選択範囲またはカーソル位置の単語でアスキーデジタル用語を検索

'otw_ascii_yougo.vbs ---------------------------------
'アスキーデジタル用語
sWord = Editor.ExpandParameter("$C")
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = true

naviURL = "http://yougo.ascii24.com/gh/search/" _
    & "?pattern=" & URLEncode(sWord)
objIE.Navigate( naviURL )

Private Function URLEncode(sWord)
    For iCnt = 1 To Len(sWord)
        sHex = sHex & Hex(Asc(Mid(sWord, iCnt)))
    Next
    For iCnt = 1To Len(sHex) Step 2
        sUrl = sUrl & "%" & Mid(sHex, iCnt, 2)
    Next
    URLEncode = sUrl
End Function
マクロ:2005/6/26 (日) 01:00:58 maru

テキスト電卓+支援

// calcPopup.vbs --------------------
Dim WshShell, wk
set args = WScript.Arguments
set WshShell = WScript.CreateObject("WScript.Shell")
wk = WshShell.Popup(args(0), 2 ,"計算式")
マクロ:2005/6/25 (土) 17:14:11 りーや

マクロのヘルプを開くとき自動で'S_'補う

// MacroHelp.js ---------------
// マクロ・ヘルプをキーワードで開く
var hlpfile = "C:\\Program Files\\sakura\\SakuraMacro.chm";
var curStr = Editor.ExpandParameter('$C');
if(curStr == "Editor"){
    Editor.WordRight();
    curStr = Editor.ExpandParameter('$C');
}
if(curStr == "."){
    Editor.WordRight();
    curStr = Editor.ExpandParameter('$C');
}
if(curStr.match(/^S_/) == null)
    curStr = "S_".concat(curStr);
Editor.ExtHtmlHelp(hlpfile,curStr);
マクロ:2005/6/23 (木) 02:23:13 りーや

テキスト電卓+(perl)

# eval.pls
$selStr = GetSelectedString(0);
unless($selStr){
        MoveHistSet();  BeginSelect();  GoLineTop(1);
        $selStr = GetSelectedString(0);
        $selStr =~ /^(.+)\t(.*)$/;
        if($2){
            $selStr = $2;
                $preFix = $1 . "\t";
    }
}
if($selStr =~ /^(.+)=[ \t\r\n]*$/){
    $outStr = eval $1;
    $outStr = $selStr . $outStr;
} else {
    $outStr = eval $selStr;
}
if($@){
    use Win32::OLE;
    $WshShell = Win32::OLE->CreateObject("WScript.Shell");
    $WshShell->Popup("$selStr\n$@",undef,"Abend",0);
    CancelMode();  MoveHistPrev();
    exit;
} else {
    InsText($preFix . $outStr);
}
マクロ:2005/6/21 (火) 17:30:25 りーや

テキスト電卓+(js)

// calcPlus.js -------------
// テキスト電卓+
var WshShell = new ActiveXObject("WScript.Shell");
var outStr="" , calStr="" , preStr="" , postStr="";
var re = /(abs|acos|asin|atan|atan2|ceil|cos|exp|floor|log|max|min|pow|random|round|sin|s
qrt|tan)/g;
var selStr = Editor.GetSelectedString(0);   // 選択文字列を取得
Editor.MoveHistSet();   // 現在位置を移動履歴に登録
if(selStr == ""){   // 選択範囲がないなら以下を行なう
    Editor.BeginSelect();   // 範囲選択開始
    Editor.GoLineTop(1);    // 行頭に移動(折り返し単位)
    selStr = Editor.GetSelectedString(0);   // 選択文字列を取得
    selStr.match(/^(.*?)([ %&(-/0-9<>M^a-il-uwx|~゜゜°]+)( *?=? *?)$/);
    preStr = RegExp.$1;     // 計算式の前
    calStr = RegExp.$2;     // 計算式部分
    postStr = RegExp.$3;    // 計算式の後
    if(calStr != ""){       // 計算式と思われるものがあるなら
        selStr = calStr;    // selStr は作業用エリアとして利用コピー退避
    } else {                // 計算式が見つからないとき(マッチしてない)
        preStr = selStr;    // 行が消えないようにすべてを残す
    }
} else {                    // 明示的に選択範囲により計算式の指定がある
    calStr = selStr;        // ので、そのまま計算式とする。
}
if(calStr.match(/Math\./) == null)          // Math. が使われてないなら
    calStr = calStr.replace(re, "Math\.$&");  // 算術関数名にMath.付け
calStr = calStr.replace(/(°|゜|゜)/g, "*3.141592653589793238/180");  // Deg→Rad
try {
    outStr = eval(calStr);                  // 式を結果で置き換えて
    if(postStr != "") outStr = selStr + postStr + outStr;
    if(preStr != "") outStr = preStr + outStr;
    Editor.InsText(outStr);             // 選択範囲部分に貼り付ける
    try {   // 計算式の表示、まさにトライ
        var tryStr = "calcPopup.vbs \"" + selStr + "\""
        eval("WshShell.run(tryStr);");
    } catch (error) {
    // エラーでもスルーする
    }
} catch (error) {  // eval のエラーをトラップ?
    WshShell.Popup(calStr+"\n"+error ,0,"計算式に間違い",0);
    Editor.CancelMode();    // 各種モードの取り消し
    Editor.MoveHistPrev();  // 移動履歴:前へ
}
マクロ:2005/6/25 (土) 17:11:44 りーや

選択範囲またはカーソル位置の単語でJM

// jm.js -----------------------------------------------------
// 選択範囲またはカーソル位置の単語でJM
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var strWord = Editor.ExpandParameter("$C");
var naviURL = "http://search.linux.or.jp/cgi-bin/JM/man.cgi" +
  "?Sec1=on&Sec2=on&Sec3=on&Sec4=on" +
  "&Sec5=on&Sec6=on&Sec7=on&Sec8=on" +
  "&Pagename=" + strWord;
objIE.Navigate( naviURL );
マクロ: 2005/6/20 (月) 23:12:08 maru

選択範囲またはカーソル位置の単語でJM全文検索

// JMnamazu.js ------------------------------------------------
// 選択範囲またはカーソル位置の単語でJM全文検索
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var strWord = Editor.ExpandParameter("$C");
var naviURL = "http://minori.linux.or.jp/cgi-bin/namazu.cgi" +
  "?key=" + strWord +
  "&whence=0&dbname=JM&max=20&format=long&sort=score";
objIE.Navigate( naviURL );

マクロ: 2005/6/20 (月) 23:12:08 maru

選択範囲またはカーソル位置の郵便番号検索

// zipcode.js ------------------------------------------------
// 選択範囲またはカーソル位置の郵便番号検索
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var strWord = Editor.ExpandParameter("$C");
var naviURL = "http://www.benri.com/zipcode/zipcode.cgi" +
  "?Keyword=" + strWord;
objIE.Navigate( naviURL );
マクロ: 2005/6/20 (月) 23:12:08 maru

選択範囲またはカーソル位置の住所で地図検索

// gooMap.js ------------------------------------------------
// 選択範囲またはカーソル位置の住所を地図検索
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var strWord = Editor.ExpandParameter("$C");
var naviURL = "http://channel.goo.ne.jp/map/search.php?MT=" +
  strWord + "&sw=1";
objIE.Navigate( naviURL );
マクロ: 2005/6/20 (月) 23:12:08 maru

選択範囲またはカーソル位置の単語で法令名検索

// law.js ------------------------------------------------
// 選択範囲またはカーソル位置の単語で法令検索
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var strWord = Editor.ExpandParameter("$C");
var naviURL = "http://law.e-gov.go.jp/cgi-bin/idxsearch.cgi" +
  "?H_NAME=" + strWord +
  "&H_NAME_SUBMIT=%8C%9F%8D%F5&H_RYAKU=1&H_YOMI_GUN=1" +
  "&H_CTG_GUN=1&H_NO_GENGO=H&H_NO_YEAR=&H_NO_TYPE=2&H_NO_NO=";
objIE.Navigate( naviURL );
マクロ: 2005/6/20 (月) 23:12:08 maru

選択範囲またはカーソル位置の単語をWeb辞書でひく(英辞郎)

// eijirou.js
// 選択範囲またはカーソル位置の単語で英辞郎on the Web英和・和英
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var strWord = Editor.ExpandParameter("$C");
var naviURL = "http://www2.alc.co.jp/ejr/index.php?word_in=" +
  strWord + "&word_in2=あいうえお&word_in3=PVawEWi72JXCKoa0Je";
objIE.Navigate( naviURL );
マクロ:2005/6/20 (月) 13:37:08 りーや

選択範囲またはカーソル位置の単語をWeb辞書でひく(goo国語)

// goojpdic.js
// 選択範囲またはカーソル位置の単語で goo国語辞典
var objIE =  new ActiveXObject("InternetExplorer.Application");
objIE.Visible = true;        // True
var strWord = Editor.ExpandParameter("$C");
var naviURL = "http://dictionary.goo.ne.jp/search.php?MT=" +
               strWord + "&kind=jn&mode=0";
// &kind=ej で英和、&kind=je で和英
objIE.Navigate( naviURL );
マクロ:2005/6/20 (月) 13:37:08 りーや

マクロの中から違うマクロを実行

var fso, f, mac;
fso = new ActiveXObject("Scripting.FileSystemObject");
f = fso.OpenTextFile("c:\\Sakura\\Macro\\test.js", 1);
mac = f.ReadAll();
eval(mac);
サンプルはJScriptですが、PerlScriptでも使用可能とのこと。
マクロ:2005/6/20 (月) 12:19:02 りーや

直前の閉じていない HTML/XML タグを閉じる

/************************************************
**  Close Last Tag 2.1                         **
*************************************************
**  A "Sakura-Editor Macro" using WSH 5.6      **
**  For sakura.exe ver.1.4.7.0 and over        **
**            Copyright (C) 2004-2005 gis_dur  **
*************************************************
**【動作】                                     **
**  カーソル位置より前にある HTML/XML タグを   **
**  ファイル先頭に向かって検索し、             **
**  1. 閉じていないコメント                    **
**  2. 終了タグのない開始タグ                  **
**  がある場合、対応する終了タグを挿入します。 **
**  コメントタグ内は無視します。               **
************************************************/

// ======== 設定開始 ========

// true  : 構文エラーメッセージ非表示
// false : 構文エラーメッセージ表示
var QUIET_MODE  = false;
// 文字列 NO_CLOSE_TAG で指定された終了タグについて、
// true  : タグの省略を許さない (XML  モード)
// false : 常に省略する         (HTML モード)
var XML_MODE    = false;
// 省略可能な終了タグ
var NO_CLOSETAG = "|area|base|basefont|bgsound|br|col|embed|frame" +
                  "|hr|img|input|isindex|keygen|link|meta|nextid" +
                  "|param|spacer|wbr|!doctype|"; // 小文字で記述
// 省略可能な終了タグを増やすには、以下のように追加します
// var NO_CLOSETAG += "|colgroup|dd|dt|li|option|p|rp|rt|";

// ======== 設定終了 ========

/***********************************************************
**  変数定義                                              **
***********************************************************/
// 正規表現オブジェクト
var regExpObj_tags     =
    new RegExp("<[/!]?[A-Za-z][\\w\\-:]*([^>]*/>)?|<!--|-->", "g");
var regExpObj_newLines =
    new RegExp("\x0d\x0a|\x0d|\x0a", "g");
// 終了タグスタック
var stack_tags = new Array();
// 全タグ
var TagsArray  = new Array();
// タグ総数
var ntags = 0;
// 全行
var LinesArray = new Array();
// 行総数
var nlines = 0;
// カーソル位置
var cursorX, cursorY;
// カーソル位置より前にある全テキスト
var all_text = "";
// 現在判定中のテキスト
var now_text = "";
// カーソル位置に挿入するテキスト
var ins_text = "";
// テンポラリ文字列
var tmp_str  = "";

// コメントブロック処理中であれば true
var b_comment = false;

/***********************************************************
**  主処理                                                **
***********************************************************/
// 選択状態を解除
Editor.CancelMode(0);
// カーソル位置取得
cursorX = Number(Editor.ExpandParameter('$x'))-1;
cursorY = Number(Editor.ExpandParameter('$y'))-1;
// 全て選択
Editor.SelectAll(0);
// 読み込み
all_text = Editor.GetSelectedString(0);
// 選択状態を解除
Editor.CancelMode(0);

// 改行コード統一
all_text = all_text.replace(regExpObj_newLines, "\x0d\x0a");
// 行に分解
LinesArray  = all_text.split(/\n/);
nlines  = LinesArray.length;
// カーソル行の文字列を取得
tmp_str = LinesArray[cursorY];
// カーソルが最終行にあって、かつ最終行に一文字も無い場合、
// 現在行は空文字列とする。
if (tmp_str == null) tmp_str = "";
// カーソル以前の文字列のみ残す
if (nlines-(cursorY+1) > 0)
    LinesArray.splice(cursorY+1, nlines-(cursorY+1));
for (var i=0; i<cursorX; i++)
    if (isKanji(tmp_str.charAt(i)))
        cursorX--;
LinesArray[cursorY] = tmp_str.substring(0, cursorX);
// タグのリストを取得
TagsArray = LinesArray.join("\n").match(regExpObj_tags);
// タグ総数を取得
if (TagsArray == null) {
    ntags = 0;
} else {
    ntags = TagsArray.length;
}

// 直前の開始タグを検索する
for (var i=ntags-1;i>=0;i--) {
    // 注目しているタグまたはコメント
    if (!XML_MODE) {
        now_text = TagsArray[i].toLowerCase();
    } else {
        now_text = TagsArray[i];
    }
    // コメントブロック内での処理
    if ( b_comment ) {
        // コメント開始タグ
        if ( now_text=="<!--" ) {
            // コメントブロック処理を抜け出す
            b_comment = false;
        }
    // 通常処理
    } else {
    // -->
        if ( now_text=="-->" ) {
            // 検索位置より前はコメントブロック
            b_comment = true;
    // <!--
        } else if ( now_text=="<!--" ) {
            // コメント終了タグを挿入して終了
            ins_text = "-->";
            break;
    // <.../>
        } else if ( now_text.indexOf("/>")!=-1 ) {
            // 終了タグが必要ないので無視
    // </...>
        } else if ( now_text.indexOf("</")==0 ) {
            now_text = now_text.substring(2);
            // 終了タグスタックに追加
            stack_tags.push(now_text);
        } else {
            now_text = now_text.substring(1);
            // 終了タグをとらないタグは無視
            if (!XML_MODE && NO_CLOSETAG.indexOf("|"+now_text+"|")!=-1)
                continue;
            // 終了タグスタックの要素が無い場合
            // 対応する終了タグを挿入して終了
            if ( stack_tags.length==0 ) {
                ins_text = "</"+ TagsArray[i].substring(1) +">";
                break;
            // 終了タグスタックの最終要素と比較
            // 一致すれば無視して次のタグを検索
            // 一致しなければタグの包含関係に誤り
            // 例:<a> <b> </a> </b> ... |←検索開始位置
            } else {
                tmp_str = stack_tags.pop();
                if ( now_text!=tmp_str ) {
                    tmp_str = "タグの包含関係が不正です\n" +
                              "<" + now_text + "> ... ... " +
                              "</" + tmp_str + ">";
                    popup_error( tmp_str );
                    stack_tags=new Array();
                    break;
                }
            }
        }
    }
}

if (ins_text != "") {
    // 終了タグを挿入
    Editor.InsText(ins_text);
} else {
    // 不正なコメントブロック
    if ( b_comment )
        popup_error("コメントの開閉関係が不正です");
    // 終了タグスタックに余り要素
    if ( stack_tags.length ) {
        tmp_str = stack_tags.pop();
        tmp_str = "開始タグの無い終了タグが見つかりました\n" +
                  "</" + tmp_str + ">";
        popup_error( tmp_str );
    }
}

/***********************************************************
**  2バイト文字判定                                      **
***********************************************************/
function isKanji(c) {
    var tmp = escape(c);
    if (tmp.charAt(0) != "%") return false;
    if (tmp.charAt(1) == "u") return true;
    else return false;
}

/***********************************************************
**  エラー出力処理                                        **
***********************************************************/
function popup_error(err_string) {
    if (!QUIET_MODE) {
        Editor.SearchClearMark(0);
        var shell = new ActiveXObject("WScript.Shell");
        shell.Popup(err_string, 0, "HTML 文法エラー", 0);
    }
}
マクロ:2005/7/17 (日) 02:12:51 gis_dur

WC(WordCounter)

// ws.js
var WshShell =  new ActiveXObject("WScript.Shell");
var nl = 0, nw = 0, nc = 0;
// line, word and character counters

var selStr = Editor.GetSelectedString(0);
if(selStr.length > 0) {
  nc = selStr.length;
  var words = selStr.split(/\s+/);
  nw = words.length;
  var lines = selStr.split(/\n/);
  nl = lines.length;
}

var outStr = "lines:" + nl.toString();
outStr += " words:" + nw.toString();
outStr += " chars:" + nc.toString();

WshShell.Popup(outStr, 0 , "Word Count", 0);
マクロ:2005/5/27 (金) 20:58:13 りーや

追加コピー(Perl)

# AddCopy.pls ( date:105-04-27 time:20:41 )
# AddCopy selection string -> clipboard
use Win32::Clipboard;
$CLIP = Win32::Clipboard();
$str = GetSelectedString();
$clip = $CLIP->GetText();
$clip = $clip . $str;
$CLIP->Set( $clip );
InsText($str);
マクロ:2005/5/27 (金) 20:58:13 りーや

追加切り取り(perl)

# AddCut.pls ( date:105-04-27 time:20:41 )
# AddCut selection string -> clipboard
use Win32::Clipboard;
$CLIP = Win32::Clipboard();
$str = GetSelectedString();
$clip = $CLIP->GetText();
$clip = $clip . $str;
$CLIP->Set( $clip );
InsText("");
マクロ:2005/5/27 (金) 20:58:13 りーや

追加コピー(js)

// AddCopy.js
var IEobj =  new ActiveXObject("InternetExplorer.Application");
IEobj.Navigate("about:blank");
var Str = Editor.GetSelectedString();
var Clip = IEobj.Document.parentWindow.clipboardData.getData("Text");
var Outstr = Clip.concat(Str);
IEobj.Document.parentWindow.clipboardData.setData("Text" , Outstr);
Editor.InsText(Str);
マクロ:2005/5/29 (日) 20:16:40 りーや

追加切り取り(js)

// AddCut.js
var IEobj =  new ActiveXObject("InternetExplorer.Application");
IEobj.Navigate("about:blank");
var Str = Editor.GetSelectedString();
var Clip = IEobj.Document.parentWindow.clipboardData.getData("Text");
var Outstr = Clip.concat(Str);
IEobj.Document.parentWindow.clipboardData.setData("Text" , Outstr);
Editor.InsText("");
マクロ:2005/5/29 (日) 20:16:40 りーや

辞書引きソフトのJammingを呼び出し

//Jamming用に修正
//↑
// DDWinで現在位置の単語を検索
//
// 秀丸マクロの移植版
// Oct. 21, 2002 genta
// ↑の PPA.DLL 移植版
// マクロファイルの拡張子は必ず .PPA にすること。PPA.DLL 必須。

var // 変数を確保する場所
word,group:String; // 文字変数を用意
begin
    word  := S_GetSelectedString(0);
    group := '外国語';

    if word <> '' then
    begin
        if      Copy(word,length(word)-2,3) = 'ies' then
        word := Copy(word,1,length(word)-3) + 'y'
        else if Copy(word,length(word)-3,4) = 'ness' then
        word := Copy(word,1,length(word)-4) + '*'
        else if Copy(word,length(word)-2,3) = 'ing' then
        word := Copy(word,1,length(word)-3) + '*'
        else if Copy(word,length(word)-2,3) = 'est' then
        word := Copy(word,1,length(word)-3) + '*'
        else if Copy(word,length(word)-1,2) = 'es' then
        word := Copy(word,1,length(word)-2) + '*'
        else if Copy(word,length(word)-3,4) = 'pped' then
        word := Copy(word,1,length(word)-4) + 'p*'
        else if Copy(word,length(word)-3,4) = 'mmed' then
        word := Copy(word,1,length(word)-4) + 'm*'
        else if Copy(word,length(word)-3,4) = 'tted' then
        word := Copy(word,1,length(word)-4) + 't*'
        else if Copy(word,length(word)-3,4) = 'gged' then
        word := Copy(word,1,length(word)-4) + 'g*'
        else if Copy(word,length(word)-2,3) = 'ied' then
        word := Copy(word,1,length(word)-3) + 'y*'
        else if Copy(word,length(word)-1,2) = 'ed' then
        word := Copy(word,1,length(word)-2) + '*'
        else if Copy(word,length(word)-1,2) = 'er' then
        word := Copy(word,1,length(word)-2) + '*'
        else if Copy(word,length(word)-0,1) = 's' then
        word := Copy(word,1,length(word)-1) + '*'
        ;
        
        //DDwin
        //S_ExecCommand ( '"C:\Program Files\DDwin\ddwin.exe" ,2,' + group + ',g1,' + word , 0 );
        
        //Jamming
        S_ExecCommand('D:\\Jamming\\Jamming.exe '-w"$C"' '-m"語尾補正"' '-f'', 0);
    end;
end;
一般:2005/2/6 (日) 14:10:41 げんた

日時文字列を書き出し

// 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに PPA.DLL を入れておいてください。
// マクロファイルの拡張子は .PPA でなくてはなりません。
// TAB=4

// 共通設定→[書式] にて
//
// 日付書式 
// ○ 標準(S) ◎ カスタム(C) D[yyyy'/'MM'/'dd'('ddd')'  ]
//
// 時刻書式
// ○ 標準(S) ◎ カスタム(U) T[HH':'mm':'ss             ]
//
// に設定しておくこと。

var
        str1,str2:String;        // 文字列型変数 str1,str2 を用意
        wk:String;                        // 文字列型変数 wk を用意
        pts,pte:Integer;        // 整数数値型変数 pts,pte を用意
begin
//        str1 := S_ExpandParameter('$d $t');        // 現在日時の文字列を str1 に取得・格納する
        str1 := S_ExpandParameter('$D $T');        // 開いているファイルのタイムスタンプの文字列を str1 に取得・格納する

        // str1 内部の (〜) 部の先頭2バイトを wk に取り出す。
        pts := Pos('(',str1);        // '(' を探して位置を pts に格納する
        pte := Pos(')',str1);        // ')' を探して位置を pte に格納する
        if( (pts = 0) or (pte = 0) )        then        Exit;        // '(' ')' どちらかが見つからなければマクロ終了(中断)
        wk := Copy(str1,pts+1,2);        // '(' の次の位置から 2バイトを wk に取得

        // wk を英曜日に変換する
        if     (wk = '日')        then        wk := 'Sun'
        else if(wk = '月')        then        wk := 'Mon'
        else if(wk = '火')        then        wk := 'Tue'
        else if(wk = '水')        then        wk := 'Wed'
        else if(wk = '木')        then        wk := 'Thu'
        else if(wk = '金')        then        wk := 'Fri'
        else if(wk = '土')        then        wk := 'Sat'
        ;

        // 出力する文字列 str2 を用意する。
        // str2 := 「先頭 〜 '(' まで」+「英曜日文字列」+「 '(' 〜 文字列末尾まで」
        str2 := Copy(str1,1,pts) + wk + Copy(str1,pte,Length(str1));

//        MessageBox(str2,'',0);        // ダイアログ表示
        S_InsText( str2 );                // 書き出す

end;
一般:2004/12/14 (火) 04:59:16 すい

複数行一括コメントアウト

矩形選択を使用せず、あえてマクロで実装された例です。
//PPAマクロ
var
str,str1,str2:String;
begin
    str1 := S_ExpandParameter('$f');
    str2 := S_ExpandParameter('$g');
    if ( (Length(str1) - Length(str2)) > 1) then str:=Copy(str1,Length(str2) + 1,Length(str1) - Length(str2));
    S_MoveHistSet(0);   // 現在位置を移動履歴に登録
    if (str = '.c') or (str = '.cpp') or (str = '.h') then
    begin
        S_ReplaceAll('^.', '//$&', 148);    // 選択範囲の行頭を // に置換する。
    end;
    if (str = '.tex') then
    begin
        S_ReplaceAll('^.', '%$&', 148); // 選択範囲の行頭を // に置換する。
    end;
    S_CancelMode(0);        // 各種モードの取り消し     選択状態を解除する。[Esc]キーと一緒。
    S_SearchClearMark(0);   // 検索マークの切替え
    S_MoveHistPrev(0);  // 移動履歴: 前へ
    S_ReDraw(0);    // 再描画
end;
一般:2004/11/25 (木) 12:04:28 すす

Java コンパイル+実行

//'C:\Program Files\Java'を適宜変更
// Javaコンパイル + 実行マクロ
var
        strFileExt  : String;        // ファイル拡張子文字列変数
        strJavaHome : String;        // JavaHomeパス文字列変数
        strCommand  : String;        // 実行用コマンド文字列変数
        intResult   : Integer;        // メッセージボックス返却値用変数
begin
        // 拡張子の取得
        strFileExt := Delete( S_ExpandParameter( '$f' ), 1, Length( S_ExpandParameter( '$g' ) ) );
        // 取得した拡張子文字列を小文字に変換
        strFileExt := LowerCase( strFileExt );
        // 拡張子が.javaまたは.javでない場合
        if CompareStr( strFileExt, '.java' ) <> 0 and CompareStr( strFileExt, 'jav' ) <> 0 then
                begin
                        // 警告メッセージを表示
                        MessageBox( 'Javaファイルではありません。', 'Javaコンパイル', $10 );
                        // 終了
                        Exit;
                end
        ;
        // メッセージボックス戻り値の初期値を設定
        intResult := 0;
        // コンパイル、コンパイル + 実行、 キャンセルの実行選択メッセージの表示
        case MessageBox( '実行もしますか?', 'Javaコンパイル', $23 ) of
                // キャンセルの場合
                2:
                        // 終了
                        Exit;
                // いいえの場合
                7:
                        // アップレットビューアの実行選択メッセージの表示
                        intResult := MessageBox( 'アップレットビューアで表示しますか?',  'Javaコンパイル', $24 );
        end;
        // JavaHomeのパス設定
        strJavaHome := 'C:\Program Files\Java';←ここを変更
        // コンパイル用コマンド文字列を設定
        strCommand := strJavaHome + '\bin\javac ' + S_ExpandParameter( '$f' );
        // Javaコンパイル実行
        S_ExecCommand( strCommand, 1 );
        // メッセージボックスの戻り値によって切り分け処理
        case intResult of
                // 実行する場合
                0:
                        // 実行用コマンド文字列を設定
                        strCommand := strJavaHome + '\bin\java ' + S_ExpandParameter( '$g' );
                // アップレットビューアで表示する場合
                6:
                        // アップレットビューア表示用コマンドを設定
                        strCommand := strJavaHome + '\bin\appletviewer ' + S_ExpandParameter( '$f' );
                // いいえを選択した場合
                7:
                        // 終了
                        Exit;
        end;
        // コマンドを実行
        S_ExecCommand( strCommand, 1 );
end
MACRO:2004/11/29 (月) 08:33:15 しにゃ

選択したテキストをファイル名として開く

//openFile
//選択したテキストをファイル名として開く
//

var dir = Editor.getFilename();
var selected = Editor.GetSelectedString();
var p = 0;	//親階層数

//選択文字列がフルパスならそのままオープン
if (selected.search(/^[a-z]:\\/i)>=0){
	Editor.FileOpen(selected);
}else{
	//親階層の検索
	while( selected.search(/^\.\.\\/) != -1 ){
		selected = selected.substring(3);
		p++;
	}
	//現在のファイルパスからファイル名を取り除く
	do{
		if ( (n = dir.lastIndexOf("\\")) != -1){
			var dir = dir.substring(0,n);
		}
		p--;
	}while(p>=0);
	Editor.FileOpen(dir + '\\' + selected);
}
MACRO:2004/11/23 (火) 18:31:30 akkun

選択部分の数字をカウントアップするWSHマクロ

// 選択部分の数字をカウントアップするWSHマクロ
// 半角の数字を選択して実行すると、1だけカウントアップ
// 選択部分の長さが1の場合のみ、その半角英字をひとつ後の半角英字にする

var inp = Editor.GetSelectedString(0);
var len = inp.length;
var i;

if ( len == 1 && inp >= "A" ) {
 i = inp.charCodeAt(0) + 1;
 inp = String.fromCharCode(i); 
}
else {
 inp = String(Number(inp)+1);
}
Editor.InsText(inp);  // 変更
for ( i = 0; i < len; i++ ) {  // 変更部分を選択
  Editor.Left_Sel();
}
MACRO:2004/11/20 (土) 18:29:59 しみづ

\n\n\nを\n\nに置換

//キーボードマクロのファイル

// 選択範囲の連続した空行を削除する。
// 範囲選択せずに実行した時はファイル全体に対して処理される。

S_ReplaceAll('[\\r\\n]+', '\\x01', 148);                // 
S_ReplaceAll('\\x01\\x01+', '\\x01\\x01', 148);        // 
S_ReplaceAll('^\\x01+', '\\x01', 148);                        // 
S_ReplaceAll('\\x01', '\\r\\n', 148);                        // 
S_ReDraw(0);        // 再描画
一般:2004/10/18 (月) 01:16:14 すい

ファイルをカーソルの位置に読み込む

//PPAマクロ
var
 str_fn:String;
begin
 str_fn := S_GetFilename();
 S_FileSave();
 S_FileCloseOpen();
 S_SelectAll(0);
 S_Copy(0);
 S_FileClose();
 S_FileOpen( str_fn );
 S_Paste(0);
end;
一般:2004/10/13 (水) 13:41:09 すす

複数行を1行にする。改行削除。

//キーマクロ
S_ReplaceAll('\r\n','',132);
一般:2004/6/29 (火) 11:32:19 しみづ

ファイルの有無を検出したい

var
 str,str2:String;        // 文字列変数宣言
 dirchk:Integer;                // 整数数値変数 tp を用意 - 作業用

begin        // { 処理開始
 str := '/c dir d:\data\hogehoge.HTML';
 dirchk := Exec('cmd.exe',str,True);
 MessageBox(IntToStr(dirchk),'',1);
 if (dirchk = 1) then break
 else str2:='a';
end;
MACRO:2004/5/23 (日) 13:41:32 しみづ

直前の閉じていないHTMLタグを閉じる

''【closeLastTag.js】
var QUIET_MODE   = false;
var REGX_ALL     = "</?[\\w\\d]+\\b(.*/>)?|<!--|-->";
var NO_CLOSETAG  = "|area|base|basefont|bgsound|br|col|embed|frame" +
  "|hr|img|input|isindex|keygen|link|meta|nextid" +
  "|param|spacer|wbr|!doctype|";
var stack_tags  = new Array();
var sel_text    = "";
var ins_text    = "";
var tmp_str     = "";
var b_comment = false;

Editor.CancelMode(0);
Editor.InsText("_");
while ( true ) {
  Editor.SearchPrev(REGX_ALL, 22);
  sel_text = Editor.GetSelectedString(0).toLowerCase();
  if ( sel_text=="" ) {
    if ( b_comment )
      popup_error("コメントの開閉関係が不正です");
    if ( stack_tags.length )
      popup_error("開始タグの無い終了タグが見つかりました")
    break;
  }
  if ( b_comment ) {
    if ( sel_text=="<!--" ) {
      b_comment = false;
    }
  } else {
  // -->
    if ( sel_text=="-->" ) {
      b_comment = true;
  // <!--
    } else if ( sel_text=="<!--" ) {
      ins_text = "-->";
      break;
  // <.../>
    } else if ( sel_text.indexOf("/>")!=-1 ) {
  // </...>
    } else if ( sel_text.indexOf("</")==0 ) {
      sel_text = sel_text.substring(2);
      stack_tags.push(sel_text);
  // <...>
    } else {
      sel_text = sel_text.substring(1);
      if (NO_CLOSETAG.indexOf("|"+sel_text+"|")!=-1)
        continue;
      if ( stack_tags.length==0 ) {
        ins_text = "</"+ sel_text +">";
        break;
      } else {
        tmp_str = stack_tags.pop();
        if ( sel_text!=tmp_str ) {
          tmp_str = "タグの包含関係が不正です\n" +
            "<" + sel_text + "> ... ... " +
            "</" + tmp_str + ">";
          popup_error( tmp_str );
          break;
        }
      }
    }
  }
}
Editor.CancelMode(0);
Editor.Undo(0);
Editor.SearchClearMark(0);
Editor.InsText(ins_text);

function popup_error(err_string) {
  if (!QUIET_MODE) {
    Editor.SearchClearMark(0);
    var shell = new ActiveXObject("WScript.Shell");
    shell.Popup(err_string, 0, "HTML 文法エラー", 0);
  }
}
同作者様よりXML対応でより高速なバージョンが公開されています。
MACRO:2004/2/26 (木) 20:54:06 gis_dur

カーソル直前のマクロファイルを実行

// 【0executeMacro.js】
// 必ず正しく指定
// ## 設定 ##
 // スクリプト自身のファイル名
 var SCRIPT_NAME = "0executeMacro.js";
 // マクロ群のあるフォルダのフルパス
 var MACRO_FOLDER = "C:\\...\\sakura\\macro";
 // マクロファイルの拡張子(小文字,正規表現不可)
 var MACRO_EXT = ".mac|.ppa|.js|.vbs";
 // Sendkeys用文字列
 // shortcutキーも可
 // %:alt ^:ctrl +:shift
 var KEYS_OPENMACRO = "%ta";//マクロ開く
 var KEYS_EXECMACRO = "%td";//マクロ実行 
// ## 設定終了 ##

var DIALOG_TYPE=1;
var DLGRET_AUTO=-1;
var DLGRET_OK=1;
var DLGRET_CANCEL=2;
var RECKEY_NAME="RecKey.mac";
MACRO_EXT="|"+MACRO_EXT+"|";

var shell=new ActiveXObject("WScript.Shell");
var sel_text=get_left();
var astr_fileNames=get_macros(sel_text);
var dlg_return=pop_dialog(astr_fileNames);

if (dlg_return!=DLGRET_CANCEL) {
 del_left();
 var path=MACRO_FOLDER+"\\"+astr_fileNames[0];
 shell.Sendkeys(KEYS_OPENMACRO);
 shell.Sendkeys(path);
 shell.Sendkeys("{ENTER}");
 shell.Sendkeys(KEYS_EXECMACRO);
}

function get_left() {
 var str="";
 Editor.CancelMode(0);
 Editor.WordLeft_Sel(0);
 str=Editor.GetSelectedString(0);
 if (str.match(/\x0D\x0A|\x0D|\x0A/)) {
  str="";
 }
 Editor.Right(0);
 return str;
}
function del_left() {
 Editor.CancelMode(0);
 Editor.WordLeft_Sel(0);
 Editor.Delete(0);
}
function get_macros(in_sel_text) {
 var fsys=new ActiveXObject("Scripting.FileSystemObject");
 var fld=fsys.GetFolder(MACRO_FOLDER);
 var fset=new Enumerator(fld.Files);
 var NOEXT=-1;
 var str="";
 var ext="";
 var arr=new Array();
 if (in_sel_text=="") return arr;
 for (;!fset.atEnd();fset.moveNext()) {
  str=fset.item().Name.toLowerCase();
  i=str.lastIndexOf(".");
  if (i==NOEXT) continue;
  ext="|"+str.substring(i)+"|";
  if (MACRO_EXT.indexOf(ext)==NOEXT) continue;
  if (str==SCRIPT_NAME.toLowerCase()) continue;
  if (str==RECKEY_NAME) continue;
  if (str.indexOf(in_sel_text)==0) arr.push(str);
 }
 return arr;
}
function pop_dialog(in_arr) {
 if (in_arr.length!=1) return DLGRET_CANCEL;
 var message="";
 message+="マクロ「"+in_arr[0]+"」を実行します\n";
 return shell.Popup(message,0,"マクロ実行の確認",DIALOG_TYPE);
}
MACRO:2004/2/26 (木) 21:34:39 gis_dur

カーソル位置からさかのぼって"/*"を探し、そこから"*/"までを選択

//【commsel.js】
// カーソル位置からさかのぼってブロックコメント"/*"を探し、そこから"*/"までを選択するWSHマクロ
// ※ファルイ先頭行・最終行にあるコメントは選択できません

var inp = " ";
var type = " ";
var last = 99;
var i = 0;
var tmp = " ";
var crlf = 0;
var rc = 0;

Editor.MoveHistSet();
Editor.GoFileEnd();
last = Number(Editor.ExpandParameter("$y"));  // 最後の行数を取得
Editor.MoveHistPrev();
for ( ; ; ) {  // /*をさかのぼって検索ループ
  Editor.Left_Sel();
  inp = Editor.GetSelectedString(0);
  tmp = inp.substr(0, 1);  // 頭の一文字を取得し
  if ( -1 != tmp.indexOf("*", 0) ) {  // *なら
    type = "*";
  }
  else if ( -1 != tmp.indexOf("/", 0) ) {  // その前が/か調べる
    if ( type == "*" ) {
      type = "/";
      break;
    }
  }
  else {
    type = " ";
  }
  if ( 1 == Number(Editor.ExpandParameter("$y")) )  // ファイル先頭にきたらやめる
    break;
}

if ( type == " " ) {  // 見つからなかったら戻る
  Editor.MoveHistPrev();
}
else {  // 見つかったら
  Editor.Left();  // 選択をやめて
  for ( i=0; ;i++ ) {  // */を検索ループ
    Editor.Right_Sel();
    inp = Editor.GetSelectedString(0);
    tmp = inp.substr(i, 1);  // 次の一文字を取得し
    if ( -1 != tmp.indexOf("\n", 0) ) {  // 改行は選択にスキップされるので、次の一文字を取り直し
      i++;
      tmp = inp.substr(i, 1);
    }
    if ( -1 != tmp.indexOf("*", 0) ) {  // *なら
      type = "*";
    }
    else if ( -1 != tmp.indexOf("/", 0) ) {  // その前が/か調べる
      if ( type == "*" )
        break;
    }
    else {
      type = " ";
    }
    if ( Number(Editor.ExpandParameter("$y")) >= last ) {  // ファイル最後にきたらやめて戻る
      Editor.Left();
      break;
    }
  }
}
MACRO:2004/1/27 (火) 10:01:42 しみづ

カーソル位置から選択を開始し、最初に見つけた(か{の対括弧までを選択する

//【brasel.js】
// カーソル位置から選択を開始し、最初に見つけた(か{の対括弧までを選択するWSHマクロ
// 括弧以前も選択できることにより、例えば関数呼び出し部分を全部選択できる
// また、(を判定して抜ける処理部分をコメントアウトして作り直しておけば、最初に見つけた{の対括弧までを選択するため、関数定義を全部選択できる
// ※ファルイ最終行にある括弧は選択できません

var inp = " ";
var type = " ";
var last = 99;
var tmp = " ";
var i = 1;

Editor.MoveHistSet();
Editor.GoFileEnd();
last = Number(Editor.ExpandParameter('$y'));  // 最後の行数を取得
Editor.MoveHistPrev();
Editor.BeginSelect();
for ( i=0; ; i++ ) {  // (か{を検索ループ
  Editor.Right();
  inp = Editor.GetSelectedString(0);
  tmp = inp.substr(i, 1);  // 次の一文字を取得し
  if ( -1 != tmp.indexOf("\n", 0) ) {  // 改行は選択にスキップされるので、次の一文字を取り直し
    i++;
    tmp = inp.substr(i, 1);
  }
  if ( -1 != tmp.indexOf("{", 0) ) {  // {を判定
    type = "{";
      break;
  }
  if ( -1 != tmp.indexOf("(", 0) ) {  // (を判定
    type = "(";
      break;
  }
  if ( Number(Editor.ExpandParameter("$y")) >= last )  // ファイル最後にきたらやめる
    break;
}
if ( type == " " ) {  // 見つからなかったら戻る
  Editor.MoveHistPrev();
}
else {  // 見つかったら
  if ( i > 0 )  // いきなり最初で見つかったのでなかったら
    Editor.Left();  // 一つもどって
  Editor.BracketPair();  // 対括弧まで行って
  Editor.Right();  // 選択
}
MACRO:2004/1/27 (火) 10:02:37 しみづ

カーソル位置から選択を開始し、最初に見つけた改行までを選択

//【endsel.js】
// カーソル位置から選択を開始し、最初に見つけた改行までを選択するWSHマクロ
// ※ファルイ最終行は選択できません

var inp = " ";
var last = 99;
var tmp = " ";
var i = 1;

Editor.MoveHistSet();
Editor.GoFileEnd();
last = Number(Editor.ExpandParameter('$y'));
Editor.MoveHistPrev();
Editor.BeginSelect();
for ( i=0; ; i++ ) {
  Editor.Right();
  inp = Editor.GetSelectedString(0);
  tmp = inp.substr(i, 1);
  if ( -1 != tmp.indexOf("\n", 0) ) {  // 改行
    Editor.Left();
    Editor.Left();
    break;
  }
  if ( Number(Editor.ExpandParameter("$y")) >= last )
    break;
}
MACRO:2004/1/27 (火) 10:02:37 しみづ

選択範囲をブロックコメントアウト

//【addcomm.js】
var inp = Editor.GetSelectedString(0);
var len = inp.length+4;
var crlf = 0;
var rc;
var i;
for ( i = 0; ; i++ ) {  // 改行カウント
  rc = inp.indexOf("\n", i);
  if ( rc == -1 )
    break;
  crlf++;
  i = rc;
}
len -= crlf;
Editor.InsText("/*");
Editor.InsText(inp);
Editor.InsText("*/");
for ( i = 0; i < len; i++ ) {
  Editor.Left();
}
Editor.BeginSelect();
for ( i = 0; i < len; i++ ) {
  Editor.Right_Sel();
}
一般:2004/1/22 (木) 17:28:54 しみづ

選択範囲の先頭・最後の2文字を削除

上記ブロックコメントアウトと対です。
var inp = Editor.GetSelectedString(0);
var len = inp.length-4;
var outp = inp.substr(2, len);
Editor.InsText(outp);
for (var i = 0; i < len; i++) {
  Editor.Left();
}
Editor.BeginSelect();
for (var i = 0; i < len; i++) {
  Editor.Right_Sel();
}
一般:2004/1/22 (木) 17:28:54 しみづ

ワード数カウントマクロ

// ワード数計算マクロ(EWCount.ppa)--スペース+ダッシュVer
// 2004.1.7 堀内悟(豹悟郎)作成
// 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに 
// PPA.DLL を入れておいてください。
// また、マクロファイルの拡張子は .PPA でなくてはなりません

var
 WordC,DC: Integer; //ワード数, ダッシュ数
 p,d : Integer;  //(空白, ダッシュ)の文字列内位置
 StrLen : Integer;  //選択文字列長
 Str,tmpStr : String; //選択文字列, 調査中現行文字列
 SPC,DSH : String;          //シングルスペース, ダッシュ

//処理の流れ
//文字列内の空白の位置を調べる、空白があればワード数を1増
//文字列先頭からその位置までを削除→tmpStrに格納
//tmpStrをTrim+Deleteで加工、先頭に戻る
//空白なし→ループ終了
//ダッシュ'--'についても同様のループ
//最後にダッシュの分を語数に足す

begin
 Str := Trim(S_GetSelectedString(0));
 StrLen := Length(Str);
 WordC := 0;
 SPC := ' ';
 DSH := '--';        //em dash
 tmpStr := Str;

if StrLen = 0 then
begin
 MessageBox('文字が選択されていません。', 'エラー',0);
 Exit;
end;

p := Pos(SPC, tmpStr);

while (p <> 0) do
begin
 p := Pos(SPC, tmpStr);        //空白の位置を調べる
 if p = 0 then Break;
 WordC := WordC + 1;
 tmpStr := Trim(Delete(tmpStr, 1, p));  //先頭から空白まで削除
end;

//ダッシュ数計算
 tmpStr := Str;        //検査対象文字列を復元
 d := Pos(DSH, tmpStr);

while (d <> 0) do
begin
 d := Pos(DSH, tmpStr);        //ダッシュの位置を調べる
 if d = 0 then Break;
 DC := DC + 1;
 tmpStr := Trim(Delete(tmpStr, 1, d+1));        //先頭からダッシュまで削除
end;

//語数集計
WordC := WordC+1+DC;
MessageBox(IntToStr(WordC) + '語です。', '計算結果',0);
end

//注 後続語がないダッシュ(例: 会話文末の「--"」)も1語とみなす
//語間スペースと--を数えるだけなので英語以外でも使えると思います
//"
 
MACRO:2004/1/11 (日) 15:46:08 堀内悟(豹悟郎)

ファイルを閉じないで、名前を付けて保存

// 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに 
// PPA.DLL を入れておいてください。
// また、マクロファイルの拡張子は .PPA でなくてはなりません。
// SAVEREOPEN.PPA
// ファイルを閉じないで、名前を付けて保存
var
  sa, ss: String;
begin
  sa := InputBox('一時保存ファイル名','ファイル名','');
  if sa = '' then Exit;
  ss := S_ExpandParameter('$F');
  S_FileSaveAs(sa,0,0);
  S_FileOpen(ss);
end.
// このマクロ何に使うのかと、関心の有る方は[ふぁんくらぶ part4] <217>,<265>をご覧下さい。
MACRO:2004/1/2 (金) 17:47:40 じゅうじ

選択中の文字で検索

// 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに 
// PPA.DLL を入れておいてください。
// また、マクロファイルの拡張子は .PPA でなくてはなりません。
// PASTENEXT.PPA
// クリップボードの内容で前検索開始(複数行の貼り付けは不可)
var
  ss, st, se: String;
  is, it, ie: Integer;
begin
  S_CancelMode();  // 選択中の文字が有る場合
  st := S_ExpandParameter('$x');
  S_Paste();
  se := S_ExpandParameter('$x');
  ie := se;
  S_BeginSelect();
  for is := ie - 1 downto st do
    S_Left();
  ss := S_GetSelectedString(0);
  S_Delete();
  S_CancelMode();
  S_SearchNext(ss,0);
end.
MACRO:2004/1/1 (木) 05:29:15 じゅうじ

特定の文字を変換して次の行へ挿入

//キーボードマクロのファイル
// TAB=4

// 1.カーソル行を2重化する
// 2.増えた下の行を範囲選択後、その選択範囲内の文字列に対して
// (1)英大文字→小文字 変換する。
// (2)「'」を空文字列に範囲指定の置換をする。
// (3)「-」「 」を「_」に範囲指定の置換をする。
// 3.変換した文字列の行末尾へ移動して(ついでに範囲選択解除)
// 4.「.jpg」と記述追記
// 5.行頭へ移動して次の行へ移動する

S_DuplicateLine(0);                                        // 1.行の二重化(折り返し単位)
S_GoLineEnd_Sel(0);                                        // 2.(選択)行末に移動(折り返し単位)
S_ToLower(0);                                                // (1)英大文字→英小文字
S_ReplaceAll('\'', '', 144);                // (2)選択範囲のみ [すべて置換(A)] で ' 1文字を空文字列に置換(つまり削除)
S_ReplaceAll('[\\- ]', '_', 148);        // (3)正規表現ON,選択範囲のみ [すべて置換(A)] で '['\- ]' → '_' の置換処理
S_ReDraw(0);                                                // (2)(3)のオマケ - 再描画
S_GoLineEnd(0);                                                // 3.行末に移動(折り返し単位) - ついでに範囲選択解除される
S_InsText('.jpg');                                        // 4.文字入力
S_GoLineTop(0);                                                // 5.行頭に移動(折り返し単位)
S_Down(0);                                                        // 5.カーソル下移動
MACRO:2003/10/22 (水) 23:46:15 すい

マクロを指定回数繰り返し実行

// 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに PPA.DLL を入れておいてください。
// マクロファイルの拡張子は .PPA でなくてはなりません。

// マクロを実行する回数を入力するダイアログを出し、
// そこで指定された回数マクロを実行する。

var
        cnt,max:Integer;        // 整数数値型変数 cnt と max を用意する
begin

        max := StrToInt( InputBox('マクロ実行','マクロを実行する回数を入力して下さい。','') );

        for cnt := 1 to max do        begin        // {

                // ここに指定回数実行したい内容を書き込む
                S_InsText( IntToStr(cnt) + '回目の文字列出力です。');
                S_Char(13);                // 改行する

        end;        // }
end;
一般:2003/10/18 (土) 05:49:35 すい

非正規表現に変換

// 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに 
// PPA.DLL を入れておいてください。
// また、マクロファイルの拡張子は .PPA でなくてはなりません。
// UNREGEXP.PPA
// 選択した文字列を非正規表現に変換してクリップボードへコピー
var
  st: String;
begin
  // カーソル位置の文字列を取得する。
  st := S_GetSelectedString(0);
  // すべて置換:正規表現&選択範囲
  S_ReplaceAll('[\^\.\$\|\[\]\(\)\{\}\*\+\?\\]', '\\$&', 132);
  // 文末の']'で(音)パボン?
  S_Cut(0);  // 選択文字列とクリップボードの入替え
  S_InsText( st );
  S_Right(0);  // or Left
  S_Left(0);
  S_Right(0);
  S_SearchClearMark(0);  // 検索マークの切替え
end.
// このマクロ何に使うのかと、関心の有る方は[一般]<3183>,<3184>をご覧下さい。
MACRO:2003/8/16 (土) 04:08:29 蒔田 信幸

選択状態でなくても逆インデント

// 逆インデント
S_MoveHistSet(0);   // 現在位置を移動履歴に登録
S_GoLineTop(9);     // 行頭に移動(スペースを無視&改行単位)
S_Delete(0);        // 削除
S_MoveHistPrev(0);  // 移動履歴: 前へ
S_Left(0);          // カーソル左移動
一般:2003/8/13 (水) 11:47:43 蒔田 信幸

行末の空白を削除して改行

//キーボードマクロのファイル
S_ReplaceAll('[ \\t]+([\\r\\n])', '$1', 36);
S_ReDraw(0);
MACRO:2003/7/23 (水) 14:09:45 wmlhq

挿入モードにする

// 実行には PPA.DLL が必須です。sakura.exe と同じフォルダに 
// PPA.DLL を入れておいてください。
// また、マクロファイルの拡張子は .PPA でなくてはなりません。
// 入力モードを調べて、インサートモードにするためのマクロです。
var
        st:String;
begin
                                            //インサートモードでなければインサートモードにする。
        S_GoFileEnd();
        S_Char(13);                         //改行を入力する。
        S_GoLineTop(1);                     //行頭にカーソルを移動する。
        S_Char(97);                         //行頭に'a'を入力する。
        S_GoLineTop(1);                     //行頭にカーソルを移動する。
        S_Char(98);                         //行頭に'b'を入力
        st := S_GetSelectedString(0);       //カーソル位置の文字列を取得する。
        if st <> 'ba' then begin            //インサートモードであったなら、'a'の前に'b'が挿入されて'ba'となっている。
                S_ChgmodINS();              //'ba'でなければ、上書きモードなので、モードを変更してインサートモードにする。
        end;
        //調査時の変更を戻す。
        S_Undo();
        S_Undo();
        S_Undo();
        //カーソルをファイルの先頭に移動する。
        S_GoFileTop();
end; 
 
MACRO:2003/2/9 (日) 08:02:43 PAPA

連続する改行を一つにしたい

S_GoFileEnd(0);                             // ファイルの最後に移動
while True do begin
    S_SearchPrev('^[ \t]*\r\n', 4);         // 前を検索
    if S_GetSelectedString(0) = '' then Break;
    S_InsText('★'):                        // 置換
end;
S_ReplaceAll('^★+', '\r\n', 4);            // 
一般:2003/4/8 (火) 14:59:37 MMX

選択範囲をタグで囲むマクロ

//キーボードマクロのファイル
S_Cut(0);                   // 切り取り
S_InsText( '<TAG></TAG>;' ); //適度に改行を入れる
S_SearchPrev('</', 2);      // 前を検索
S_Left(0);                  // 選択解除のおまじない
S_Paste(0);                 // 貼り付け
// カーソル位置の調整はこのあと、履歴の管理とか
一般:2003/3/26 (水) 15:18:18 MMX

辞書引きソフトDDをマクロで

// DDWinで現在位置の単語を検索
//
// 秀丸マクロの移植版
// Oct. 21, 2002 genta
// ↑の PPA.DLL 移植版
// マクロファイルの拡張子は必ず .PPA にすること。PPA.DLL 必須。

var                // 変数を確保する場所
        word,group:String;        // 文字変数を用意
begin
        word  := S_GetSelectedString(0);
        group := '外国語';

        if word <> '' then
        begin
                if      Copy(word,length(word)-2,3) = 'ies' then
                        word := Copy(word,1,length(word)-3) + 'y'
                else if Copy(word,length(word)-3,4) = 'ness' then
                        word := Copy(word,1,length(word)-4) + '*'
                else if Copy(word,length(word)-2,3) = 'ing' then
                        word := Copy(word,1,length(word)-3) + '*'
                else if Copy(word,length(word)-2,3) = 'est' then
                        word := Copy(word,1,length(word)-3) + '*'
                else if Copy(word,length(word)-1,2) = 'es' then
                        word := Copy(word,1,length(word)-2) + '*'
                else if Copy(word,length(word)-3,4) = 'pped' then
                        word := Copy(word,1,length(word)-4) + 'p*'
                else if Copy(word,length(word)-3,4) = 'mmed' then
                        word := Copy(word,1,length(word)-4) + 'm*'
                else if Copy(word,length(word)-3,4) = 'tted' then
                        word := Copy(word,1,length(word)-4) + 't*'
                else if Copy(word,length(word)-3,4) = 'gged' then
                        word := Copy(word,1,length(word)-4) + 'g*'
                else if Copy(word,length(word)-2,3) = 'ied' then
                        word := Copy(word,1,length(word)-3) + 'y*'
                else if Copy(word,length(word)-1,2) = 'ed' then
                        word := Copy(word,1,length(word)-2) + '*'
                else if Copy(word,length(word)-1,2) = 'er' then
                        word := Copy(word,1,length(word)-2) + '*'
                else if Copy(word,length(word)-0,1) = 's' then
                        word := Copy(word,1,length(word)-1) + '*'
                ;

//                MessageBox(word,'',0);        // for Debug
//                MessageBox( '"C:\Program Files\DDwin\ddwin.bat" ,2,' + group + ',g1,' + word ,'',0);        // for Debug
                S_ExecCommand ( '"C:\Program Files\DDwin\ddwin.exe" ,2,' + group + ',g1,' + word , 0 );
        end;
end;
一般:2002/11/1 (金) 20:50:11 すい

辞書引きソフトDDをマクロで

' DDWin.vbs
' DDWinで現在位置の単語を検索
' 秀丸マクロの移植版
' Oct. 21, 2002 genta

Option Explicit
DIM word

word = Editor.GetSelectedString( 0 )

If word <> "" then 
        ddwin_search "外国語", word
end if

sub ddwin_search( group, word )
        If right(word,3) = "ies" then
                word=left(word,len(word)-3) & "y"
        ElseIf right(word,4) = "ness" then
                word=left(word,len(word)-4) & "*"
        ElseIf right(word,3) = "ing" then
                word=left(word,len(word)-3) & "*"
        ElseIf right(word,3) = "est" then
                word=left(word,len(word)-3) & "*"
        ElseIf right(word,2) = "es" then
                word=left(word,len(word)-2) & "*"
        ElseIf right(word,4) = "pped" then
                word=left(word,len(word)-4) & "p*"
        ElseIf right(word,4) = "mmed" then
                word=left(word,len(word)-4) & "m*"
        ElseIf right(word,4) = "tted" then
                word=left(word,len(word)-4) & "t*"
        ElseIf right(word,4) = "gged" then
                word=left(word,len(word)-4) & "g*"
        ElseIf right(word,3) = "ied" then
                word=left(word,len(word)-3) & "y*"
        ElseIf right(word,2) = "ed" then
                word=left(word,len(word)-2) & "*"
        ElseIf right(word,2) = "er" then
                word=left(word,len(word)-2) & "*"
        ElseIf right(word,1) = "s" then
                word=left(word,len(word)-1) & "*"
        end if
        Editor.ExecCommand  """C:\Program Files\DDwin\ddwin.exe"" ,2," & group & ",g1," & word , "0"
        ''Editor.ExecCommand( "C:\\Program Files\\DDwin\\ddwin.exe ,2," & group & ",g1," & word )
end sub
一般:2002/10/21 (月) 19:43:22 げんた

HSPの選択部分コンパイル+実行

Xi Compilerというツールが必要なようです。パスの記述も適宜変更が必要。
//ppaマクロ
var
        Path, Dir :String;
        i         :Integer;
begin
        // フルパス→ディレクトリ取得
        Path := S_GetFilename();
        Dir  := '';

        i := Pos('\',Path);
        while (i>0) do begin
                Dir := Dir + Copy(Path,1,i);
                Path := Delete(Path,1,i);
                i := Pos('\',Path);
        end;
        Dir := Delete(Dir,Length(Dir),1);

        // 選択範囲を実行
        S_Copy();
        //xicmp.exeのパスを指定のこと↓
        S_ExecCommand('E:\HSP\xicmp.exe '+Dir+' /clp',0);
end;
一般:2002/8/21 (水) 06:06:01 xi

空行を挿入

//キーボードマクロのファイル
S_GoLineTop(1); // 行頭に移動(折り返し単位)
S_Char(13);     // 文字入力
S_Up(0);        // カーソル上移動
一般:2002/8/8 (木) 21:37:47 すい

いろいろ正規表現

実例が複雑で説明が困難なもの、または正規表現自体が難解で要約できないものは省きました。

連続改行を一回改行にする

CR/LF改行
置換前: ^\r\n
置換後: 
LF改行
置換前: ^\n
置換後: 
CR改行
置換前: ^\r
置換後: 
一般:2006/5/5 (金) 21:23:20 じゅうじ

行末に「-」のある英単語の検索

?te[\r\n\-]*le[\r\n\-]*vi[\r\n\-]*sion
一般:2006/4/16 (日) 04:16:42 しみづ

C/C++関数を強調表示(改)

正規表現: /(if|for|while|switch|return|sizeof)[ \t]*(?=\()/k
色設定 : 強調キーワード1

正規表現: /[a-zA-Z_]+[0-9a-zA-Z_]*[ \t]*(?=\()/k
色設定 : 任意
MACRO:2006/3/23 (木) 17:53:26 too

全角文字を色分け

全角空白・全角記号類を含めて指定
正規表現: /[ -K]/k
色設定 : 任意

全角空白を除いて指定
正規表現: /[、-K]/k
色設定 : 任意
一般:2006/3/14 (火) 16:20:17 もか

C/C++関数を強調表示

正規表現: /(if|for|while|switch|return|sizeof)[ \t]*\(/k
色設定 : 強調キーワード1

正規表現: /[a-zA-Z_]+[0-9a-zA-Z_]*[ \t]*\(/k
色設定 : 任意
MACRO:2006/2/6 (月) 10:24:58 じゅうじ

正規表現キーワードを使用して行コメントを一括指定

正規表現: /([;#!]|\/\/).*/k
色指定 : コメント
一般:2006/1/23 (月) 23:56:51 すい

行頭以外にある特定の文字以降を検索

条件: (?!^)■.*
一般:2005/2/9 (水) 01:35:31 トーリス

and検索やor検索

and検索: (red.*blue)|(blue.*red)
or検索: (red)|(blue)
一般:2005/3/31 (木) 10:23:40 しゃ

行頭以外にある特殊文字以降を削除

置換前: (.)■+
置換後: $1
一般:2005/2/9 (水) 12:08:23 もか

改行コードを変換

置換前: \r
置換後: \r\n

置換前: \r\n
置換後: \r
正規表現にこだわらなければ「保存時に改行コードを指定」な意見も
一般:2005/1/23 (日) 11:10:18 kei

メールのレスを色分け

正規表現: /^(\s*[>>]){5}.*/k  色指定:5段以上レス色
正規表現: /^(\s*[>>]){4}.*/k  色指定:4段レス色
正規表現: /^(\s*[>>]){3}.*/k  色指定:3段レス色
正規表現: /^(\s*[>>]){2}.*/k  色指定:2段レス色
正規表現: /^(\s*[>>]){1}.*/k  色指定:1段レス色
一般:2004/10/22 (金) 01:20:33 すい

「'」「"」の取り扱いについて

「シングルクォーテーション文字列」「ダブルクォーテーション文字列」を無効にして正規表現キーワードで色分け
正規表現: /(["'])([\\].|[^\1])*?\1/k
色指定 : ダブルクォーテーション文字列またはシングルクォーテーション文字列
一般:2004/8/27 (金) 12:40:49 ヤマモ

1番目、2番目、3番目」⇒「NO.1、NO.2、NO.3」

「(\d+)番目」→「No.$1」
一般:2004/5/8 (土) 23:44:39 もか

閉じないクォーテーションの色分け問題対策

正規表現: /"(|.*?[^\\])(\\\\)*"/k    色指定:ダブルクォーテーション文字列
正規表現: /'(|.*?[^\\])(\\\\)*'/k    色指定:シングルクォーテーション文字列
正規表現: /\/(|.*?[^\\])(\\\\)*\//k  色指定:テキストまたは色強調キーワード1
一般:2004/4/6 (火) 03:16:48 すい

HTMLタグの一括除去(4重入れ子まで対応の場合)

<!--<br>-->のようなものもマッチさせる、というお話です
置換前: <[^<>]*(<[^<>]*(<[^<>]*(<[^<>]*[^<>]*>[^<>]*)*[^<>]*>[^<>]*)*[^<>]*>[^<>]*)*[^<>]*>
置換後: 
一般:2004/4/4 (日) 10:03:04 すい

「ABC123とDEF987はGHI456の友達」→「ABC 123とDEF 987はGHI 456の友達」

置換前: ([A-Z])(\d)
置換後: \1 \2
一般:2004/3/21 (日) 15:29:56 げんた

正規表現キーワード登録数節約例(LaTeXの場合)

正規表現: /\\(int|begin|end)(?![0-9a-zA-Z])/k
色設定 : 強調キーワード1
一般:2004/1/17 (土) 14:17:24 (全略)

秀丸「タグ付き正規表現」?のように・・・

「タグ付き・・・」の使いどころをいまいち理解できず、うまく要約できません。
置換前: <b>([^<>]+)</b>
置換後: <i>\1</i>
一般:2003/12/7 (日) 19:05:55 げんた

複数行を1行にまとめる。

置換前: [\r\n]+
置換後: 
MACRO:2003/6/29 (日) 23:27:04 蒔田 信幸

空白行を削除する

置換前: ^[\r\n]+
置換後: 
MACRO:2003/6/29 (日) 23:27:04 蒔田 信幸

空白行を削除する。スペースとタブの行も削除。

置換前: ^[ \t]*[\r\n]+
置換後: 
MACRO:2003/6/29 (日) 23:27:04 蒔田 信幸

行の内容を同一行にコピーする

置換前: ^[^\r\n]*
置換後: -$&-$&-
MACRO:2003/6/29 (日) 23:27:04 蒔田 信幸

行の内容を同一行にコピーする。改行だけの行では行わない。

置換前: ^[^\r\n]+
置換後: -$&-$&-
MACRO:2003/6/29 (日) 23:27:04 蒔田 信幸

行の末尾に文字を追加する。

置換前: $
置換後: -
MACRO:2003/6/29 (日) 23:27:04 蒔田 信幸

行の先頭に文字を追加する

置換前: ^
置換後: -
MACRO:2003/6/29 (日) 23:27:04 蒔田 信幸

改行を含んで行全体を選択する

「.*」→「-$&」
「[^\n]*」→「-$&」
MACRO:2003/6/29 (日) 23:27:04 蒔田 信幸

改行を含まないで行全体を選択する

「^[^\r\n]*」→「$&-」
MACRO:2003/6/29 (日) 23:27:04 蒔田 信幸

連続する改行を一つにしたい

step1.「\r\n」->「\n」
step2.「^\n+」->「」
step3.「\n」->「\r\n」
一般:2003/5/9 (金) 02:03:25 蒔田 信幸

行頭の文字挿入

スレ中で指摘されている「^」→「//」が動作しない件について、現在のバージョンでは問題ないように見えます・・・
置換前: ^.|\n
置換後: //$&
一般:2003/2/6 (木) 17:16:49 すい

行末の文字挿入

上記同様「$」→「//」で大丈夫だと思います
置換前: [\r\n]
置換後: //$&
一般:2003/2/6 (木) 22:04:29 すい

スペース・タブだけの行を空行に

置換前: ^[ \t]+([\r\n])
置換後: $1
一般:2002/12/13 (金) 19:47:55 すい

スペース・タブだけの行を削除

置換前: ^[ \t]+[\r\n]+
置換後: 
一般:2002/12/13 (金) 19:47:55 すい

空行を削除

置換前: ^[\r\n]+
置換後: 
一般:2002/12/13 (金) 19:47:55 すい

空行またはスペース・タブだけの行を削除

置換前: ^[ \t]*[\r\n]+
置換後: 
一般:2002/12/13 (金) 19:47:55 すい

xxxを含む行を削除

置換前: .*xxx.*\n
置換後: 
一般:2002/8/8 (木) 21:37:47 すい

xxxを含む行を空行に(改行だけ残す)

置換前: .*xxx[^\r\n]*
置換後: 
一般:2002/8/8 (木) 21:37:47 すい