(サクラエディタ)(マクロ)(VBScript)(範囲指定した行の 行頭に 指定した文字を挿入するのを作ってみている所・・・)

 以前 フリーの 「だいなファイラー」 を使ってみていると書きましたが
現在は 「あふ」を使っています 笑)
環境設定自体は かなり めんどいけど 細かな設定ではやはり だいなファイラーより上かな?と
自分向けの 環境が出来てくると これは かなり爽快な感じで使えますね
私の 卓駆からの移行の本命は 「あふ」 になるかも!? 笑)

 と ファイラーの話はここまでで
フリーソフト化計画として サクラエディタをやっているわけですが
となると 当然 マクロ機能が気になるところです

 個人的に 凄く気になったのが 行の数え方が 「折り返し単位」がメインという
エディタ的感性の持ち主としては かなり 頭を痛める 仕様になっていることですね 笑)
ワープロ的感性の持ち主なら ハッピーな仕様なのかもしれませんが・・・ 笑)
エディタ的感性 というのは いうまでも無く 「改行単位」って事ですね
スクリプトなどの プログラムに対して マクロ処理する場合は
そんな エディタ側の都合でしかない 「折り返し単位」じゃ辛いんですよね・・・ 笑)

 ということで 現在 悩みに悩みまくって 製作中なのが
スクリプト や プログラム に 対するマクロの 基本中の基本となる
『 範囲指定した行の 行頭に 指定した文字列を挿入する 』
です・・・・ < そんな事に 苦労するなよという声が聴こえてくる・・・ 笑)
まぁ 同じような事が出来る 簡潔なプログラムは すぐに作ったんですが
ウインドウサイズによっては「折り返し」が発生して
どうしてもずれてしまうんですよね・・・、 改行単位ならこんなことには・・・・

 という事でそのサンプルです
いろんなところで エレガントさに欠けた コーディングがあって 恥ずかしい・・・・ 笑)
というか VB関係の プログラム書くの 本当に久しぶりだなぁ〜
Option Explicit

Call main

Sub main()
	Dim PrefixStr, buf, buf_ary, re, line, IsFirst, SelFrom, IsOneLine

	' 行頭に挿入する文字を取得する
	' キャンセル もしくは 値をセットしなかった場合 は
	' このマクロを終了する
	PrefixStr = InputBox("行頭に挿入する文字を入力してください", "行頭に挿入")
	If ( PrefixStr = "" ) Then
		Exit Sub
	End If

	' 選択範囲が掛かっている行を選択状態にする
	' ついでに 1行かどうか や 選択開始行を保存しておく
	SelFrom = RangeSelToLineSel(IsOneLine)

	' 選択範囲を処理して 行頭に 指定された文字を打った文字列を生成
	buf = Editor.GetSelectedString
	If ( IsOneLine ) Then
		Call Editor.InsText(PrefixStr + buf)
		Exit Sub
	End If
	buf_ary = Split(buf, vbCrLf)
	buf = ""
	IsFirst = True
	Set re = New RegExp
 	re.Pattern = "^"
	For Each line In buf_ary
		If IsFirst Then
			buf =re.Replace(line, PrefixStr) 
			IsFirst = False
		Else
			buf = buf + vbCrLf + re.Replace(line, PrefixStr)
		End If
	Next

	' 範囲選択は維持されているはずなので そこにペースト
	' 結果的に 範囲選択 と 置換される
	Call Editor.InsText(buf)

	' 範囲指定開始行に戻り 画面をリドローする
	Call Editor.Jump(SelFrom, 0)
	Call Editor.ReDraw(0)
End Sub

' 選択範囲が掛かっている行を選択状態にする関数
' 第1引数 は 書き戻しで 範囲指定が一行かどうかを判断する物
' 戻り値は 選択開始行の行番号(折り返し単位)
Function RangeSelToLineSel(ByRef IsOneLine)
	Dim SelFrom, SelTo

	' 選択中では無い場合は 現在の行を選択して終わり
	If ( Editor.IsTextSelected = 0 ) Then
		Call Editor.SelectLine(0)
		IsOneLine = True
		RangeSelToLineSel = Editor.GetSelectLineFrom()
		Exit Function
	End If

	' 選択範囲の 開始行 と 終了行を取得 (いずれも 折り返し単位)
	SelFrom = Editor.GetSelectLineFrom()
	SelTo = Editor.GetSelectLineTo()
	' カーソルが行頭にあるとその行まで範囲に入るので
	' 対象にしないようにする
	' ただし矩形範囲指定の場合は除く
	If ( Editor.GetSelectColmTo() <= 1 ) and ( Editor.IsTextSelected <> 2 )Then
		SelTo = SelTo - 1
	End If

	' 一旦範囲選択を解除、これをしないと矩形範囲の時おかしくなる
	Call Editor.CancelMode

	' Jump直後はカーソルが行頭にあるので そのまま 範囲選択を開始
	' 範囲終了行までJumpしてカーソルを行末に持っていく
	Call Editor.Jump(SelFrom, 0)
	Call Editor.BeginSelect()
	Call Editor.Jump(SelTo, 0)
	Call Editor.GoLineEnd_Sel()
	IsOneLine = False
	RangeSelToLineSel = SelFrom
End Function
 まぁ 「Editor」 を 連呼している所は 「With Editor 〜 End With」とかすれば
多少は 落ち着くかも・・・