テーマ:未分類(甘党)

日々、思いついたことを記録します。

[秀丸マクロ] Windowサイズを小さく & 場所移動(時計回り)

2008年05月03日 06時34分42秒 | 秀丸エディタ Tips
かなり、どうでもよい、ちょ~小物マクロなのですが、作ってみたら、かなり便利につかっています。

単に、ウィンドウサイズを小さめの60×15桁にして、今のウィンドウ位置から、時計まわりに移動するというものなのです。
普段は、だいたい、全画面にしてしまっているのですが、他のアプリケーションの画面を見ながら、入力することも結構あって、そんなときに、このマクロで、秀丸エディタのウィンドウサイズを小さくして、ウィンドウ位置をクルクル回して、調整します。

私の場合は、Shift+Ctrl+Wに割り振ってみました。

==============================================================
// Windowサイズを小さく & 場所移動(時計回り)
    setwindowsize 60, 15;

    if ((windowposx==0) && (windowposy==0))
        setwindowpos 1023, 0;
    else if ((windowposx>0) && (windowposy==0))
        setwindowpos 1023, 767;
    else if ((windowposx>0) && (windowposy>0))
        setwindowpos 0, 767;
    else
        setwindowpos 0, 0;

    config "xAutoAdjustOrikaeshi:+";


スペルチェッカ for 秀丸&PDICWIN by Zophos

2008年04月30日 22時35分18秒 | 秀丸エディタ Tips
久しぶりの秀丸エディタのネタです
最近は、英文のメールを作成することが多くて、Outlook2007のスペルチェッカの機能は、欠かせません。

ちなみに、Outlook2007の[ツール(T)]メニューの[オプション]で開くダイアログボックスの[スペルチェック]タブで、[ ]送信前にスペルチェックを実行するチェックボックスを有効にしてあります。

ただ、メールのテキストは、秀丸エディタ上で作るの常で、結構、スペルに自信がないときとかは、秀丸エディタ上でのスペルチェックをしたいときが、ままあったのですが、とりあえずは、スペルだけの確認のために、毎回、辞書を使っていました。

ただ、やっと、思い立って、この前、秀丸エディタのスペルチェッカを探してみたんですが、英辞郎でPDICWINを使っていたので、以下を試しに使ってみました。

スペルチェッカ for 秀丸&PDICWIN by Zophos
http://www.vector.co.jp/soft/win31/writing/se032537.html

ただ、これが、公開が、Jul.1996で、Windows3.1の頃のものではないですか。こんな古いマクロが動くものなのだろうかと不安だったのですが、なんとまぁ、びっくりしたことに、会社で使っているWindows XP+秀丸エディタv7.07+PDICv4.76(DEPW.DLLv1.42)の組み合わせで、このスペルチェッカのマクロが問題なく動作したのです。

秀丸エディタのバージョンアップ時にマクロの互換性にも、すごく注意を払われているようで、秀丸エディタの作者の方に、非常に感心をした次第です。

ただ、このスペルチェッカで、機能的には、英辞郎から単語のリストを持ってくるということで、単語の数が、膨大すぎるので、いいんだか、悪いんだか、良く分かりません。

あと、機能的には、必要十分なのですが、細かいところで、気になるところがあります。

・修正/全修正/登録/無視をキーボードアクセラレータを割り当てたい。
・[ESC]キーで止めたいかな。

そのうち、マクロの中を見て、修正するか、もしくは、何か自分なりのアイデアを入れて、自分なりのスペルチェッカを作ってしまおうかとも企んでいます。


longringさんのキージェスチャーが面白い

2007年11月22日 06時38分36秒 | 秀丸エディタ Tips
ひさしぶりに、秀丸エディタのマクロライブラリをのぞいてみました。

ちょっと、気になったのが、longringさんのキージェスチャーですね。

Altキーを押して、そのあと、カーソルキーを使って、いろいろなことができるようにするマクロで、かなり、面白い発想という感じでした。

と、思ったので、さっそく、ダウンロードしてみました。
ただ、以下のような感じで、うーーん、ただ、あまり、使うものがなくて、非常に残念です。

Alt+上 ウインドウ最大化
Alt+下 ウインドウ最小化
Alt+上下 ウインドウを最大化、最小化から元に戻す
Alt+上上 ウインドウサイズを少し大きくする
Alt+下下 ウインドウサイズを少し小さくする
※ これは、Alt+Spaceで開くコントロールのメニューからアクセスするのが慣れてしまっていて、他のアプリと共通なのだし、使わないなぁ。

Alt+右 次の秀丸
Alt+左 前の秀丸
Alt+上右 次のタブ
Alt+上左 前のタブ
※ 基本的には、タブしか使っていなくて、タブの移動は、Ctrl+Tab/Shift+Ctrl+Tabで移動しているので、使わないなぁ。

Alt+下上下 最近のウインドウ2つを縦に並べる
Alt+下左右 最近のウインドウ2つを横に並べる
※ これらは、かなり、面白いですね。ぜひ、覚えて、使うようにしたいと思っている。

Alt+右右 フォントサイズを少し大きくする
Alt+左左 フォントサイズを少し小さくする
Alt+右右右 フォントサイズを結構大きくする
Alt+左左左 フォントサイズを結構小さくする
Alt+右右右右 フォントサイズをかなり大きくする
Alt+左左左左 フォントサイズをかなり小さくする
※ 今一歩、使いづらいなぁ。Ctrl+プラスとCtrl+マイナスに、フォントの拡大/縮小を割り振っていて、Firefoxと同じキーアサインで、非常に使いやすくて、変える気がないなぁ。

Alt+左右下 Grepファイルを全て閉じる ただし、自分のファイルは閉じません
Alt+左右下下 無題ファイルを全て閉じる ただし、自分のファイルは閉じません
※ これらは、良い感じ。かなり、覚えづらいジェスチャ。かなり危険なコマンドなので、左右にオタオタさせたあと、下で、閉じる感じ。下下は、非常に危険なものを閉じるので、2度押しという感じかな?

Alt+上左下右 フリーカーソルモードの切り替え
※ 一周回すのは、結構、大変だし、あんまり、この切り替えをしたことがない。

Alt+左右 検索文字列の強調の切り替え
Alt+右左 アウトライン解析の枠表示/非表示
※ うーん、メニューのショートカットがないところですが、Alt+S,Oと、Alt+W,Oで、覚えちゃってるから、あまり、キージェスチャでやる必要性を感じないなぁ。

発想は、面白いから、このインターフェースを利用させてもらって、独自に拡張しちゃおうかなぁ、、、。

何が困っているかを考えてみると、、、、

タブの位置の操作は、マウスでしか、やる方法を知らないんですが、これをキーボードでできるようになると、かなり、便利かも。Alt+上右右...とAlt+上左左... ぐらいかなぁ。(実現性の可否は、未確認)

あとはぁぁ、、、

そうそう、段組みモードにしたときの段組みの横方向のカーソル移動とかも、困っていたなぁ、、、。Alt+右とAlt+左は、ぐらいかなぁ(これまで、Alt+左/右は、単語内の先頭と最後にカーソル移動に割り振っていたのですが、今回、キージェスチャーをインストールするにあたって、Ctrl+Alt+左/右に移動して、それほど、困っていないので、これは、これで、そのままに、しておこうと思う。)

あとはぁぁ、、、

本当に自分で改造するとしたら、「Alt+左右下 Grepファイルを全て閉じる ただし、自分のファイルは閉じません」は、私が自分で作った似たような機能のマクロがあるんで、それに置き換えようかと思います。(編集中のGrepファイルは、閉じない。)



秀丸エディタからサイボウズv3の予定作成画面に移行する秀丸エディタ用マクロを作っている

2007年10月31日 06時31分50秒 | 秀丸エディタ Tips
CreateCybozuAppo.mac v.0.01

このブログの前に3つソースファイルをバックアップしてみました。

HidemaruWithCybozu.iniのバックアップ
CreateCybozuAppo.mac v.0.01のバックアップ
CreateCybozuItem.vbs v0.01のバックアップ

たぶん、全く需要がないと思うので、ファイルの保管庫にアーカイブを置くのは、やめにしておこうと思います。

今、秀丸エディタからサイボウズv3の予定作成画面に移行する秀丸エディタ用マクロを作っていて、そのソースコードになります。

まだ、作りかけなのですが、個人的には、とんでもなく便利で、作りかけでも、かなり、頻繁に使い始めてしまっています。

どうも、サイボウズv3に予定を入れる時、多数のフィールドがあって、そして、最悪なのが、時刻が、プルダウンで選択しないといけなくて、予定を手作業で入れるのは、非常に面倒なものでした。

まだ、作成中のマクロですが、とりあえず、たとえば、メールから、サイボウズv3の予定に登録したいテキストをコピーしてきて、秀丸エディタにペーストして、このCreateCybozuAppo.mac v.0.01マクロが認識できる書式に加工した後、Shift+Ctrl+Uに割りつけたこのマクロを呼び出すと、サイボウズv3の予定表作成画面で、タイトル、開始時間、メモと、終了時間は、開始時間に合わせて、終了時間のところにフォーカスを合わせて、マクロを終了します。


今のところ、CreateCybozuAppo.mac v.0.01マクロが認識できるものは、以下の書式に限定されてしまっています。

・1行目は、かならず、タイトル
・予定日は、最初にあらわれる「M/D」か「M月D日」のパターンから抽出
・予定日は、最初にあらわれる「h:m」か「h時m分」のパターンから抽出

あと、サイボウズv3には、まだ、オートログインをするコードを入れていないので、インターネットエクスプローラで、サイボウズv3にログインしておく必要があります。

あと、TODOとしては、以下のようなことを考えています。

' 日時らしきものの動作確認。特に、年度の処理は怪しいはず。
' ログインしていない場合には、自動的にログインするようにしたい。
' カスタマイズが必要な要素は、本当は、INIファイルなどから、取得したいところ。
' item-typeで分岐するような構造にしていない。

HidemaruWithCybozu.iniのバックアップ

2007年10月31日 06時26分31秒 | 秀丸エディタ Tips
; サイボウズv3連携マクロ用コンフィグレーション

[HidemaruControl]
;デバッグモード(0:通常モード、1:デバッグモード)
DEBUG_FLAG=0

;新規(ファイル名なし)の場合の一時ファイルを作成するディレクトリ(「%..%」で環境変数)
TMP_DIR=%TEMP%
;TMP_DIR=C:Temp

;ファイル名を持つ場合の、クローズ処理の有無(0:オープンのまま、1:クローズ)
; (なお、ファイル名を持たない新規ファイル(無題)の場合には、テンポラリファイル名に保存してしまう。)
FILE_CLOSE_FLAG=0

; (無題)にため作成する一時ファイル名のプリフィックスと拡張子
TMP_FNAME_PREFIX=HidemaruWithCybozu
TMP_FNAME_EXT=.~~~

[VBScriptControl]
; WSHのEXEファイル名
WSH_EXE_FNAME=wscript.exe

;VBSファイル名
VBS_FNAME=CreateCybozuItem.vbs

;VBS機能名(VBSの第1パラメータ)
;MAIL=mail
APPO=appo
;TASK=task
;NOTE=note

;VBSオプション(/...)
;OPT_DEL=/DEL



CreateCybozuAppo.mac v.0.01のバックアップ

2007年10月31日 06時25分13秒 | 秀丸エディタ Tips
// CreateCybozuAppo.mac v.0.01
// 秀丸エディタからサイボウズの予定作成画面に移行する秀丸エディタ用マクロ
//
// Copyright (C) 2007 甘党のプログラマ, All rights reserved.
//
// 同じフォルダに、以下のファイルを置いてください。
// HidemaruWithCybozu.ini, CreateCybozuItem.vbs

///////////////////////////
// 各種初期化
///////////////////////////
$INI_FNAME = currentmacrodirectory + "HidemaruWithCybozu.ini";        // iniファイル名
$vbs_func_options = " ";        // 追加オプション保持用

///////////////////////////
// iniファイルの処理
///////////////////////////
//デバッグモード(0:通常モード、1:デバッグモード)
#DEBUG_FLAG = getininum($INI_FNAME, "HidemaruControl", "DEBUG_FLAG");
if (#DEBUG_FLAG == 1) {
    $debuginfo_title = "[" + currentmacrobasename + "]";    // debuginfo出力のタイトル
    debuginfo 1;        // debuginfo出力の有効化
    debuginfo $debuginfo_title + "Debug Mode : On";
    $run_options = " //X";          // デバッガでスクリプトを実行する
}
else
    $run_options = " ";

//新規(ファイル名なし)の場合の一時ファイルを作成するディレクトリ(「%..%」で環境変数)
$TMP_DIR = getinistr($INI_FNAME, "HidemaruControl", "TMP_DIR");
if ((leftstr($TMP_DIR,1)=="%") && (rightstr($TMP_DIR,1)=="%"))
    $TMP_DIR = getenv(midstr($TMP_DIR,1,strlen($TMP_DIR)-2));
debuginfo $debuginfo_title + "$TMP_DIR : "" + $TMP_DIR + """;

//クローズ処理の有無(0:オープンのまま、1:クローズ)
#FILE_CLOSE_FLAG = getininum($INI_FNAME, "HidemaruControl", "FILE_CLOSE_FLAG");
debuginfo $debuginfo_title + "#FILE_CLOSE_FLAG : " + str(#FILE_CLOSE_FLAG);

// (無題)のときのために作成する一時ファイル名のプリフィックスと拡張子
$TMP_FNAME_PREFIX = getinistr($INI_FNAME, "HidemaruControl", "TMP_FNAME_PREFIX");
debuginfo $debuginfo_title + "$TMP_FNAME_PREFIX : "" + $TMP_FNAME_PREFIX + """;
$TMP_FNAME_EXT = getinistr($INI_FNAME, "HidemaruControl", "TMP_FNAME_EXT");
debuginfo $debuginfo_title + "$TMP_FNAME_EXT : "" + $TMP_FNAME_EXT + """;

// WSHのEXEファイル名
$WSH_EXE_FNAME = getinistr($INI_FNAME, "VBScriptControl", "WSH_EXE_FNAME");
debuginfo $debuginfo_title + "$WSH_EXE_FNAME : "" + $WSH_EXE_FNAME + """;

// VBSファイル名
$VBS_FNAME = currentmacrodirectory + "" + getinistr($INI_FNAME, "VBScriptControl", "VBS_FNAME");
debuginfo $debuginfo_title + "$VBS_FNAME : "" + $VBS_FNAME + """;

// VBS機能名
$VBS_FUNC = getinistr($INI_FNAME, "VBScriptControl", "APPO");       // Appointment
debuginfo $debuginfo_title + "$VBS_FUNC : "" + $VBS_FUNC + """;

//$VBS_FUNC_OPT_DEL = " " + getinistr($INI_FNAME, "VBScriptControl", "OPT_DEL") + " ";  // /DEL
//debuginfo $debuginfo_title + "$VBS_FUNC_OPT_DEL : "" + $VBS_FUNC_OPT_DEL + """;



///////////////////////////
// メイン処理部スタート
///////////////////////////

// CreateCybozuItem.vbsに引き渡すファイルの作成
if (filetype == "new") {
    // 新規(ファイル名なし)の場合

    // 一時ファイル名の作成と保存
    $content_fname = $TMP_DIR + "" + $TMP_FNAME_PREFIX + year + month + day + hour + minute + second + $TMP_FNAME_EXT;
    saveas $content_fname,sjis;

    debuginfo $debuginfo_title + "Saving as "" + $content_fname + """;

    // サイボウズ画面を表示したら、ファイルを削除するために、VBSに/DELオプションを付加
    $vbs_func_options = $vbs_func_options + $VBS_FUNC_OPT_DEL;

//  #FILE_CLOSE_FLAG = 1;   // マクロ実行終了直前に、ファイルをクローズ
}
else {
//  if (charset != 1) {
//      message currentmacrobasename + "は、Shift-JISモードのみ対応です。nShift-JISモードに変換後、再実行してください。";
//      endmacro;
//  }

    if (updated == 1) {
        //  更新されているため、保存
        save;
        debuginfo $debuginfo_title + "Saving for updated";
    }
    $content_fname = filename;
}

debuginfo $debuginfo_title + "$content_fname=" + $content_fname;


// クリップボードのファイルの内容をコピーする。(VBScriptでは困難に操作)
selectall;
copy;


// CreateCybozuItem.vbsの呼び出し
$run_commandline = """ + $WSH_EXE_FNAME + "" "" + $VBS_FNAME + "" " + $VBS_FUNC + " "" + $content_fname + "" " + $vbs_func_options +" " + $run_options;
debuginfo $debuginfo_title + "$run_commandline=" + $run_commandline;

run $run_commandline;


// 終了処理
if (#FILE_CLOSE_FLAG == 1) {
    exit;
}

endmacro;


CreateCybozuItem.vbs v0.01のバックアップ

2007年10月31日 06時22分05秒 | 秀丸エディタ Tips
' CreateCybozuItem.vbs v0.01
' Copyright (C) 2007 甘党のプログラマ, All rights reserved.
'v0.01 (2007/10/24) 
'初版-サイボウズの予定作成のみ対応。

Option Explicit 
const VBS_TITLE = "CreateCybozuItem.vbs v0.01"

Dim strUrlPath, strUrlPage, strUrlId, strUrlGid, strUrlData, strUrlBpage, strUrlBdate
Dim strAppActivate
strUrlPath = "http://★.★.★.★//scripts/cb3/office.exe"
strUrlPage = "page=ScheduleEntry"
strUrlId = "id=★"
strUrlGid = "gid=★" 
strAppActivate = "★★★ - スケジュールの登録 - Microsoft Internet Explorer" 
Dim objWshUnnamed
Set objWshUnnamed = WScript.Arguments.Unnamed
Dim objWshNamed
Set objWshNamed = WScript.Arguments.Named
Dim enumItemType 
(0:olMailItem/1:olAppointmentItem/3:olTaskItem/4:olNoteItem)
Dim strItemType
Dim strInputFile  ' 入力ファイル名

Dim objFso
Dim objStream

Dim objIE
Dim strUrl

Dim boolDelFileFlag
boolDelFileFlag = False
Dim boolContProcFlag
boolContProcFlag = True
Dim boolFindStat
boolFindStat = False

Dim oRe, oMatch, oMatches, RetStr
Dim idxFindPos
Dim strYear ,strMon, strDay
Dim strHour, strMin

Dim objWSHShell
Dim strBody
Dim Idx

If objWshUnnamed.Count <> 2 Then
 DispUsage
 boolContProcFlag = False
Else
 Select Case objWshUnnamed(0)
  Case "appo"
   enumItemType = 1 'olAppointmentItem
   strItemType = "予定"
  Case Else
   DispUsage
   boolContProcFlag = False
 End Select

 strInputFile = objWshUnnamed(1)

 If objWshNamed.Exists("DEL") Then boolDelFileFlag=True

 If boolContProcFlag = True Then
  Set objFso = CreateObject("Scripting.FileSystemObject")
  If objFSO.FileExists(strInputFile) Then
   Set objStream = objFso.OpenTextFile(strInputFile , 1)
   strBody = objStream.ReadAll()
   strYear = Year(Now)
   strMon = Month(Now)
   strDay = Day(Now)
   strHour = Hour(Now)
   If (Minute(Now)<30) Then 
    strMin = 0
   Else
    strMin = 30
   End If

   ' 月/日のパターン
   Set oRe = New RegExp
   oRe.Pattern = "([0-9]+)/([0-9]+)"
   Set oMatches = oRe.Execute(strBody)
   If oMatches.Count > 0 Then
    Set oMatch = oMatches(0)
    strMon = oMatch.SubMatches(0)
    strDay = oMatch.SubMatches(1)
    idxFindPos = oMatch.FirstIndex
   Else
    idxFindPos = -1
   End If
   ' mm月dd日のパターン
   oRe.Pattern = "([0-9]+)月 +([0-9]+)日"
   Set oMatches = oRe.Execute(strBody)
   If oMatches.Count > 0 Then
    Set oMatch = oMatches(0)
    If (oMatch.FirstIndex <idxFindPos) Then
     strMon = oMatch.SubMatches(0)
     strDay = oMatch.SubMatches(1)
     idxFindPos = oMatch.FirstIndex
    End If
   Else
    idxFindPos = -1
   End If
   ' 時:分のパターン
   oRe.Pattern = "([0-9]+):([0-9]+)"
   Set oMatches = oRe.Execute(strBody)
   If oMatches.Count > 0 Then
    Set oMatch = oMatches(0)
    strHour = oMatch.SubMatches(0)
    strMin = oMatch.SubMatches(1)
    idxFindPos = oMatch.FirstIndex
   Else
    idxFindPos = -1
   End If
   ' h時m分のパターン
   oRe.Pattern = "([0-9]+)時 +([0-9]+)分"
   Set oMatches = oRe.Execute(strBody)
   If oMatches.Count > 0 Then
    Set oMatch = oMatches(0)
    If (oMatch.FirstIndex <idxFindPos) Then
     strHour = oMatch.SubMatches(0)
     strMin = oMatch.SubMatches(1)
     idxFindPos = oMatch.FirstIndex
    End If
   Else
    idxFindPos = -1
   End If
   ' URLの生成
   strUrlData = "date=da." & Year(Now) & "." & Month(Now) & "." & Day(Now)
   strUrlData = "date=da." & strYear & "." & strMon & "." & strDay
   strUrlBpage = "bpage=ScheduleDay"
   strUrlBdate = "bdate=da." & strYear & "." & strMon & "." & strDay
   strUrl = strUrlPath & "?" & strUrlPage & "&" & strUrlId & "&" & strUrlGid & "&" & strUrlData & "&" & strUrlBpage & "&" & strUrlBdate
   Set objWSHShell = WScript.CreateObject("WScript.Shell")
   ' IEのインスタンスを生成
   set objIE = WScript.CreateObject("InternetExplorer.Application")
      With objIE
          .Visible = True
    .Navigate(strUrl)
    Do While .busy
    Loop
    Do While .Document.readyState <> "complete"
    Loop

    ' ウィンドウの切替
    boolFindStat = objWSHShell.AppActivate( strAppActivate )
    If  boolFindStat = False Then
     MsgBox("debug cannot find ie window")
    End If

    WScript.Sleep 1000

    'メモへの入力は、Shift+Tab 9回
          objWSHShell.SendKeys "+{TAB}+{TAB}+{TAB}+{TAB}+{TAB}+{TAB}+{TAB}+{TAB}+{TAB}"
    ' クリップボードの内容をペースト
          objWSHShell.SendKeys "+{INSERT}"
          objWSHShell.SendKeys "^{HOME}"
   '予定(タイトル)の入力は、さらに、Shift+Tab 3回
          objWSHShell.SendKeys "+{TAB}+{TAB}+{TAB}"
    ' クリップボードの内容をペースト
          objWSHShell.SendKeys "+{INSERT}"
    '開始時刻の時間は、Shift+Tab 5回
          objWSHShell.SendKeys "+{TAB}+{TAB}+{TAB}+{TAB}+{TAB}"
    '8時以降は、↓をstrHour-7回
    If strHour > 7 Then
     For Idx = 1 To (strHour-7)
      objWSHShell.SendKeys "{DOWN}"
     Next
    Else
     ' 7時以前は、1回↓のあと、↑を9-strHour回
     objWSHShell.SendKeys "{DOWN}"
     For Idx = 1 To (9-strHour)
      objWSHShell.SendKeys "{UP}"
     Next
    End If
    '開始時刻の分に、移動(Tab 1回)
          objWSHShell.SendKeys "{TAB}"
    '00は、↓1回
    For Idx = 1 To (strMin/15)+1
     objWSHShell.SendKeys "{DOWN}"
    Next
    '終了時刻に移動(Tab 1回)
          objWSHShell.SendKeys "{TAB}"
    '終了時刻は、開始の+1時間にしておく、移動(Tab 1回)
    If (strHour+1) > 7 Then
     For Idx = 1 To ((strHour+1)-7)
      objWSHShell.SendKeys "{DOWN}"
     Next
    Else
     ' 7時以前は、1回↓のあと、↑を9-(strHour+1)回
     objWSHShell.SendKeys "{DOWN}"
     For Idx = 1 To (9-(strHour+1))
      objWSHShell.SendKeys "{UP}"
     Next
    End If
    '終了時刻の分に、移動(Tab 1回)
          objWSHShell.SendKeys "{TAB}"
    '00は、↓1回
    For Idx = 1 To (strMin/15)+1
     objWSHShell.SendKeys "{DOWN}"
    Next
    ' Shift Tabで、終了時刻の時間に戻る
          objWSHShell.SendKeys "+{TAB}"
   End With
  Else
   ' システムがエラーを出すか?
  End If
 End If
End If
WScript.Quit (1)

Private Sub DispUsage
 MsgBox _
   "○ 使用方法" & vbCrLf & _
  "wscript.exe CreateCybozuItem.vbs item-type filename " & vbCrLf & _
  "  item-type=appo" & vbCrLf & _
  "○ 機能" & vbCrLf & _
  "item-typeに指定されたサイボウズv3のアイテム作成します。" & vbCrLf _
 ,, VBS_TITLE
End Sub



秀丸エディタマクロのショートカットキー割付の方法

2007年07月24日 06時07分45秒 | 秀丸エディタ Tips
秀丸エディタマクロの「KeyboardMacro拡張」とか、「クリップボード履歴の取り込み」、さらには、セキセイニャンコ(nyan)さん作成の「NYANKEY ver 3 ...文字列 Cut&Paste バッファ× 280個」の登録をしようとしたときに、大量のショートカットキーの設定が必要になります。

ただ、秀丸エディタのキー割り付けのダイアログボックスって、ショートカットキーを指定して、そのあとに、割り当てる機能を選択するようなダイアログボックスなので、同じマクロを、違うショートカットキーに割り付ける作業は、無意味に、大変です。(新たなショートカットキーを割り付けるとき、かならず、最初は、(なし)から始まるので、そのあとの同じ機能選択をひたすら繰り返す羽目になる。)

そして、h-tomさん作成の「キー設定マクロ(key-assign-set.mac)」なるものを見つけて、どうやら、秀丸エディタ自体のショートカットキーの設定のレジストリやその取り込みの挙動を解析して実現したようで、すごそうなのですが、ただ、どうやら、ませまさん作成の「キー割り当て拡張マクロ」を使った場合のiniファイルを読み込んで動作するようです。
まだ、ませまさん作成の「キー割り当て拡張マクロ」は使ったことがないのですが、どうも、機能概要を見ても、自分には、必要そうがありません。

で、ここまでのところで、WSHで、秀丸エディタのモーダルダイアログを操作してきているので、同様に、秀丸エディタの「キー割り当て」ダイアログボックスを操作してしまうのはどうだろうと思ってしまい、まずは、「キー割り当て」ダイアログボックスの中のキーリストと、そのキーのiskeydown関数のコードを調べてみました。

秀丸エディタV6.11のキー割り当てダイアログのキーリスト

この表の中の[採取データ]を元に、[テーブルデータ]のように、マスターテーブルを作って、そのインデックスを参照するように、Shift/Ctrl/Altの状態で、テーブルを切り替えようと考えてみました。

そのあと、WSHのSendKeysで、本当に、登録済みのマクロのショートカットキーの設定ができるものかどうかを、まずは、KeyboardMacro拡張のEVAL機能を使って試していたら、あまり、汎用性を考えなければ、このEVALとキーボードマクロだけで、うまくいきそうです。

まあ、一度、設定してしまったら、そんなに、頻繁に設定するものでもないし、ここまでの情報を元に、設定の度ことに、キーボードマクロで、設定するだけで良いような気がしてきました。(まぁ、もう少し、頑張るんだったら、秀丸エディタのマクロをハードコーディングしても良いかもね。)


以下は、私のマシン上でのディレクトリパスや、設定するマクロの番号が固定だったりするので、調整が必要になります。

○ Alt+Shift+0~9を(なし)をマクロ41に設定する場合
$_=61~70
#M=41;$K="%L%S%K{DOWN "+$_+"}%C^{END}{UP}{TAB}^{HOME}{DOWN "+str(#M+7)+"}"; run "wscript.exe \"C:\\Program Files\\Hidemaru\\Macro\\KeyboardMacro拡張\\KeyboardMacroEx.vbs\" \"" + $K + "\" \"Not fond ERROR\" /W:\"キー割り当て\" /T:5"; keyassign;

○ Alt+Shift+Ctrl+1~9をマクロ41に設定する場合
$_=62~70
#M=41;$K="%L%S%T%K{DOWN "+$_+"}%C^{END}{UP}{TAB}^{HOME}{DOWN "+str(#M+7)+"}"; run "wscript.exe \"C:\\Program Files\\Hidemaru\\Macro\\KeyboardMacro拡張\\KeyboardMacroEx.vbs\" \"" + $K + "\" \"Not fond ERROR\" /W:\"キー割り当て\" /T:5"; keyassign;

○ Alt+Ctrl+Num0~Num9をマクロ41に設定する場合
$_=75~84
#M=41;$K="%L%T%K{DOWN "+$_+"}%C^{END}{UP}{TAB}^{HOME}{DOWN "+str(#M+7)+"}"; run "wscript.exe \"C:\\Program Files\\Hidemaru\\Macro\\KeyboardMacro拡張\\KeyboardMacroEx.vbs\" \"" + $K + "\" \"Not fond ERROR\" /W:\"キー割り当て\" /T:5"; keyassign;


○ Alt+Shift+0~9を(なし)にクリアする場合
$_=61~70
$KEY_SEQUENCE="%L%S%K{DOWN " + $_ + "}%C^{HOME}{TAB}^{HOME}"; run "wscript.exe \"C:\\Program Files\\Hidemaru\\Macro\\KeyboardMacro拡張\\KeyboardMacroEx.vbs\" \"" + $KEY_SEQUENCE + "\" \"Not fond ERROR\" /W:\"キー割り当て\" /T:5"; keyassign;

○ Alt+Shift+Ctrl+1~9を(なし)にクリアする場合
$_=62~70
$KEY_SEQUENCE="%L%S%T%K{DOWN " + $_ + "}%C^{HOME}{TAB}^{HOME}"; run "wscript.exe \"C:\\Program Files\\Hidemaru\\Macro\\KeyboardMacro拡張\\KeyboardMacroEx.vbs\" \"" + $KEY_SEQUENCE + "\" \"Not fond ERROR\" /W:\"キー割り当て\" /T:5"; keyassign;

○ Alt+Ctrl+Num0~Num9を(なし)にクリアする場合
$_=75~84
$KEY_SEQUENCE="%L%T%K{DOWN " + $_ + "}%C^{HOME}{TAB}^{HOME}"; run "wscript.exe \"C:\\Program Files\\Hidemaru\\Macro\\KeyboardMacro拡張\\KeyboardMacroEx.vbs\" \"" + $KEY_SEQUENCE + "\" \"Not fond ERROR\" /W:\"キー割り当て\" /T:5"; keyassign;


KeyboardMacroEx v0.02のTODOと拡張案

2007年07月20日 05時38分48秒 | 秀丸エディタ Tips
v0.000001からのToDoや拡張案を見直してみて、今回のものとマージして、まとめておきました。

■ TODO

○ 評価をほとんどしていないし、かつ、結構、基本なところに手を入れた可能性があるので、ソースとコンフィグを見ながら、ホワイトボックステストをしないとまずそうです。

○ 先ほど、急いで、コメントを付けておいてた「SAVE_DIRがないとエラーになる 」件は、修正しないとまずいですね。

○ エラーチェック
現状は、とりあえずのコードなので、ほとんど、エラーチェックをしていない。気づいた部分には、ソースコード中に、「★[TODO]」でコメントを入れている。

○ 実行速度
反応速度が、ワンテンポ遅れるのが気に入らない。(特に、ポップアップメニュー表示)
まずは、debuginfo文が大量に入っているので、その影響度合いを調査した方が良いかも。
そのあとは、実行時間のプロファイリングをして、チューニングをすることになるが、秀丸エディタのマクロ実行エンジンの速度の問題で、対応が厳しそうな場合には、WSH側に、多くの処理をさせた方が速くなる気がする。

○ 連続押しで、エラーになりそう。

○ マクロ登録時のコメントでキャンセルをすると、デフォルト(保存日)のコメントにするだけだが、本当は、登録せずに、キャンセルできるようにした方が良いはず。

○ disabledrawからenabledrawしたときに、画面調整をしたはずだが、うまくいっているか?


■ 以下は、今後の拡張案

○ EVAL文中の特殊変数の拡張
とりあえず、最初からおごるとなかなか動き始めないので、EVAL文の中の特殊変数として、$_だけを用意したが、EVAL文中の特殊変数は、いくらでも、拡張できそう。

・「#_」は、「val($_)」に展開すると、一手間省けそう。

・ 現状、「$_」は、一つしか展開していない。複数の「$_」の対応について、少し、検討する必要があるはず。(全て、同じ文字列に展開するか、、。ただ、複文の場合には、それ以前の左辺値が文字列のものを参照するとか、、、。)

・ 表記は考えていないが、クリップボード履歴機能と組み合わせても、面白いかも、、、。

○ EVAL文のヒストリ機能
現状は、一回前のEVAL文を、EVAL文のinputboxに入れておく程度の対応しかしていないが、なんとか、昔に指定したEVAL文を参照できるようにならないだろうか?
一番安直なのは、クリップボードに自動的にコピーして、秀丸のクリップ履歴機能に頼れるようにするのも一案だが、これ以上になると、専用のメニュー面を用意するか、ヒストリ機能つきのコンボボックスのGUIになるように、WSHなり田楽DLLなりにUIを変更する必要があるかも。

※ EVAL機能は、非常にプリミティブなので、何でもできるようたが、指定が面倒すぎて。使わない恐れもあるし、作者以外が、この機能を理解できくなる恐れが高い、、、。デフォルトのコンフィグでは、無効にしておいた方が良いかも。(ただ、私(ymiz777)が使いやすければ、それだけ良いので、気にすることもないか、、、。)無理に難しくして、他の人に理解不能にしまうよりは、もう少し、自分自身で、使い込んでみてから、便利そうな特殊変数を入れていった方が良さそう。

○ カレントのキーボードマクロを実行について
秀丸エディタでキー操作の記録中に、KeyboardMacroExのポップアップメニューを表示して使用するようなキーボードマクロは、そのまま、秀丸エディタで再生をすると、うまく再生できない件は、対処が厳しいので、考えないことにする。ただ、KeyboardMacroExのポップアップメニューの中から、カレントを実行したときに、現状は、毎回、loadmacroをして、変換しょりをしている。本当は、一度、KeyboardMacroExのポップアップメニューの中から、カレントを実行したら、変換後のマクロを呼び出すexecmacroをsavemacroしたいところ。ただ、変換したものを直接、savemacroしていた頃には、用意に対応できていたが、今回、v0.02で、~KeyboardMacroExKey*.macファイル呼び出しをsavemacroするような構造にしたので、かなり、厳しい。

loadmacroをしたときに、マクロ文の内容、特に、execmacroの呼び出し先のチェックとともに、コメント等にもマジックフレーズを入れておいて、チェックすることで、一度、変換したマクロを呼び出している場合には、何もせずに、実行するようにするだけとか、呼び出し先(変換済みの.mac)を、~KeyboardMacroExKey*.macファイルにコピーするような構造にする必要があるかもしれない。


○ 記録中の登録について、
今回v0.02では、ショートカットキーのダイレクト登録のときだけ、マクロの終了と登録をできるようにしてみた。
ポップアップメニューの方からも、HIDEMARU_KEYMACRO_ENDキーが定義されていたら、記録中でも、登録メニューに遷移できるようにして、マクロの終了と登録をできるようしても良いかもしれない。

○ UIの再検討
現状レベルの設定であれば、ポップアップメニューで、モードをトグルするような設定方法でも、これは、これで、結構、以外に、快適に使えますね。
ただ、今後、もし、拡張を続けていって、いろいろと、複雑な設定をさせるようになると、さすがに、このポップアップメニューだけでは、破綻するような気がする。
田楽DLLとかHTAのダイアログボックスで、設定させるようなことも、いつか、考える必要がでてくるはず。

○ 秀丸エディタのキー操作記録状態の取得 CheckRecordingStatus:では、VBSを呼び出して、「記録中!」というタイトルウィンドウを探すことにしてしまったが、もっと、エレガントな方法はないのだろうか?
このVBS呼び出しは、WSH立ち上がり後、一回のチェックで、OK/NGが判断できるので、速度的には、あまり、気にならないようだったが、ただ、あまりにも、きわどすぎる。

○ CaputureCurrentKeyboardMacroルーチンからKeyboardMacroEx.macを使って、「キー操作の保存」ダイアログを操作するとき、300ms周期ポーリングとかアクティブ後100msウェイトとか、いろいろと、マージン時間をいれている。このあたりを調整すると、きびきび動くようになるかもしれないが、環境やシステム状況の状況に影響されるので、何か、対策がないかを考えたい。(そもそも、こんなきわどいことをしなくても、もっと、自然に、保存する方法がないかも、調査したい。)

○ 選択範囲内でリピート機能:
以前のブログにも書きましたが、マクロの中で、開始と終了を記録しても、マクロ処理で、位置が変化してしまうため、単純には、無理。やるとしたら、マークを挿入したいところだが、選択範囲内にマークがあると、矛盾が起きてしまうため、これも厳しい、、、。

○ キーボードマクロ用一時変数値機能
現状は、単に初期値を設定して、挿入したら、インクリメントするだけ。
この機能に関連して、以下のような拡張のアイデアもある。
ステップ数設定
書式設定 : 幅、右寄せ、カンマ区切り、基数指定(hex/dec/oct/binなど)
数値以外日付/曜日などの対応(Excelが参考になるか?)

さらに、今は、一つしか用意しなかったが、複数の一時変数のサポートするアイデアもある。

○ 一時バッファの内容の編集機能

○ ダイアログボックスの入力待ちで止まってしまうような機能についても、パラメータ設定も含めて、先に進めるような機能。

以下までくると、レコーディング自体をマクロがしないと実現できないかも?

○ 外部コマンドを実行するようなマクロの実現
○ 他のファイルを開いたり、行ったりきたり、するマクロの実現

たぶん、KeyboardMacroEx.macの中の「拡張のキー操作の記録開始」記録開始をさせて、KeyboardMacroEx.macの「外部コマンドを実行」とか、「他のファイルを開く/切り替える」「元のファイルに戻る」を使って、キーボードマクロを作ってもらうしか方法がなさそう。つまり、KeyboardMacroEx.macの管理下で、秀丸のキーボードマクロの記録開始/終了を繰り返し操作して、終了時に、 KeyboardMacroEx.macのファイルに取り込んだものを組み合わせるアイデア。




▲ 環境変数、レジストリやINIファイル等を参照/設定する機能
→頻繁に使用すると思えないので、今回、追加したevalで対応できるはずなので、対応する必要なし。

▲ 条件分岐の実現
例えば、カレントのキーボードマクロ内の最後検索の失敗したときに実行する挙動を定義させたりするのもかしれない。
→ ここまでくると、直接、マクロを編集させた方が分かりやすいので、対応する必要なしと思う。

KeyboardMacroEx v0.02

2007年07月20日 04時29分51秒 | 秀丸エディタ Tips
まだ、未評価状態で、何らかのバグが紛れ込んでいる可能性が非常に高い感じがしています。
ただ、評価開始前のバックアップということで、現状の状態をアーカイブして、アップロードしておこうと思います。


変更内容は、以下の通り。

○ v0.02 (2007/7/20)
・KeyboardMacroEx.ini v0.01→v0.02からの変更点
(1) [HidemaruControl]セクションにHIDEMARU_KEYMACRO_ENDキー追加
(2) [Eval]セクションとEVAL_STATEMENTキーの追加

・KeyboardMacroEx.mac v0.01→v0.02からの変更点
(1) 秀丸エディタでのキー操作記録中にダイレクト登録ショートカットキーを
有効化。
(2) EVAL文実行機能の追加
(3) キーボードマクロのカレントへの復帰時、単純にロードすると、記録中呼
び出しヒストリファイルとのマージ処理等で、サイズが大きくなっている
ために、登録が失敗することがあった。このため、ロードするマクロは、
指定されたマクロファイルをexecmacro呼び出しに変更。
(4) 保存メニューと復帰メニューでタイトルや区切り線を選んだときに無意味
にエラー発生をしていたため、無視するように変更。
(5) キーボードマクロ用一時変数値の設定時に、キャンセルすると、0になっ
てしまっていたため、キャンセルできるように変更。
(6) $CURRENT_KBM_TMP_SAVE_FNAMEは、カレントのキーボードマクロ専用化。
別途、記録状態ステータスチェック、EVAL実行、カレントバッファ登録時
に使いまわすテンポラリファイル名$TMP_FNAMEを定義。
(7) マクロの実行前後で検索系ダイアログの状態が変化していたため、ユーザ
の検索系ダイアログの状態の保持して、復帰するように変更。

・KeyboardMacroEx.vbs v0.01
(変更無し)


※ 主な追加機能としては、「秀丸エディタでのキー操作記録中にダイレクト登録ショートカットキーを有効化。」と「EVAL文実行機能の追加」ですが、「キーボードマクロのカレントへの復帰時、単純にロードすると、記録中呼び出しヒストリファイルとのマージ処理等で、サイズが大きくなっているために、登録が失敗することがあった。このため、ロードするマクロは、指定されたマクロファイルをexecmacro呼び出しに変更。」は、結構、構造的にきわどいところを触ってしまったような気がして、かなり、いろいろなところへの影響度をチェックしないと、まずそうです。


ファイルのダウンロードは、以下からできるようにしてあります。

甘党のプログラマのファイル保管庫」の「秀丸エディタ関連のマクロ」ページの「■ 秀丸エディタキーボードマクロ拡張」

KeyboardMacroEx v0.01 ベータ版のTODO

2007年07月11日 04時59分39秒 | 秀丸エディタ Tips
TODOは、大体つぶしたが、そのほかの気になる点とか拡張案については、何もできていない。

■ TODO
○ 保存や復帰のときに、変換したマクロが大きくなっているので、復帰に失敗する場合がある。
ちょっとだけ、対処が面倒なので、対応を後回しにした。一時的なマクロファイル作成して、そのマクロを呼び出すように、Loadrecordする。

○ エラーチェック
現状は、とりあえずのコードなので、ほとんど、エラーチェックをしていない。気づいた部分には、ソースコード中に、「★[TODO]」でコメントを入れている。

■ ちょっと、気になっている点の追加
○ 実行速度
反応速度が、ワンテンポ遅れるのが気に入らない。(特に、ポップアップメニュー表示)
まずは、debuginfo文が大量に入っているので、その影響度合いを調査した方が良いかも。
そのあとは、実行時間のプロファイリングをして、チューニングをすることになるが、秀丸エディタのマクロ実行エンジンの速度の問題で、対応が厳しそうな場合には、WSH側に、多くの処理をさせた方が速くなる気がする。

○ 連続押しで、エラーになりそう。


■ KeyboardMacroEx.macの将来の拡張案のアイデアの追加
○ 記録中に登録をできるようにすると良いかもね。
記録中に、ショートカットなりで登録使用したら、questionで記録を終了するかどうかを確認するかな?

○ メニューから、記録の開始と終了をできると良いかもね。


KeyboardMacroEx v0.01 ベータ版

2007年07月11日 04時49分30秒 | 秀丸エディタ Tips
ちょっと、あまりに、気になって、他のことが手がつかないので、とりあえず、まとめました。

大きな機能追加としては、「ダイレクト登録/呼び出しのためのショートカットキー機能」の部分をコーディングしたというところでしょうか?


・ キーボードマクロ一時バッファ(最大9個)
・ 一時バッファ登録時のコメント
・ キーボードマクロのリピート呼び出し機能
・ 検索失敗時のマクロ実行中止機能
・ disabledrawによるマクロ実行中の画面ロック指定
・ 繰り返しで連番数を作るためのキーボードマクロ用一時変数機能
・ 一時バッファへ登録済みのキーボードマクロを組み合わせて、キーボードマクロを作成可能
・ 全機能は、ポップアップメニューでアクセス可能
・ ダイレクト登録/呼び出しのためのショートカットキー機能


ToDoが残っていますが、まずは、ここまでのところで、ベータ版として、使い勝手を試してみます。


○ v0.01 (2007/7/11)
・KeyboardMacroEx.ini v0.01→v0.000001からの変更点
(1) [HidemaruControl]セクションに、数字キーのベースコード値をコンフィグ
レーションするためのNUMKEYCODE_BASEキーを追加
(2) [LoadRecordDialogBox]セクションのキー名を[SaveRecordDialogBox]セク
ションと一致させた。

・KeyboardMacroEx.mac v0.01→v0.000001からの変更点
(1) クリップボード内容の復旧 : マクロの実行前後で、テキストのクリップ
ボードの内容が変化しないように、初期化で、新規のステルスウィンドウ
にペーストしておき、最後に、コピーして、poppaste
(2) 削除メニューの追加
(3) 復帰メニューの追加
(4) ダイレクト呼び出し/登録ショートカットキー対応

・KeyboardMacroEx.vbs v0.01
(変更無し)

ファイルのダウンロードは、以下からできるようにしてあります。

甘党のプログラマのファイル保管庫」の「秀丸エディタ関連のマクロ」ページの「■ 秀丸エディタキーボードマクロ拡張」

KeyboardMacroEx.macの将来の拡張案のアイデア

2007年07月05日 06時10分37秒 | 秀丸エディタ Tips
秀丸エディタキーボードマクロ拡張用マクロの機能案を検討中、、、の後半でも、KeyboardMacroEx.macの拡張案を書いていますが、それも含めて、コーディングしながら、思いついたアイデアを、忘れないうちに、メモしておこうと思います。

○ UIの再検討
現状レベルの設定であれば、ポップアップメニューで、モードをトグルするような設定方法でも、これは、これで、結構、以外に、快適に使えますね。
ただ、今後、もし、拡張を続けていって、いろいろと、複雑な設定をさせるようになると、さすがに、このポップアップメニューだけでは、破綻するような気がする。
田楽DLLとかHTAのダイアログボックスで、設定させるようなことも、いつか、考える必要がでてくるはず。


○ 選択範囲内でリピート機能:
以前のブログにも書きましたが、マクロの中で、開始と終了を記録しても、マクロ処理で、位置が変化してしまうため、単純には、無理。やるとしたら、マークを挿入したいところだが、選択範囲内にマークがあると、矛盾が起きてしまうため、これも厳しい、、、。


○ バッファの個数を増やすとか、バッファの内容をカレントにコピーする機能とか
バッファのマクロ間に依存関係がない限り、登録場所の変更して、整理できるようになる。ただ、現状は、9個しかないので、本当に、単なる一時バッファとしていか使えないので、整理する必要もない。バッファの個数何十個と増やせるようにすると、一時バッファというよりは、常駐させるためのマクロにもなりそうなので、こうなると、整理するための機能も欲しくなる。このときには、単に、バッファの内容をカレントにコピーする機能で良いかも。


○ キーボードマクロ用一時変数値機能
現状は、単に初期値を設定して、挿入したら、インクリメントするだけ。
この機能に関連して、以下のような拡張のアイデアもある。
ステップ数設定
書式設定 : 幅、右寄せ、カンマ区切り、基数指定(hex/dec/oct/binなど)
数値以外日付/曜日などの対応(Excelが参考になるか?)

さらに、今は、一つしか用意しなかったが、複数の一時変数のサポートするアイデアもある。

○ 環境変数、レジストリやINIファイル等を参照/設定する機能

○ 一時バッファの内容の編集機能

○ 条件分岐の実現
例えば、カレントのキーボードマクロ内の最後検索の失敗したときに実行する挙動を定義させたりするのもかしれない。

○ ダイアログボックスの入力待ちで止まってしまうような機能についても、パラメータ設定も含めて、先に進めるような機能。



以下までくると、レコーディング自体をマクロがしないと実現できないかも?

○ 外部コマンドを実行するようなマクロの実現
○ 他のファイルを開いたり、行ったりきたり、するマクロの実現

たぶん、KeyboardMacroEx.macの中の「拡張のキー操作の記録開始」記録開始をさせて、KeyboardMacroEx.macの「外部コマンドを実行」とか、「他のファイルを開く/切り替える」「元のファイルに戻る」を使って、キーボードマクロを作ってもらうしか方法がなさそう。つまり、KeyboardMacroEx.macの管理下で、秀丸のキーボードマクロの記録開始/終了を繰り返し操作して、終了時に、KeyboardMacroEx.macのファイルに取り込んだものを組み合わせるアイデア。


KeyboardMacroEx.macのTODO

2007年07月05日 05時33分31秒 | 秀丸エディタ Tips
ちょっと、このあと、しばらく時間がとれないかもしれないので、忘れないうちに、今、頭にあることを書いておこうと思います。

■ TODO

○ ダイレクト登録/呼び出しのためのショートカットキー機能
・CheckShortcutKeyルーチンの実装が必要
iskeydown()関数で、Shift、Ctrl、Altのコードが上がってくることは確認済み。
CAL_SHORTCUTKEYとCAP_SHORTCUTKEYキーの文字列を解析("Shift"、"Ctrl"、"Alt"をstrstrすれば良いか?)
Shift、Ctrl、Altと数字キーの組み合わせが、マッチしたら、オプションキーも含めて、リターンする。マッチしない場合には、0リターン(今のスタブ)

なお、数字キーは、;QWERTYの上(1段目)と;NumLock(テンキー)で違うので、コンフィグレーションの要素として、追加が必要。

・「// ★[TODO]ショートカットキーの処理」の分岐処理
現在は、空。
まぁ、実験用のコードをベースにすれば、すぐにできるはず。
それより、#recording_statusが1:記録中の状態の場合には、登録ができないので、エラーメッセージも良いした方が良い。

○ クリップボード、及びクリップボード履歴の保持
たぶん、今は、マクロの前後で、クリップボードの内容が壊れることがあるはず。(要確認)
カレントのクリップボードの内容は、復帰するのは、当然として、クリップボード履歴も変化しないようにすること。

○ 検索条件の保持
たぶん、今は、マクロの前後で、検索バッファの内容が変化することがあるはず。(要確認)
マクロを呼んだら、検索テキストが変化するなんて、とんでもないので、検証と対応が必要。

○ 置換系の検索失敗のendmacroallをしていない
単純なコーディング漏れ。ConvertMacroFileのマクロ変換時に、置換系のキーワード検索も追加しておくこと。

○ 現状、KeyboardMacroEx.mac呼び出しを含むキーボードマクロは、1箇所の保存しかサポートしていない
#recording_statusが1:記録中で、KeyboardMacroEx.mac呼び出し履歴をとっているが、ConvertMacroFileのマクロ変換時後に、単純に削除してしまっている。(特に、現コードは、ConvertMacroFileのマクロ変換時にエラー表示するため、にっちもさっちもいかない。)

履歴ファイルを削除したら、KeyboardMacroEx.mac呼び出しを含むキーボードマクロは、バッファに登録ができなくするようなチェックを入れて、登録メニューに遷移できないようにする方が良いはず。(カレントの実行も消去が必要。。。。少し、制限が厳しすぎるか?)

このチェックが面倒であれば、ConvertMacroFileのマクロ変換時後に、履歴を単純に削除せずに、カレントのマクロが必要な行数にシュリンクするようなアイデアもある。

○ エラーチェック
現状は、とりあえずのコードなので、ほとんど、エラーチェックをしていない。気づいた部分には、ソースコード中に、「★[TODO]」でコメントを入れている。


■ ちょっと、気になっている点

○ disabledrawからenabledrawしたときに、画面調整をしたはずだが、うまくいっているか?

○ 実行速度
反応速度が、ワンテンポ遅れるのが気に入らない。(特に、ポップアップメニュー表示)
まずは、debuginfo文が大量に入っているので、その影響度合いを調査した方が良いかも。
そのあとは、実行時間のプロファイリングをして、チューニングをすることになるが、秀丸エディタのマクロ実行エンジンの速度の問題で、対応が厳しそうな場合には、WSH側に、多くの処理をさせた方が速くなる気がする。

○ 検索失敗で再生中止したマクロは、endmacroallで終了させているため、カレントのキーボードマクロ実行時には、そのテンポラリファイルが残るはず。
とりあえずは、固定ファイル名にしてあり、かつ、KeyboardMacroEx.macの最初のCheckRecordingStatusでのVBSとの中間ファイルと共用しているため、あまり、気にすることはないような気がする。
変換後のマクロは、絶対にKeyboardMacroEx.macコールを含んでいないはずだから、CheckRecordingStatusと共用は問題にならないと思っているが、よくよく考えて、破綻している場合には、少し、気にした方が良いかしれない。
また、CheckRecordingStatusと共用したので、$CURRENT_KBM_TMP_SAVE_FNAMEは、もう少し、分かりやすい、名前を変えたり、さらに、各所のコメントを変更が必要。

○ 秀丸エディタのキー操作記録状態の取得 CheckRecordingStatus:では、VBSを呼び出して、「記録中!」というタイトルウィンドウを探すことにしてしまったが、もっと、エレガントな方法はないのだろうか?
このVBS呼び出しは、WSH立ち上がり後、一回のチェックで、OK/NGが判断できるので、速度的には、あまり、気にならないようだったが、ただ、あまりにも、きわどすぎる。

○ マクロ変換時に、常に。キーボードマクロ用一時変数の挿入とインクリメント用のInsertKbmTmpVar:ルーチンを挿入してしまっている。
少なくとも、履歴に、call InsertKbmTmpVarがあるときだけにしたい。
ただ、やはり、直接、マクロに挿入せずに、InsertKbmTmpVar.macのようなものを用意or作成して、execmacroに置換した方が気持ちが良いかも。要再考。

○ CaputureCurrentKeyboardMacroルーチンからKeyboardMacroEx.macを使って、「キー操作の保存」ダイアログを操作するとき、300ms周期ポーリングとかアクティブ後100msウェイトとか、いろいろと、マージン時間をいれている。このあたりを調整すると、きびきび動くようになるかもしれないが、環境やシステム状況の状況に影響されるので、何か、対策がないかを考えたい。(そもそも、こんなきわどいことをしなくても、もっと、自然に、保存する方法がないかも、調査したい。)

秀丸エディタキーボードマクロ拡張v0.000001(作りかけ&機能評価用(α版)&バックアップ版)

2007年07月05日 04時31分26秒 | 秀丸エディタ Tips
いやぁ、参りました。ここまで、一気に書いたですが、何かする度に、考え込むような箇所がたくさんあって、くたびれたので、当初、頭の中でイメージした全体的なフレームワークは動き始めたので、まだ、コーディング途中で、ほとんど、動作確認もできていない状況ですが、とりあえず、現時点のコードをアーカイブしてバックアップしておこうと思います。

このマクロは、最終的には、秀丸エディタのキーボードマクロを、より便利にするための以下の機能を実現しようとしています。

・ キーボードマクロ一時バッファ(最大9個)
・ 一時バッファ登録時のコメント
・ キーボードマクロのリピート呼び出し機能
・ 検索失敗時のマクロ実行中止機能
・ disabledrawによるマクロ実行中の画面ロック指定
・ 繰り返しで連番数を作るためのキーボードマクロ用一時変数機能
・ 一時バッファへ登録済みのキーボードマクロを組み合わせて、キーボードマクロを作成可能
・ 全機能は、ポップアップメニューでアクセス可能
・ ダイレクト登録/呼び出しのためのショートカットキー機能(★未コーディング)

2007/7/5 v0.000001(作りかけ&機能評価用(α版)&バックアップ版)

ファイルのダウンロードは、以下からできるようにしてあります。

甘党のプログラマのファイル保管庫」の「秀丸エディタ関連のマクロ」ページの「■ 秀丸エディタキーボードマクロ拡張」