「パス・URLを開く コマンドを実行する」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
MSY-07 (トーク | 投稿記録)
マークアップの修正
Yuko (トーク | 投稿記録)
編集の要約なし
5行目: 5行目:
# カーソル位置にMeryで認識できるURLがある場合、そのURLを開きます。
# カーソル位置にMeryで認識できるURLがある場合、そのURLを開きます。
# カーソルのある行すべての文字列を対象にして開きます。
# カーソルのある行すべての文字列を対象にして開きます。
Alt+Enter などに設定し、サッと実行できるようにするのがオススメです。


<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
120行目: 122行目:
         var text = sel.Text;
         var text = sel.Text;
         sel.SetActivePoint(mePosLogical, x, y);
         sel.SetActivePoint(mePosLogical, x, y);
         if (text.match(/^https?:\/\//)) {
         if (text.match(/^(https?|file):\/\//)) {
             wshShell.Run(text);
             sel.OpenLink();
             return;
             return;
         }
         }
       
 
         text = document.GetLine(y, 0);
         text = document.GetLine(y, 0);
         openPath(text);
         openPath(text);

2023年10月28日 (土) 17:51時点における版

選択範囲の文字列をパスやURLとして開く、またはコマンドとして実行します。

未選択状態で実行した場合、以下の順序で実行します。

  1. カーソル位置にMeryで認識できるURLがある場合、そのURLを開きます。
  2. カーソルのある行すべての文字列を対象にして開きます。

Alt+Enter などに設定し、サッと実行できるようにするのがオススメです。

#title = "パス・URLを開く_コマンドを実行する";

// 選択範囲の文字列をパスやURLとして開く、またはコマンドとして実行します。
// 未選択状態で実行した場合、以下の順序で実行します。
// 1. カーソル位置にMeryで認識できるURLがある場合、そのURLを開きます。
// 2. カーソルのある行すべての文字列を対象にして開きます。
//
// (1) パスを開く
//   ファイルパスとして認識できる文字列の場合は、関連付けアプリケーションで開くかMeryで開くかを確認してから開きます。
//   絶対パスにのみ対応しています。
//   (ファイルパスとして認識できる文字列の例)
//     [ローカルファイルパス] C:\Users\username\Desktop\example.txt
//     [ネットワークパス]     \\127.0.0.1\examplefolder\example.txt
// (2) コマンドを実行
//   ファイルパスではない文字列だと判定した場合、コマンドと見なして実行しようとします。
//   これは、「ファイル名を指定して実行」でコマンドを指定して実行するときと同様の動きです。
//   (コマンド実行できる文字列の例)
//     ping 1.1.1.1 -t
//     mstsc /v:172.16.0.1

var sel = document.Selection;
var wshShell = new ActiveXObject( "WScript.Shell" );
var fso = new ActiveXObject( "Scripting.FileSystemObject" );

var BUTTON_OK_CANCEL = 1
var ICON_EXCLAMATION = 48
var ICON_CRITICAL = 16
var SELECT_2 = 256
var RES_OK = 1
var RES_CANCEL = 2

function msgBox(body, title) {
    if (!title) title = body;
    var result = wshShell.Popup(body,
                                0,
                                title,
                                BUTTON_OK_CANCEL + ICON_EXCLAMATION + SELECT_2);
    return result;
}

function errMsg(body) {
    var result = wshShell.Popup(body,
                                0,
                                'Error!!',
                                ICON_CRITICAL);
    return result;
}

function quotePath(path) {
    return '"' + path + '"';
}

function execCommand(text) {
    var result = msgBox('以下のコマンドを実行しますか?\n\n' + text,
                        'コマンド確認');
    if (result !== RES_OK) {
        return;
    }
    try {
        if (fso.FileExists(text)) {
            wshShell.Run(quotePath(text));
        } else {
            wshShell.Run(text);
        }
    } catch(e) {
        errMsg('コマンド実行に失敗しました。\n\n[command]\n' + text);
    }
}

function openPath(t) {
    var text = t.trim().replace(/^"([^"]+)"$/g, '$1');
    if (text === '') return;
    
    if (text.match(/^https?:\/\//)) {
        wshShell.Run(text);
    } else if (text.match(/^([a-zA-Z]:[/\\]|[/\\]{2})/)) {
        if (fso.FolderExists(text)) {
            wshShell.Run(quotePath(text));
        } else if (fso.FileExists(text)) {
            if (fso.GetFileName(text).match(/\.exe$/)) {
                execCommand(text);
            } else {
                var menu = CreatePopupMenu();
                menu.Add("関連付けアプリケーションで開く (&1)", 1);
                menu.Add("Mery で開く (&2)", 2);
                menu.Add("", 0, meMenuSeparator);
                menu.Add("キャンセル (&C)", 99);
                menu.Add(text.match(/.*[/\\]([^/\\]+)/)[1], 0, meMenuGrayed);

                var track = menu.Track(0);
                switch (track) {
                    case 1:
                        wshShell.Run(quotePath(text));
                        break;
                    case 2:
                        wshShell.Run('"' + editor.FullName + '" ' + quotePath(text));
                        break;
                }
            }
        }
    } else {
        execCommand(text);
    }
}

function main() {
    if (sel.IsEmpty) {
        var x = sel.GetActivePointX(mePosLogical);
        var y = sel.GetActivePointY(mePosLogical);

        sel.SelectWord();
        var text = sel.Text;
        sel.SetActivePoint(mePosLogical, x, y);
        if (text.match(/^(https?|file):\/\//)) {
            sel.OpenLink();
            return;
        }

        text = document.GetLine(y, 0);
        openPath(text);
        
        return;
    }
    
    openPath(sel.Text);
}

main();
スポンサーリンク