feat(fancy-ctrl-z): Flip-flop between two backgrounded jobs

Added a feature to `fancy-ctrl-z` which, if and only if there are
precisely two backgrounded jobs, switches between them (using `fg %-`)
when bringing back something to the foreground.
This commit is contained in:
Whisperity 2025-04-01 12:08:51 +02:00
commit 6f7a50dca8
2 changed files with 16 additions and 8 deletions

View file

@ -1,8 +1,10 @@
# fancy-ctrl-z
Allows pressing Ctrl-Z again to switch back to a background job.
Allows pressing Ctrl-Z again to switch back to the most recently backgrounded
job. If there are precisely two backgrounded jobs, Ctrl-Z will toggle between
them, bringing the other one back.
To use it, add `fancy-ctrl-z` to the plugins array in your zshrc file:
To use it, add `fancy-ctrl-z` to the `plugins` array in your `.zshrc` file:
```zsh
plugins=(... fancy-ctrl-z)
@ -11,14 +13,14 @@ plugins=(... fancy-ctrl-z)
## Motivation
I frequently need to execute random commands in my shell. To achieve it I pause
Vim by pressing Ctrl-z, type command and press fg<Enter> to switch back to Vim.
The fg part really hurts me. I just wanted to hit Ctrl-z once again to get back
Vim by pressing Ctrl-Z, type command and press fg<Enter> to switch back to Vim.
The fg part really hurts me. I just wanted to hit Ctrl-Z once again to get back
to Vim. I could not find a solution, so I developed one on my own that
works wonderfully with ZSH.
Source: http://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/
Credits:
- original idea by @sheerun
- added to OMZ by @mbologna
- original idea by [@sheerun](https://github.com/sheerun)
- added to OMZ by [@mbologna](https://github.com/mbologna)
- two-job switching added by [@Whisperity](https://github.com/Whisperity)

View file

@ -1,12 +1,18 @@
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
BUFFER="fg"
IFS=$'\n' local num_jobs=($(jobs))
if [[ "${#num_jobs[@]}" -eq 2 ]]; then
BUFFER="fg %-"
fi
zle accept-line -w
else
zle push-input -w
zle clear-screen -w
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z