「カッコをはずす」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
Sukemaru (トーク | 投稿記録)
「カッコをはずす」を更新、「カッコを削除/追加」を追加
1行目: 1行目:
= カッコをはずす =


選択範囲の "最初の1文字" と "最後の1文字" が「'''対になるカッコ'''」のとき、カッコ囲いをはずします。


* 選択範囲の "外側 (前と後) の各1文字" が「対になるカッコ」のときも、カッコをはずせます。
選択範囲の "最初の1文字" と "最後の1文字" が「'''対になるカッコ'''」のとき、または選択範囲の外側 (前と後) の各1文字が「対になるカッコ」のときに、カッコ囲いをはずします。
* カッコの種類はソースコード内で定義したもののみ <br>(開き/閉じカッコはそれぞれ「1文字」ずつのセットで)。
 
* カッコの種類はソースコード内で定義したもののみ <br>(開き/閉じカッコはそれぞれ「1文字」ずつのペアで)。
* カッコの種類
* カッコの種類
:* 各種のカッコ(全角/半角/縦書き)
:* 各種のカッコ(半角/全角/縦書き)
:* 各種の引用符(全角/半角)
::  () 「」 <> [] {} ⦅⦆ <br> () 「」 『』 <> [] {} 【】 〖〗 ⦅⦆ 〚〛 〔〕 〘〙 〈〉 《》 <br> ﹁﹂ ﹃﹄ ︵︶ ︿﹀ ︽︾ ︹︺ ︷︸ ︻︼ ︗︘
:* ダーシ、波ダーシ、チルダ (全角)
:* 各種の引用符(半角/全角)
:* '''半角空白'''も含んでいるので、選択単語の左右の半角空白も削除できます。
:: " "  ' '  ” ”  ’ ’  〝 〞  〝 〟  ‘ ’  “ ”
 
:* ーダーシー、〜波ダーシ〜、~全角チルダ~
:* '''␣半角空白␣'''も含んでいるので、選択単語の左右の半角空白も削除できます。
<br>
* 1回の実行につき1組のカッコ囲いをはずします。
* 1回の実行につき1組のカッコ囲いをはずします。
:: 例. 以下の行で <u>'''[ "hoge" ]'''</u> を範囲選択して連続で実行した場合、次のように作用します。
:: 例. 以下の行で <u>'''[ "hoge" ]'''</u> を範囲選択して連続で実行した場合、次のように作用します。(※内側の両端が優先)


  ( <u>[ "hoge" ]</u> ) // 元の文字列
  ( <u>[ "hoge" ]</u> ) // 元の文字列
   
   
  ( <u> "hoge" </u> ) // 1回 実行後: ''[  と  ] を削除しました。''
  ( <u> "hoge" </u> ) // 1回目 実行後: ''[  と  ] を削除しました。''
  ( <u>"hoge"</u> ) // 2回 実行後: ''␣ と ␣ を削除しました。''
  ( <u>"hoge"</u> ) // 2回目 実行後: ''␣ と ␣ を削除しました。''
  ( <u>hoge</u> ) // 3回 実行後: ''"  と  " を削除しました。''
  ( <u>hoge</u> ) // 3回目 実行後: ''"  と  " を削除しました。''
  (<u>hoge</u>) // 4回 実行後: ''␣ と ␣ を削除しました。''
  (<u>hoge</u>) // 4回目 実行後: ''␣ と ␣ を削除しました。'' ※選択範囲の外側
  <u>hoge</u> // 5回 実行後: ''(  と  ) を削除しました。''
  <u>hoge</u> // 5回目 実行後: ''(  と  ) を削除しました。'' ※選択範囲の外側
 
* 選択範囲(複数行)の各行の行頭/行末からカッコを除去したい場合は、「[[カッコで囲う]](ポップアップメニュー)」マクロや「[[テキスト整形]]」マクロの削除系コマンドをご利用ください。




28行目: 33行目:


/**
/**
  * 選択範囲の最初の1文字と最後の1文字が「対になるカッコ」のとき、カッコ囲いをはずします。
  * ------------------------------------------------------------
  * 選択範囲の外側 (前と後) の各1文字がカッコのときも、カッコをはずせます。
  * カッコをはずす (2019/03/14 - 2019/03/18, sukemaru)
* ------------------------------------------------------------
* 選択範囲の最初の1文字と最後の1文字が「対になるカッコ」のとき、
* または選択範囲の外側 (前と後) の各1文字が「対になるカッコ」のときに、
* カッコ囲いをはずします。
* ※「外側」オプションが有効な場合でも、
*  選択範囲"内側"の先頭/末尾のカッコの削除が優先されます。
  */
  */


// ▼「対になるカッコ」の種類 (始)+(終) を列挙する ▼
// ※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ
var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〞〝〟‘’“”――~~〜〜  ";


// ▼「対になるカッコ」の種類を列挙する ▼
// 削除対象に ▼各種記号のペア▼ を追加する場合は、コメントアウトを解除する
// (※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ)
// brackets += "++--**//##==%%::::@@@@※※○○●●□□■■◇◇◆◆▽▽▼▼△△▲▲☆☆★★††||←→→←↑↓↓↑←←→→↑↑↓↓……¿?¡!‚‘‚’„“„”“„‘‚‹››‹«»»«——‐‐--␣␣__";
var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〟‘’“”――~~〜〜  ";




// ■ 選択範囲の外側 (前と後) の各1文字がカッコのときも除去する? ■  
// ■ 選択範囲の『外側』(前と後ろ) の各1文字がカッコのときも除去する? ■  
// (※ 選択範囲の前後を1文字ずつ拡張してカッコを除去する)
// (※ 選択範囲の前後を1文字ずつ拡張してカッコを除去する)
var removeOuterBracketsEnable = true; // true:する / false:しない
var removeOuterBracketsEnable = true; // true:する / false:しない
44行目: 58行目:


var d = document;
var d = document;
var s = d.selection;
if ( d.ReadOnly ) {
  Status = " ドキュメントは書き換え禁止です。";
  Quit();
}
 
var s = document.selection;
var st = s.Text; // 選択範囲の文字列
var st = s.Text; // 選択範囲の文字列
var act = s.GetActivePos();
var act = s.GetActivePos();
var anc = s.GetAnchorPos();
var anc = s.GetAnchorPos();
var tPos = ( anc < act ) ? anc : act; // 選択範囲の先頭位置
var tp = ( anc < act ) ? anc : act; // 選択範囲の先頭位置
var bPos = ( anc < act ) ? act : anc; // 選択範囲の末尾位置
var bp = ( anc < act ) ? act : anc; // 選択範囲の末尾位置
var del = false;
var del = false;
var o, c;


// 選択範囲内の最初と最後の各1文字がカッコのとき
// 選択範囲内の最初と最後の各1文字がカッコのとき
for ( var i = 0; i < brackets.length - 1; i ++ ) {
for ( var i = 0, len = brackets.length - 1; i < len; i ++ ) {
   var o = brackets[ i ]; // 開きカッコ
   o = brackets[ i ]; // 開きカッコ
   var c = brackets[ i + 1 ] // 閉じカッコ
   c = brackets[ i + 1 ] // 閉じカッコ
   if ( st.length > 1 && i % 2 == 0
   if ( st.length >= o.length + c.length && i % 2 == 0
       && st.charAt( 0 ) == o
       && st.slice( 0, o.length ) == o
       && st.charAt( st.length - c.length ) == c ) {
       && st.slice( - c.length ) == c ) {
     s.Text = st.slice( o.length, - c.length ); // 先頭と末尾の各1文字ずつを削除
     s.Text = st.slice( o.length, - c.length );// 先頭と末尾の各1文字ずつを削除
     s.SetAnchorPos( tPos ); // 選択範囲を復帰する
     s.SetAnchorPos( tp ); // 選択範囲を復帰する
    Status = " " + ( o == " " ? "␣" : o ) + "  と  "
          + ( c == " " ? "␣" : c ) + "  を削除しました。";
     del = true;
     del = true;
     break;
     break;
70行目: 88行目:
// 選択範囲の外側 (前と後) の各1文字がカッコのとき
// 選択範囲の外側 (前と後) の各1文字がカッコのとき
if ( removeOuterBracketsEnable && ! del ) {
if ( removeOuterBracketsEnable && ! del ) {
   for ( var i = 0; i < brackets.length - 1; i ++ ) {
   for ( var i = 0, len = brackets.length - 1; i < len; i ++ ) {
     var o = brackets[ i ]; // 開きカッコ
     o = brackets[ i ]; // 開きカッコ
     var c = brackets[ i + 1 ] // 閉じカッコ
     c = brackets[ i + 1 ] // 閉じカッコ
     if ( i % 2 == 0
     if ( i % 2 == 0
         && d.Text.charAt( tPos - o.length ) == o
         && d.Text.slice( tp - o.length, tp ) == o
         && d.Text.charAt( bPos ) == c ) {
         && d.Text.slice( bp, bp + c.length ) == c ) {
       s.SetAnchorPos( tPos - o.length ); // 選択範囲の先頭を1文字拡張
       s.SetAnchorPos( tp - o.length ); // 選択範囲の先頭を1文字拡張
       s.SetActivePos( bPos + c.length, true ); // 選択範囲の末尾を1文字拡張
       s.SetActivePos( bp + c.length, true ); // 選択範囲の末尾を1文字拡張
       st = s.Text;
       st = s.Text;
       s.Text = st.slice( o.length, - c.length ); // 先頭と末尾の各1文字ずつ削除
       s.Text = st.slice( o.length, - c.length );// 先頭と末尾の各1文字を削除
       s.SetAnchorPos( tPos - o.length ); // 選択範囲を復帰する
       s.SetAnchorPos( tp - o.length ); // 選択範囲を復帰する
       Status = " " + ( o == " " ? "␣" : o ) + "  と  "
       del = true;
            + ( c == " " ? "␣" : c ) + "  を削除しました。";
       break;
       break;
     }
     }
   }
   }
}
// 終了ステータス
if ( del ) {
  Status = " " + ( o == " " ? "␣" : o ) + "  と  "
        + ( c == " " ? "␣" : c ) + "  を削除しました。";
}
else {
  Status = " カッコがありません。"
}
}
</source>
</source>
= カッコを削除/追加 =
選択範囲の先頭と末尾が「対になるカッコ」のときは、カッコ囲いをはずします。<br>
選択範囲の先頭と末尾が「対になるカッコ」でなかったときは、「さいごに 追加/削除 したカッコ」と同種のカッコで選択範囲を囲います。
* '''※[[includeライブラリ]]を利用して「さいごに 追加/削除 したカッコ」を外部ファイルに保存します。'''
<div id="注1" class="warningbox">
: あらかじめ [[includeライブラリ]] を Macros フォルダにインストールしてください。
:: 外部ファイルの保存場所は  Mery\Macros\MacroSettings\<カッコを削除/追加>.json <br> または  %AppData%\Mery\MacroSettings\<カッコを削除/追加>.json  です。 <br>( <カッコを削除/追加> の部分はこのマクロのファイル名と同一になります )
</div>
* 「対になるカッコ」の定義は「[[カッコをはずす]]」マクロとおなじです。
* 定義されたカッコのペアを削除したときに「さいごに 追加/削除 したカッコ」を更新します。
* カッコの追加に使用する前に、一度「使いたいカッコ」の削除を実行して、設定ファイルの「さいごに 追加/削除 したカッコ」を更新する必要があります。<br>  e.g. "削除" → "追加" → "追加" ……  (削除) → (追加) → (追加) ……
* 両端が '''" "''' で囲われた文字列を範囲選択して、外側を '''( )''' などで囲うことはできません。<br>  ∵ '''" "''' のペアもカッコの定義にあるので「削除」が優先。
* おなじ選択範囲のまま連続で実行すると、削除 ⇔ 追加 の繰り返しになります。
== ソースコード ==
<source lang="javascript">
#title="カッコを削除/追加"
#tooltip="対になるカッコを削除/追加する"
#icon="code_slashed.ico"
#include "include/IO.js"
/**
* ------------------------------------------------------------
* カッコを削除/追加 (2019/03/18, sukemaru)
* ------------------------------------------------------------
* 選択範囲の先頭と末尾が「対になるカッコ」のときは、カッコ囲いをはずします。
* 選択範囲の先頭と末尾が「対になるカッコ」でなかったときは、
* さいごに 追加/削除 したカッコと同種のカッコで囲います。
*/
// ▼「対になるカッコ」の種類 (始)+(終) を列挙する ▼
// ※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ
var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〞〝〟‘’“”――~~〜〜  ";
// 削除対象に ▼各種記号のペア▼ を追加する場合は、コメントアウトを解除する
// brackets += "++--**//##==%%::::@@@@※※○○●●□□■■◇◇◆◆▽▽▼▼△△▲▲☆☆★★††||←→→←↑↓↓↑←←→→↑↑↓↓……¿?¡!‚‘‚’„“„”“„‘‚‹››‹«»»«——‐‐--␣␣__";
var d = document;
if ( d.ReadOnly ) {
  Status = " ドキュメントは書き換え禁止です。";
  Quit();
}
var setting = {};
// JSON ファイルから「最後に使用したカッコ」を読み込む
setting = IO.Deserialize( setting );
var s = document.selection;
var st = s.Text; // 選択範囲の文字列
var act = s.GetActivePos();
var anc = s.GetAnchorPos();
var tp = ( anc < act ) ? anc : act; // 選択範囲の先頭位置
var bp = ( anc < act ) ? act : anc; // 選択範囲の末尾位置
var o = setting.openBracket ? setting.openBracket : "(";
var c = setting.closeBracket ? setting.closeBracket : ")";
var del = false;
// ループ処理で「対になるカッコ」と一致するかチェック
for ( var i = 0, len = brackets.length - 1; i < len; i ++ ) {
  o = brackets[ i ]; // 開きカッコ
  c = brackets[ i + 1 ] // 閉じカッコ
  // 選択範囲内の先頭と末尾が「対になるカッコ」のとき
  if ( st.length > o.length + c.length && i % 2 == 0
      && st.slice( 0, o.length ) == o
      && st.slice( - c.length ) == c ) {
    s.Text = st.slice( o.length, - c.length ); // 先頭と末尾のカッコを削除
    s.SetAnchorPos( tp ); // 選択範囲を復帰する
    del = true;
    setting.openBracket = o;
    setting.closeBracket = c;
    IO.Serialize( setting ); // ヒットしたカッコを保存する
    break;
  }
}
// 選択範囲内の先頭と末尾が「対になるカッコ」ではなかったとき
if ( ! del ) {
  // 「最後に使用したカッコ」
  var o = setting.openBracket;
  var c = setting.closeBracket;
  s.Text = o + st + c; // 先頭と末尾にカッコを追加
  s.SetAnchorPos( tp ); // 選択範囲を復帰する
}
// 終了ステータス
if ( del ) {
  Status = " " + o.replace( /[ ]+/g , "␣" ) + "  と  "
        + c.replace( /[ ]+/g , "␣" ) + "  を削除しました。";
}
else {
  Status = " " +  o.replace( /[ ]+/g , "␣" )  + " カッコ "
        + c.replace( /[ ]+/g , "␣" ) + "  で囲いました。";
}
</source>
= メモ =
* 注釈では「開きカッコ/閉じカッコの指定は '''各1文字''' ずつ」としてありますが、削除ループのコードは「複数文字」の文字列を扱えるようにしてあります。<br> 変数 blackets の最初の代入値を配列形式にすれば、 (始)と(終) のペアは「任意の複数文字の文字列」も追加できます。<br>  e.g. ''var brackets = [ "(" , ")" , "<" , ">" , "<nowiki><!-- " , " --></nowiki>" , "<" , " />" ];''
* カッコの定義文字列に "\n" を含めることを想定していません(問題ないはずですが動作検証していません)。

2019年3月18日 (月) 19:31時点における版

カッコをはずす

選択範囲の "最初の1文字" と "最後の1文字" が「対になるカッコ」のとき、または選択範囲の外側 (前と後) の各1文字が「対になるカッコ」のときに、カッコ囲いをはずします。

  • カッコの種類はソースコード内で定義したもののみ
    (開き/閉じカッコはそれぞれ「1文字」ずつのペアで)。
  • カッコの種類
  • 各種のカッコ(半角/全角/縦書き)
 () 「」 <> [] {} ⦅⦆
() 「」 『』 <> [] {} 【】 〖〗 ⦅⦆ 〚〛 〔〕 〘〙 〈〉 《》
﹁﹂ ﹃﹄ ︵︶ ︿﹀ ︽︾ ︹︺ ︷︸ ︻︼ ︗︘
  • 各種の引用符(半角/全角)
" "  ' '  ” ”  ’ ’  〝 〞  〝 〟  ‘ ’  “ ”
  • ーダーシー、〜波ダーシ〜、~全角チルダ~
  • ␣半角空白␣も含んでいるので、選択単語の左右の半角空白も削除できます。


  • 1回の実行につき1組のカッコ囲いをはずします。
例. 以下の行で [ "hoge" ] を範囲選択して連続で実行した場合、次のように作用します。(※内側の両端が優先)
( [ "hoge" ] )	// 元の文字列

(  "hoge"  )	// 1回目 実行後: [  と  ] を削除しました。
( "hoge" )	// 2回目 実行後: ␣ と ␣ を削除しました。
( hoge )	// 3回目 実行後: "  と  " を削除しました。
(hoge)		// 4回目 実行後: ␣ と ␣ を削除しました。	※選択範囲の外側
hoge		// 5回目 実行後: (  と  ) を削除しました。	※選択範囲の外側
  • 選択範囲(複数行)の各行の行頭/行末からカッコを除去したい場合は、「カッコで囲う(ポップアップメニュー)」マクロや「テキスト整形」マクロの削除系コマンドをご利用ください。


ソースコード

#title="カッコをはずす"
#tooltip="対になるカッコを除去する"

/**
 * ------------------------------------------------------------
 * カッコをはずす (2019/03/14 - 2019/03/18, sukemaru) 
 * ------------------------------------------------------------
 * 選択範囲の最初の1文字と最後の1文字が「対になるカッコ」のとき、
 * または選択範囲の外側 (前と後) の各1文字が「対になるカッコ」のときに、
 * カッコ囲いをはずします。
 * ※「外側」オプションが有効な場合でも、
 *  選択範囲"内側"の先頭/末尾のカッコの削除が優先されます。
 */

// ▼「対になるカッコ」の種類 (始)+(終) を列挙する ▼ 
// ※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ

var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〞〝〟‘’“”――~~〜〜  ";

// 削除対象に ▼各種記号のペア▼ を追加する場合は、コメントアウトを解除する
// brackets += "++--**//##==%%::::@@@@※※○○●●□□■■◇◇◆◆▽▽▼▼△△▲▲☆☆★★††||←→→←↑↓↓↑←←→→↑↑↓↓……¿?¡!‚‘‚’„“„”“„‘‚‹››‹«»»«——‐‐--␣␣__";


// ■ 選択範囲の『外側』(前と後ろ) の各1文字がカッコのときも除去する? ■ 
// (※ 選択範囲の前後を1文字ずつ拡張してカッコを除去する)
var removeOuterBracketsEnable = true;	// true:する / false:しない


var d = document;
if ( d.ReadOnly ) {
  Status = " ドキュメントは書き換え禁止です。";
  Quit();
}

var s = document.selection;
var st = s.Text;	// 選択範囲の文字列
var act = s.GetActivePos();
var anc = s.GetAnchorPos();
var tp = ( anc < act ) ? anc : act;	// 選択範囲の先頭位置
var bp = ( anc < act ) ? act : anc;	// 選択範囲の末尾位置
var del = false;
var o, c;

// 選択範囲内の最初と最後の各1文字がカッコのとき
for ( var i = 0, len = brackets.length - 1; i < len; i ++ ) {
  o = brackets[ i ];			// 開きカッコ
  c = brackets[ i + 1 ]		// 閉じカッコ
  if ( st.length >= o.length + c.length && i % 2 == 0
      && st.slice( 0, o.length ) == o
      && st.slice( - c.length ) == c ) {
    s.Text = st.slice( o.length, - c.length );// 先頭と末尾の各1文字ずつを削除
    s.SetAnchorPos( tp );			// 選択範囲を復帰する
    del = true;
    break;
  }
}

// 選択範囲の外側 (前と後) の各1文字がカッコのとき
if ( removeOuterBracketsEnable && ! del ) {
  for ( var i = 0, len = brackets.length - 1; i < len; i ++ ) {
    o = brackets[ i ];		// 開きカッコ
    c = brackets[ i + 1 ]	// 閉じカッコ
    if ( i % 2 == 0
        && d.Text.slice( tp - o.length, tp ) == o
        && d.Text.slice( bp, bp + c.length ) == c ) {
      s.SetAnchorPos( tp - o.length );		// 選択範囲の先頭を1文字拡張
      s.SetActivePos( bp + c.length, true );	// 選択範囲の末尾を1文字拡張
      st = s.Text;
      s.Text = st.slice( o.length, - c.length );// 先頭と末尾の各1文字を削除
      s.SetAnchorPos( tp - o.length );		// 選択範囲を復帰する
      del = true;
      break;
    }
  }
}

// 終了ステータス
if ( del ) {
  Status = " " + ( o == " " ? "␣" : o ) + "  と  "
         + ( c == " " ? "␣" : c ) + "  を削除しました。";
}
else {
  Status = " カッコがありません。" 
}


カッコを削除/追加

選択範囲の先頭と末尾が「対になるカッコ」のときは、カッコ囲いをはずします。
選択範囲の先頭と末尾が「対になるカッコ」でなかったときは、「さいごに 追加/削除 したカッコ」と同種のカッコで選択範囲を囲います。

  • includeライブラリを利用して「さいごに 追加/削除 したカッコ」を外部ファイルに保存します。
あらかじめ includeライブラリ を Macros フォルダにインストールしてください。
外部ファイルの保存場所は Mery\Macros\MacroSettings\<カッコを削除/追加>.json
または %AppData%\Mery\MacroSettings\<カッコを削除/追加>.json です。
( <カッコを削除/追加> の部分はこのマクロのファイル名と同一になります )
  • 定義されたカッコのペアを削除したときに「さいごに 追加/削除 したカッコ」を更新します。
  • カッコの追加に使用する前に、一度「使いたいカッコ」の削除を実行して、設定ファイルの「さいごに 追加/削除 したカッコ」を更新する必要があります。
      e.g. "削除" → "追加" → "追加" …… (削除) → (追加) → (追加) ……
  • 両端が " " で囲われた文字列を範囲選択して、外側を ( ) などで囲うことはできません。
      ∵ " " のペアもカッコの定義にあるので「削除」が優先。
  • おなじ選択範囲のまま連続で実行すると、削除 ⇔ 追加 の繰り返しになります。


ソースコード

#title="カッコを削除/追加"
#tooltip="対になるカッコを削除/追加する"
#icon="code_slashed.ico"
#include "include/IO.js"

/**
 * ------------------------------------------------------------
 * カッコを削除/追加 (2019/03/18, sukemaru) 
 * ------------------------------------------------------------
 * 選択範囲の先頭と末尾が「対になるカッコ」のときは、カッコ囲いをはずします。
 * 選択範囲の先頭と末尾が「対になるカッコ」でなかったときは、
 * さいごに 追加/削除 したカッコと同種のカッコで囲います。
 */


// ▼「対になるカッコ」の種類 (始)+(終) を列挙する ▼ 
// ※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ

var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〞〝〟‘’“”――~~〜〜  ";

// 削除対象に ▼各種記号のペア▼ を追加する場合は、コメントアウトを解除する
// brackets += "++--**//##==%%::::@@@@※※○○●●□□■■◇◇◆◆▽▽▼▼△△▲▲☆☆★★††||←→→←↑↓↓↑←←→→↑↑↓↓……¿?¡!‚‘‚’„“„”“„‘‚‹››‹«»»«——‐‐--␣␣__";


var d = document;
if ( d.ReadOnly ) {
  Status = " ドキュメントは書き換え禁止です。";
  Quit();
}

var setting = {};

// JSON ファイルから「最後に使用したカッコ」を読み込む
setting = IO.Deserialize( setting );

var s = document.selection;
var st = s.Text;	// 選択範囲の文字列
var act = s.GetActivePos();
var anc = s.GetAnchorPos();
var tp = ( anc < act ) ? anc : act;	// 選択範囲の先頭位置
var bp = ( anc < act ) ? act : anc;	// 選択範囲の末尾位置
var o = setting.openBracket ? setting.openBracket : "(";
var c = setting.closeBracket ? setting.closeBracket : ")";
var del = false;

// ループ処理で「対になるカッコ」と一致するかチェック
for ( var i = 0, len = brackets.length - 1; i < len; i ++ ) {
  o = brackets[ i ];		// 開きカッコ
  c = brackets[ i + 1 ]		// 閉じカッコ

  // 選択範囲内の先頭と末尾が「対になるカッコ」のとき
  if ( st.length > o.length + c.length && i % 2 == 0
      && st.slice( 0, o.length ) == o
      && st.slice( - c.length ) == c ) {
    s.Text = st.slice( o.length, - c.length );	// 先頭と末尾のカッコを削除
    s.SetAnchorPos( tp );			// 選択範囲を復帰する
    del = true;

    setting.openBracket = o;
    setting.closeBracket = c;
    IO.Serialize( setting );	// ヒットしたカッコを保存する
    break;
  }
}

// 選択範囲内の先頭と末尾が「対になるカッコ」ではなかったとき
if ( ! del ) {
  // 「最後に使用したカッコ」
  var o = setting.openBracket;
  var c = setting.closeBracket;
  s.Text = o + st + c;		// 先頭と末尾にカッコを追加
  s.SetAnchorPos( tp );		// 選択範囲を復帰する
}

// 終了ステータス
if ( del ) {
  Status = " " + o.replace( /[ ]+/g , "␣" ) + "  と  "
         + c.replace( /[ ]+/g , "␣" ) + "  を削除しました。";
}
else {
  Status = " " +  o.replace( /[ ]+/g , "␣" )  + " カッコ "
         + c.replace( /[ ]+/g , "␣" ) + "  で囲いました。";
}


メモ

  • 注釈では「開きカッコ/閉じカッコの指定は 各1文字 ずつ」としてありますが、削除ループのコードは「複数文字」の文字列を扱えるようにしてあります。
    変数 blackets の最初の代入値を配列形式にすれば、 (始)と(終) のペアは「任意の複数文字の文字列」も追加できます。
     e.g. var brackets = [ "(" , ")" , "<" , ">" , "<!-- " , " -->" , "<" , " />" ];
  • カッコの定義文字列に "\n" を含めることを想定していません(問題ないはずですが動作検証していません)。
スポンサーリンク