구성 없이 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이 셸을 사용하여 xclip을 실행하는 반면 Nvim은 셸 없이 xclip을 실행하기 때문에 발생한 것이라고 생각됩니다. 가설을 테스트하기 위해 동일한 실험을 반복했지만 이번에는 파일에 작성하고 hello
대신 xclip을 사용하여 시작했습니다. 전자는 셸 없이 프로세스를 시작할 수 있기 때문입니다(실험 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
.
중간 쉘 생성이 왜 문제인지 알고 싶습니다. 그래서,실험 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이 생성한 중간 셸을 볼 수 없습니다(아마도 Vim이 종료되고 xclip이 upstart 프로세스의 부모가 다시 지정되었기 때문일 것입니다).
그러면 랩 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)