From 6f7a50dca8f106c93281c920c351c17a41e45d23 Mon Sep 17 00:00:00 2001 From: Whisperity Date: Tue, 1 Apr 2025 12:08:51 +0200 Subject: [PATCH] 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. --- plugins/fancy-ctrl-z/README.md | 16 +++++++++------- plugins/fancy-ctrl-z/fancy-ctrl-z.plugin.zsh | 8 +++++++- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/plugins/fancy-ctrl-z/README.md b/plugins/fancy-ctrl-z/README.md index 7766c51eb..388e402d0 100644 --- a/plugins/fancy-ctrl-z/README.md +++ b/plugins/fancy-ctrl-z/README.md @@ -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 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 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) diff --git a/plugins/fancy-ctrl-z/fancy-ctrl-z.plugin.zsh b/plugins/fancy-ctrl-z/fancy-ctrl-z.plugin.zsh index 82b968894..c32512174 100644 --- a/plugins/fancy-ctrl-z/fancy-ctrl-z.plugin.zsh +++ b/plugins/fancy-ctrl-z/fancy-ctrl-z.plugin.zsh @@ -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 -