* General note Some of the presented ex commands can take special values instead of numbers, such as . for current, + for next, - for previous, 0 for first and $ for last. It's time to look at how Evil exactly parses ranges and how to create a new interactive type for it if there isn't any fitting one for the task. There is a bang modifier for commands that close tabs, it forces Vim to ignore the presence of modified buffers in a tab page because it would otherwise abort the action. This doesn't really fit Emacs (this question usually comes when ending the session), so I'm strongly considering to just drop these commands. - [ ] implement extended {count} argument * Switch to next tab Both switching to the next and nth tab with gt are supported. is not used since it's bound to the ~scroll-left~ command in Emacs. An ex command should be trivial to implement. Note that in Vim gt wraps around, but in eyebrowse it doesn't unless the appropriate option is set. Whether this default is worth changing or adjusting with an Evil command wrapper is yet to be determined. - [X] gt - [ ] - [ ] :tabn[ext] - [X] {count}gt - [ ] {count} - [ ] :tabn[ext] {count} - [ ] wraparound without argument * Switch to previous tab Both switching to the previous and n tabs backwards with wrapping temporarily enabled are supported. The other caveats from the previous section still apply. There's an extra ex command, but it is identical to the other one. - [X] gT - [ ] - [ ] :tabp[revious] - [ ] :tabN[ext] - [X] {count}gT - [ ] {count} - [ ] :tabp[revious] {count} - [ ] :tabN[ext] {count} - [ ] wraparound without argument * Switch to first tab Title says it all, it should be merely a special case of switching to the nth buffer. Not implemented yet. - [ ] :tabfir[st] - [ ] :tabr[ewind] * Switch to last tab As suggested by the title, switch to whatever the last tab is. There is a minor quibble though, simply because there is already an ~eyebrowse-last-window-config~ command which does something different, switching to the tab used before the current one. Perhaps that command shall be obsoleted for a more generic MRU replacement (à la irssi/weechat) that allows one to switch through a ring of tabs. Not implemented yet. - [ ] :tabl[ast] * Create empty tab Now that it's possible to open empty tabs, simply let-binding the corresponding option and turning it into a command should do the trick. To implement the count versions it's necessary to use either a number or special argument which will open the tab after the nth one instead. Not implemented. - [ ] :[count]tabe[dit] - [ ] :[count]tabnew * Find file in tab The option for doing something different from cloning a window config will also allow a function as type, let-binding to a lambda that does find a file in combination with the appropriate interactive type. Same applies to the count argument as above. Not implemented. - [ ] :[count]tabe[dit] [++opt] [+cmd] {file} - [ ] :[count]tabnew [++opt] [+cmd] {file} * Turn current window into tab See title. This will fail if there's only one window open. Probably requires the more flexible window configuration backend (or alternatively, clone the current window config, close the selected window in one tab, close all other windows in the other one). A count will make the tab open before the tab with the respective number, otherwise it will be inserted after the current one. - [ ] [count]C-w T * Move tab There's two types of movements, one would be moving a tab to a specific position, the other one moving it in a direction by an amount. I'm not sure whether Evil supports both types of specifying the count. Not implemented. - [ ] :tabm[ove] [N] - [ ] :[N]tabm[ove] - [ ] :tabm[ove] +[N] - [ ] :tabm[ove] -[N] * Close a tab Currently, only closing the current tab is implemented. The other interesting part left to implement would be a numerical argument to close a different tab than the current one. This should be fairly easy (take care of what tab you end up at afterwards since the behaviour is different from closing the current one), what looks more problematic though is implementing the special arguments as listed above (with the exception of 1 instead of 0 for the first tab). - [X] gc - [X] :tabc[lose] - [ ] :tabc[lose][!] - [ ] {count}gc - [ ] :{count}tabc[lose] - [ ] :{count}tabc[lose]! - [ ] :tabc[lose]{count} - [ ] :tabc[lose]!{count} * Close other tabs This is the inverse of the previous, closing all other tabs except the current one. Similiar caveats apply, like the numerical argument and bang modifier. Nothing implemented yet. - [ ] :tabo[nly] - [ ] :tabo[nly][!] - [ ] :{count}tabo[nly] - [ ] :{count}tabo[nly][!] * Tab overview Displays a list of tabs with currently displayed buffers in their windows with the currently active buffer (the buffer point is on?) and changed buffers highlighted. Not implemented. - [ ] :tabs * Generic commands Vim allows both modifying an ex command to spawn in a tab instead of a window and executing an ex command by looping over all tabs. I doubt this to be necessary to implement given that this is of limited utility when used interactively and a bit of elisp can solve the problem in a much cleaner manner. Not implemented. - [ ] :[count]tab {cmd} - [ ] :[range]tabd[o] {cmd} * FFAP The following commands are very similiar to gf and gF which are wrappers around FFAP in Evil. As I understand it, these will perform the same task, but display the result in a newly opened tab. Not implemented. - [ ] :[count]tabf[ind] [++opt] [+cmd] {file} - [ ] C-w gf - [ ] C-w gF * Omissions Vim doesn't seem to have a concept of a last tab page (as in, tab page one was previously on) one can switch to, perhaps for the lack of a better name (to distinguish it from the tab positioned at the end of the tab list). I've bound that command to zx, but that feels wrong since it's supposed to be a folding command that merely happened to be free in Evil's z map. A solution as explained in the section about the "other" last tab page would probably work out. - [X] zx - [ ] Find a better solution and keybinding for it