ホイールクリックでクリップボードの内容を貼り付け(範囲選択していた場合は上書きする)

ドルマウス(middle mouse)、ミドルクリック(middle click)、中クリック、ホイールクリック(wheel click)に関するエントリー。

Firefoxの機能に「ホイールクリックでペースト」がある。便利なので最近使い始めた。about:configでmiddlemouse.pasteをtrueにすると利用できる。再起動しなくてもOK。

でも、この機能には欠点がある。範囲選択をしてからホイールクリックをしても上書きされずに挿入されてしまう。
これをuserChrome.jsを用いて修正する。

ザックリ確認したところFirefox 3.0.8と3.1 Beta3とFirefox 2は上記の残念な仕様。

ソースコード

// ==UserScript==
// @name           middleMousePaste
// @namespace      http://d.hatena.ne.jp/Cherenkov/
// @description    enable overwrite.
// @include        chrome://browser/content/browser.xul
// ==/UserScript==

(function(){
if (gPrefService.getBoolPref("middlemouse.paste")) return alert("Please set a value.\nabout:config -> middlemouse.paste -> false");
window.addEventListener("click", function(event) {
  if (event.button == 1) {
    var target = event.target;
    var tagName = target.tagName;
    if (tagName) tagName = tagName.toLowerCase();
    var type = target.type;
    if (type) type = type.toLowerCase();
    if ((tagName == "input" && (type == "" || type == "text" || type == "password")) || tagName == "textarea" || tagName == "textbox" || tagName == "searchbar") {
      var front = target.value.substr(0,target.selectionStart);
      var back = target.value.substr(target.selectionEnd);
      var select = target.value.substring(target.selectionStart, target.selectionEnd);
      var clipbrd = readFromClipboard();
      if(!clipbrd) clipbrd = "";
      target.value = front + clipbrd + back;
      //modify caret position.
      target.selectionStart = target.selectionEnd = (front.length + clipbrd.length);
    }
  }
}, true);

//stop a scroll event.
window.addEventListener("mousedown", function(event) {
  if (event.button == 1) {
    var target = event.target;
    var tagName = target.tagName;
    if (tagName) tagName = tagName.toLowerCase();
    var type = target.type;
    if (type) type = type.toLowerCase();
    if ((tagName == "input" && (type == "" || type == "text" || type == "password")) || tagName == "textarea" || tagName == "textbox") {
      event.stopPropagation();
    }
  }
}, true);
})();

解説

  • tagNameは小文字にするのが定石らしい。HTMLのtextareaやXULのtextbox上でのみ実行されるようにしておく。
  • クリップボードが画像データのみの場合はundefinedが返ってくるので空白をいれることにした。
  • カーソルのことをキャレットというらしい。上書きペーストするとキャレットが終端に移動してしまうのを修正した。
  • ホイールボタンをmousedownした時に起こるスクロールイベントをstopPropagation()で停止させる。

ダウンロード

middleMousePaste.uc.js (gist:90746

使い方

  1. userChrome.jsをインストール。→簡単なインストール方法
  2. about:configでmiddlemouse.pasteをfalseにしておく。
  3. サブスクリプトローダーを使用しているなら、middleMousePaste.uc.jsをダウンロードしてuserChrome.jsと同じ場所に入れるだけ。
注意点

searchbar(Firefoxメニュー - 表示 - ツールバー - カスタマイズ - 検索のやつ)は、このスクリプトが利かず上書きペーストができない。挿入は可能。


感想

  • middle mouseをmousedownしたときのスクロールイベントを封印するときにpreventDefault()とpreventBubble()は効果が無かった。
  • このスクリプトの場合、preventDefault()とかremoveEventListenerする必要ある?
  • この人にも伝えたい。

firefox userChrome.js greasemonkeyスレ 5
45 :名無しさん@お腹いっぱい。:sage :2008/06/21(土) 14:12:42 id:ZwbS2zYX0
テキスト領域でミドルクリックしたとき, クリップボードの内容を貼り付ける
user_pref("middlemouse.paste", true);というやつなんですが、範囲選択したあと貼り付けで挿入ではなく上書きにしてくれるスクリプトってないですかね?
よろしくお願いします。

参考資料