「
パスを貼り付け(ポップアップメニュー)
」を編集中 (節単位)
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
== ソースコード == '''ダウンロード''' >> 「[[ファイル:パスを貼り付け_(ポップアップメニュー).zip]]」(アイコン入り) : 初版: 2020/12/30 <syntaxhighlight lang="javascript" style="height:60em; overflow:auto;"> #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; } </syntaxhighlight>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク