カッコで囲う

提供:MeryWiki
2018年8月28日 (火) 14:03時点におけるSukemaru (トーク | 投稿記録)による版 (修正)
ナビゲーションに移動 検索に移動

ポップアップメニューから任意のカッコダッシュなどの種類を選択して、選択範囲を囲います。
選択範囲がないばあい、基本的にはカーソル位置に (), <>, [], {}, 「」, … などを挿入します。

ルーラーの行番号のドラッグでの複数行選択やトリプルクリックでの行選択などで末尾改行が含まれているばあい、さいごの改行を無視します。

作成にあたり、「引用の追加」マクロとキーアサイン集の「括弧で挟む」マクロのコードを参考にしました。

#title = "カッコ..."
#tooltip = "カッコで囲う"
/**
 * ポップアップメニューからカッコの種類を選択して、選択範囲をカッコで囲う
 * 複数行の選択範囲で末尾が改行 \n のとき、さいごの改行は除外する
 * 非選択時には、それぞれことなる動作をする
 * 
 * 項目(カッコの種類)の追加や変更も自由にでき、
 * 項目を減らしたいばあいは m.Add(); の行を // でコメントアウトするだけでよい
 */

// 開きカッコ p1 を配列で定義
var p1 = new Array( "",  "(",  "<",  "[",  "{",  "(",  "「",  "『",  "【",  " (",  " (",  " \"",  " ",  " - ",  "――",  "~",  "" );
// 閉じカッコ p2 を配列で定義
var p2 = new Array( "",  ")",  ">",  "]",  "}",  ")",  "」",  "』",  "】",  ") ",  ") ",  "\" ",  " ",  " - ",  "――",  "~",  "" );
// メニュー項目のID("0", "1",  "2",  "3",  "4",  "5",   "6",   "7",   "8",   "9",    "10",  "11",   "12", "13",   "14",    "15",  "" )

// ポップアップメニュー項目の定義
var m = CreatePopupMenu();
// m.Add( "カッコの種類・表示名 (&アクセラレータキー)", ID )	※インデックス ID は 0番 スタートで p1, p2 の並び順に対応
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)", 16 );
m.Add( "2文字ずつ前後を削除 (&2)", 17 );
// 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 );

  // 選択範囲の文字列を取得(さいごの改行を含めない)
  if ( ! s.IsEmpty && bx == 1 ) {
    s.SetActivePoint( mePosLogical, 1, by - 1 );
    s.EndOfLine( false, mePosLogical );
    s.SetAnchorPoint( mePosLogical, ax, ay );
  }
  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( s.GetActivePos() - p2[r].length );	// カーソルをカッコのなかに移動
      }
      else {	// 選択範囲があれば
        s.Text = p1[r] + st + p2[r];	// 選択範囲 st をカッコ p1 & p2 で囲う
        s.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      break;

    case 9:  case 10:  case 11:  case 12:	// カッコ(スペースつき)
      if ( ! s.IsEmpty ) {	// 選択範囲があれば
        s.Text = p1[r] + st + p2[r];	// 選択範囲 st をカッコ p1 & p2 で囲う
        s.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      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.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      break;

    case 16:  case 17:	// n文字ずつ前後を削除
      if ( ! s.IsEmpty ) {	// 選択範囲があれば
        if ( r == 16 )
          var n = 1;
        else
          var n = 2;
        s.Text = st.slice( n, st.length - n );	// 選択範囲の前後から 1文字 or 2文字 消す
        s.SetAnchorPoint( mePosLogical, ax, ay );	// 選択範囲を復元
      }
      break;

    default:
      break;
  }
}


カッコで囲う (ポップアップメニューなし)

特定の種類のカッコを一発で追加する小マクロはキーアサイン集にもありますが、コードを改変して前後に付ける "カッコ" のかわりに "任意の文字列" を指定するばあいに「折り返し」表示と相性のよくない部分があります。

また、マクロ実行後のカーソル位置を選択範囲なしのときとありのときとで変えたいばあいも、こちらのコードがよいでしょう。

#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 );	// カッコを含めて範囲選択
スポンサーリンク