diff --git a/evil.org b/evil.org new file mode 100644 index 0000000..85c0ba8 --- /dev/null +++ b/evil.org @@ -0,0 +1,171 @@ +* 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. + +* 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} + +* 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.