【要望】コンテキストメニューからのURLコピー

  1. はじめまして、最近いくつかのエディタを経てMerryに落ち着いた者です。

    要望なのですが、URLのコンテキストメニューから、そのURLをコピーできるようにしていただきたいのです。

    現状でも、URLのみの行に関しては、その行をクリックしてカーソル(キャレット)を合わせた上で「右クリック」→「コピー」でURLがコピーできるのですが、この最初の「行をクリックする」という手順をできれば回避したいのです。
    無論、URL以外の文字が混在した行についても、同様にURLコピーができるようになるとなお嬉しいのですが……。

    つまり、
    ・キャレット位置にかかわらず、右クリックした位置の行をコピーする
    ・URLを認識して、URL上での右クリックからURLをコピーする
    これらのうちどちらか(できれば後者)を実現していただきたく思い、書き込ませていただきました。
    何卒、宜しくお願い致します。

    ※過去にも似たような要望は見つけたのですが、4年以上経っているのと、要望の内容も多少異なるため、新しく立てさせていただきました。
    http://haijin-boys.com/index.php?fuseaction=discussions.replies&discussion_id=1491

     |  Nirvana  |  返信
  2. 脇から失礼します。

    > URLのコンテキストメニューから、そのURLをコピー…

    URLのコンテキストメニュー?
    どこでも同じポップアップメニューのことだと勝手に考えさせていただくと…
    (違っていたらご免なさい)

    オプションを変更すると、
    日本語を含まない URL はその URL の上をダブルクリックすると「選択」できます。
    http://www.haijin-boys.com/index.php?fuseaction=discussions.replies&discussion_id=1978
    あとはコピーするだけ。

      オプションの変更箇所
        ツール - オプション - 基本タブ
          ☑URLをダブルクリックで開く
          ↑
          チェックをはずす

    もっと手間を省くなら、

    「キャレットの位置を問わず」ではないのですが、そこから後ろの URL でもよければ、
    その URL を Mery による自動選択とコピー、します。

    このマクロを登録してから、
    「ポップアップメニューの設定」でコンテキストメニューに入れたらどうでしょう。

    やっぱり古い…(笑)

    // - ------------------------ --------------------------------------------------
    // カーソル移動で次URL(Shift+Ctrl+N)
    //
    //   カーソルを次の URL の先頭に移動。
    //   判定はつぎの先頭文字の一致だけ。
    //   http://
    //   https://
    //   ttp://
    //   ttps://
    //   ftp://
    //
    // revised  inuuik  2011-11-18
    // - ------------------------ --------------------------------------------------
    {
      var s = document.selection;
      s.Find("(?=https?:\/\/)|(?=file:\/\/)|(?:(?<!h)(?=ttps?:\/\/))|(?=ftp:\/\/)", (meFindReplaceCase | meFindReplaceRegExp | meFindNext));
      s.CopyLink();
    }
    // - ------------------------ --------------------------------------------------

     |  inuuik  |  返信
  3. inuuikさん、返信有難うございます。

    拙文ゆえに、あまりうまく伝えられないのですが……。

    |文字列
    |URL1
    |URL2

    上記のようなテキストファイルをMerryで開いて、文字列の部分にキャレットがある状態だと、いくらURLにマウスカーソルをあわせていても、右クリックのコンテキストメニューからコピーを選んだ時にコピーされるのは文字列の部分――つまりキャレットのある行がコピーされるのです。
    これを、URL1の上で右クリックしたときにURL1をコピーし、URL2の上で右クリックしたときにURL2をコピーできるようにしたいのですが・・・。

    そのためには、
    ①右クリックした時点でマウスカーソルのある行をコピーできる
    (otbeditなどがこの仕様になっています)
    ②URL上で右クリックした場合、そのURLを認識してコピーできる
    (TeraPadなどがこの仕様です)

    これらのうちどちらかができればよいと思うのですが、マクロでこのような機能は実現できましょうか。
    もし可能であれば、ぜひ、御教授いただけますと幸いです。
    できれば②のほうが好ましいのですが……というのも、

    |要望・感想はこちらまで↓
    |HP(http://ww......
    |mail(○○.××.jp)

    このような文章があった場合、①だと「HP(http://www.....)」の行全体をコピーすることになりますが、②ならばURL部分のみをコピーできる、という利点があるからです。

    私は最初に記した例のような(文とURLとが行でわかれている)テキストの方を多く扱いますので、現状のMerryでもちょっとした手間さえ惜しまなければ何も問題はないのです。Merryは「キャレットのある行を右クリックからコピーする」ことができるので、URLのある行にその都度キャレットを合わせてやればすむのですが、このワンクリックの手間を惜しみたいがためにこのような要望を出させていただいた次第です。

    長文および乱文、失礼いたしました。

     |  Nirvana  |  返信
  4. 【追記】英文の癖でどうしてもMerryと綴ってしまうのですが、毎度あとになってから気づきます。Mery、でしたね。申し訳ありませんでした。

     |  Nirvana  |  返信
  5. あまり inuuik さんのと変わらないですが,キャレットのある行で最初にある URL をコピーするマクロです.
    ただマクロというより Mery の仕様の話ですが,右クリックしただけではキャレットが移動しないので,使用したい場合は左クリック⇒マクロ実行の手順が必要です.
    直接,対象行を右クリック⇒マクロ実行だとキャレットが移動しないので,正しく動作しません.
    (多分,範囲選択中に右クリックしたとき,選択を解除しないでコマンドを実行するための仕様だと思いますが)

    以下 URL コピーマクロ

    var p = "http|https|file|ftp";          // プロトコル
    var u = "a-z0-9\\-_/\\?:@&=\\+\\$\\.";  // 使用可能文字
    var s = Document.Selection;
    var y = s.GetActivePointY(mePosLogical);
    var t = Document.GetLine(y, 0);
    if (t.search(new RegExp("("+p+")://["+u+"]+", "i")) >= 0) {
      s.SetAnchorPoint(mePosLogical, RegExp.index+1, y);
      s.SetActivePoint(mePosLogical, RegExp.lastIndex+1, y, true);
      s.Copy();
      Status = "URL をコピーしました.";
    } else {
      Status = "URL が見つかりません.";
    }

     |  ks  |  返信
  6. こんばんは。
    右クリックはコンテキストメニューの表示に使っているので、即コピーとはいかないと思います。
    という訳で、

    var src = document.Text;
    var reg = /(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)/g;
    var result = reg.exec( src );
    var urls = [];
    while ( result != null ) { 
      urls.push( result[ 0 ] );
      result = reg.exec( src );
    }
    ClipboardData.SetData( urls.join( "\n" ) );

    って感じのマクロで、ファイル全体からURLと思しき部分を全部抜き出してしまうというのはいかがでしょう。
    これならキャレットの移動は不要……。^^;

     |  手石  |  返信
  7. Nirvana さん、はじめまして。返信が遅くなってしまいすみません。
    それと Mery をご愛用くださりありがとうございます。

    みなさん色々とご対応くださりありがとうございます。
    表題の件ですが、現状、マクロでは実現できませんので右クリックメニューに組み込む方向で機能を追加してみようと思います。(右クリックメニュー内であればカスタマイズも可能ですし、邪魔にならないかという判断です)

    しかし TeraPad を見てみたところ、メールアドレスも判定してくれるんですね。メルアドはちょっとめんどくさそうな気がするので、とりあえず保留…

     |  Kuro  |  返信
  8. 作者様、返信が遅くなり申し訳ありません。
    機能追加を考えて下さるとのことで、有り難い限りで御座います。

    マクロを教えて下さった皆様方も、本当に有難うございました。
    私が要望に書いたものとは些か異なりますが、便利なマクロをいくつも御教授いただき、勉強になりました。こちらも有り難く使わせていただきたいと思います。

     |  Nirvana  |  返信