1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-21 20:57:59 +01:00

Add completion to :tabmove/:tabattach.

This commit is contained in:
Kris Maglione
2011-06-01 13:54:59 -04:00
parent 7d019560be
commit 8b27315bd7
3 changed files with 47 additions and 24 deletions

View File

@@ -1515,15 +1515,18 @@ var Buffer = Module("buffer", {
context.completions = [[title, href.join(", ")] for ([title, href] in Iterator(styles))];
};
completion.buffer = function buffer(context) {
completion.buffer = function buffer(context, visible) {
let filter = context.filter.toLowerCase();
let defItem = { parent: { getTitle: function () "" } };
let tabGroups = {};
tabs.getGroups();
tabs.allTabs.forEach(function (tab, i) {
tabs[visible ? "visibleTabs" : "allTabs"].forEach(function (tab, i) {
let group = (tab.tabItem || tab._tabViewTabItem || defItem).parent || defItem.parent;
if (!set.has(tabGroups, group.id))
tabGroups[group.id] = [group.getTitle(), []];
group = tabGroups[group.id];
group[1].push([i, tab.linkedBrowser]);
});
@@ -1558,7 +1561,7 @@ var Buffer = Module("buffer", {
else if (i == tabs.index(tabs.alternate))
indicator = "#";
let tab = tabs.getTab(i);
let tab = tabs.getTab(i, visible);
let url = browser.contentDocument.location.href;
i = i + 1;

View File

@@ -1488,7 +1488,7 @@ var Dactyl = Module("dactyl", XPCOM(Ci.nsISupportsWeakReference, ModuleBase), {
* @property {Window[]} Returns an array of all the host application's
* open windows.
*/
get windows() [win for (win in iter(services.windowMediator.getEnumerator("navigator:browser")))],
get windows() [win for (win in iter(services.windowMediator.getEnumerator("navigator:browser"))) if (win.dactyl)],
}, {
// initially hide all GUI elements, they are later restored unless the user

View File

@@ -228,13 +228,15 @@ var Tabs = Module("tabs", {
* if *index* is not specified. This is a 0-based index.
*
* @param {number|Node} index The index of the tab required or the tab itself
* @param {boolean} visible If true, consider only visible tabs rather than
* all tabs.
* @returns {Object}
*/
getTab: function (index) {
getTab: function (index, visible) {
if (index instanceof Node)
return index;
if (index != null)
return config.tabbrowser.mTabs[index];
return this[visible ? "visibleTabs" : "allTabs"][index];
return config.tabbrowser.mCurrentTab;
},
@@ -529,7 +531,7 @@ var Tabs = Module("tabs", {
"Delete current buffer",
function (args) {
let removed = 0;
for (let tab in matchTabs(args, args.bang)) {
for (let tab in matchTabs(args, args.bang, true)) {
config.removeTab(tab);
removed++;
}
@@ -548,7 +550,7 @@ var Tabs = Module("tabs", {
privateData: true
});
function matchTabs(args, substr) {
function matchTabs(args, substr, all) {
let filter = args[0];
if (!filter && args.count == null)
@@ -556,13 +558,13 @@ var Tabs = Module("tabs", {
else if (!filter)
yield dactyl.assert(tabs.getTab(args.count - 1));
else {
let matches = /^(\d+):?/.exec(filter);
let matches = /^(\d+)(?:$|:)/.exec(filter);
if (matches)
yield dactyl.assert(args.count == null &&
tabs.getTab(parseInt(matches[1], 10) - 1));
tabs.getTab(parseInt(matches[1], 10) - 1, !all));
else {
let str = filter.toLowerCase();
for (let tab in values(tabs.allTabs)) {
for (let tab in values(tabs[all ? "allTabs" : "visibleTabs"])) {
let host, title;
let browser = tab.linkedBrowser;
let uri = browser.currentURI.spec;
@@ -589,7 +591,7 @@ var Tabs = Module("tabs", {
commands.add(["pin[tab]"],
"Pin tab as an application tab",
function (args) {
for (let tab in matchTabs(args, true))
for (let tab in matchTabs(args))
config.browser[!args.bang || !tab.pinned ? "pinTab" : "unpinTab"](tab);
},
{
@@ -606,7 +608,7 @@ var Tabs = Module("tabs", {
commands.add(["unpin[tab]"],
"Unpin tab as an application tab",
function (args) {
for (let tab in matchTabs(args, true))
for (let tab in matchTabs(args))
config.browser.unpinTab(tab);
},
{
@@ -771,15 +773,17 @@ var Tabs = Module("tabs", {
function (args) {
let arg = args[0];
// FIXME: tabmove! N should probably produce an error
dactyl.assert(!arg || /^([+-]?\d+)$/.test(arg),
_("error.trailingCharacters"));
// if not specified, move to after the last tab
tabs.move(config.tabbrowser.mCurrentTab, arg || "$", args.bang);
if (tabs.indexFromSpec(arg) == -1) {
let tabs = [tab for (tab in matchTabs(args, true))];
dactyl.assert(tabs.length == 1);
arg = tabs[0];
}
tabs.move(tabs.getTab(), arg, args.bang);
}, {
argCount: "?",
bang: true
bang: true,
completer: function (context, args) completion.buffer(context, true),
literal: 0
});
commands.add(["tabo[nly]"],
@@ -827,16 +831,21 @@ var Tabs = Module("tabs", {
commands.add(["taba[ttach]"],
"Attach the current tab to another window",
function (args) {
dactyl.assert(args.length <= 2 && !args.some(function (i) !/^\d+$/.test(i)),
dactyl.assert(args.length <= 2 && !args.some(function (i) !/^\d+(?:$|:)/.test(i)),
_("error.trailingCharacters"));
let [winIndex, tabIndex] = args.map(parseInt);
let [winIndex, tabIndex] = args.map(function (arg) parseInt(arg));
let win = dactyl.windows[winIndex - 1];
dactyl.assert(win, _("window.noIndex", winIndex));
dactyl.assert(win != window, _("window.cantAttachSame"));
let browser = win.getBrowser();
let tabList = browser.visibleTabs || browser.mTabs;
let target = tabList[tabIndex];
if (tabIndex)
dactyl.assert(target);
let dummy = browser.addTab("about:blank");
browser.stop();
// XXX: the implementation of DnD in tabbrowser.xml suggests
@@ -846,15 +855,26 @@ var Tabs = Module("tabs", {
let last = browser.mTabs.length - 1;
browser.moveTabTo(dummy, Math.constrain(tabIndex || last, 0, last));
if (tabIndex)
browser.moveTabTo(dummy, Array.indexOf(browser.mTabs, target));
browser.selectedTab = dummy; // required
browser.swapBrowsersAndCloseOther(dummy, config.tabbrowser.mCurrentTab);
}, {
argCount: "+",
literal: 1,
completer: function (context, args) {
if (args.completeArg == 0) {
switch (args.completeArg) {
case 0:
context.filters.push(function ({ item }) item != window);
completion.window(context);
break;
case 1:
let win = dactyl.windows[Number(args[0]) - 1];
if (!win || !win.dactyl)
context.message = _("Error", _("window.noIndex", winIndex));
else
win.dactyl.modules.commands.get("tabmove").completer(context);
break;
}
}
});