KeySnail は Emacs ライクなキーバインドなものにしてくれ、さらに keyconfig のように独自コードを割り当てることができる拡張です。
KeySnail :: Add-ons for Firefox
タイトルと URL をコピーするものはあるのですが、大体どこかひとつのテンプレートにしか対応していません。色々なサービスを使っていると不便なことが多いので、テンプレートを選べるスクリプトをつくりました。
テンプレートは少ないので、個人個人利用しているテンプレートを templates 変数に追加、削除するとよいのではと思います。割り当てたキーバインドを実行するとクリップボードにコピーするフォーマット一覧が出力されるので、後は grep して対象のフォーマットのところで Enter キーを押すだけです。
よく利用するテンプレートを一番最初に持ってくると便利かもしれません。
key.setGlobalKey(['C-c', 't'], function () {
var templates = {
tdiary: "[[{0}|{1}]]",
text:"{0}\n{1}",
hatena: "[{1}:title={0}]",
mt: "[{0}]({1})",
pukiwiki: "[[{0}:{1}]]",
link: "<a href=\"{1}\">{0}</a>"
};
function getLineSeprator() {
var sysInfo = Cc['@mozilla.org/system-info;1'].getService(Ci.nsIPropertyBag2);
var platform = sysInfo.getProperty("name");
if (platform.indexOf("Windows") >= 0) {
return "\r\n";
} else {
return "\n";
}
}
var regexp = /\{(\d)\}/g;
function format() {
var args = Array.prototype.slice.apply(arguments);
var format = args.shift();
return format && format.replace(regexp, function () {
return args[arguments[1]] || "";
});
}
var promptList = [];
for (var key in templates) {
promptList.push([key, templates[key].replace(/\n/g, '\\n')]);
}
var title = window.content.document.title;
var url = window.content.location.href;
prompt.selector({
message: "copy from: ",
flags: [0, 0],
collection: promptList,
header: ["key", "format"],
callback: function (index) {
if (index < 0) {
return;
}
var key = promptList[index][0];
var template = templates[key].replace(/\n/g, getLineSeprator());
var text = format(template, title, url);
Cc['@mozilla.org/widget/clipboardhelper;1'].getService(Ci.nsIClipboardHelper).copyString(text);
}
});
}, 'URL とタイトルをコピー');
これまで Ubiquity で入力してフォーマットを変換するようにしていたのですが、 KeySnail の selector を使うと一覧から選択できることによって入力ミスがなくなりました。とても便利なので Ubiquity がいらなくなっちゃいました。
Emacs ユーザーでない方もキーバインドをカスタマイズすると、なかなか快適な Firefox 生活を送れるのではと思います。
実行した時点での URL とタイトルから目的のタブを検索するスクリプトです。
検索して選択するとフォーカスが移動します。
key.setGlobalKey(['C-c', 'l'], function () {
var promptList = [];
var w = Application.activeWindow;
var tabs = Array.apply(null, w.tabs);
for each (var tab in tabs) {
promptList.push([tab.document.title, tab.uri.spec]);
}
prompt.selector({
message: "select tab: ",
flags: [0, 0],
collection: promptList,
header: ["title", "url"],
callback: function (index) {
if (index < 0 || tabs.length < index) {
return;
}
tabs[index].focus();
}
});
}, 'タブを検索する');