「
拡張自動選択
」を編集中
2020年5月31日 (日) 17:41時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(修正)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
通常の「カーソル位置の単語の選択 (ダブルクリック)」を拡張したかんじの自動選択機能を提供します。<br> : <span class="warningbox">※ ダブルクリックにマクロを割りあてることはできません</span> == ちょっと便利な自動選択拡張機能 == <u>「選択範囲がない」状態からこのマクロを実行</u>すると「拡張自動選択」モードになります。 <br><br> : 1. 「'''キャレット位置の単語'''」の自動選択 (通常のダブルクリックと同等) :<br> : 2. 「'''同一記号の繰り返し部分'''」の自動選択 :: 半角記号 <code>#####</code>、全角記号 <code>※※※※※</code>、全角空白 <code> </code> など、おなじ記号が連続する部分を範囲選択します。 : 3. 「'''全角空白を含む空白文字列'''」の自動選択 :: 通常のダブルクリックでも「タブと半角空白が混在した空白文字列」の部分を自動選択できますが、このマクロでは全角空白を含めて自動選択できます。 : 4. 「'''日付'''」の自動選択 :: キャレットの右側が「日付」の数字部分なら、<code>2001年1月1日</code>、<code>2002-2-2</code>、<code>2003/3/3</code>、<code>2020.05.31</code> のような「日付」の文字列全体を自動選択します。 : 5. 「'''行全体を選択'''」 (改行を含めない) :: 2. - 4. に該当しなかったときに「行全体」を自動選択します(設定項目で表示行か論理行かを指定)。 行番号のクリックとはことなり、末尾改行を選択範囲に含めません。 : ⇒ 範囲選択したらマクロ終了 <br> : ※ '''3''' と '''5''' の機能は。ソースコード内の設定項目の値を変更すると利用できます(初期値:無効)。 <br> ;【注意】 *「同一記号の繰り返し」の自動選択機能は、たまに "ダブルクリックで同じ記号2文字選択できちゃった" が発生するのと同じレベルの頻度で失敗することがあります。 * 「日付」の自動選択は、<code>2020年01.01</code> や <code>1900/1.5</code> のような区切り文字の形式が不揃いな「日付っぽい文字列」にも誤爆して範囲選択します (もともと、このマクロをあえてそういう文字列上で実行する必要性がないので修正しません)。 * <span style="color:#c00;">URL 文字列上(Mery の標準機能で下線のついた URL 部分)で実行した場合は、URL が範囲選択されたり、URL を勝手にブラウザで開いたりします。</span> <br> == 今日の日付 == <u>「日付」の文字列を範囲選択した状態からこのマクロを実行</u>すると「今日の日付」モードになります。 <br><br> : <code>2001年1月1日</code>、<code>2002-2-2</code>、<code>2003/3/3</code>、<code>2020.05.31</code> のような「日付」の文字列を「今日の日付」に変換しますので、このマクロを '''連続実行''' することで 「日付を自動選択」 ⇒ 「今日の日付に変換」 ができます。 <br> ; 「日付」の判定基準 :* 「年」は、 <code>1900</code> - <code>2099</code> の範囲内の4ケタの半角数字 :* 「月」は、 <code>1</code> - <code>12</code> または <code>01</code> - <code>09</code> の範囲内の半角数字 :* 「日」は、 <code>1</code> - <code>31</code> または <code>01</code> - <code>09</code> の範囲内の半角数字 ("小の月" を考慮しない) :* 年月日の数字の区切りは、<code>-</code> <code>.</code> <code>/</code> のいずれかの記号×2回、または <code>年</code> <code>月</code> <code>日</code> <br> : ※ 区切り文字の判定基準を拡張自動選択機能での判定基準よりも少しだけきつくしてありますので、<code>2020年01.01</code> や <code>1900/1.5</code> のように区切り文字の形式が混在した文字列からは変換しません。 :※ 和暦の年号や全角数字で記述された日付、<code>20200601</code> のような区切り文字のない半角8ケタの数値は対象外です。 :※ <code>2001-02-31</code> のような実在しない日付でも「今日の日付」に変換されます。 <br> ; 変換後の「日付」の形式 : <span style="color:#c00;">「区切り文字」の部分は変換前とおなじままになりますが、月と日の数字部分はつねに <code>2020/06/01</code> のようにゼロ埋めした2ケタに変換されます。</span> == 1行コメントアウト/アンコメント == <u>末尾改行を含めずに「論理行全体」(1行) を範囲選択した状態からこのマクロを実行</u>すると「1行コメントアウト/アンコメント」モードを利用できます(ソースコード内の設定項目の初期値:無効)。 <br><br> :行頭に <q><code>> </code></q> のようなコメントマークを付けたりはずしたりできますので、このマクロを '''連続実行''' することで 「論理行全体を自動選択」 ⇒ 「1行コメントアウト/アンコメント」 ができます。 <br> : ※ 「1行コメントアウト」は、範囲選択なしの空行でも実行できます(コメントマーク挿入)。 : ※「[[コメントマーク付け外し]]」マクロなどから「編集モードによるコメントマークの定義切替」のコードを移植することもできます。 == ソースコード == <br> ; ダウンロード >> 「[[ファイル:ちょっと便利な拡張自動選択.zip]]」(アイコン入り) <br> <source lang="javascript" style="height:60em; overflow:auto;"> #title = "拡張自動選択" #tooltip = "ちょっと便利な自動選択拡張機能 + α" // #icon = "select_ex.ico" /** * --------------------------------------------------------- * 「拡張自動選択」マクロ * sukemaru, 2020/05/31 * --------------------------------------------------------- * 通常の「カーソル位置の単語の選択」を拡張した自動選択機能 */ // ---------- ▼ 設定項目 ▼ ---------- // // ■ 「空白文字列の自動選択」に「全角空白」を含める var fullWSpc = false; // true 含める / false 含めない (タブと半角空白のみ) // ■ 説明欄の 1 - 4 に該当しなかったときには「行全体を選択」する var selectLine = 0; // 0 しない / 1 表示行を選択 / 2 論理行を選択 // ■ 選択範囲が論理行全体のとき「1行コメントアウト/アンコメント」する var commentOut = false; // true する / false しない var commentMark = "> "; // コメントマーク // ---------- ▲ 設定項目 ▲ ---------- // var d = editor.ActiveDocument, s = d.selection; var st = s.Text; var $end = false; if ( d.ReadOnly ) { Status = " ドキュメントは書き換え禁止です。"; } // 選択範囲の文字列が日付なら「今日の日付」に変換して終了 else if ( st ) { var today = DateOfToday( st ); if ( s.Text !== today ) { s.Text = today; $end = true; } } // 「キャレット位置の単語」の自動選択 または // 「同一記号の繰り返し」/「全角空白を含む空白文字列」/「日付」の自動選択 if ( ! $end && ! st ) { $end = SelectWordEx( fullWSpc, selectLine ); } // 「1行コメントアウト/アンコメント」 if ( ! $end && commentOut && commentMark && s.Text === d.GetLine( s.GetActivePointY( mePosLogical ), 0 ) ) { $end = CommentOut( s.Text, commentMark ); } /** * 関数 DateOfToday( str ) * 選択範囲の文字列が日付なら今日の日付に変換する * * 引数の条件(日付の判定基準) * ・「年」は 19 か 20 ではじまる4ケタの半角数字 * ・「月」は 1 - 12 または 01 - 09 の範囲内の半角数字 * ・「日」は 1 - 31 または 01 - 09 の範囲内の半角数字(小の月を考慮しない) * ・年月日の数字の区切りは * 「-」「.」「/」のいずれか(同一の記号2回の場合のみ) * または「年月日」 * (SelectWordEx で誤爆した「2020年01.01」や「1900/1.5」のような文字列は変換しない) * ・和暦の年号や全角数字、区切り文字のない半角8ケタの数値は不可 * * 戻り値の「月日」の数字はつねにゼロ埋め */ function DateOfToday( str, selectLine ) { var reg1 = /^(?:19|20)\d{2}([-.\/])(?:0?[1-9]|1[0-2])(\1)(?:0?[1-9]|[12][0-9]|3[01])(\b)$/; var reg2 = /^(?:19|20)\d{2}(年)(?:0?[1-9]|1[0-2])(月)(?:0?[1-9]|[12][0-9]|3[01])(日)$/; if ( str.match( reg1 ) || str.match( reg2 ) ) { var sep1 = RegExp["$1"], sep2 = RegExp["$2"], sep3 = RegExp["$3"]; var Pad = function( tmp ) { return tmp < 10 ? "0" + tmp : tmp; } var dt = new Date(); var yyyy = dt.getFullYear() + sep1; var mm = Pad( dt.getMonth() + 1 ) + sep2; var dd = Pad( dt.getDate() ) + sep3; str = yyyy + mm + dd; } return str; } /** * 関数 SelectWordEx( fullWSpc, selectLine ) * ※ 引数: 「全角空白を含む空白文字列」の自動選択の許可フラグ * 拡張自動選択 * 1.「キャレット位置の単語」の自動選択(通常のダブルクリックと同等) * 2.「同一記号の繰り返し」の自動選択 ##### ※※※※※ * 3.「全角空白を含む空白文字列」の自動選択 * 4.「日付け」の自動選択 * 2001年1月1日 2002-2-2 2003/3/3 2020.05.31 * ※ 「日付け」の自動選択は、キャレットの右側が数字のときのみ * ※「2020年01.01」や「1900/1.5」のような文字列に誤爆する */ function SelectWordEx( fullWSpc, selectLine ) { var d = editor.ActiveDocument, s = d.selection; s.SelectWord(); // キャレットは選択範囲の末尾 var str = s.Text; if ( ! str ) { return false; } var ax = s.GetActivePointX( mePosLogical ); var ay = s.GetActivePointY( mePosLogical ); var line = d.GetLine( ay, 0 ); var str1 = line.slice( 0, ax - 1 ); // キャレットより前の文字列 var str2 = line.slice( ax - 1 ); // キャレットより後ろの文字列 // ※ 同一記号の繰り返し文字列の自動選択 if ( str.length === 1 ) { var sig1 = String( str1.match( new RegExp( "\\" + str + "+$", "" ) ) || "" ); var sig2 = String( str2.match( new RegExp( "^\\" + str + "+", "" ) ) || "" ); if ( sig1 || sig2 ) { s.SetAnchorPoint( mePosLogical, ax - sig1.length, ay ); s.SetActivePoint( mePosLogical, ax + sig2.length, ay, true ); } if ( s.Text !== str ) { return true; } } // ※ 全角空白をふくむ空白文字列全体を自動選択 if ( fullWSpc && /^[\t ]+$/.test( str ) ) { var sig1 = String( str1.match( /[\t ]+$/ ) || "" ); var sig2 = String( str2.match( /^[\t ]+/ ) || "" ); if ( sig1 || sig2 ) { s.SetAnchorPoint( mePosLogical, ax - sig1.length, ay ); s.SetActivePoint( mePosLogical, ax + sig2.length, ay, true ); } if ( s.Text !== str ) { return true; } } // ※ 日付の自動選択 // /^\d{4}([-.\/年])(?:0?[1-9]|1[0-2])([-.\/月])(?:0?[1-9]|[12][0-9]|3[01])(日?)$/; if ( /^(?:19|20)\d{2}$/.test( str ) && ( mmdd = str2.match( /^[-.\/年](?:0?[1-9]|1[0-2])[-.\/月](?:0?[1-9]|[12][0-9]|3[01])日?(?=$|\D)/ ) ) ) { s.SetActivePoint( mePosLogical, ax + String( mmdd ).length, ay, true ); return true; } if ( /^(?:0?[1-9]|1[0-2])$/.test( str ) && ( yy = str1.slice( 0, - str.length ).match( /\b(?:19|20)\d{2}[-.\/年]$/ ) ) && ( dd = str2.match( /^[-.\/月](?:0?[1-9]|[12][0-9]|3[01])日?(?=$|\D)/ ) ) ) { s.SetAnchorPoint( mePosLogical, ax - ( yy + str ).length, ay ); s.SetActivePoint( mePosLogical, ax + String( dd ).length, ay, true ); return true; } if ( /^(?:0?[1-9]|[12][0-9]|3[01])$/.test( str ) && ( yymm = str1.slice( 0, - str.length ).match( /\b(?:19|20)\d{2}[-.\/年](?:0?[1-9]|1[0-2])[-.\/月]$/ ) ) && ( dd = str2.match( /^日?(?=$|\D)/ ) ) ) { s.SetAnchorPoint( mePosLogical, ax - ( yymm + str ).length, ay ); s.SetActivePoint( mePosLogical, ax + String( dd ).length, ay, true ); return true; } if ( selectLine ) { s.StartOfLine( false, selectLine ); s.EndOfLine( true, selectLine ); if ( s.Text ) { return true; } } return false; } /** * 関数 CommentOut( str, commentMark ) * 1行コメントアウト/アンコメント */ function CommentOut( line, commentMark ) { var s = editor.ActiveDocument.selection; var comBlank = commentMark.match( /\s+$/ ) || ""; var comEscaped = commentMark.replace( /\s+$/g, "" ).replace( /\W/g, "\\$&" ); var regUnComment = new RegExp( "^(\\s*)(" + comEscaped + ( comBlank ? comBlank : "" ) + ")" , "" ); if ( regUnComment.test( line ) ) { s.Text = line.replace( regUnComment, "$1" ); } else { s.Text = line.replace( /^(\s*)(\S*)/, "$1" + commentMark + "$2" ); } s.StartOfLine( true, mePosLogical ); return true; } </source> <br> == メモ == * 2020/05/31 ➀ : このマクロは、「[[TAB/半角空白 トグル変換]]」マクロとおなじく「[[TrueとFalse を切り替える|Yes/No マクロ]]」への自家用追加コードとしてつくったものを単独マクロとして切出したものです。 現在自分が使用している「同一記号の繰り返し部分の自動選択」と「日付の自動選択」⇒「今日の日付に変換」機能以外は、公開・配布用のソースコードでも初期値を「無効」に設定してあります。 : ZIP には既製の「マテリアルデザインっぽいアイコン」からちょっといじって詰めておきましたが、いい感じではなくて申しわけないです。 * 2020/05/31 ➁ : 正規表現をミスっていたので修正。
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク