交换 shell 前台/后台作业的键绑定

交换 shell 前台/后台作业的键绑定

尽管大量tmux使用和在窗格之间切换,我仍然经常使用 shell 作业控制。当有东西需要戳时,我会将我正在使用的工具背景化Ctrl+ Z,戳东西,然后fg再次使用该工具。问题是有时“戳”会变成使用另一种工具,我想来回几次。

是否可以绑定另一个被 shell 捕获的键(即从未传递到前台应用程序),该键将当前作业置于后台并前台运行,无论最近的后台作业是什么?

答案1

这使得只要您有超过 1 个作业暂停,发布CTRL+就会立即恢复之前的作业。Z退出 while 循环的唯一方法是关闭程序,直到最多留下 1 个后台程序。

function fgstack() {
  local n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
  while [[ n_jobs -gt 1 ]]; do
    fg %-;
    n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
  done
}

如果你想给自己一个机会摆脱两个作业循环,那么在 0.2 秒过去之前暂停一个作业可以吗CTRL+ Z+ Z: (zsh - 对于 bash,你需要使用其他东西来获取时间) :

function fgstack() {
  local n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
  while [[ n_jobs -gt 1 ]]; do
    if [[ $SECONDS -lt 0.2 ]]; then
      break
    fi
    typeset -F SECONDS=0
    fg %-;
    n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
  done
}

这是另一个,需要弗兹夫但如果您有两个以上的选项可供选择,则会为您提供一个菜单:

function fgstack() {
  local n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
  while [[ n_jobs -gt 1 ]]; do
    if [[ n_jobs -eq 2 ]]; then
      fg %-;
    else
     job=$(jobs | fzf -0 -1 | tr -cd "[:digit:]") && fg %$job
    fi
    n_jobs=$(jobs | tr -cd "[:digit:][:space:]" | wc -l)
  done

在 zsh 和 bash 中测试 - bash 似乎在调用函数后从第一个后台作业返回后退出 while 循环,如果有人知道如何解决这个问题,欢迎编辑和评论!

相关内容