tmux xclip 복사가 더 이상 작동하지 않습니다.

tmux xclip 복사가 더 이상 작동하지 않습니다.

mu Ubuntu 12.04 설정에서 내 tmux 클립보드 복사 및 붙여넣기 명령은 다음과 같이 설정됩니다.

set -g prefix M-a
unbind C-b
bind C-c run "tmux save-buffer - | xclip -i -sel clipboard"
bind C-v run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

위의 내용을 위반하는 구성 변경이나 패키지 변경이 있었던 것으로 의심되는 약 한 달 전까지는 오랫동안 잘 작동했습니다. 그놈 터미널에서는 prefix+ ctrl-v와 붙여넣기를 사용해도 여전히 잘 작동합니다 ctrl-shift-v.

그러나 내가 무엇을 하든 복사 명령이 더 이상 작동하지 않으며 위의 사용자 지정 접두사 바인딩을 제거하여 을 사용하는 대신 사용하거나 사용하지 않는 등의 방법을 xclip시도해 보았습니다. 나 같은 GVim 사용자에게는 쉘을 인계받기 위해 tmux를 사용하는 GNOME 터미널 해결 방법 조차 없기 때문에 이는 거의 놀라운 일입니다 . 복사 모드로 들어가서 + 로 텍스트를 선택하고 + 를 해도 아무 일도 일어나지 않습니다. 그때까지 tmux는 하단의 알림 섹션에 확인 메시지를 표시합니다.-select-selclipboardctrl-shift-cspacemovementprefixctrl-c

누구든지 이것을 디버깅하는 방법에 대한 제안이 있습니까? 이는 생산성에 상당한 타격을 줍니다. 사용할 수도 있겠네요현재 임시 파일 솔루션, 하지만 무슨 일이 일어나고 있는지 알게 되어 기쁩니다 xclip.

답변1

이것xsel이 유틸리티는 와 유사 xclip하지만 약간 다르게 구현됩니다. 일반적으로 나는 그들이 동일한 방식으로 작동하기를 원하지만 정확히 동일한 X 라이브러리 호출을 수행하지 않으므로 일부 경우에는 작동 xsel하지만 작동하지 않거나 xclip그 반대의 경우도 있습니다. 노력하다:

bind C-c run "tmux save-buffer - | xsel -ib"
bind C-v run "tmux set-buffer \"$(xsel -ob)\"; tmux paste-buffer"

답변2

-bto run-shell(또는 ) 명령을 추가하면 run문제가 해결되었습니다. 쉘 -b명령은 백그라운드에서 실행됩니다.

bind C-c run-shell -b "tmux save-buffer - | xclip -i -sel clipboard"

답변3

더 이상 재현할 수는 없지만 귀하의 경우에 발생할 수 있는 상황에 대한 기술적 답변은 다음과 같습니다.

먼저 X11 클립보드의 작동 방식을 이해해야 합니다. jwz의 기사를 읽어보세요:http://www.jwz.org/doc/x-cut-and-paste.html

즉, 클립보드 내용을 보유한 애플리케이션은 다른 애플리케이션이 소유권을 주장할 때까지 실행되어야 합니다. 따라서 를 실행하면 xclip -i <<< test다른 항목을 선택할 때까지 xclip이 백그라운드에서 실행되는 것을 볼 수 있습니다.

$ xclip -i <<< test
$ ps
  PID TTY          TIME CMD
10166 pts/8    00:00:00 xclip
10171 pts/8    00:00:00 ps
19345 pts/8    00:00:00 bash

이제 모든 것이 정상이지만 이 셸을 종료하면 기본적으로 이 세션에 속한 모든 프로세스가 HUP 신호를 보내 종료됩니다. 이는 xclip이 종료되고 더 이상 클립보드 내용에 접근할 수 없음을 의미합니다.

따라서 권장되는 해결 방법(xsel이 없는 경우)은 다음 바인딩을 사용하여 HUP 신호를 무시하는 것입니다.

bind C-c run "tmux save-buffer - | nohup >/dev/null 2>/dev/null xclip -i -sel clipboard"

xsel이 문제의 영향을 받지 않습니다. 왜냐하면 fork() 이후 가장 먼저 수행하는 작업은 제어 터미널에서 자신을 분리하여 쉘이 종료될 때 HUP 신호를 수신하지 않기 때문입니다(위의 ps에서도 볼 수 없습니다). 출력되지만 )을 수행하는 경우에만 해당됩니다 ps -e | grep xsel.

답변4

이것은 오래된 질문이지만 다음에서 가져온 해결책이 있다고 생각합니다.Arch wiki의 Tmux 페이지:

xclip은 이 목적으로도 사용할 수 있으며 xsel과 달리 현재 로케일에 적합하지 않은 원시 비트스트림을 인쇄하는 데 더 좋습니다. 그래도 xclip은 tmux 버퍼에서 데이터를 읽은 후 STDOUT을 닫지 않으므로 xclip 대신 xsel을 사용하는 것이 더 깔끔합니다. 따라서 tmux는 복사 작업이 완료된 것을 알지 못하지만 xclip이 종료될 때까지 계속 기다리므로 tmux가 응답하지 않게 됩니다. 해결책은xclip의 STDOUT을 /dev/null로 리디렉션

따라서 명령은 다음과 같아야 합니다.

bind C-c run "tmux save-buffer - | xclip -i -sel clipboard >/dev/null"

관련 정보