对评论的回应

对评论的回应

我运行了很多 vim 窗口,并且经常将它们放在 bg 中。问题是vim我列出的时候他们都说了jobs,所以很难区分。

[1]  - suspended  nvim
[2]  - suspended  nvim
[3]  + suspended  nvim

解决此问题的一种方法是在启动 vim 时打开特定文件:

nvim ./myfile

jobs:

[1]  + suspended  nvim myfile

但这是一个糟糕的名字替代品。

另一种选择是(错误)使用这样的环境变量来命名缓冲区:

vim name=my_name

但是 的输出jobs可能更有用,并且缺点是需要在启动进程时为可能不需要的进程背景做好准备。

[1]  - suspended  nvim name=my_name
[2]  + suspended  nvim name=other_name

理想情况下,当我按下 时,我希望被要求为该进程指定一个可选名称ctl-z。也许有一个插件可以处理这个问题,但我还没有找到。

我想自己写,但不知道从哪里开始。大概是通过重新映射ctl-z到其他程序?也许我必须写一些位于前面fgjobs控制输出的东西......

对此有何建议?

答案1

您可以编写一个 shell 函数nvim来检查与其名称和当前参数相匹配的后台作业。如果找到,则会将其带回到前台。如果没有,则运行新的命令行。

您可以使用 shell 历史记录,而不用再次输入整个命令:

  1. 您启动了新命令nvim foo.txt
  2. 您将此命令放在后台。
  3. [使用典型的 bash 配置] 按Ctrlr foo应该会显示,nvim foo.txt因此您只需按Enter再次运行命令行即可调用 shell 函数并使您返回暂停的 vim 进程。

对评论的回应

Ctrl-z不是那样工作的。它没有分配任何可配置的 shell 函数。您可以检查bash所有字母(以及其他几个字符):

start cmd:> bind -p | grep -F '\C-a'
"\C-a": beginning-of-line

它们中的大多数在 shell 中都有一些配置(即在readline其提示编辑组件中),但没有Ctrl- z。原因是这是在其他地方定义的,具有“更高的优先级”,因此它永远不会到达 shell:

start cmd:> stty -a
speed 38400 baud; rows 47; columns 210; line = 0;
intr = ^C; [...] kill = ^U; eof = ^D; [...] start = ^Q; stop = ^S; susp = ^Z;

终端仿真器捕获此组合键并向SIGTSTP前台进程组发送 (TERMINAL STOP) 信号:

start cmd:> strace -f -p 20171
strace: Process 20171 attached
restart_syscall(<... resuming interrupted read ...>) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTSTP {si_signo=SIGTSTP, si_code=SI_KERNEL} ---
--- stopped by SIGTSTP ---
--- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=3583, si_uid=1000} ---

这就是内核级别发生的事情。前台进程停止(因为它没有捕获该信号),并且 shell 被告知其子进程已收到来自内核的信号并已停止。运行fg导致最后一行,即从用户进程(shell)发送的继续信号。

相关内容