「カッコで囲う」の版間の差分
細編集の要約なし |
細編集の要約なし |
||
1行目: | 1行目: | ||
<div style="float:right">__TOC__</div> | <div style="float:right">__TOC__</div> | ||
[[ファイル:カッコで囲う_ポップアップメニュー.png]] | [[ファイル:カッコで囲う_ポップアップメニュー.png|link=]] | ||
全部入りのソースをダウンロード → 「[[メディア:カッコで囲う.zip|カッコで囲う.zip]](アイコン入り)」 (最終更新 2018/10/26) | 全部入りのソースをダウンロード → 「[[メディア:カッコで囲う.zip|カッコで囲う.zip]](アイコン入り)」 (最終更新 2018/10/26) |
2018年10月27日 (土) 14:54時点における版
全部入りのソースをダウンロード → 「カッコで囲う.zip(アイコン入り)」 (最終更新 2018/10/26)
カッコで囲う (ポップアップメニューあり)
ポップアップメニューから任意の カッコ や ダッシュ などの種類を選択して、選択範囲をカッコやいろいろな文字列で囲います。
選択範囲がないばあい、基本的にはカーソル位置に (), <>, [], {}, 「」, … などを挿入します。
ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択などで末尾改行が含まれているばあい、さいごの改行を無視します。
作成にあたり、「引用の追加」マクロとキーアサイン集の「括弧で挟む」マクロのコードを参考にしました。
※「引用の追加」マクロは 2018/10/14 付けで公開停止になりました)
- ソースコード
#title = "カッコ..."
#tooltip = "カッコで囲う"
/**
* ポップアップメニューからカッコの種類を選択して、選択範囲をカッコで囲う
* 複数行の選択範囲で末尾が改行 \n のとき、さいごの改行は除外する
* 非選択時には、それぞれことなる動作をする
*
* ※ ポップアップメニューの項目は、m.Add( … ); の不要な行を行をコメントアウトすれば隠せる。
* (配列から削除する場合は中身だけ消して "" として空要素を残しておかないと、メニューや処理コードの ID と一致しなくなる)
*/
// 開きカッコ p1 を配列で定義
var p1 = new Array( "" , // 以下 r = 1~10、11~ の ID 順
"(" , "<" , "[" , "{" , "(" , "「" , "『" , "【" , " (" , " (" ,
" \"" , " " , " - " , "――" , "~" );
// 閉じカッコ p2 を配列で定義
var p2 = new Array( "" , // 以下 1~10、11~ の ID 順
")" , ">" , "]" , "}" , ")" , "」" , "』" , "】" , ") " , ") " ,
"\" " , " " , " - " , "――" , "~" );
// ポップアップメニュー項目の定義
var m = CreatePopupMenu();
// m.Add( "カッコの種類・表示名 (&アクセラレータキー)", ID )
// m.Add( "ラベル", r ); の各行は、任意に上下移動(並べ替え)してよいが、
// r の数値は上の配列の並び順やテキスト変換処理の case r: に対応しているので変更しないこと!
m.Add( " ( 半角 丸カッコ ) (&P)", 1 ); // Parenthesis
m.Add( "< 半角 山カッコ > (&A)", 2 ); // Angle brackets ※半角不等号 < / > (キーボードの[ね]/[る]
m.Add( " [ 半角 角カッコ ] (&B)", 3 ); // square Brackets
m.Add( " { 半角 波カッコ } (&C)", 4 ); // Curly brackets
m.Add( "", 0, meMenuSeparator );
m.Add( "( 全角 丸カッコ ) (&R)", 5 ); // Round brackets
m.Add( "", 0, meMenuSeparator );
m.Add( "「 全角 かぎカッコ 」 (&K)", 6 ); // Kakko
m.Add( "『 全角 二重かぎカッコ 』 (&W)", 7 ); // White corner brackets
m.Add( "【 全角 スミ付きカッコ 】 (&L)", 8 ); // Lenticular brackets
m.Add( "", 0, meMenuSeparator );
m.Add( "␣( 全角 丸カッコ )␣ (&Z)", 9 ); // Zenkaku (full-width)
m.Add( "␣ ( 半角 丸カッコ ) ␣ (&H)", 10 ); // Hankaku (half-width)
m.Add( "␣ \" 半角 引用符 \" ␣ (&Q)", 11 ); // double Quotation mark キーボードの[ふ]キー
m.Add( "␣ 半角 スペース ␣ (&S)", 12 ); // Space
m.Add( "", 0, meMenuSeparator );
m.Add( "␣-␣ 半角 ハイフン ␣-␣ (&M)", 13 ); // hyphen-Minus キーボードの[ほ]キー
m.Add( "―― 全角 ダッシュ ―― (&D)", 14 ); // Dash
m.Add( "~ 全角 チルダ ~ (&T)", 15 ); // Tilde キーボードの[へ]キー
m.Add( "", 0, meMenuSeparator );
m.Add( "1文字ずつ前後を削除 (&1)", 31 );
m.Add( "2文字ずつ前後を削除 (&2)", 32 );
m.Add( "3文字ずつ前後を削除 (&3)", 33 );
// m.Add( "", 0, meMenuSeparator );
// m.Add( "キャンセル", 0 ); // Escキーでキャンセルできるのでアクセラレータなし
// ポップアップメニューを表示
// m.Track(0); ならキャレット位置、Track(1); ならカーソル位置にサブメニューがポップアップ
var r = m.Track( mePosMouse = 1 ); // 選択されたメニュー項目のIDを r に格納する
if ( r > 0 ) {
var s = document.selection
// マクロ実行前の選択範囲の各座標を取得
var ax = s.GetTopPointX( mePosLogical );
var ay = s.GetTopPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
var anc = s.GetAnchorPos(); // 選択範囲の開始位置 (キャレットのない側)
var act = s.GetActivePos(); // 選択範囲の終了位置 (キャレットのある側)
var tp = ( anc < act ) ? anc : act; // 選択範囲の先頭位置
var bp = ( anc < act ) ? act : anc; // 選択範囲の末尾位置
if ( !s.Text.length ) // 選択範囲がなければ
var pos = s.GetActivePos(); // カーソル位置を取得
// 選択範囲の文字列を取得(さいごの改行を含めない)
if ( ! s.IsEmpty && bx == 1 ) {
s.SetActivePoint( mePosLogical, 1, by - 1 ); // 元の選択範囲の末尾より1行うえ
s.EndOfLine( false, mePosLogical ); // 元の選択範囲の末尾の1行うえの行末から
s.SetAnchorPos( tp ); // 元の選択範囲の先頭まで選択
}
// 選択範囲の文字列を取得
var st = s.Text;
// IDごとのテキスト変換処理
switch (r) {
// カッコ(スペースなし)
case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8:
if ( s.IsEmpty ) { // 選択範囲がなければ
document.Write( p1[r] + p2[r] ); // カッコ p1 & p2 だけ挿入
s.SetActivePos( pos + p1[r].length ); // カーソルをカッコのなかに移動
}
else { // 選択範囲があれば
s.Text = p1[r] + st + p2[r]; // 選択範囲 st をカッコ p1 & p2 で囲う
s.SetAnchorPos( tp ); // 選択範囲を復元
}
break;
// カッコ(スペースつき)
case 9: case 10: case 11: case 12:
if ( ! s.IsEmpty ) { // 選択範囲があれば
s.Text = p1[r] + st + p2[r]; // 選択範囲 st をカッコ p1 & p2 で囲う
s.SetAnchorPos( tp ); // 選択範囲を復元
}
break;
// ハイフン、ダッシュ、チルダ
case 13: case 14: case 15:
if ( s.IsEmpty ) { // 選択範囲がなければ
document.Write( p1[r] ); // 片側分 p1 だけ挿入
}
else { // 選択範囲があれば
s.Text = p1[r] + st + p2[r]; // 選択範囲 st をダーシ p1 & p2 で囲う
s.SetAnchorPos( tp ); // 選択範囲を復元
}
break;
// n文字ずつ前後を削除
case 31: case 32: case 33:
if ( ! s.IsEmpty ) { // 選択範囲があれば
var n;
if ( r == 31 ) n = 1; // 1文字ずつ
else if ( r == 32 ) n = 2; // 2文字ずつ
else if ( r == 33 ) n = 3; // 3文字ずつ
s.Text = st.slice( n, st.length - n ); // 選択範囲の両端から n文字ずつ 消す
s.SetAnchorPos( tp ); // 選択範囲を復元
}
break;
default:
break;
}
}
組み込み用コード
追加コードです。
任意の文字列
文字入力用のダイアログで「前につける文字列」と「後ろにつける文字列」を指定します。
- 改行コードとタブ文字は、それぞれ「\\\n」と「\\\t」で入力されたもの (注:¥記号3つ) を置換するようにしてあります。
- ※「\n」、「\t」と入力するとそのままのリテラル「\n」、「\t」を返します。
- 文字コードには非対応です(入力されたままの文字列を返します)。
- 「カッコで囲う」マクロのコードに以下のブロックを追加します。
1. "m.Add( … );" のグループに追加(位置・並び順は任意 ※先頭を推奨)
m.Add( "任意の文字列", 50 );
m.Add( "", 0, meMenuSeparator );
2. "␣␣␣␣default:" のうえに挿入
// ダイアログのテキスト入力フィールドから文字列を取得
case 50:
var p1 = Prompt( "前につける文字列:\t改行=\\\\\\n ; タブ=\\\\\\t (注:¥記号3つ)", "" ).replace( /\\\\\\n/g , "\n" ).replace( /\\\\\\t/g , "\t" );
var p2 = Prompt( "後ろにつける文字列:\t改行=\\\\\\n ; タブ=\\\\\\t (注:¥記号3つ)", "" ).replace( /\\\\\\n/g , "\n" ).replace( /\\\\\\t/g , "\t" );
if ( p1 || p2 ) {
s.Text = p1 + st + p2; // 選択範囲 st を p1 & p2 で囲う
s.SetAnchorPos( tp ); // 選択範囲を復元
}
break;
wiki用 文字列装飾
5種類の wiki用 文字列装飾 を「カッコで囲う」マクロのポップアップメニュー項目として組みこむことができます。
- 太字
- 選択範囲の両端を '''(シングルクオート×3) で囲います。
- 斜体(Italic)
- 選択範囲の両端を ''(シングルクオート×2) で囲います。
- 下線
- 選択範囲の両端を <u> と </u> で囲います。
- [[内部リンク]]
- 選択範囲の両端を [[ と ]] で囲い、[[リンク|ラベル]] 型のハイパーリンクにします。
- <nowiki>文字列</nowiki>
- 選択範囲の両端を <nowiki> と </nowiki> で囲います。
※「カッコで囲う」マクロの既存の項目を減らしたいばあいは、 "m.Add( … );" の行を // でコメントアウトするとその項目をメニューから隠せます。
全部入り ZIP のソースでは「選択範囲内の各行ごとに囲う」コードにしてありますが、以下のコードは「選択範囲の全体をひとまとめに囲う」仕様になっています。
- 「カッコで囲う」マクロのコードに以下のブロックを追加します。
1. "p1", "p2" の配列を上書き
// 開きカッコ p1 を配列で定義
var p1 = new Array( "" , // 以下 r = 1~10、11~20、21~ の ID 順
"(" , "<" , "[" , "{" , "(" , "「" , "『" , "【" , " (" , " (" ,
" \"" , " " , " - " , "――" , "~" , "'''" , "''" , "<u>" , "[[" , "<nowiki>" ,
"" );
// 閉じカッコ p2 を配列で定義
var p2 = new Array( "" , // 以下 1~10、11~20、21~ の ID 順
")" , ">" , "]" , "}" , ")" , "」" , "』" , "】" , ") " , ") " ,
"\" " , " " , " - " , "――" , "~" , "'''" , "''" , "</u>" , "]]" , "</nowiki>" ,
"" );
2. "m.Add( … );" のグループに追加(位置・並び順は任意)
m.Add( "", 0, meMenuSeparator ); // アクセラレータは任意で割りあててください
m.Add( "''' wiki 太字 '''", 16 );
m.Add( "'' wiki 斜体 ''", 17 );
m.Add( "<u> wiki 下線 </u>", 18 );
m.Add( "[[ wiki リンク ]]", 19 );
m.Add( "<nowiki> </nowiki>", 20 );
3. "␣␣␣␣default:" のうえに挿入
// wiki 文字装飾 ※ 太字/斜体/下線/<nowiki>
case 16: case 17: case 18: case 20:
if ( s.IsEmpty ) { // 選択範囲がなければ
document.Write( p1[r] + " " + p2[r] ); // p1 & p2 と全角スペースを挿入
s.SetAnchorPos( pos + p1[r].length ); // カーソルをカッコのなかに移動
s.SetActivePos( s.GetAnchorPos() + 1, true ); // カッコの中の全角スペースを範囲選択状態にする
}
else { // 選択範囲があれば
s.Text = p1[r] + st + p2[r]; // 選択範囲 st を p1 & p2 で囲う
s.SetAnchorPos( tp ); // 選択範囲を復元
}
break;
// wiki 文字装飾 ※ [[リンク|ラベル]]
case 19:
if ( s.IsEmpty ) { // 選択範囲がなければ
document.Write( p1[r] + " | " + p2[r] ); // p1 & p2 と " | " を挿入
s.SetActivePos( tp + p1[r].length ); // カーソルをカッコの中に移動
s.SetAnchorPos( s.GetActivePos() + " | ".length ); // カッコの中を範囲選択状態にする
}
else { // 選択範囲があれば
s.Text = p1[r] + st + "|" + st + p2[r]; // 選択範囲 st を [[st|st]] に置換
s.SetActivePos( tp + p1[r].length ); // p1 の後ろにカーソルを移動する
}
break;
- ポップアップメニュー項目とカッコの定義配列 "var px = new Array( … )" に16コ以上詰めこんでいるばあいは、追加コードのID 16~20 を適当な数字に変更し、配列を適宜修正してください。
※ wiki の編集をする人はメッタにいないとおもいますので、適当にアレンジしてご活用ください。 (sukemaru 自身も… ふだんはコメントアウトしています)
挿入型コメントアウト
3種類の 挿入型コメントアウト を「カッコで囲う」マクロのポップアップメニュー項目として組みこむことができます。
- /* JavaScript 挿入型コメントアウト1 */
- 選択範囲の両端を /* と */ で囲います。
- /* *JavaScript コメントアウト2(複数行) */
- 選択範囲の両端を "/* \n" と "\n */" で囲い、範囲内の各行の行頭に " * " を付けます。
- <!-- XML 挿入型コメントアウト -->
- 選択範囲の両端を <!-- と --> で囲います。
※ "JS アンコメント" はこのマクロで挿入した "JavaScript コメントアウト1 / 2" にしか適さないかもしれません。
※「カッコで囲う」マクロの既存の項目を減らしたいばあいは、 "m.Add( … );" の行を // でコメントアウトするとその項目をメニューから隠せます。
- 「カッコで囲う」マクロのコードに以下のブロックを追加します。
1. "m.Add( … );" のグループに追加(位置・並び順は任意)
m.Add( "", 0, meMenuSeparator ); // 重複しているアクセラレータは任意で再割りあてしてください
m.Add( "/*␣ コメントアウト1 ␣*/ (&J)", 21 ); // JavaScript comment-out
m.Add( "/* *␣ コメントアウト2 ␣*/ (&J)", 22 ); // JavaScript comment-out (multiple lines)
m.Add( "JS アンコメント (&U)", 23 ); // Uncomment
m.Add( "", 0, meMenuSeparator );
m.Add( "<!--␣ コメントアウト ␣--> (&X)", 24 ); // XML comment-out
m.Add( "XML アンコメント (&X)", 25 );
2. "␣␣␣␣default:" のうえに挿入
/* JavaScript コメントアウト1 */
// <!-- XML コメントアウト -->
case 21: case 24:
var p1, p2;
if ( r == 21 ) { // /* JavaScript コメントアウト 1 */
p1 = " /* "; p2 = " */ ";
}
else { // ( r == 24 ) // <!-- XML コメントアウト -->
p1 = " <!-- "; p2 = " --> ";
}
if ( pos ){ // 選択範囲がなければ
document.Write( p1 + p2 ); // コメントマーク p1 & p2 だけ挿入
s.SetActivePos( pos + p1.length ); // カーソルをコメント枠のなかに移動
}
else { // 選択範囲があれば
s.Text = p1 + st + p2; // 選択範囲 st をコメントアウト
s.SetAnchorPos( tp ); // 選択範囲を復元
}
break;
/* * JavaScript コメントアウト2 */
case 22:
// 基本的に1行めが行の先頭から始まることしか想定していないので、
// あらかじめコメントアウトする文字列は、行単位でまとまったブロックにしておくとよい
// 選択範囲の先頭/末尾が行の途中にある状態でコメントアウトする場合は、改行を追加する
var p1 = ( ax > 1 ) ? "\n/*\n" : "/*\n"; // */
var p2 = ( document.Text.charAt( bp ) != "\n" ) ? "\n */\n" : "\n */";
var ast = " * ";
if ( ax > 1 ) { // 選択範囲の先頭座標が x = 1 でなければ改行させるので
ax = 1; ay ++; // 選択範囲の復元用座標を調整
}
if ( pos ){ // 選択範囲がなければ
document.Write( p1 + ast + p2 ); // コメントマークだけ挿入
s.SetActivePos( s.GetActivePos() - p2.length ); // カーソルをコメント枠のなかに移動
}
else { // 選択範囲があれば
s.Text = CommentOutJS( st, p1, p2, ast ); // 選択範囲全体をコメントアウト
s.SetAnchorPoint( mePosLogical, ax, ay ); // 選択範囲を復元
}
break;
// JSアンコメント ※選択範囲内の各行頭のコメントマークにのみマッチ
case 23: // case 21 & 22 の /*␣ JavaScript コメント ␣*/ をアンコメントする
/*
* ・このタイプの複数行のコメントにたいしてアンコメントする。
* ・中間行の行頭のビュレットはアスタリスク「*」と中黒「・」「・」を削除対象とする。
* (行頭のビュレットと前後の半角スペース各1を削除する)
* ・JSコメントでない箇条書き文で実行した場合も行頭のビュレットを削除する。
*/
/* このタイプのコメントにたいしてもアンコメント処理する。 */
var dc = UnCommentJS( st ); // コメントアウトを解除
// 選択範囲に /* JSコメント */ がなかった場合 undo 履歴を残さない
if ( dc == st ) { // アンコメント処理の前後でテキストが一致したら
if ( pos ) // マクロ実行前に選択範囲がなかった場合は
s.SetActivePos( pos ); // カーソルを元の位置に戻す
break; // 中止
}
s.Text = dc; // アンコメント完了
s.SetAnchorPos( tp ); // 選択範囲を復元
break;
// XML アンコメント ※選択範囲の先頭と末尾のコメントマーク "<!-- " " -->" にマッチ
case 25: // case 24 の <!--␣ XMLコメント ␣--> をアンコメントする
// 選択範囲の先頭の " <!-- " と 末尾の " --> " にマッチ
// 複数のコメントがあると正常にアンコメントしない
// 選択範囲の先頭と末尾のコメントマークを削除
var dc = st.replace( /^ ?<!-- ?| ?-- *>\ ?$/g , "" );
// 選択範囲に <!-- XMLコメント --> がなかった場合 undo 履歴を残さない
if ( dc == st ) { // アンコメント処理の前後でテキストが一致したら
if ( pos ) // マクロ実行前に選択範囲がなかった場合は
s.SetActivePos( pos ); // カーソルを元の位置に戻す
break; // 中止
}
s.Text = dc; // アンコメント完了
s.SetAnchorPos( tp ); // 選択範囲を復元
break;
3. ソースコードの末尾 ( "}" の下) に追加
function CommentOutJS( arg1, arg2, arg3, arg4 ) { // CommentOutJS(st,p1,p2,ast); p1="/* \n", p2="\n */", ast=" * ";
var a = arg1.split( "\n" ); // 選択範囲 st を "\n" で区切って配列 a に格納する
for ( var i = 0; i < a.length; i ++ ) // 「1行め」から繰りかえし処理
a[i] = arg4 + a[i]; // 各行の先頭に ast = " * " を追加する
// 各行を "\n" で区切って連結し、先頭に p1 = "/*\n"、末尾に p2 = "\n */" を付け足す
return arg2 + a.join( "\n" ) + arg3;
}
function UnCommentJS( arg1 ) { // UnCommentJS( st )
var re1 = "^ ?\\/\\*+ ?\\n?"; // 先頭の正規表現
var re2 = "\\n? ?\\*+\\/ ?$"; // 末行の正規表現
var reg = new RegExp( re1 + "|" + re2, "g" ); // 正規表現 / … /g に変換
var re3 = /^ ?(\*+|[・・]) ?/; // 中間行の行頭の正規表現
var a = arg1.split( "\n" ); // 選択範囲 st を "\n" で区切って配列 a に格納する
// 中間行の行頭のビュレットを削除する
for ( var i = 0; i < a.length; i ++ ) { // 中間行の行数で繰りかえし処理
if ( a[i].match( reg ) ) // 先頭行と末行のコメントマークがある行はスキップ
continue;
a[i] = a[i].replace( re3 , "" ); // 中間行の行頭のビュレットを削除
}
// 各行を "\n" で区切って連結し、先頭行と末行のコメントマークを削除
return a.join( "\n" ).replace( reg , "" );
}
- ポップアップメニュー項目とカッコの定義配列 "var XX = new Array( … )" に20コ以上詰めこんでいるばあいは、追加コードのID 21~25 を適当な数字に変更してください。
カッコで囲う (ポップアップメニューなし)
簡易版です。
- c.f. 追加と削除ができる機能強化版 → 「引用符を追加/削除」
特定の種類のカッコを一発で追加する小マクロはキーアサイン集にもありますが、コードを改変して前後に付ける "カッコ" のかわりに "任意の文字列" を指定するばあいに「折り返し」表示と相性のよくない部分があります。
また、マクロ実行後のカーソル位置を選択範囲なしのときとありのときとで変えたいばあいも、こちらのコードがよいでしょう。
#title = "( カッコ )"
#tooltip = "( カッコ ) で囲う"
// MeryWiki の マクロライブラリ >> キーアサイン集 の「括弧で挟む」を改変
// 選択範囲の前後にカッコ以外にも任意の文字列を追加するマクロとしても流用できます
var s = document.selection;
// 選択範囲の各座標を取得
var ax = s.GetTopPointX( mePosLogical );
var ay = s.GetTopPointY( mePosLogical );
// 選択範囲のテキストを取得し、カッコを追加
var st = s.Text;
var pre = "("; // 前に付ける文字列
var sur = ")"; // 後ろに付ける文字列
s.Text = pre + st + sur;
// カーソルを移動、または範囲選択
if ( ! st ) // 選択範囲なしだったばあい
s.SetActivePos( s.GetActivePos() - sur.length ); // 後ろに付けた文字列 sur の前にカーソルを移動
else // 選択範囲があったばあい
s.SetAnchorPoint( mePosLogical, ax, ay ); // カッコを含めて範囲選択
引用符を追加/削除
「カッコで囲う (ポップアップメニューなし)」の強化版です。
”引用符” を一発で追加する小マクロは 「マテリアルデザインっぽいアイコンと『小マクロ集』」 の 「”引用符”を追加」 にもありますが、こちらのマクロでは 「引用符(または指定した文字列)で囲う」操作と「囲っている引用符を削除する」操作をトグルできます。
※ 後ろにつける文字列の末尾が "\n" の場合はトグル不可。
- 文字列指定は ”引用符” 以外の カッコ や HTML タグ などに変更できます。
- 選択範囲が複数行(論理行)にまたがっている場合に、選択範囲「全体」を一組の ”引用符” で囲うか、選択範囲内の「各行ごと」に ”引用符” で囲うかを選択することもできます。
- マクロ実行後のカーソル位置を選択範囲なしのときとありのときとで変えたい場合には、数種類のパターンから選択できるようになっています。
#title = "''引用符'' で囲う"
#tooltip = "ダブルクォーテーションで囲う"
// -----------------------------------------------------------------------------
// 選択範囲を指定の文字列("引用符")で囲う
// 選択範囲がすでに "引用符" で囲われていたら引用符ふたつ "" を削除する
// 複数行の選択範囲のとき、さいごの改行はふくめない
// -----------------------------------------------------------------------------
/* ■文字列を指定 */
var pre = '"'; // 前に付ける文字列
var sur = '"'; // 後に付ける文字列
// ※ 文字列をダブルクォーテーション "" で囲うなら、中の「 " 」は要エスケープ 「'"'」=> 「"\""」
// ※ 引用符以外の文字列を指定するなら 「'"'」=> 「"ほげ"」「"ふが"」
// ※ 片側しか必要ないならいずれかを 「'"'」=> 「""」
/* ■複数行フラグ */
var multi = true;
// ・multi = false; では、選択範囲「全体」の前後に文字列 pre / sur を追加
// ・multi = true; では、選択範囲の「各行」ごとに文字列 pre / sur で囲う
/* ■挿入フラグ */
var ins = false;
// ・ins = false; では、選択範囲がないときはマクロを中止する
// また、■複数行フラグが有効 ( multi = true ) のときに、空行には挿入しない
// 選択範囲の末尾に空行があった場合、マクロ実行後のカーソルの復帰位置が■終了後フラグの説明どおりにならないことがある
// ・ins = true; では、選択範囲がないときにはカーソル位置に pre / sur を挿入する
// また、■複数行フラグが有効 ( multi = true ) のときに、空行にも挿入する
// ※■複数行フラグが有効 ( multi = true ) のときは、空白文字だけの行は空行と見做す
/* ■終了後フラグ */
var endPos = 5; // 指定できる値は 0 ~ 5 ( 6 以上の値は 0 と同じ)
// 0. カーソルは "引用符" の後ろへ (※範囲選択なし)
// 1. カーソルは最後の "引用符" の中へ移動する (※範囲選択なし)
// 2. マクロ実行前に範囲選択がなければカーソルは最後の "引用符" の中へ、
// あれば "引用符" の後ろへ移動する (※範囲選択なし)
// 3. マクロ実行前に範囲選択がなければカーソルは最後の "引用符" の中へ移動 (※範囲選択なし)、
// あれば "引用符" を含めた全体を選択範囲にする (※カーソルは選択範囲の後ろへ)
// 4. "引用符" を含めた全体を選択範囲にする (※カーソルは選択範囲の後ろへ)
// 5. "引用符" を含めた全体を選択範囲にする (※カーソル位置はマクロ実行前の側(先頭 or 末尾)へ)
//
// ※ "引用符" を含めた選択範囲を残すようにすると、連続実行で 追加 <=> 削除 のトグルができる( 3 ~ 5 )
// ※ 複数フラグが有効 ( multi = true ) のとき、"引用符" の中へ移動する「0 と 1」は適さないとおもわれる
// ※ 「範囲選択なし」になる終了後フラグで "引用符" を削除したとき、カーソルの復帰位置は上の説明どおりにはならないことがある
// -----------------------------------------------------------------------------
Redraw = false;
// 選択範囲
var s = document.selection;
var anc = s.GetAnchorPos(); // 選択範囲の開始位置 (キャレットのない側)
var act = s.GetActivePos(); // 選択範囲の終了位置 (キャレットのある側)
var tp = ( anc < act ) ? anc : act; // 選択範囲の先頭位置
var bp = ( anc < act ) ? act : anc; // 選択範囲の末尾位置
// 選択範囲の先頭&末尾の各座標
var ty = s.GetTopPointY( mePosLogical );
var bx = s.GetBottomPointX( mePosLogical );
var by = s.GetBottomPointY( mePosLogical );
// 選択範囲の末尾が行頭 x = 1 にあるときの調整(末尾の改行を含めない)
if ( ty < by && bx == 1 ) {
s.SetActivePos( tp );
s.SetAnchorPos( bp - 1 );
}
// 選択範囲の文字列を取得
var st = s.Text;
// AddDelBrackets() で "引用符" を追加/削除
var t = AddDelBrackets( st, pre, sur );
// AddDelBrackets() 処理の前後で文字列に変化がないなら undo 履歴を残さない
if ( t == st ) {
s.SetActivePos( act );
s.SetAnchorPos( anc );
Quit();
}
// "引用符" を追加/削除
s.Text = t;
// case 0. この時点でカーソルは "引用符" のうしろ ※範囲選択なし(末尾調整されたままの位置)
var dp = s.GetActivePos();
// ■終了後フラグの指定動作 ※カーソルを移動/選択範囲を復旧
switch ( endPos ) {
case 1: // カーソルは最後の "引用符" の中へ移動する ※範囲選択なし
SearchLastBracket();
break;
case 2: // マクロ実行前に範囲選択がなければカーソルは最後の "引用符" の中へ
// あれば選択範囲の後ろへ移動する ※範囲選択なし
if ( ! st ) // マクロ実行前に選択範囲がなかったとき
SearchLastBracket();
else // マクロ実行前に選択範囲があったときは選択範囲の後ろへ
MoveToEndPos();
break;
case 3: // マクロ実行前に範囲選択がなければカーソルは最後の "引用符" の中へ移動 ※範囲選択なし
// あれば "引用符" を含めた全体を選択範囲にする ※カーソルは選択範囲の後ろへ
if ( ! st ) // マクロ実行前に選択範囲がなかったとき
SearchLastBracket();
else { // マクロ実行前に選択範囲があったとき
MoveToEndPos();
s.SetAnchorPos( tp ); // 先頭まで範囲選択
}
break;
case 4: // "引用符" を含めた全体を選択範囲にする ※カーソルは選択範囲の後ろへ
MoveToEndPos();
s.SetAnchorPos( tp );
break;
case 5: // "引用符" を含めた全体を選択範囲にする ※カーソル位置はマクロ実行前の側(先頭 or 末尾)へ
if ( anc <= act ) { // マクロ実行前のキャレットの位置が選択範囲の末尾だったとき
MoveToEndPos();
s.SetAnchorPos( tp );
}
else { // マクロ実行前のキャレットの位置が選択範囲の先頭だったとき
MoveToEndPos();
s.SetActivePos( tp, true );
}
break;
default:
break;
}
// -----------------------------------------------------------------------------
// 関数 AddDelBrackets() カッコを 追加/削除
function AddDelBrackets( arg1, arg2, arg3 ) { // ← AddDelBrackets( t, pre, sur )
// ■複数行フラグ ( multi ) 判定
// 有効なら ( true ) 選択範囲 st を行で区切って配列 a に格納する
var a = ( multi ) ? arg1.split( "\n" ) : [];
// 無効なら ( false ) 選択範囲の文字列全体 st をそのまま配列 a に格納する
if ( ! multi )
a.push( arg1 );
for ( var i = 0; i < a.length; i ++ ) { // 「1行め」から繰りかえし処理
// 選択範囲がカッコで囲われているとき (先頭と末尾の文字列をカッコと比較して一致したとき)
if ( a[i].substr( 0, arg2.length ) == arg2 && a[i].substr( a[i].length - arg3.length, arg3.length ) == arg3 )
// 各行のカッコを削除
a[i] = a[i].slice( arg2.length, a[i].length - arg3.length );
// 選択範囲がカッコで囲われていないとき
// ■挿入フラグが有効 ( ins = true ) なら、または a[i] が空白文字列でないなら、前後にカッコをつける
else if ( ins || ! a[i].match( /^[\s ]*$/g ) )
a[i] = arg2 + a[i] + arg3;
else
// ■挿入フラグが無効 ( ins = false ) のときの空白文字列は、スルー(空白のまま)
continue;
}
// 各行を "\n" で区切って連結しなおす
return a.join( "\n" );
}
// 関数 SearchLastBracket() カーソルを最後の閉じカッコの前へ移動 ※範囲選択なし
function SearchLastBracket() {
if ( t.length < st.length ) // カッコを削除したときは。先頭へ
s.SetActivePos( tp );
else { // カッコを追加したときは、選択範囲内の最後の閉じカッコの前へ
if ( sur.length ) {
s.SetAnchorPos( tp );
s.SetActivePos( tp + s.Text.lastIndexOf( s.Text.match( sur.replace( /[$()*+.?\[\\\]^{|}]/g , "\\$&" ) ) ) );
}
else // 閉じカッコ sur が未指定 "")の場合は、先頭へ
s.SetActivePos( tp );
}
}
// 関数 MoveToEndPos() マクロ実行前に選択範囲があったとき、カーソルを元の選択範囲の末尾位置へ移動 ※範囲選択なし
function MoveToEndPos() {
if ( ty < by && bx == 1 ) // 選択範囲の末尾調整をしていたときは
s.SetActivePoint( mePosLogical, bx, by ); // カーソルは元の末尾位置に復帰
else // 末尾調整をしていなかったときは
s.SetActivePos( dp ); // カーソル位置はそのまま
}
メモ
- 2018/08/24 (sukemaru)
- ページを新規作成
- 2018/08/26 (sukemaru)
- 「カッコで囲う (ポップアップメニューなし)」の節を追加
- 2018/08/27 (sukemaru)
- ・「カッコで囲う (ポップアップメニューあり)」のソースコードを修正
- ・case1~8 の "s.CharLeft( false, p2[r].length );" を "s.SetActivePos( s.GetActivePos() - p2[r].length );" に変更
- 2018/10/12 (sukemaru)
- 「カッコで囲う (ポップアップメニューあり)」のソースコードに "3文字ずつ前後を削除" を追加
- 組みこみ用コード「wiki用 文字列装飾」と「挿入型コメントアウト」の節を追加
- 「カッコで囲う.zip」のダウンロードリンクを追加
- 2018/10/13 - 2018/10/16 (sukemaru)
- ・マクロのコードを微修正
- ・「カッコで囲う.zip」を差し替え
- 2018/10/19 (sukemaru)
- ・「引用符を追加/削除」の節を追加
- ・「カッコで囲う.zip」を差し替え
- 2018/10/26 (sukemaru)
- ・コードの体裁を修正 (※変数名を変更したので、追加コードは最新の「カッコで囲う」でないとエラーになる)
- ・各マクロの動作コードを変更し、実行後の文字列に変化なしになる場合に undo 履歴を残さないようにした
- ・追加コード「任意の文字列」の項目を追加
- ・追加コードの「JS コメントアウト1」と「XML コメントアウト」のコードをまとめた
- ・追加コードの「JS アンコメント」で先頭/末尾のコメントマーク /* */ がある行では中間行の行頭記号を削除しないようにした
- ・「引用符を追加/削除」の終了後の動作コードを変更し、不自然な位置にキャレットが移動する不具合を修正した
- ・「カッコで囲う.zip」を差し替え