「カッコをはずす」の版間の差分
ナビゲーションに移動
検索に移動
細 →メモ |
「カッコを追加/削除」のコードを整理し、GetKeyState のリンク先を変更。ZIPファイルを更新。 |
||
| 13行目: | 13行目: | ||
:: " " ' ' ” ” ’ ’ 〝 〞 〝 〟 ‘ ’ “ ” | :: " " ' ' ” ” ’ ’ 〝 〞 〝 〟 ‘ ’ “ ” | ||
:* ーダーシー、〜波ダーシ〜、~全角チルダ~ | :* ーダーシー、〜波ダーシ〜、~全角チルダ~ | ||
:* '''␣半角空白␣''' | :* '''␣半角空白␣'''も含めてあるので、選択単語の左右の半角空白も削除できます。 | ||
: ※ソースコード内に。各種の記号や諸外国後で使用される引用符などのペアを用意してあります。任意で追加してご利用下さい。 | : ※ソースコード内に。各種の記号や諸外国後で使用される引用符などのペアを用意してあります。任意で追加してご利用下さい。 | ||
| 21行目: | 21行目: | ||
---- | ---- | ||
::'''ダウンロード:''' [[ファイル:カッコを削除/追加.zip]](アイコン入り) 2019/03/ | ::'''ダウンロード:''' [[ファイル:カッコを削除/追加.zip]](アイコン入り) 2019/03/23 更新 | ||
----<br> | ----<br> | ||
| 29行目: | 29行目: | ||
* | * 1回の実行につき1組のカッコ囲いをはずします(※内側の両端が優先。半角空白のペアも除去対象)。 | ||
:: 例. 以下の行で <u>'''[ "hoge" ]'''</u> を範囲選択して連続で実行した場合、次のように作用します。 | :: 例. 以下の行で <u>'''[ "hoge" ]'''</u> を範囲選択して連続で実行した場合、次のように作用します。 | ||
| 39行目: | 39行目: | ||
(<u>hoge</u>) // 4回目 実行後: ''␣ と ␣ を削除しました。'' ※選択範囲の外側 | (<u>hoge</u>) // 4回目 実行後: ''␣ と ␣ を削除しました。'' ※選択範囲の外側 | ||
<u>hoge</u> // 5回目 実行後: ''( と ) を削除しました。'' ※選択範囲の外側 | <u>hoge</u> // 5回目 実行後: ''( と ) を削除しました。'' ※選択範囲の外側 | ||
:: <u>'''( [ "hoge" ] )'''</u> 全体を範囲選択して連続で実行した場合は外側から、<br> ( [ "<u>'''hoge'''</u>" ] ) の '''hoge''' だけを範囲選択して連続で実行した場合は内側から <br> 順にカッコ囲いを解除します。 | |||
* 選択範囲(複数行)の各行の行頭/行末からカッコを除去したい場合は、「[[カッコで囲う]](ポップアップメニュー)」マクロや「[[テキスト整形]]」マクロの削除系コマンドをご利用ください。 | * 選択範囲(複数行)の各行の行頭/行末からカッコを除去したい場合は、「[[カッコで囲う]](ポップアップメニュー)」マクロや「[[テキスト整形]]」マクロの削除系コマンドをご利用ください。 | ||
| 141行目: | 143行目: | ||
<div id="注1" class="warningbox"> | <div id="注1" class="warningbox"> | ||
: あらかじめ [[includeライブラリ]] を Macros | : あらかじめ [[includeライブラリ]] を Macros フォルダに配置してください。 | ||
:: 外部ファイルの保存場所は Mery\Macros\MacroSettings\<カッコを削除/追加>.json <br> または %AppData%\Mery\MacroSettings\<カッコを削除/追加>.json です。 <br>( <u><カッコを削除/追加></u> の部分はこのマクロのファイル名と同一になります ) | :: 外部ファイルの保存場所は Mery\Macros\MacroSettings\<カッコを削除/追加>.json <br> または %AppData%\Mery\MacroSettings\<カッコを削除/追加>.json です。 <br>( <u><カッコを削除/追加></u> の部分はこのマクロのファイル名と同一になります ) | ||
</div> | </div> | ||
| 244行目: | 246行目: | ||
= カッコを追加/削除 = | = カッコを追加/削除 = | ||
マクロライブラリで公開・配布されている pizz 氏作成の "[[GetKeyState.exe(キー状態取得実行ファイル)|GetKeyState]]" も利用して、「[[#カッコをはずす|カッコをはずす]]」マクロと「[[#カッコを削除/追加|カッコを削除/追加]]」マクロの機能を統合してあります。 | |||
* マクロ実行時に Ctrl | * マクロ実行時に '''Ctrl キー''' が押されているときは、選択範囲を「さいごに 削除/追加 したカッコ」で囲います(→ 詳細は「[[#カッコを削除/追加|カッコを削除/追加]]」マクロの項を参照)。 | ||
* マクロ実行時に Ctrl キーが押されていないとき、選択範囲の最初の1文字と最後の1文字が「対になるカッコ」の場合か、または選択範囲の外側 (前と後) の各1文字が「対になるカッコ」の場合には、カッコ囲いをはずします(→ 詳細は「[[#カッコをはずす|カッコをはずす]]」マクロの項を参照)。 | * マクロ実行時に Ctrl キーが押されていないとき、選択範囲の最初の1文字と最後の1文字が「対になるカッコ」の場合か、または選択範囲の外側 (前と後) の各1文字が「対になるカッコ」の場合には、カッコ囲いをはずします(→ 詳細は「[[#カッコをはずす|カッコをはずす]]」マクロの項を参照)。 | ||
| 252行目: | 254行目: | ||
<div id="注2" class="warningbox"> | <div id="注2" class="warningbox"> | ||
* '''外部実行ファイル | * '''外部実行ファイル [[GetKeyState.exe(キー状態取得実行ファイル)|GetKeyState.exe]] を利用して Ctrl キー押し下げ判定をします。''' | ||
: あらかじめ | : あらかじめ "GetKeyState.zip" をダウンロードして、書庫内の "GetKeyState.exe" を Macros フォルダに配置してください。 | ||
* '''[[includeライブラリ]] を利用して「さいごに 追加/削除 したカッコ」を外部ファイルに保存します。''' | * '''[[includeライブラリ]] を利用して「さいごに 追加/削除 したカッコ」を外部ファイルに保存します。''' | ||
: あらかじめ | : あらかじめ "includeライブラリを" Macros フォルダに配置してください。 | ||
:: 外部ファイルの保存場所は Mery\Macros\MacroSettings\<カッコを追加/削除>.json <br> または %AppData%\Mery\MacroSettings\<カッコを追加/削除>.json です。 <br>( <u><カッコを追加/削除></u> の部分はこのマクロのファイル名と同一になります ) | :: 外部ファイルの保存場所は Mery\Macros\MacroSettings\<カッコを追加/削除>.json <br> または %AppData%\Mery\MacroSettings\<カッコを追加/削除>.json です。 <br>( <u><カッコを追加/削除></u> の部分はこのマクロのファイル名と同一になります ) | ||
</div> | </div> | ||
| 265行目: | 267行目: | ||
* ツールバーにアイコンを置いて実行する場合、アイコンをクリックするときの Ctrl キーの押し下げ状態(Ctrl+クリックか、ただのクリックか)で機能を切り替えます<br> | * ツールバーにアイコンを置いて実行する場合、アイコンをクリックするときの Ctrl キーの押し下げ状態(Ctrl+クリックか、ただのクリックか)で機能を切り替えます<br> | ||
* [マクロ]メニューや右クリックメニュー内から実行する場合も、実行するときの Ctrl キーの押し下げ状態(Ctrl+クリック or ただの左クリック、または Ctrl+Enter or Enter)で機能を切り替えます<br> | |||
* 外部リソースからの読み込みコストがあるため、Ctrl+F8 キーなどや Ctrl+クリックが速すぎると Ctrl キーの押し下げ状態を正しく取得できないことがあります。<br> 「カッコの追加」がうまく機能しないときは、Ctrl キーを放すタイミングを遅らせてください <br>(マクロが発動するまで、またはマクロの処理が終了するまで Ctrl キーを押し下げたままにする)。 | * 外部リソースからの読み込みコストがあるため、Ctrl+F8 キーなどや Ctrl+クリックが速すぎると Ctrl キーの押し下げ状態を正しく取得できないことがあります。<br> 「カッコの追加」がうまく機能しないときは、Ctrl キーを放すタイミングを遅らせてください <br>(マクロが発動するまで、またはマクロの処理が終了するまで Ctrl キーを押し下げたままにする)。 | ||
| 284行目: | 288行目: | ||
#tooltip="対になるカッコを追加/削除する" | #tooltip="対になるカッコを追加/削除する" | ||
#include "include/IO.js" | #include "include/IO.js" | ||
var start = new Date(); | |||
// Ctrl キーの状態を取得する | |||
var WshShell = new ActiveXObject( 'WScript.Shell' ); | |||
var getKeyState = '"' + editor.FullName.replace( /mery\.exe$/i , 'Macros\\' ) | |||
+ 'GetKeyState.exe "'; // フルパスを " " で囲い、半角空白を追加 | |||
// GetKeyState.exe + 引数 control | |||
var $ctrl = WshShell.Run( getKeyState + "control", 0, true ); | |||
/** | /** | ||
* ------------------------------------------------------------ | * ------------------------------------------------------------ | ||
* カッコを追加/削除 (2019/03/19, sukemaru) | * カッコを追加/削除 (2019/03/19 - 2019/03/23, sukemaru) | ||
* ------------------------------------------------------------ | * ------------------------------------------------------------ | ||
* ※ このマクロの実行には、以下の外部ライブラリと実行ファイルが必要です。 | * ※ このマクロの実行には、以下の外部ライブラリと実行ファイルが必要です。 | ||
| 293行目: | 306行目: | ||
* ・ks 氏作成の "includeライブラリ" を Macros フォルダに配置してください。 | * ・ks 氏作成の "includeライブラリ" を Macros フォルダに配置してください。 | ||
* https://www.haijin-boys.com/wiki/include%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA | * https://www.haijin-boys.com/wiki/include%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA | ||
* | |||
* ・pizz 氏作成の "GetKeyState.exe" を Macros フォルダに配置してください。 | * ・pizz 氏作成の "GetKeyState.exe" を Macros フォルダに配置してください。 | ||
* https://www.haijin-boys.com/wiki/ | * https://www.haijin-boys.com/wiki/GetKeySatate.exe%28%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%29 | ||
* ------------------------------------------------------------ | * ------------------------------------------------------------ | ||
* | * | ||
| 302行目: | 316行目: | ||
// ▼「対になるカッコ」の種類 (始)と(終) のペアを列挙する ▼ | // ▼「対になるカッコ」の種類 (始)と(終) のペアを列挙する ▼ | ||
// ※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ | // ※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ | ||
var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〞〝〟‘’“”――~~〜〜 "; | var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〞〝〟‘’“”――~~〜〜 "; | ||
brackets += "++--**\/\/##==%%::::@@@@※※○○●●□□■■◇◇◆◆▽▽▼▼△△▲▲☆☆★★††||←→→←↑↓↓↑←←→→↑↑↓↓……¿?¡!‚‘‚’„“„”“„‘‚‹››‹«»»«——‐‐--␣␣__"; | |||
| 317行目: | 332行目: | ||
Quit(); | Quit(); | ||
} | } | ||
if ( $ctrl == -1 ) { | if ( $ctrl == -1 ) { | ||
| 328行目: | 339行目: | ||
var s = document.selection; | 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 tp = ( anc < act ) ? anc : act; // 選択範囲の先頭位置 | var tp = ( anc < act ) ? anc : act; // 選択範囲の先頭位置 | ||
var bp = ( anc < act ) ? act : anc; // 選択範囲の末尾位置 | var bp = ( anc < act ) ? act : anc; // 選択範囲の末尾位置 | ||
var $del = false; | var $del = false; // 削除フラグ | ||
var $add = false; | var $add = false; // 追加フラグ | ||
var o, c; | var o, c; | ||
var setting = {}; | var setting = {}; | ||
| 341行目: | 352行目: | ||
setting = IO.Deserialize( setting ); | setting = IO.Deserialize( setting ); | ||
// Ctrl | // Ctrl キーが押されているときは、選択範囲を「最後に使用したカッコ」で囲う | ||
if ( $ctrl == 1 ) { | if ( $ctrl == 1 ) { | ||
// | AddBrackets( st ); | ||
} | |||
// Ctrl キーが押されていないとき | |||
else { | |||
// 選択範囲の先頭と末尾から「対になるカッコ」を削除する | |||
DeleteBrackets( st ); | |||
// 選択範囲内の先頭と末尾が「対になるカッコ」ではなかったとき | |||
if ( removeOuterBracketsEnable && ! del ) { | |||
// 選択範囲の外側(前と後ろ)にある「対になるカッコ」を削除する | |||
RemoveOuterBrackets( st ); | |||
} | |||
} | |||
// 終了ステータス | |||
var end = new Date(); | |||
if ( $add ) { | |||
Status = " " + o.replace( /[ ]+/g , "␣" ) + " カッコ " | |||
+ c.replace( /[ ]+/g , "␣" ) + " で囲いました。" | |||
+ TimerElapsed( end, start ); | |||
} | |||
else if ( $del ) { | |||
Status = " " + o.replace( /[ ]+/g , "␣" ) + " と " | |||
+ c.replace( /[ ]+/g , "␣" ) + " を削除しました。" | |||
+ TimerElapsed( end, start ); | |||
} | |||
else { | |||
Status = " カッコがありません。" | |||
+ TimerElapsed( end, start ); | |||
} | |||
Quit(); | |||
// ------------------------------------------------------------ | |||
// 以下、各関数では基本的にグローバルスコープの変数を継承する | |||
// ------------------------------------------------------------ | |||
/** | |||
* 関数 TimerElapsed( end, start ) | |||
* start からの経過時間を [ s.sss 秒 ] で返す | |||
*/ | |||
function TimerElapsed( end, start ) { | |||
var elapsed = end - start; | |||
return " [ " | |||
+ ( ( elapsed / 1000 ) + "000" ).replace( /(\.)(\d{3})(0*)$/, "$1 $2" ) | |||
+ " sec. ]"; | |||
} | |||
/** | |||
* 関数 AddBrackets( st ) | |||
* 選択範囲をカッコで囲う | |||
*/ | |||
function AddBrackets( st ) { | |||
// 追加するカッコ =「最後に使用したカッコ」 | |||
o = setting.openBracket ? setting.openBracket : "("; | o = setting.openBracket ? setting.openBracket : "("; | ||
c = setting.closeBracket ? setting.closeBracket : ")"; | c = setting.closeBracket ? setting.closeBracket : ")"; | ||
s.Text = o + st + c; // 先頭と末尾にカッコを追加 | s.Text = o + st + c; // 先頭と末尾にカッコを追加 | ||
s.SetAnchorPos( tp ); // 選択範囲を復帰する | s.SetAnchorPos( tp ); // 選択範囲を復帰する | ||
| 351行目: | 418行目: | ||
} | } | ||
/** | |||
* 関数 DeleteBrackets( st ) | |||
* 選択範囲の先頭と末尾からカッコを削除する | |||
*/ | |||
function DeleteBrackets( st ) { | |||
// ループ処理で「対になるカッコ」と一致するかチェック | // ループ処理で「対になるカッコ」と一致するかチェック | ||
for ( var i = 0, len = brackets.length | for ( var i = 0, len = brackets.length; i < len; i ++ ) { | ||
if ( i % 2 == 1 ) { | |||
continue; | |||
} | |||
o = brackets[ i ]; // 開きカッコ | o = brackets[ i ]; // 開きカッコ | ||
c = brackets[ i + 1 ] // 閉じカッコ | c = brackets[ i + 1 ] // 閉じカッコ | ||
// 選択範囲内の先頭と末尾が「対になるカッコ」のとき | // 選択範囲内の先頭と末尾が「対になるカッコ」のとき | ||
if ( st.length >= o.length + c.length | if ( st.length >= o.length + c.length | ||
&& st.slice( 0, o.length ) == o | && st.slice( 0, o.length ) == o | ||
&& st.slice( - c.length ) == c ) { | && st.slice( - c.length ) == c ) { | ||
s.Text = st.slice( o.length, - c.length ); // | s.Text = st.slice( o.length, - c.length ); // 先頭/末尾のカッコを削除 | ||
s.SetAnchorPos( tp ); // 選択範囲を復帰する | s.SetAnchorPos( tp ); // 選択範囲を復帰する | ||
$del = true; | $del = true; | ||
| 370行目: | 443行目: | ||
setting.openBracket = o; | setting.openBracket = o; | ||
setting.closeBracket = c; | setting.closeBracket = c; | ||
IO.Serialize( setting ); // | IO.Serialize( setting ); // ヒットしたカッコを JSON ファイルに保存 | ||
} | } | ||
break; | break; | ||
} | } | ||
} | } | ||
} | } | ||
</source> | </source> | ||
| 462行目: | 497行目: | ||
// 配列 brackets の中身をアウトプットバーに出力する | // 配列 brackets の中身をアウトプットバーに出力する | ||
// OutputBar.Writeln(brackets.toString().replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/[ ]/g,"▯")); | // OutputBar.Writeln(brackets.toString().replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/[ ]/g,"▯")); | ||
// OutputBar.Writeln( ( brackets.length / 2 ) + " pairs\n" ); | |||
</source> | </source> | ||
'''アウトプットの出力結果'''(半角空白は ▯ で表示) | '''アウトプットの出力結果'''(半角空白は ▯ で表示) | ||
: <span style="color:#c00;"><nowiki><b>,</b>,<u>,</u>,</,>,<,/>,/*\n,\n▯*/,/*▯,▯*/,/*,*/,<!-- | : <span style="color:#c00;"> <nowiki><b>,</b>,<i>,</i>,<u>,</u>,</,>,<,/>,<!--▯,▯-->,/**▯\n,\n▯*/,/**▯\n,\n*/,/**\n,\n▯*/,/**\n,\n*/,/*▯\n,\n▯*/,/*▯\n,\n*/,/*\n,\n▯*/,/*\n,\n*/,/**▯,▯*/,/*▯,▯*/,<!--,-->,</nowiki> </span>(,),「,」,<,>,[,],{,},",",',',(,),「,」,『,』,<,>,[,],{,},【,】,〖,〗,﹁,﹂,﹃,﹄,︵,︶,︿,﹀,︽,︾,︹,︺,︷,︸,︻,︼,︗,︘,⦅,⦆,⦅,⦆,〚,〛,〔,〕,〘,〙,〈,〉,《,》,”,”,’,’,〝,〞,〝,〟,‘,’,“,”,―,―,~,~,〜,〜,▯,▯,+,+,-,-,*,*,/,/,#,#,=,=,%,%,:,:,:,:,@,@,@,@,※,※,○,○,●,●,□,□,■,■,◇,◇,◆,◆,▽,▽,▼,▼,△,△,▲,▲,☆,☆,★,★,†,†,|,|,←,→,→,←,↑,↓,↓,↑,←,←,→,→,↑,↑,↓,↓,…,…,¿,?,¡,!,‚,‘,‚,’,„,“,„,”,“,„,‘,‚,‹,›,›,‹,«,»,»,«,—,—,‐,‐,-,-,␣,␣,_,_<span style="color:#c00;">,≪,≫</span> | ||
: 111 pairs | |||
これで「カッコをはずす」や「カッコを追加」の操作で <nowiki><!-- と --> や /* と */</nowiki> | これで「カッコをはずす」や「カッコを追加」の操作で '''<nowiki><!-- と --></nowiki>''' や '''<nowiki>/* と */</nowiki>''' などのペアも扱えるようになります。<br> ※正規表現には対応していないので、必要に応じて半角空白つき差分なども追加してください。 | ||
2019年3月23日 (土) 19:14時点における版
選択範囲の "最初の1文字" と "最後の1文字" が「対になるカッコ」のとき、カッコ囲いをはずします。
それにくわえて
- 「カッコをはずす」マクロでは、選択範囲の外側 (前と後) の各1文字が「対になるカッコ」のときにも、カッコ囲いをはずします。
- 「カッコを削除/追加」マクロでは、選択範囲の先頭と末尾が「対になるカッコ」でなかったときは、「さいごに削除(または追加)したカッコ」と同種のカッコで選択範囲を囲います。
- 「カッコを追加/削除」マクロは、両者の機能を統合したものです。
削除できるカッコの種類はソースコード内で定義したもののみ(開き/閉じカッコはそれぞれ「1文字」ずつのペアで)。
- カッコの種類
- 各種のカッコ(半角/全角/縦書き)
- ( ) 「 」 < > [ ] { } ⦅ ⦆
( ) 「 」 『 』 < > [ ] { } 【 】 〖 〗 ⦅ ⦆ 〚 〛 〔 〕 〘 〙 〈 〉 《 》
﹁﹂ ﹃﹄ ︵︶ ︿﹀ ︽︾ ︹︺ ︷︸ ︻︼ ︗︘
- 各種の引用符(半角/全角)
- " " ' ' ” ” ’ ’ 〝 〞 〝 〟 ‘ ’ “ ”
- ーダーシー、〜波ダーシ〜、~全角チルダ~
- ␣半角空白␣も含めてあるので、選択単語の左右の半角空白も削除できます。
- ※ソースコード内に。各種の記号や諸外国後で使用される引用符などのペアを用意してあります。任意で追加してご利用下さい。
カッコを追加する機能は「さいごに削除したカッコ」を記憶しておくことと更新することができるので、ソースコードや散文の校正のさいに使うと便利です。
- ダウンロード: ファイル:カッコを削除/追加.zip(アイコン入り) 2019/03/23 更新
カッコをはずす
選択範囲の "最初の1文字" と "最後の1文字" が「対になるカッコ」のとき、または選択範囲の外側 (前と後) の各1文字が「対になるカッコ」のときに、カッコ囲いをはずします。
- 1回の実行につき1組のカッコ囲いをはずします(※内側の両端が優先。半角空白のペアも除去対象)。
- 例. 以下の行で [ "hoge" ] を範囲選択して連続で実行した場合、次のように作用します。
( [ "hoge" ] ) // 元の文字列(下線部が選択範囲) ( "hoge" ) // 1回目 実行後: [ と ] を削除しました。 ( "hoge" ) // 2回目 実行後: ␣ と ␣ を削除しました。 ( hoge ) // 3回目 実行後: " と " を削除しました。 (hoge) // 4回目 実行後: ␣ と ␣ を削除しました。 ※選択範囲の外側 hoge // 5回目 実行後: ( と ) を削除しました。 ※選択範囲の外側
- ( [ "hoge" ] ) 全体を範囲選択して連続で実行した場合は外側から、
( [ "hoge" ] ) の hoge だけを範囲選択して連続で実行した場合は内側から
順にカッコ囲いを解除します。
- ( [ "hoge" ] ) 全体を範囲選択して連続で実行した場合は外側から、
ソースコード
#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 です。
( <カッコを削除/追加> の部分はこのマクロのファイル名と同一になります )
- 外部ファイルの保存場所は Mery\Macros\MacroSettings\<カッコを削除/追加>.json
- 定義されたカッコのペアを削除したときに「さいごに 追加/削除 したカッコ」を更新します。
- カッコの追加に使用する前に、一度「使いたいカッコ」の削除を実行して、設定ファイルの「さいごに 追加/削除 したカッコ」を更新する必要があります。
e.g. "削除" → "追加" → "追加" …… (削除) → (追加) → (追加) ……
- 両端が " " で囲われた文字列を範囲選択して、外側を ( ) などで囲うことはできません。
∵ " " のペアもカッコの定義にあるので「削除」が優先。
- おなじ選択範囲のまま連続で実行すると、削除 ⇔ 追加 の繰り返しになります。
ソースコード
#title="カッコを削除/追加"
#tooltip="対になるカッコを削除/追加する"
#include "include/IO.js"
/**
* ------------------------------------------------------------
* カッコを削除/追加 (2019/03/18 - 2019/03/19, sukemaru)
* ------------------------------------------------------------
* 選択範囲の先頭と末尾が「対になるカッコ」のときは、カッコ囲いをはずします。
* 選択範囲の先頭と末尾が「対になるカッコ」でなかったときは、
* 「さいごに 追加/削除 したカッコ」と同種のカッコで囲います。
*/
// ▼「対になるカッコ」の種類 (始)+(終) を列挙する ▼
// ※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ
var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〞〝〟‘’“”――~~〜〜 ";
// 削除対象に ▼各種記号のペア▼ を追加する場合は、コメントアウトを解除する
// brackets += "++--**//##==%%::::@@@@※※○○●●□□■■◇◇◆◆▽▽▼▼△△▲▲☆☆★★††||←→→←↑↓↓↑←←→→↑↑↓↓……¿?¡!‚‘‚’„“„”“„‘‚‹››‹«»»«——‐‐--␣␣__";
var setting = {};
// JSON ファイルから「最後に使用したカッコ」を読み込む
setting = IO.Deserialize( setting );
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 del = false;
var o, c;
// ループ処理で「対になるカッコ」と一致するかチェック
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;
if ( o != setting.openBracket || c != setting.closeBracket ) {
setting.openBracket = o;
setting.closeBracket = c;
IO.Serialize( setting ); // ヒットしたカッコを JSON ファイルに保存する
}
break;
}
}
// 選択範囲内の先頭と末尾が「対になるカッコ」ではなかったとき
if ( ! del ) {
// 「最後に使用したカッコ」
o = setting.openBracket ? setting.openBracket : "(";
c = setting.closeBracket ? 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 , "␣" ) + " で囲いました。";
}
カッコを追加/削除
マクロライブラリで公開・配布されている pizz 氏作成の "GetKeyState" も利用して、「カッコをはずす」マクロと「カッコを削除/追加」マクロの機能を統合してあります。
- マクロ実行時に Ctrl キー が押されているときは、選択範囲を「さいごに 削除/追加 したカッコ」で囲います(→ 詳細は「カッコを削除/追加」マクロの項を参照)。
- マクロ実行時に Ctrl キーが押されていないとき、選択範囲の最初の1文字と最後の1文字が「対になるカッコ」の場合か、または選択範囲の外側 (前と後) の各1文字が「対になるカッコ」の場合には、カッコ囲いをはずします(→ 詳細は「カッコをはずす」マクロの項を参照)。
- 外部実行ファイル GetKeyState.exe を利用して Ctrl キー押し下げ判定をします。
- あらかじめ "GetKeyState.zip" をダウンロードして、書庫内の "GetKeyState.exe" を Macros フォルダに配置してください。
- includeライブラリ を利用して「さいごに 追加/削除 したカッコ」を外部ファイルに保存します。
- あらかじめ "includeライブラリを" Macros フォルダに配置してください。
- 外部ファイルの保存場所は Mery\Macros\MacroSettings\<カッコを追加/削除>.json
または %AppData%\Mery\MacroSettings\<カッコを追加/削除>.json です。
( <カッコを追加/削除> の部分はこのマクロのファイル名と同一になります )
- 外部ファイルの保存場所は Mery\Macros\MacroSettings\<カッコを追加/削除>.json
- Ctrl キーの押し下げ状態でカッコの「追加/削除」の機能を切り替えるので、このマクロにショートカットキーを割り当てる場合は、 Ctrl キーをふくむキーパターンと Ctrl キーをふくまないキーパターンの2つを登録する必要があります。
- e.g. Ctrl+F8 と F8 / Ctrl+8 と Alt+8 など
- ※ F8 だけを登録しした場合、 Ctrl+F8 での「カッコの追加」はできません。
- ツールバーにアイコンを置いて実行する場合、アイコンをクリックするときの Ctrl キーの押し下げ状態(Ctrl+クリックか、ただのクリックか)で機能を切り替えます
- [マクロ]メニューや右クリックメニュー内から実行する場合も、実行するときの Ctrl キーの押し下げ状態(Ctrl+クリック or ただの左クリック、または Ctrl+Enter or Enter)で機能を切り替えます
- 外部リソースからの読み込みコストがあるため、Ctrl+F8 キーなどや Ctrl+クリックが速すぎると Ctrl キーの押し下げ状態を正しく取得できないことがあります。
「カッコの追加」がうまく機能しないときは、Ctrl キーを放すタイミングを遅らせてください
(マクロが発動するまで、またはマクロの処理が終了するまで Ctrl キーを押し下げたままにする)。
- Ctrl キーを押していないときで、選択範囲がカッコで囲われていない場合はなにもしません。
カスタマイズ
- ソースコード内の "Ctrl", "ctrl", "control" を "shift" に書き換えれば、カッコの「追加」用のトリガーを Shift キーに変更できます。
- ソースコード内の if ( $ctrl == 1 ) を if ( $ctrl == 0 ) に書き換えれば、
Ctrl キーの押し下げありで「カッコを削除」
Ctrl キーの押し下げなしで「カッコを追加」
に変更できます。 - 「カッコの種類」の定義に "<!-- " と " -->" など「複数文字の文字列のペア」を追加したい場合は、ページ末尾の「メモ」の項のサンプルコードを参考にカスタマイズしてください。
ソースコード
#title="カッコを追加/削除"
#tooltip="対になるカッコを追加/削除する"
#include "include/IO.js"
var start = new Date();
// Ctrl キーの状態を取得する
var WshShell = new ActiveXObject( 'WScript.Shell' );
var getKeyState = '"' + editor.FullName.replace( /mery\.exe$/i , 'Macros\\' )
+ 'GetKeyState.exe "'; // フルパスを " " で囲い、半角空白を追加
// GetKeyState.exe + 引数 control
var $ctrl = WshShell.Run( getKeyState + "control", 0, true );
/**
* ------------------------------------------------------------
* カッコを追加/削除 (2019/03/19 - 2019/03/23, sukemaru)
* ------------------------------------------------------------
* ※ このマクロの実行には、以下の外部ライブラリと実行ファイルが必要です。
*
* ・ks 氏作成の "includeライブラリ" を Macros フォルダに配置してください。
* https://www.haijin-boys.com/wiki/include%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA
*
* ・pizz 氏作成の "GetKeyState.exe" を Macros フォルダに配置してください。
* https://www.haijin-boys.com/wiki/GetKeySatate.exe%28%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%29
* ------------------------------------------------------------
*
*/
// ▼「対になるカッコ」の種類 (始)と(終) のペアを列挙する ▼
// ※ 開き/閉じカッコはそれぞれ「1文字」でないとダメ
var brackets = "()「」<>[]{}\"\"''()「」『』<>[]{}【】〖〗﹁﹂﹃﹄︵︶︿﹀︽︾︹︺︷︸︻︼︗︘⦅⦆⦅⦆〚〛〔〕〘〙〈〉《》””’’〝〞〝〟‘’“”――~~〜〜 ";
brackets += "++--**\/\/##==%%::::@@@@※※○○●●□□■■◇◇◆◆▽▽▼▼△△▲▲☆☆★★††||←→→←↑↓↓↑←←→→↑↑↓↓……¿?¡!‚‘‚’„“„”“„‘‚‹››‹«»»«——‐‐--␣␣__";
// ■ 選択範囲の『外側』(前と後ろ) の各1文字がカッコのときも除去する? ■
// (※ 選択範囲の前後を1文字ずつ拡張してカッコを除去する)
var removeOuterBracketsEnable = true; // true:する / false:しない
var d = document;
if ( d.ReadOnly ) {
Status = " ドキュメントは書き換え禁止です。";
Quit();
}
if ( $ctrl == -1 ) {
Status = " GetKeyState.exe エラー ";
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 $add = false; // 追加フラグ
var o, c;
var setting = {};
// JSON ファイルから「最後に使用したカッコ」を読み込む
setting = IO.Deserialize( setting );
// Ctrl キーが押されているときは、選択範囲を「最後に使用したカッコ」で囲う
if ( $ctrl == 1 ) {
AddBrackets( st );
}
// Ctrl キーが押されていないとき
else {
// 選択範囲の先頭と末尾から「対になるカッコ」を削除する
DeleteBrackets( st );
// 選択範囲内の先頭と末尾が「対になるカッコ」ではなかったとき
if ( removeOuterBracketsEnable && ! del ) {
// 選択範囲の外側(前と後ろ)にある「対になるカッコ」を削除する
RemoveOuterBrackets( st );
}
}
// 終了ステータス
var end = new Date();
if ( $add ) {
Status = " " + o.replace( /[ ]+/g , "␣" ) + " カッコ "
+ c.replace( /[ ]+/g , "␣" ) + " で囲いました。"
+ TimerElapsed( end, start );
}
else if ( $del ) {
Status = " " + o.replace( /[ ]+/g , "␣" ) + " と "
+ c.replace( /[ ]+/g , "␣" ) + " を削除しました。"
+ TimerElapsed( end, start );
}
else {
Status = " カッコがありません。"
+ TimerElapsed( end, start );
}
Quit();
// ------------------------------------------------------------
// 以下、各関数では基本的にグローバルスコープの変数を継承する
// ------------------------------------------------------------
/**
* 関数 TimerElapsed( end, start )
* start からの経過時間を [ s.sss 秒 ] で返す
*/
function TimerElapsed( end, start ) {
var elapsed = end - start;
return " [ "
+ ( ( elapsed / 1000 ) + "000" ).replace( /(\.)(\d{3})(0*)$/, "$1 $2" )
+ " sec. ]";
}
/**
* 関数 AddBrackets( st )
* 選択範囲をカッコで囲う
*/
function AddBrackets( st ) {
// 追加するカッコ =「最後に使用したカッコ」
o = setting.openBracket ? setting.openBracket : "(";
c = setting.closeBracket ? setting.closeBracket : ")";
s.Text = o + st + c; // 先頭と末尾にカッコを追加
s.SetAnchorPos( tp ); // 選択範囲を復帰する
$add = true;
}
/**
* 関数 DeleteBrackets( st )
* 選択範囲の先頭と末尾からカッコを削除する
*/
function DeleteBrackets( st ) {
// ループ処理で「対になるカッコ」と一致するかチェック
for ( var i = 0, len = brackets.length; i < len; i ++ ) {
if ( i % 2 == 1 ) {
continue;
}
o = brackets[ i ]; // 開きカッコ
c = brackets[ i + 1 ] // 閉じカッコ
// 選択範囲内の先頭と末尾が「対になるカッコ」のとき
if ( st.length >= o.length + c.length
&& st.slice( 0, o.length ) == o
&& st.slice( - c.length ) == c ) {
s.Text = st.slice( o.length, - c.length ); // 先頭/末尾のカッコを削除
s.SetAnchorPos( tp ); // 選択範囲を復帰する
$del = true;
if ( o != setting.openBracket || c != setting.closeBracket ) {
setting.openBracket = o;
setting.closeBracket = c;
IO.Serialize( setting ); // ヒットしたカッコを JSON ファイルに保存
}
break;
}
}
}
メモ
共通
- 注釈では「開きカッコ/閉じカッコの指定は 各1文字 ずつ」としてありますが、削除ループのコードは「任意の複数文字の文字列」を扱えるようにしてあります。
変数 blackets の最初の代入値を配列形式にすれば、 (始)と(終) のペアは「任意の複数文字の文字列」も追加できます。
- e.g. var brackets = [ "(" , ")" , "<!-- " , " -->" , "<" , " />" , "<" , ">" ];
※ZIP 書庫の JS ファイル内末尾には var brackets = [ "(" , ")" , "<" , ">" , "<!-- " , " -->" , "<" , " />" ]; と記述していますが間違いです。 < , > のように短いパターンのペアが先にマッチすると "<!-- " , " -->" はヒットしなくなります。
- e.g. var brackets = [ "(" , ")" , "<!-- " , " -->" , "<" , " />" , "<" , ">" ];
- カッコの定義文字列に "\n" を含めることを想定していません(問題ないはずですが動作検証していません)。
- (2019/03/19 sukemaru)
- 既存の var brackets = " …… "; 文字列部分を配列形式に変換してから、「任意の複数文字の文字列」のペアを追加することもできます。
- ソースコード内では正規表現による文字列の検索・置換処理をしていないので「 " 」以外の文字をエスケープ( \ での退避修飾)する必要はありません。
サンプルコード
- // brackets += " …… "; の行のしたに追加する
// brackets を配列形式に変換する
brackets = brackets.split( "" );
// ① 配列の末尾にカッコの種類を追加する ※(始) (終) の順
brackets[ brackets.length ] = "≪";
brackets[ brackets.length ] = "≫";
/**
* "<!-- " , " -->" や "<" , "/>" のように
* (始) & (終) が複数文字のペアで、(始)の先頭/(終)の末尾 の文字が
* 既存の「カッコの種類」に含まれている(この例では < > のペア)ものは、
* ・unshift() メソッドで配列の先頭に追加するか
* ・別の配列に列挙してから concat() メソッドで brackets と統合する
*/
// ② unshift() メソッドでカッコの種類を配列の先頭に追加する場合は
// brackets.unshift("終"); brackets.unshift("始"); の順にすること
brackets.unshift( " -->" );
brackets.unshift( "<!-- " );
// ③ 別の配列に (始),(終),(始),(終) の順に列挙して brackets と統合する
brackets2 = [ "<b>", "</b>", "<u>", "</u>", "</", ">", "<", "/>", "/*\n", "\n */", "/* ", " */", "/*", "*/" ];
brackets = brackets2.concat( brackets );
// 配列 brackets の中身をアウトプットバーに出力する
// OutputBar.Writeln(brackets.toString().replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/[ ]/g,"▯"));
// OutputBar.Writeln( ( brackets.length / 2 ) + " pairs\n" );
アウトプットの出力結果(半角空白は ▯ で表示)
- <b>,</b>,<i>,</i>,<u>,</u>,</,>,<,/>,<!--▯,▯-->,/**▯\n,\n▯*/,/**▯\n,\n*/,/**\n,\n▯*/,/**\n,\n*/,/*▯\n,\n▯*/,/*▯\n,\n*/,/*\n,\n▯*/,/*\n,\n*/,/**▯,▯*/,/*▯,▯*/,<!--,-->, (,),「,」,<,>,[,],{,},",",',',(,),「,」,『,』,<,>,[,],{,},【,】,〖,〗,﹁,﹂,﹃,﹄,︵,︶,︿,﹀,︽,︾,︹,︺,︷,︸,︻,︼,︗,︘,⦅,⦆,⦅,⦆,〚,〛,〔,〕,〘,〙,〈,〉,《,》,”,”,’,’,〝,〞,〝,〟,‘,’,“,”,―,―,~,~,〜,〜,▯,▯,+,+,-,-,*,*,/,/,#,#,=,=,%,%,:,:,:,:,@,@,@,@,※,※,○,○,●,●,□,□,■,■,◇,◇,◆,◆,▽,▽,▼,▼,△,△,▲,▲,☆,☆,★,★,†,†,|,|,←,→,→,←,↑,↓,↓,↑,←,←,→,→,↑,↑,↓,↓,…,…,¿,?,¡,!,‚,‘,‚,’,„,“,„,”,“,„,‘,‚,‹,›,›,‹,«,»,»,«,—,—,‐,‐,-,-,␣,␣,_,_,≪,≫
- 111 pairs
これで「カッコをはずす」や「カッコを追加」の操作で <!-- と --> や /* と */ などのペアも扱えるようになります。
※正規表現には対応していないので、必要に応じて半角空白つき差分なども追加してください。
スポンサーリンク