如果我在没有配置的情况下启动 tmux:
$ tmux -Ltest -f/dev/null new
然后在没有配置的情况下启动 Vim:
$ vim -Nu NONE
hello
然后从 Vim 运行 xclip 以在剪贴板中写入:
:call system('xclip -selection clipboard', 'hello')
然后退出 Vim:
:q
hello
仍在剪贴板中;$ xclip -selection clipboard -o
输出hello
。
如果我重复相同的实验,但在 tmux 分割窗口中启动 Vim(实验 2):
$ tmux splitw vim -Nu NONE
一旦我退出 Vim,xclip 进程就会被终止,剪贴板为空。
如果我重复相同的实验,但使用 Nvim(实验 3),xclip 进程不会被终止,并且剪贴板仍然存在。我查看了:h vim-differences
Nvim 的文档并发现了这一点:
|system()|, |systemlist()| can run {cmd} directly (without 'shell')
这让我认为这个问题是由于 Vim 用 shell 启动 xclip,而 Nvim 在没有 shell 的情况下启动它。为了验证我的假设,我重复了相同的实验,但这一次,我在一个文件中写入,并使用而不是hello
启动 xclip ,因为前者可以在没有 shell 的情况下启动进程(实验 4):job_start()
system()
$ echo hello >/tmp/file
$ tmux -Ltest -f/dev/null new
$ tmux splitw vim -Nu NONE
:call job_start('xclip -selection clipboard /tmp/file')
:q
事实上,退出 Vim 后,xclip 进程仍然存在,并且剪贴板仍然包含hello
.
我想了解为什么中间 shell 的创建是一个问题。所以,在实验2,在退出Vim之前,我检查了xclip进程的祖先:
$ pstree -s -p $(pidof xclip)
systemd(1)---lightdm(951)---lightdm(1126)---upstart(1156)---xclip(15389)
同样的事情在实验4:
$ pstree -s -p $(pidof xclip)
systemd(1)---lightdm(951)---lightdm(1126)---upstart(1156)---xclip(18541)
进程树是相同的,我看不到 Vim 创建的中间 shell(可能是因为它被杀死并且 xclip 被重新设置为新贵进程的父级)。
那么为什么当我在实验 2 中退出 Vim 时 xclip 会被杀死,而当我在实验 4 中退出 Vim 时 xclip 不会被杀死呢?
编辑:
输出$ uname -a
:
Linux ubuntu 4.15.0-51-generic #55~16.04.1-Ubuntu SMP Thu May 16 09:24:37 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
输出$ vim --version | head -n2
:
VIM - Vi IMproved 8.1 (2018 May 18, compiled May 30 2019 04:42:18)
Included patches: 1-1421
输出$ tmux -V
:
tmux next-3.1
输出$ zsh --version
:
zsh 5.7.1 (x86_64-pc-linux-gnu)