配置 zsh 作业输出和 fg 行为

配置 zsh 作业输出和 fg 行为

直到最近,我对zsh 中的fgand命令的工作方式还非常满意,即:jobs

  • 只是fg-> 再次将最近的后台作业置于前台
  • jobs-> 显示命令名称(包括参数),甚至可能是 PID(不记得了)

在最新的 Fedora 33 更新之后,这些 zsh 行为以一种(对我来说)非常烦人的方式发生了变化:

  • fg现在将作业 ID 最低的作业置于前台(即不是最近后台作业)
  • “jobs”输出更加简洁,例如:
[3]  + suspended (signal)  mutt
[4]  - suspended

其中工作4是 vim 会话...

所以我推测一些 zsh 默认值发生了变化。因此我的问题是:如何配置更有用的行为fgjobs返回?

(这意味着我如何才能jobs始终显示带有参数和 pid 的命令名称,并将fg最近的后台作业置于前台?)

(我目前在 zsh-5.8-3.fc33.x86_64。)

编辑1:示例会话:

$ zsh
~ $ man man

zsh: suspended  man man
~ $ vim blah
zsh: suspended  
~ $ jobs
[1]  - suspended  man man
[2]  + suspended  
~ $ fg
[2]  - continued  

zsh: suspended  
zsh: suspended  
~ $ jobs
[1]  + suspended  man man
[2]  - suspended

CtrlZ请注意,我每次都通过暂停前台作业。+在输出中查找标记jobs。同样让我惊讶的是,zsh: suspended第二次暂停 vim 后我得到了 2 行。看起来挂起信号再次传递给已经挂起的 man 进程?

编辑2:仅当一项作业为 时,才会出现作业控制问题vim。因此,关于如何调用 vim 的一些细节:

$ which vim
vim=__vi_internal_vim_alias
$ alias vim
vim=__vi_internal_vim_alias
$ typeset -f __vi_internal_vim_alias
__vi_internal_vim_alias () {
    (
        test -f /usr/bin/vim && exec /usr/bin/vim "$@"
        test -f /usr/bin/vi && exec /usr/bin/vi "$@"
    )
}

好吧,这些定义不是来自我的个人资料。看来它们来自系统更改。如果我调用vim作业\vim控制问题就不会再出现。看起来子 shell 弄乱了 zsh 的命令行字符串创建和其他东西。也可以看看其他有关的报告

那么这是从哪里来的:

$ cd /etc
$ grep -r __vi_internal_vim_alias . -r 2>/dev/null
./profile.d/vim.sh:__vi_internal_vim_alias()
./profile.d/vim.sh:        alias vi=__vi_internal_vim_alias
./profile.d/vim.sh:        alias vim=__vi_internal_vim_alias
./profile.d/vi.sh:__vi_internal_vim_alias()
./profile.d/vi.sh:        alias vi=__vi_internal_vim_alias
./profile.d/vi.sh:        alias vim=__vi_internal_vim_alias
$ rpm -qf ./profile.d/vim.sh 
vim-enhanced-8.2.2146-2.fc33.x86_64
$ rpm -qf ./profile.d/vi.sh 
vim-minimal-8.2.2146-2.fc33.x86_64

答案1

这是由 Fedora 开始定义vim在子 shell 中启动 vim 的系统范围别名引起的。

由于这似乎破坏了左右的东西,这些别名现在正在回滚:https://bugzilla.redhat.com/show_bug.cgi?id=1918575

相关内容