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
Both switching to the next and nth tab with gt are supported.
<C-PageDown> 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
- [ ] <C-PageDown>
- [ ] :tabn[ext]
- [X] {count}gt
- [ ] {count}<C-PageDown>
- [ ] :tabn[ext] {count}
- [ ] wraparound without argument
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
- [ ] <C-PageUp>
- [ ] :tabp[revious]
- [ ] :tabN[ext]
- [X] {count}gT
- [ ] {count}<C-PageUp>
- [ ] :tabp[revious] {count}
- [ ] :tabN[ext] {count}
- [ ] wraparound without argument
Title says it all, it should be merely a special case of switching to the nth buffer. Not implemented yet.
- [ ] :tabfir[st]
- [ ] :tabr[ewind]
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]
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
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}
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
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]
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}
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][!]
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
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}
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
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