「パスを貼り付け(ポップアップメニュー)」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
ページを新規作成(初版)
 
MSY-07 (トーク | 投稿記録)
空行と改行の除去
 
(2人の利用者による、間の4版が非表示)
1行目: 1行目:
<!-- 「パスを貼り付け(ポップアップメニュー)」マクロ 2020/12/30 -->
<!-- 「パスを貼り付け(ポップアップメニュー)」マクロ 2020/12/30 -->
__toc__ <br clear=all>
__toc__
[[ファイル:パスを貼り付け(ポップアップメニュー).png|link=]] <br clear=all>
[[ファイル:パスを貼り付け(ポップアップメニュー).png|link=]]
 


== 概要 ==
== 概要 ==
 
Mery Ver 3.2.2α 以降(の隠し機能)で、エクスプローラ上で「コピー」したフォルダ・ファイルのパスを、ポップアップメニューから選択した形式に整形してペーストします。<br>
Mery ver 3.2.2α 以降(の隠し機能)で、エクスプローラ上で「コピー」したフォルダ・ファイルのパスを、ポップアップメニューから選択した形式に整形してペーストします。
 → ''ref.''  Mery 公式フォーラムのトピック [https://www.haijin-boys.com/discussions/5835#discussion-5868 「【要望】ファイルパスの貼付け機能」]
: → ref.  Mery 公式フォーラムのトピック [https://www.haijin-boys.com/discussions/5835#discussion-5868 「【要望】ファイルパスの貼付け機能」]
 


クリップボードのデータが <br>
クリップボードのデータが <br>
・「エクスプローラ上でコピーしたフォルダ・ファイル(リスト形式)」でない場合 <br>
*「エクスプローラ上でコピーしたフォルダ・ファイル(リスト形式)」でない場合 <br>
・「フォルダ・ファイルの'''フルパス'''のリスト(テキスト形式)」でない場合 <br>
*「フォルダ・ファイルの'''フルパス'''のリスト(テキスト形式)」でない場合 <br>
Mery 本体のバージョンが動作要件を満たさない場合 <br>
* Mery 本体のバージョンが動作要件を満たさない場合 <br>
は、ポップアップメニューを表示せずに通常の「貼り付け(Ctrl+V)」をおこないます (設定項目<code>forcePaste</code>: 初期値=<source lang="javascript" inline>true</source>)。
は、ポップアップメニューを表示せずに通常の「貼り付け (Ctrl+V)」をおこないます (設定項目<code>forcePaste</code>: 初期値=<syntaxhighlight lang="javascript" inline>true</syntaxhighlight>)。
 


※ <span style="color:#0000c0;">動作要件:(Windows OS 上の) Mery ver 3.2.2α 以降</span> <br>
※ <span style="color:#0000c0;">動作要件:(Windows OS 上の) Mery Ver 3.2.2α 以降</span> <br>
※ テキスト形式の「フルパスのリスト」では、コピー元のデータの末尾に改行が必要。 <br>
※ テキスト形式の「フルパスのリスト」では、コピー元のデータの末尾に改行が必要。 <br>
※ 環境変数などで省略されたパスを含むリストや、フルパス以外の文字列を含むリストには非対応 (フルパスの判定方は、各行が「:\」をひとつずつ含んでいるかどうかのチェックだけですが)。 <br>
※ 環境変数などで省略されたパスを含むリストや、フルパス以外の文字列を含むリストには非対応 (フルパスの判定方法は、"各行が「:\」をひとつずつ含んでいるかどうか" をチェックするだけの簡易的なものですが)。
 


=== 変換パターン ===
=== 変換パターン ===
* 二重引用符つきで "貼り付け"
* '''二重引用符つき'''で "貼り付け"
* <code>¥</code>(U+005C バックスラッシュ)を二重'''<code>¥¥</code>'''にして貼り付け
* <code>¥</code>(バックスラッシュ U+005C)を二重'''<code>¥¥</code>'''にして貼り付け
* <code>¥</code>(U+005C バックスラッシュ)を二重'''<code>¥¥</code>'''にして '''二重引用符つき''' で "貼り付け"
* <code>¥</code>(バックスラッシュ U+005C)を二重'''<code>¥¥</code>'''にして '''二重引用符つき''' で "貼り付け"
* '''フォルダ名・ファイル名''' の部分のみにして貼り付け
* '''フォルダ名・ファイル名''' の部分のみにして貼り付け
* '''フォルダ名・ファイル名''' の部分のみを '''二重引用符つき''' で "貼り付け"
* '''フォルダ名・ファイル名''' の部分のみを '''二重引用符つき''' で "貼り付け"


: ※「<code>¥</code>を二重'''<code>¥¥</code>'''にして [二重引用符つきで] 貼り付け」の変換パターンと下記のソートパターンを組み合わせた選択項目はありません。 <br>必要なら、'''ソートつきで貼り付けたあとに Undo (Ctrl+Z) してから'''、このマクロを再実行して「<code>¥</code>を二重'''<code>¥¥</code>'''にして [二重引用符つきで] 貼り付け」しなおしてください。
<code>¥</code>を二重'''<code>¥¥</code>'''にして [二重引用符つきで] 貼り付け」の変換パターンと下記のソートパターンを組み合わせた選択項目はありません。 <br>
 
: → 必要なら、'''ソートつきで貼り付けたあとに Undo (Ctrl+Z) してから'''、このマクロを再実行して「<code>¥</code>を二重'''<code>¥¥</code>'''にして [二重引用符つきで] 貼り付け」しなおしてください (設定項目<syntaxhighlight lang="javascript" inline>sendToClipboard = true</syntaxhighlight>の場合のみ)。


=== ソート(並べ替え)パターン ===
=== ソート(並べ替え)パターン ===
39行目: 34行目:
* 拡張子順*
* 拡張子順*
: フォルダを先頭にまとめて、拡張子順 > 文字列順
: フォルダを先頭にまとめて、拡張子順 > 文字列順
<br>
 
いずれのソートパターンでも、フォルダ・ファイルパス内の「連続する半角数字の部分」は「数値順 (十進数)」で評価します。
<span style="color:#0000c0;">いずれのソートパターンでも、フォルダ・ファイルパス内の「連続する半角数字の部分」は「数値順 (十進数)」で評価します。</span>
:: i.e.  1 < 002 < 03 < 5 < 40
:: ''i.e.''  1 < 002 < 03 < 5 < 40
<br>
: ※ "0" から始まる「16進数」や「数字の羅列」などを含むパスでは、望ましくない並び順になる場合があります。
: ※ "0" から始まる「16進数」や「数字の羅列」などを含むパスでは、望ましくない並び順になる場合があります。
:: i.e.  1a1a < 02a0 < 0010
:: ''i.e.''  1a1a < 02a0 < 0010
: → 完全な文字列順にしたい場合は、貼り付けた後で「[[昇順で並び替え]]」「[[昇順で並び替え/降順で並び替え|昇順で並び替え/降順で並び替え トグル変換]]」「[[行並べ替え]]」などのマクロなどで並べなおしてください。
 
<br>
<span style="color:#0000c0;">アルファベットの 大文字/小文字 や、日本語の ひらがな/カタカナ などは区別せずに、「'''辞書順''' (OS のロケールに依存)」で評価します。</span>
: ※ アルファベットの大文字/小文字は区別せずに「辞書順 (OS のロケールに依存)」で評価します。
: ※「拡張子順*」では、拡張子の部分の数字のみ「文字列順」で評価します。
: ※ ひらがな/カタカナ などは区別して「unicode (UTF-16) 昇順」で評価します。
<!-- : ※ その他は「unicode (UTF-16) 昇順」で評価します。 -->
: ※「拡張子順*」では、拡張子の部分の数字を「文字列順」で評価します。
 
<br>
: → <span style="color:#c00;">'''完全な文字列順''' に整形したい場合は</span>、貼り付けた後で「[[昇順で並び替え]]」「[[昇順で並び替え/降順で並び替え|昇順で並び替え/降順で並び替え トグル変換]]」「[[行並べ替え]]」などのマクロなどで並べなおしてください。
 
「ファイル名順*」と「拡張子順*」のソートでは、フォルダパスを先頭に集めます。
「ファイル名順*」と「拡張子順*」のソートでは、フォルダパスを先頭に集めます。
: ※ フォルダの実在確認により判定するので、実在確認できなかったものは「拡張子なしのファイル」と見做します。
: ※ フォルダの実在確認により判定するので、実在確認できなかったものは「拡張子なしのファイル」と見做します。
: ※「ファイル名順*」と「文字列順 (数値順)」との違いは、フォルダパスを先頭に集めるかどうかの違いだけです。
: ※「ファイル名順*」と「文字列順 (数値順)」との違いは、フォルダパスを先頭に集めるかどうかの違いだけです。


=== クリップボードデータの上書き ===
=== クリップボードデータの上書き ===
設定項目 <code>sendToClipboard</code>(初期値=<source lang="javascript" inline>false</source>) <br>
設定項目 <code>sendToClipboard</code>(初期値=<syntaxhighlight lang="javascript" inline>false</syntaxhighlight>) <br>
<source lang="javascript" inline>true</source>にすると、整形して貼り付けたデータ(テキスト形式)をクリップボードに送信します。
<syntaxhighlight lang="javascript" inline>true</syntaxhighlight>にすると、整形して貼り付けたデータ(テキスト形式)をクリップボードに送信します。
: → Ctrl+V で整形済みのデータを再貼り付けできるようになります (Mery の「クリップボード履歴」からも再貼り付けできるようになります)。
: → Ctrl+V で整形済みのデータを再貼り付けできるようになります (Mery の「クリップボード履歴」からも再貼り付けできるようになります)。
<br>
: ※ 整形なしの「貼り付け」では、Mery の「クリップボード履歴」に残しません。
: ※ 整形なしの「貼り付け」では、Mery の「クリップボード履歴」に残しません。
: ※ このマクロを再実行して別の形式を選択して貼り付けする場合、前回の整形済みデータから '''"'''二重引用符'''"''' と「ふたつ重ねにした<code>¥</code>記号」を消した状態から、あらためて整形しなおします (整形なしの「貼り付け」では前回と同じ形式で貼り付け)。
: ※ このマクロを再実行して別の形式を選択して貼り付けする場合、前回の整形済みデータから '''"'''二重引用符'''"''' と「ふたつ重ねにした<code>¥</code>記号」を消した状態から、あらためて整形しなおします (整形なしの「貼り付け」では前回と同じ形式で貼り付け)。
: ※ 間違えて「フォルダ/ファイル名のみ ~」で貼り付けしてしまった場合、Undo してもクリップボードに送信したデータ形式を復旧できないので再度エクスプローラ上でフォルダ・ファイルを「コピー」し直さなければなりません (フルパス形式でなくなるため、マクロを再実行してもメニューを再表示できない)。
: ※ 間違えて「フォルダ/ファイル名のみ ~」で貼り付けしてしまった場合、Undo してもクリップボードに送信したデータ形式を復旧できないので再度エクスプローラ上でフォルダ・ファイルを「コピー」し直さなければなりません (フルパス形式でなくなるため、マクロを再実行してもメニューを再表示できない)。


== ソースコード ==
== ソースコード ==
'''ダウンロード''' >> 「[[ファイル:パスを貼り付け_(ポップアップメニュー).zip]]」(アイコン入り)
: 初版: 2020/12/30


'''ダウンロード''' >> 「[[ファイル:パスを貼り付け(ポップアップメニュー).zip]]」(アイコン入り)
<syntaxhighlight lang="javascript" style="height:60em; overflow:auto;">
: 初版: 2020/12/30
<br>
<source lang="javascript" style="height:60em; overflow:auto;">
#title = "パスを貼り付け..."
#title = "パスを貼り付け..."
#tooltip = "ポップアップメニューで選択した形式でパスを整形して貼り付け"
#tooltip = "ポップアップメニューで選択した形式でパスを整形して貼り付け"
80行目: 71行目:
  * ---------------------------------------------------------
  * ---------------------------------------------------------
  * 「パスを貼り付け(ポップアップメニュー)」マクロ
  * 「パスを貼り付け(ポップアップメニュー)」マクロ
  * sukemaru, 2020/12/27 - 2020/12/29 (公開版 初版: 2020/12/30)
  * sukemaru, 2020/12/30
  * ---------------------------------------------------------
  * ---------------------------------------------------------
  * エクスプローラ上で「コピー」したフォルダ・ファイルのパスを
  * エクスプローラ上で「コピー」したフォルダ・ファイルのパスを
  * ポップアップメニューから選択した形式に整形してペーストする
  * ポップアップメニューから選択した形式に整形してペーストする
  *  
  *  
  * 動作要件:(Windows OS 上の) Mery ver 3.2.2α 以降
  * 動作要件:(Windows OS 上の) Mery Ver 3.2.2α 以降
  */
  */


94行目: 85行目:


// ■ 整形して貼り付けたデータをクリップボードに送信する?
// ■ 整形して貼り付けたデータをクリップボードに送信する?
var sendToClipboard = true; // true: 送信する / false: 送信しない
var sendToClipboard = false; // true: 送信する / false: 送信しない


// ■ ポップアップメニューを表示する位置
// ■ ポップアップメニューを表示する位置
365行目: 356行目:
   return folders.concat( files ).join( crlf ) + crlf;
   return folders.concat( files ).join( crlf ) + crlf;
}
}
</source>
</syntaxhighlight>
 


== メモ ==
== メモ ==
動作確認は Windows XP SP3 (32bit) 上の Mery ver 3.2.3 で行ったのみです。
動作確認は Windows XP SP3 (32bit) 上の Mery Ver 3.2.3 で行ったのみです。

2024年9月9日 (月) 11:18時点における最新版

概要[編集]

Mery Ver 3.2.2α 以降(の隠し機能)で、エクスプローラ上で「コピー」したフォルダ・ファイルのパスを、ポップアップメニューから選択した形式に整形してペーストします。
 → ref.  Mery 公式フォーラムのトピック 「【要望】ファイルパスの貼付け機能」

クリップボードのデータが

  • 「エクスプローラ上でコピーしたフォルダ・ファイル(リスト形式)」でない場合
  • 「フォルダ・ファイルのフルパスのリスト(テキスト形式)」でない場合
  • Mery 本体のバージョンが動作要件を満たさない場合

は、ポップアップメニューを表示せずに通常の「貼り付け (Ctrl+V)」をおこないます (設定項目forcePaste: 初期値=true)。

動作要件:(Windows OS 上の) Mery Ver 3.2.2α 以降
※ テキスト形式の「フルパスのリスト」では、コピー元のデータの末尾に改行が必要。
※ 環境変数などで省略されたパスを含むリストや、フルパス以外の文字列を含むリストには非対応 (フルパスの判定方法は、"各行が「:\」をひとつずつ含んでいるかどうか" をチェックするだけの簡易的なものですが)。

変換パターン[編集]

  • 二重引用符つきで "貼り付け"
  • ¥(バックスラッシュ U+005C)を二重¥¥にして貼り付け
  • ¥(バックスラッシュ U+005C)を二重¥¥にして 二重引用符つき で "貼り付け"
  • フォルダ名・ファイル名 の部分のみにして貼り付け
  • フォルダ名・ファイル名 の部分のみを 二重引用符つき で "貼り付け"

¥を二重¥¥にして [二重引用符つきで] 貼り付け」の変換パターンと下記のソートパターンを組み合わせた選択項目はありません。

→ 必要なら、ソートつきで貼り付けたあとに Undo (Ctrl+Z) してから、このマクロを再実行して「¥を二重¥¥にして [二重引用符つきで] 貼り付け」しなおしてください (設定項目sendToClipboard = trueの場合のみ)。

ソート(並べ替え)パターン[編集]

  • 文字列順 (数値順)
フォルダ・ファイル混在で文字列順(昇順)
  • ファイル名順*
フォルダを先頭にまとめて、フォルダ・ファイル それぞれを文字列順
  • 拡張子順*
フォルダを先頭にまとめて、拡張子順 > 文字列順

いずれのソートパターンでも、フォルダ・ファイルパス内の「連続する半角数字の部分」は「数値順 (十進数)」で評価します。

i.e.  1 < 002 < 03 < 5 < 40
※ "0" から始まる「16進数」や「数字の羅列」などを含むパスでは、望ましくない並び順になる場合があります。
i.e.  1a1a < 02a0 < 0010

アルファベットの 大文字/小文字 や、日本語の ひらがな/カタカナ などは区別せずに、「辞書順 (OS のロケールに依存)」で評価します。

※「拡張子順*」では、拡張子の部分の数字のみ「文字列順」で評価します。
→ 完全な文字列順 に整形したい場合は、貼り付けた後で「昇順で並び替え」「昇順で並び替え/降順で並び替え トグル変換」「行並べ替え」などのマクロなどで並べなおしてください。

「ファイル名順*」と「拡張子順*」のソートでは、フォルダパスを先頭に集めます。

※ フォルダの実在確認により判定するので、実在確認できなかったものは「拡張子なしのファイル」と見做します。
※「ファイル名順*」と「文字列順 (数値順)」との違いは、フォルダパスを先頭に集めるかどうかの違いだけです。

クリップボードデータの上書き[編集]

設定項目 sendToClipboard(初期値=false
trueにすると、整形して貼り付けたデータ(テキスト形式)をクリップボードに送信します。

→ Ctrl+V で整形済みのデータを再貼り付けできるようになります (Mery の「クリップボード履歴」からも再貼り付けできるようになります)。
※ 整形なしの「貼り付け」では、Mery の「クリップボード履歴」に残しません。
※ このマクロを再実行して別の形式を選択して貼り付けする場合、前回の整形済みデータから "二重引用符" と「ふたつ重ねにした¥記号」を消した状態から、あらためて整形しなおします (整形なしの「貼り付け」では前回と同じ形式で貼り付け)。
※ 間違えて「フォルダ/ファイル名のみ ~」で貼り付けしてしまった場合、Undo してもクリップボードに送信したデータ形式を復旧できないので再度エクスプローラ上でフォルダ・ファイルを「コピー」し直さなければなりません (フルパス形式でなくなるため、マクロを再実行してもメニューを再表示できない)。

ソースコード[編集]

ダウンロード >> 「ファイル:パスを貼り付け (ポップアップメニュー).zip」(アイコン入り)

初版: 2020/12/30
#title = "パスを貼り付け..."
#tooltip = "ポップアップメニューで選択した形式でパスを整形して貼り付け"
// #icon = "paste_path.ico"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",313

/**
 * ---------------------------------------------------------
 * 「パスを貼り付け(ポップアップメニュー)」マクロ
 * sukemaru, 2020/12/30
 * ---------------------------------------------------------
 * エクスプローラ上で「コピー」したフォルダ・ファイルのパスを
 * ポップアップメニューから選択した形式に整形してペーストする
 * 
 * 動作要件:(Windows OS 上の) Mery Ver 3.2.2α 以降
 */

// ---------- ▼ 設定項目 ▼ ---------- //

// ■「フルパスのリスト」以外のデータのとき、メニューを表示せずに「貼り付け」する?
var forcePaste = true;	// true: 貼り付けする / false: なにもしない

// ■ 整形して貼り付けたデータをクリップボードに送信する?
var sendToClipboard = false;	// true: 送信する / false: 送信しない

// ■ ポップアップメニューを表示する位置
var menuPosMouse = true;	// true: マウス位置 / false: キャレット位置

// ---------- ▲ 設定項目 ▲ ---------- //


var d = editor.ActiveDocument,  s = d.selection;
var grayFlag = d.ReadOnly ? meMenuGrayed : 0;
var r;

// Mery.exe のバージョンチェック
var meryVer = + ( editor.Version.replace( /\d+/g , function( dig ) {
                  return dig.length < 2 ? "0" + dig : dig
                } ).replace( /\./g, "" ).slice( 0, 6 ) );

// クリップボードデータ
var cb = ClipboardData,  cbData = cb.GetData();
var cnd = ( meryVer >= 30202 && cbData.length && /:\\.*[\r\n]+$/.test( cbData )
&& ( cbData.match( /:\\/g ) || [] ).length === ( cbData.match( /[\r\n]+/g ) || [] ).length );

// ステータスバーの表示
var $status = Status;
if ( grayFlag ) { Status = " ドキュメントは書き換え禁止です。"; }

// パスの整形・貼り付け用メニュー
if ( cnd ) {
  var cbPathMulti = /\n(?!$)/.test( cbData );
  var menu = CreatePopupMenu();

  menu.Add( "貼り付け (&P)", 19, grayFlag );
  menu.Add( "", 0, meMenuSeparator );

  if ( cbPathMulti ) {
    menu.Add( "\u00A5 を \u00A5\u00A5 に置換して貼り付け (&C)", 20, grayFlag );	//「¥」(\u00A5)
    menu.Add( "パスを 文字列順(数値順) でソートして貼り付け (&S)", 21, grayFlag );
    menu.Add( "パスを ファイル名順* でソートして貼り付け (&F)", 22, grayFlag );
    menu.Add( "パスを 拡張子順* でソートして貼り付け (&E)", 23, grayFlag );
    menu.Add( "", 0, meMenuSeparator );

    menu.AddPopup( "二重引用符つきで \"貼り付け\" (&W)"
                 , sm1 = CreatePopupMenu() );
    sm1.Add( "二重引用符つきで \"貼り付け\" (&W)", 24, grayFlag );
    sm1.Add( "\u00A5 を \u00A5\u00A5 に置換して \"貼り付け\" (&C)", 25, grayFlag );
    sm1.Add( "パスを 文字列順(数値順) でソートして \"貼り付け\" (&S)", 26, grayFlag );
    sm1.Add( "パスを ファイル名順* でソートして \"貼り付け\" (&F)", 27, grayFlag );
    sm1.Add( "パスを 拡張子順* でソートして \"貼り付け\" (&E)", 28, grayFlag );
    menu.Add( "", 0, meMenuSeparator );

    menu.AddPopup( "フォルダ/ファイル名のみ 貼り付け (&N)"
                 , sm2 = CreatePopupMenu() );
    sm2.Add( "フォルダ/ファイル名 のみを貼り付け (&N)", 29, grayFlag );
    sm2.Add( "フォルダ/ファイル名を 文字列順(数値順) でソートして貼り付け (&S)", 30, grayFlag );
    sm2.Add( "フォルダ/ファイル名を ファイル名順* でソートして貼り付け (&F)", 31, grayFlag );
    sm2.Add( "フォルダ/ファイル名を 拡張子順* でソートして貼り付け (&E)", 32, grayFlag );
    menu.Add( "", 0, meMenuSeparator );

    menu.AddPopup( "フォルダ/ファイル名のみを 二重引用符つきで \"貼り付け\" (&Q)"
                 , sm3 = CreatePopupMenu() );
    sm3.Add( "フォルダ/ファイル名を 二重引用符つきで \"貼り付け\" (&Q)", 33, grayFlag );
    sm3.Add( "フォルダ/ファイル名を 文字列順(数値順) でソートして \"貼り付け\" (&S)", 34, grayFlag );
    sm3.Add( "フォルダ/ファイル名を ファイル名順* でソートして \"貼り付け\" (&F)", 35, grayFlag );
    sm3.Add( "フォルダ/ファイル名を 拡張子順* でソートして \"貼り付け\" (&E)", 36, grayFlag );
  }
  else {
    menu.Add( "二重引用符つきで \"貼り付け\" (&W)", 24, grayFlag );
    menu.Add( "", 0, meMenuSeparator );
    menu.Add( "\u00A5 を \u00A5\u00A5 に置換して貼り付け (&C)", 20, grayFlag );	//「¥」(\u00A5)
    menu.Add( "\u00A5 を \u00A5\u00A5 に置換して 二重引用符つきで \"貼り付け\" (&C)", 25, grayFlag );
    menu.Add( "", 0, meMenuSeparator );
    menu.Add( "フォルダ/ファイル名 のみを貼り付け (&N)", 29, grayFlag );
    menu.Add( "フォルダ/ファイル名を 二重引用符つきで \"貼り付け\" (&Q)", 33, grayFlag );
  }
  menu.Add( "", 0, meMenuSeparator );

  menu.Add( "貼り付けしてからアイテムを削除 (&M)", 37, grayFlag );
  menu.Add( "アイテムを削除 (&D)", 38 );
  menu.Add( "", 0, meMenuSeparator );
  menu.Add( "キャンセル	 & ", 0 );

  // ポップアップメニューを表示
  r = menu.Track( + menuPosMouse );
}
// 「フルパスのリスト」以外のデータのとき
else if ( forcePaste && cbData.length && ! grayFlag ) {
  r = 19;	// 「貼り付け」
}

// 選択したコマンドを実行
if ( ! r ) { Status = $status; }
else {
  editor.ExecuteCommandByID( MEID_WINDOW_ACTIVE_PANE = 2189 );

  // 貼り付け
  if ( r === 19 ) { s.Paste(); }

  else if ( r >= 20 && r <= 36 ) {	// >
    // ¥¥ を ¥ に置換し、二重引用符の囲いをはずす
    cbData = cbData.replace( /\\\\/g, "\\" )
                   .replace( /^(\s*)"+/gm, "$1" ).replace( /"+(\s*)$/gm, "$1" );

    var str =
      // ¥ を ¥¥ に置換して貼り付け
      ( r === 20 ) ? Escape( cbData )
      // パスを 文字列順(数値順) でソートして貼り付け
    : ( r === 21 ) ? SortPathByString( cbData )
      // パスを ファイル名順* でソートして貼り付け
    : ( r === 22 ) ? SortPathByFileName( cbData )
      // パスを 拡張子順* でソートして貼り付け
    : ( r === 23 ) ? SortPathByFileExt( cbData )

      // 二重引用符つきで "貼り付け"
    : ( r === 24 ) ? DoubleQuote( cbData )
      // ¥ を ¥¥ に置換して "貼り付け"
    : ( r === 25 ) ? DoubleQuote( Escape( cbData ) )
      // パスを 文字列順(数値順) でソートして "貼り付け"
    : ( r === 26 ) ? DoubleQuote( SortPathByString( cbData ) )
      // パスを ファイル名順* でソートして "貼り付け"
    : ( r === 27 ) ? DoubleQuote( SortPathByFileName( cbData ) )
      // パスを 拡張子順* でソートして "貼り付け"
    : ( r === 28 ) ? DoubleQuote( SortPathByFileExt( cbData ) )

      // フォルダ/ファイル名 のみを貼り付け
    : ( r === 29 ) ? Extract( cbData )
      // フォルダ/ファイル名を 文字列順(数値順) でソートして貼り付け
    : ( r === 30 ) ? Extract( SortPathByString( cbData ) )
      // フォルダ/ファイル名を ファイル名順* でソートして貼り付け
    : ( r === 31 ) ? Extract( SortPathByFileName( cbData ) )
      // フォルダ/ファイル名を 拡張子順* でソートして貼り付け
    : ( r === 32 ) ? Extract( SortPathByFileExt( cbData ) )

      // フォルダ/ファイル名を 二重引用符つきで "貼り付け"
    : ( r === 33 ) ? DoubleQuote( Extract( cbData ) )
      // フォルダ/ファイル名を 文字列順(数値順) でソートして "貼り付け"
    : ( r === 34 ) ? DoubleQuote( Extract( SortPathByString( cbData ) ) )
      // フォルダ/ファイル名を ファイル名順* でソートして "貼り付け"
    : ( r === 35 ) ? DoubleQuote( Extract( SortPathByFileName( cbData ) ) )
      // フォルダ/ファイル名を 拡張子順* でソートして "貼り付け"
    : ( r === 36 ) ? DoubleQuote( Extract( SortPathByFileExt( cbData ) ) )
    : cbData;

    s.Text = str;
    if ( sendToClipboard ) { cb.SetData( str );  cb.SetData( str, 0 ); }
  }

  // (貼り付けしてから)アイテムを削除
  else if ( r >= 37 ) { 
    if ( r === 37 ) { s.Paste(); }
    cb.ClearData();
    if ( ! cb.GetData() ) {
      Status = " クリップボードからアイテムを削除しました。";
    }
  }
}


/**
 * 関数 DoubleQuote( str )
 * 各行ごとに "二重引用符" で囲う
 */
function DoubleQuote( str ) {
  return str.replace( /^./gm, "\"$&" ).replace( /(.)([\r\n]+)/g, "$1\"$2" );
}

/**
 * 関数 Escape( str )
 * ¥ を ¥¥ に置換する
 */
function Escape( str ) {
  return str.replace( /\\/g, "\\$&" );
}

/**
 * 関数 Extract( str )
 * パスをフォルダ/ファイル名 だけにする
 */
function Extract( str ) {
  return str.replace( /^.*\\/gm, "" );
}

/**
 * 関数 DigitsAsNumber( str )
 * 数字を数値(十進数)として評価する
 * masme 氏の「行並べ替え」マクロの "数値順変換(opt.asNum)" のコードを借用
 * ref. https://www.haijin-boys.com/wiki/%E8%A1%8C%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88
 */
function DigitsAsNumber( str ) {
  return str.toLowerCase()
            .replace( /(0*)([0-9]+)/g, function( str, z, n ) {
    var k = 0xF + n.length;
    return ( k > 0xFFF0 )
           ? "0\r\uFFF1\r" + str
           : "0\r" + String.fromCharCode( k )+ n + z + ";\r";
  } );
}

/**
 * 関数 SortByString( a, b )
 * 数字を数値順で評価して並べ替える
 */
function SortByString( a, b ) {
  var aN = DigitsAsNumber( a ),  bN = DigitsAsNumber( b );
  return aN.localeCompare( bN ) || a.localeCompare( b );
}

/**
 * 関数 SortByExt( a, b )
 * 拡張子順で評価して並べ替える
 * ・拡張子より前の部分の数字は数値順で評価
 */
function SortByExt( a, b ) {
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var a1 = Fso.GetExtensionName( a );  a2 = a1.toLowerCase();
  var b1 = Fso.GetExtensionName( b );  b2 = b1.toLowerCase();
  var aN = DigitsAsNumber( a ),  bN = DigitsAsNumber( b );
  return ( a2 < b2 ) ? -1
       : ( a2 > b2 ) ? 1
       : ( a1 < b1 ) ? -1
       : ( a1 > b1 ) ? 1
       : aN.localeCompare( bN ) || a.localeCompare( b );
}

/**
 * 関数 SortPathByString( pathData )
 * パスをファイル名順で並べ替える
 * ・数字を数値順で評価
 * ・フォルダを先頭に集めない
 */
function SortPathByString( path ) {
  var a = path.split( /[\r\n]+/ ),  crlf = RegExp[ "$&" ];
  return a.sort( SortByString ).join( crlf ) + crlf;
}

/**
 * 関数 SortPathByFileName( pathArray )
 * パスをファイル名順で並べ替える
 * ・数字を数値順で評価
 * ・フォルダを先頭に集める
 */
function SortPathByFileName( path ) {
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var a = path.split( /[\r\n]+/ ),  crlf = RegExp[ "$&" ];
  var folders = [],  files = [];
  for ( var i = 0, len = a.length; i < len; i ++ ) {	// >
    if ( Fso.FolderExists( a[i] ) ) { folders.push( a[i] ) }; 
    else { files.push( a[i] ) }; 
  }
  folders.sort( SortByString );
  files.sort( SortByString );
  return folders.concat( files ).join( crlf ) + crlf;
}

/**
 * 関数 SortPathByFileExt( pathArray )
 * パスを拡張子順で並べ替える
 * ・数字を数値順で評価
 * ・フォルダを先頭に集める
 */
function SortPathByFileExt( path ) {
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var a = path.split( /[\r\n]+/ ),  crlf = RegExp[ "$&" ];
  var folders = [],  files = [];
  for ( var i = 0, len = a.length; i < len; i ++ ) {	// >
    if ( Fso.FolderExists( a[i] ) ) { folders.push( a[i] ) }; 
    else { files.push( a[i] ) }; 
  }
  folders.sort( SortByString );
  files.sort( SortByExt );
  return folders.concat( files ).join( crlf ) + crlf;
}

メモ[編集]

動作確認は Windows XP SP3 (32bit) 上の Mery Ver 3.2.3 で行ったのみです。

スポンサーリンク