「拡張自動選択」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
ページを新規作成
 
Sukemaru (トーク | 投稿記録)
修正
11行目: 11行目:
: 3. 「'''全角空白を含む空白文字列'''」の自動選択
: 3. 「'''全角空白を含む空白文字列'''」の自動選択
:: 通常のダブルクリックでも「タブと半角空白が混在した空白文字列」の部分を自動選択できますが、このマクロでは全角空白を含めて自動選択できます。
:: 通常のダブルクリックでも「タブと半角空白が混在した空白文字列」の部分を自動選択できますが、このマクロでは全角空白を含めて自動選択できます。
: 4. 「'''日付け'''」の自動選択
: 4. 「'''日付'''」の自動選択
:: キャレットの右側が「日付」の数字部分なら、<code>2001年1月1日</code>、<code>2002-2-2</code>、<code>2003/3/3</code>、<code>2020.05.31</code> のような「日付」の文字列全体を自動選択します。
:: キャレットの右側が「日付」の数字部分なら、<code>2001年1月1日</code>、<code>2002-2-2</code>、<code>2003/3/3</code>、<code>2020.05.31</code> のような「日付」の文字列全体を自動選択します。
: 5. 「'''行全体を選択'''」 (改行を含めない)
: 5. 「'''行全体を選択'''」 (改行を含めない)
22行目: 22行目:
;【注意】
;【注意】
*「同一記号の繰り返し」の自動選択機能は、たまに "ダブルクリックで同じ記号2文字選択できちゃった" が発生するのと同じレベルの頻度で失敗することがあります。
*「同一記号の繰り返し」の自動選択機能は、たまに "ダブルクリックで同じ記号2文字選択できちゃった" が発生するのと同じレベルの頻度で失敗することがあります。
* 「日付け」の自動選択は、<code>2020年01.01</code> や <code>1900/1.5</code> のような文字列にも誤爆して範囲選択します (このマクロをあえてそういう文字列上で実行する必要性がないので修正しません)。
* 「日付」の自動選択は、<code>2020年01.01</code> や <code>1900/1.5</code> のような区切り文字の形式が不揃いな「日付っぽい文字列」にも誤爆して範囲選択します (もともと、このマクロをあえてそういう文字列上で実行する必要性がないので修正しません)。
* <span style="color:#c00;">URL 文字列上(Mery の標準機能で下線のついた URL 部分)で実行した場合は、URL が範囲選択されたり、URL を勝手にブラウザで開いたりします。</span>  
* <span style="color:#c00;">URL 文字列上(Mery の標準機能で下線のついた URL 部分)で実行した場合は、URL が範囲選択されたり、URL を勝手にブラウザで開いたりします。</span>  
<br>
<br>
32行目: 32行目:
<br>
<br>
; 「日付」の判定基準
; 「日付」の判定基準
:* 「年」は、 <code>19</code> <code>20</code> ではじまる半角数字4ケタ
:* 「年」は、 <code>1900</code> - <code>2099</code> の範囲内の4ケタの半角数字
:* 「月」は、 <code>1</code> - <code>12</code> または <code>01</code> - <code>09</code> の範囲内の半角数字
:* 「月」は、 <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>1</code> - <code>31</code> または <code>01</code> - <code>09</code> の範囲内の半角数字 ("小の月" を考慮しない)
:* 年月日の数字の区切りは、<code>-</code> <code>.</code> <code>/</code> のいずれかの記号×2、または <code>年</code> <code>月</code> <code>日</code>
:* 年月日の数字の区切りは、<code>-</code> <code>.</code> <code>/</code> のいずれかの記号×2回、または <code>年</code> <code>月</code> <code>日</code>
<br>
<br>
:※「2001-02-31」のような実在しない日付でも「今日の日付」に変換されます。
: ※ 区切り文字の判定基準を拡張自動選択機能での判定基準よりも少しだけきつくしてありますので、<code>2020年01.01</code> や <code>1900/1.5</code> のように区切り文字の形式が混在した文字列からは変換しません。
:※「2020年01.01」や「1900/1.5」のような区切り文字が混在した文字列は変換されません。
:※ 和暦の年号や全角数字で記述された日付、<code>20200601</code> のような区切り文字のない半角8ケタの数値は対象外です。
:※ 和暦の年号や全角数字、<code>20200601</code> のような区切り文字のない半角8ケタの数値は対象外です。
:※ <code>2001-02-31</code> のような実在しない日付でも「今日の日付」に変換されます。
<br>
<br>
; 変換後の「日付」の形式
; 変換後の「日付」の形式
132行目: 132行目:
  */
  */
function DateOfToday( str, selectLine ) {
function DateOfToday( str, selectLine ) {
   var reg1 = /^(?:19|20)\d{2}([-.\/])(?:0?[1-9]|11|12)(\1)(?:0?[1-9]|[12][0-9]|3[01])(\b)$/;
   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]|11|12)(月)(?:0?[1-9]|[12][0-9]|3[01])(日)$/;
   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 ) ) {
   if ( str.match( reg1 ) || str.match( reg2 ) ) {
     var sep1 = RegExp["$1"], sep2 = RegExp["$2"], sep3 = RegExp["$3"];
     var sep1 = RegExp["$1"], sep2 = RegExp["$2"], sep3 = RegExp["$3"];
246行目: 246行目:


== メモ ==
== メモ ==
* 2020/05/31
* 2020/05/31
: このマクロは、「[[TAB/半角空白 トグル変換]]」マクロとおなじく「[[TrueとFalse を切り替える|Yes/No マクロ]]」への自家用追加コードとしてつくったものを単独マクロとして切出したものです。 現在自分が使用している「同一記号の繰り返し部分の自動選択」と「日付の自動選択」⇒「今日の日付に変換」機能以外は、公開・配布用のソースコードでも初期値を「無効」に設定してあります。
: このマクロは、「[[TAB/半角空白 トグル変換]]」マクロとおなじく「[[TrueとFalse を切り替える|Yes/No マクロ]]」への自家用追加コードとしてつくったものを単独マクロとして切出したものです。 現在自分が使用している「同一記号の繰り返し部分の自動選択」と「日付の自動選択」⇒「今日の日付に変換」機能以外は、公開・配布用のソースコードでも初期値を「無効」に設定してあります。
: ZIP には既製の「マテリアルデザインっぽいアイコン」からちょっといじって詰めておきましたが、いい感じではなくて申しわけないです。
: ZIP には既製の「マテリアルデザインっぽいアイコン」からちょっといじって詰めておきましたが、いい感じではなくて申しわけないです。
* 2020/05/31 ➁
: 正規表現をミスっていたので修正。

2020年5月31日 (日) 17:41時点における版

通常の「カーソル位置の単語の選択 (ダブルクリック)」を拡張したかんじの自動選択機能を提供します。

※ ダブルクリックにマクロを割りあてることはできません

ちょっと便利な自動選択拡張機能

「選択範囲がない」状態からこのマクロを実行すると「拡張自動選択」モードになります。

1. 「キャレット位置の単語」の自動選択 (通常のダブルクリックと同等)

2. 「同一記号の繰り返し部分」の自動選択
半角記号 #####、全角記号 ※※※※※、全角空白       など、おなじ記号が連続する部分を範囲選択します。
3. 「全角空白を含む空白文字列」の自動選択
通常のダブルクリックでも「タブと半角空白が混在した空白文字列」の部分を自動選択できますが、このマクロでは全角空白を含めて自動選択できます。
4. 「日付」の自動選択
キャレットの右側が「日付」の数字部分なら、2001年1月1日2002-2-22003/3/32020.05.31 のような「日付」の文字列全体を自動選択します。
5. 「行全体を選択」 (改行を含めない)
2. - 4. に該当しなかったときに「行全体」を自動選択します(設定項目で表示行か論理行かを指定)。 行番号のクリックとはことなり、末尾改行を選択範囲に含めません。
⇒ 範囲選択したらマクロ終了


35 の機能は。ソースコード内の設定項目の値を変更すると利用できます(初期値:無効)。


【注意】
  • 「同一記号の繰り返し」の自動選択機能は、たまに "ダブルクリックで同じ記号2文字選択できちゃった" が発生するのと同じレベルの頻度で失敗することがあります。
  • 「日付」の自動選択は、2020年01.011900/1.5 のような区切り文字の形式が不揃いな「日付っぽい文字列」にも誤爆して範囲選択します (もともと、このマクロをあえてそういう文字列上で実行する必要性がないので修正しません)。
  • URL 文字列上(Mery の標準機能で下線のついた URL 部分)で実行した場合は、URL が範囲選択されたり、URL を勝手にブラウザで開いたりします。


今日の日付

「日付」の文字列を範囲選択した状態からこのマクロを実行すると「今日の日付」モードになります。

2001年1月1日2002-2-22003/3/32020.05.31 のような「日付」の文字列を「今日の日付」に変換しますので、このマクロを 連続実行 することで 「日付を自動選択」 ⇒ 「今日の日付に変換」 ができます。


「日付」の判定基準
  • 「年」は、 1900 - 2099 の範囲内の4ケタの半角数字
  • 「月」は、 1 - 12 または 01 - 09 の範囲内の半角数字
  • 「日」は、 1 - 31 または 01 - 09 の範囲内の半角数字 ("小の月" を考慮しない)
  • 年月日の数字の区切りは、- . / のいずれかの記号×2回、または


※ 区切り文字の判定基準を拡張自動選択機能での判定基準よりも少しだけきつくしてありますので、2020年01.011900/1.5 のように区切り文字の形式が混在した文字列からは変換しません。
※ 和暦の年号や全角数字で記述された日付、20200601 のような区切り文字のない半角8ケタの数値は対象外です。
2001-02-31 のような実在しない日付でも「今日の日付」に変換されます。


変換後の「日付」の形式
「区切り文字」の部分は変換前とおなじままになりますが、月と日の数字部分はつねに 2020/06/01 のようにゼロ埋めした2ケタに変換されます。


1行コメントアウト/アンコメント

末尾改行を含めずに「論理行全体」(1行) を範囲選択した状態からこのマクロを実行すると「1行コメントアウト/アンコメント」モードを利用できます(ソースコード内の設定項目の初期値:無効)。

行頭に > のようなコメントマークを付けたりはずしたりできますので、このマクロを 連続実行 することで 「論理行全体を自動選択」 ⇒ 「1行コメントアウト/アンコメント」 ができます。


※ 「1行コメントアウト」は、範囲選択なしの空行でも実行できます(コメントマーク挿入)。
※「コメントマーク付け外し」マクロなどから「編集モードによるコメントマークの定義切替」のコードを移植することもできます。


ソースコード


ダウンロード >> 「ファイル:ちょっと便利な拡張自動選択.zip」(アイコン入り)


#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;
}


メモ

  • 2020/05/31 ➀
このマクロは、「TAB/半角空白 トグル変換」マクロとおなじく「Yes/No マクロ」への自家用追加コードとしてつくったものを単独マクロとして切出したものです。 現在自分が使用している「同一記号の繰り返し部分の自動選択」と「日付の自動選択」⇒「今日の日付に変換」機能以外は、公開・配布用のソースコードでも初期値を「無効」に設定してあります。
ZIP には既製の「マテリアルデザインっぽいアイコン」からちょっといじって詰めておきましたが、いい感じではなくて申しわけないです。
  • 2020/05/31 ➁
正規表現をミスっていたので修正。
スポンサーリンク