
Если я запускаю tmux без конфигурации:
$ tmux -Ltest -f/dev/null new
затем запустите Vim без конфигурации:
$ vim -Nu NONE
затем из Vim запустите xclip, чтобы записать hello
в буфер обмена:
:call system('xclip -selection clipboard', 'hello')
затем выйдите из Vim:
:q
hello
все еще находится в буфере обмена; $ xclip -selection clipboard -o
выводит hello
.
Если я повторю тот же эксперимент, но запущу Vim в разделенном окне tmux (эксперимент 2):
$ tmux splitw vim -Nu NONE
как только я выхожу из Vim, процесс xclip завершается и буфер обмена пустеет.
Если я повторю тот же эксперимент, но с Nvim (эксперимент 3), процесс xclip не будет убит, а буфер обмена сохранится. Я посмотрел :h vim-differences
в документации Nvim и нашел это:
|system()|, |systemlist()| can run {cmd} directly (without 'shell')
Это заставило меня подумать, что проблема связана с тем, что Vim запускает xclip с оболочкой, а Nvim — без нее. Чтобы проверить свою гипотезу, я повторил тот же эксперимент, но на этот раз я записал hello
файл и запустил xclip с помощью job_start()
вместо system()
, поскольку первый может запустить процесс без оболочки (эксперимент 4):
$ 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
.
Я хотел понять, почему создание промежуточной оболочки было проблемой. Итак, вэксперимент 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 (возможно, потому, что она была завершена, а xclip был переназначен на процесс upstart).
Так почему же xclip завершается, когда я выхожу из Vim в эксперименте 2, но не завершается, когда я выхожу из Vim в эксперименте 4?
Редактировать:
Вывод $ 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)