chrome.commands.onCommand.addListener(cmd => { chrome.tabs.query({ currentWindow:true, active:true }, tabs => { const tab = tabs[0]; if (!tab) return; switch (cmd) { case 'move-left': chrome.tabs.move(tab.id, { index:Math.max(0, tab.index-1) }); break; case 'move-right': chrome.tabs.move(tab.id, { index:tab.index+1 }); break; case 'move-to-first': chrome.tabs.move(tab.id, { index:0 }); break; case 'move-to-last': chrome.tabs.move(tab.id, { index:-1 }); break; case 'move-next-window': tabMoveWindow(tab, 1); break; case 'move-prev-window': tabMoveWindow(tab, -1); break; } }); }); function tabMoveWindow(tab, dir) { chrome.windows.getAll(wins => { if (wins.length <= 1) chrome.windows.create({ tabId:tab.id }); else for (let i = 0; i < wins.length; i++) if (tab.windowId === wins[i].id) return chrome.tabs.move(tab.id, { windowId: wins[(i + dir + wins.length) % wins.length].id, index:-1 }, newTab => { chrome.tabs.highlight({ windowId:newTab.windowId, tabs:[newTab.index] }, () => { chrome.windows.update(newTab.windowId, { focused:true }); }); }); }); }