秀丸エディタで、選択範囲の行頭&行末に文字を挿入


秀丸エディタで、選択範囲の行頭&行末に文字を挿入するマクロがあれば、教えて頂けないでしょうか?

ちなみに、
秀丸エディタで指定範囲の文字列を指定文字列で囲むマクロ
ttp://d.hatena.ne.jp/shouh/20160417/1460847168

これだと、選択範囲の最初と最後にしか文字が追加されません

すべての行の行頭&行末に特定の文字列を挿入
ttp://honey8823.hateblo.jp/entry/2015/08/11/120020

動作的にはこれが近いですが、「選択範囲」ではなく「すべての行」に文字が追加されます。

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2018/05/04 00:36:10
  • 終了:2018/05/04 11:13:03

ベストアンサー

id:Z1000S No.2

Z1000S回答回数25ベストアンサー獲得回数202018/05/04 08:47:19

ポイント90pt

挿入の基準が「行」となるようなので、
1行のみを対象とするような場合に
「文字を選択していないくてもキャレットがあればその行を選択している」
とみなして良いのであれば、次のような感じで。

キャレットが行頭にある場合について

  • 1行のみ選択している場合において、行頭=行末(要するに改行のみの行にキャレットがある)でも、その行を選択しているとみなしています。
  • 複数行を選択している場合、選択範囲の最後(下側)の行の行頭にある場合、その行を選択していないとみなしています。
$BegininiOfLine = ">>";
$EndOfLine = "<<";

if ( selecting == 1 )
{
	escape;

	#TargetLine = seltopy + 1;

	if ( selendx == 0 )
	{
		#EndLine    = selendy;
	}
	else
	{
		#EndLine    = selendy + 1;
	}

	movetolineno 1, seltopy + 1;
}
else
{
	#TargetLine = lineno;

	#EndLine    = lineno;
}

gofileend;
#FileEndLine = lineno;

movetolineno 1, #TargetLine;

while ( #TargetLine != #EndLine + 1 )
{
	golinetop;
	insert $BegininiOfLine;

	golineend;
	insert $EndOfLine;

	#TargetLine = #TargetLine + 1;

	if ( #TargetLine >= #FileEndLine )
	{
		break;
	}

	movetolineno 1, #TargetLine;
}
他2件のコメントを見る
id:s-takeuchi-0102-gg

思った通りの動作になりました!

このたびは本当にありがとうございました。

2018/05/04 11:11:19
id:Z1000S

お役に立てたようで良かったです。

ベストアンサーありがとうございました。

2018/05/04 11:25:01

その他の回答(1件)

id:kaoato No.1

kaoato回答回数142ベストアンサー獲得回数602018/05/04 01:07:23

ポイント10pt
///////////////////////////
// ◆ユーザ設定
// 行頭に挿入する文字列
$header = "[";
// 行末に挿入する文字列
$footer = "]";
///////////////////////////
#tmplineno = seltopy; #endline = selendy;
// #endline まで繰り返し while (code != eof) {
// 行頭 moveto 0, #tmplineno; insert $header; // 行末 moveto linelen, #tmplineno; insert $footer;
//次の行へ #tmplineno = #tmplineno + 1; movetolineno 1, #tmplineno + 1; if (#tmplineno > #endline) break; }


2つめのマクロを少し変更してみました。

範囲指定してから、上記のマクロを呼び出すと、期待通りの動作をするかと思います。

id:s-takeuchi-0102-gg

ありがとうございます。
試してみたのですが、一番下の行を選択してマクロを実行すると何も起きませんでした。

2018/05/04 10:49:58
id:Z1000S No.2

Z1000S回答回数25ベストアンサー獲得回数202018/05/04 08:47:19ここでベストアンサー

ポイント90pt

挿入の基準が「行」となるようなので、
1行のみを対象とするような場合に
「文字を選択していないくてもキャレットがあればその行を選択している」
とみなして良いのであれば、次のような感じで。

キャレットが行頭にある場合について

  • 1行のみ選択している場合において、行頭=行末(要するに改行のみの行にキャレットがある)でも、その行を選択しているとみなしています。
  • 複数行を選択している場合、選択範囲の最後(下側)の行の行頭にある場合、その行を選択していないとみなしています。
$BegininiOfLine = ">>";
$EndOfLine = "<<";

if ( selecting == 1 )
{
	escape;

	#TargetLine = seltopy + 1;

	if ( selendx == 0 )
	{
		#EndLine    = selendy;
	}
	else
	{
		#EndLine    = selendy + 1;
	}

	movetolineno 1, seltopy + 1;
}
else
{
	#TargetLine = lineno;

	#EndLine    = lineno;
}

gofileend;
#FileEndLine = lineno;

movetolineno 1, #TargetLine;

while ( #TargetLine != #EndLine + 1 )
{
	golinetop;
	insert $BegininiOfLine;

	golineend;
	insert $EndOfLine;

	#TargetLine = #TargetLine + 1;

	if ( #TargetLine >= #FileEndLine )
	{
		break;
	}

	movetolineno 1, #TargetLine;
}
他2件のコメントを見る
id:s-takeuchi-0102-gg

思った通りの動作になりました!

このたびは本当にありがとうございました。

2018/05/04 11:11:19
id:Z1000S

お役に立てたようで良かったです。

ベストアンサーありがとうございました。

2018/05/04 11:25:01
  • id:siachan
    今更ですが、こんな方法もあるって事で。

    // -----------------------------
    $head = "【";
    $foot = "】";

    if(!selecting) endmacro; // 範囲選択中で無ければ何もしない
    disabledraw;
    //if(!selecting) selectall; // 範囲選択中で無ければ全選択

    #start = seltoplineno;
    #end = selendlineno;
    if(!selendcolumn) #end = #end - 1; // 選択範囲の最後が行頭の場合はその行は含まない

    // 選択範囲の最終行に改行があるか?
    gofileend;
    #lastline = 0;
    if(#end == lineno && column) #lastline = 1; // ない

    setcompatiblemode 0x00020000; // マクロで実行した検索設定を記憶しない
    begingroupundo;
    call selectlines #start,#end;
    replaceallfast "^",$head,regular,inselect;
    call selectlines #start,#end;
    replaceallfast "$",$foot,regular,inselect;

    // 最終行に改行が無かった場合は手動(?)で挿入
    if(#lastline) {
    gofileend;
    insert $foot;
    }
    endgroupundo;
    enabledraw;
    endmacro;

    selectlines:
    movetolineno 1,##2; // 終了行
    beginlinesel;
    movetolineno 1,##1; // 開始行
    return;
    // -----------------------------

    もっとシンプルになる予定だったんですがけっこうごたごたしちゃいましたね。
  • id:s-takeuchi-0102-gg
    わざわざ教えて頂いて、ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません