it-swarm-ko.tech

tmux가 버퍼를 클립 보드에 복사하도록하기

Tmux 버퍼에있는 것을 내 클립 보드에 복사하는 적절한 방법을 찾으려고합니다. 나는 같은 몇 가지 다른 것을 시도했다

bind-key p select-pane -t 2 \; split-window 'xsel -i -b' \; paste-buffer

접두사 -p를 수행 한 후 control-d를 누르기 만하면됩니다.

나는 그렇게함으로써 그것을 고치려고 노력했다.

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE\; tmux paste-buffer\; echo HERE'

그러나 그것은 효과가 없습니다. 사실 이걸 그냥 페어링하면

bind-key p select-pane -t 2 \; split-window 'xsel -i -b << HERE'

그것은 아무것도하지 않으므로 분할 창은 쉘 명령에서 <<을 좋아하지 않는다고 가정합니다.

어떤 아이디어?

수정 : select-pane -t 2 원한다면 정말 중요하지 않습니다. 나는 단지 특정 레이아웃을 사용하고 창 2는 기본적으로 스플릿과 관련된 바인딩에 들어가기 위해 다른 것을 할 때 나누는 것을 선호합니다.

121
Digital Powers

여기 문서에는 개행이 필요합니다. 예를 들어, 셸 스크립트에서

cat <<EOF >somefile; echo  done
file contents
EOF

나는 tmux를 사용하여 줄 바꿈을 할 수 있다고 생각하지 않으며 그렇게하더라도 이것이 좋은 접근 방식은 아닙니다. 데이터 자체에 한 줄에 HERE 만 포함 된 경우 (예 : .tmux.conf)?

버퍼 내용을 임시 파일에 쓰는 것이 좋습니다. 테스트되지 않은 :

bind-key p save-buffer ~/.tmux-buffer \; run-Shell "xsel -i -b <~/.tmux-buffer && rm ~/.tmux-buffer"

두 개의 개별 tmux 인스턴스에서이 명령을 사용하면 경쟁 조건이 있습니다. 이 문제를 해결하는 방법을 모르겠습니다.

이것은 작동해야합니다 :

# move x clipboard into tmux paste buffer
bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer"
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i"
94
Grauwolf

Mac OS-X를위한 더 간단한 솔루션

이것은 Alex의 답변을 기반으로하며 당시 존재하지 않은 것들을 사용합니다.

homebrew 를 사용하고 있다면 (그렇지 않은 이유는 무엇입니까?) 다음과 같이하면됩니다 :

brew install reattach-to-user-namespace

그런 다음 ~/.tmux.conf :

set-option -g default-command "reattach-to-user-namespace -l zsh" # or bash...
bind C-c run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
bind C-v run "reattach-to-user-namespace pbpaste | tmux load-buffer - && tmux paste-buffer"

Tmux의 버퍼 를 (tmux를 사용하여 이미 복사 했어야 함) Mac 보드에 복사하려면 <tmux-key> Control-c. 이제 Command-v 또는 pbpaste

Mac 보드에서 무언가를 붙여 넣으려면 <tmux-key> Control-v.

41
docwhat

copy-pipe 명령은 버전 1.8부터 추가되었습니다. 선택 사항을 tmux 버퍼에 복사하고 명령으로 파이프합니다. 이제 접두사 바인딩이 필요하지 않습니다. 예를 들면 다음과 같습니다.

bind -t vi-copy y copy-pipe "xclip"

# For OS X users:
bind -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

이제 copy-modey 해당 텍스트를 tmux 버퍼 및 OS 클립 보드에 복사합니다. 그러나 클립 보드에서 tmux 버퍼로 텍스트를 가져 오려는 경우 도움이되지 않습니다.

40
Tyler Holien

tmux-yank plugin 을 시도 할 수 있습니다. 그것은 시스템 클립 보드 (OS X 및 Linux)와 현재 쉘 라인을 잡아 당기는 것과 같은 다른 것들로 바로 복사 할 수 있습니다.

16
user80379

다음은 포괄적 인 답변을 시도한 것입니다.

먼저 작은 역사

이 질문을 처음 받았을 때 (2011 년 6 월) Tmux에서 클립 보드로 텍스트를 복사하는 작업은 2 단계 과정이어야했습니다. 먼저 선택한 텍스트를 Tmux의 버퍼로 복사 한 다음 Tmux의 버퍼에서 시스템 클립 보드로 텍스트를 복사하십시오.

1.8 (2013 년 3 월)에 copy-pipe 명령이 추가되어 선택한 텍스트를 시스템 클립 보드 (또는 다른 대상)에 바로 복사 할 수 있습니다.

그런 다음 2.4 (2017 년 4 월)에서 주요 테이블이 크게 변경되어이 페이지의 많은 답변이 더 이상 사용되지 않습니다.

원래 질문에 대답

리눅스 :

bind-key C-y run-Shell "tmux save-buffer - | xclip -i -r > /dev/null" \; display-message "Copied tmux buffer to selection"
bind-key C-Y run-Shell "tmux save-buffer - | xclip -i -r -selection clipboard > /dev/null" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"

Mac :

homebrew 를 사용하는 경우 터미널에서 다음 명령을 실행하여 reattach-to-user-namespace를 설치해야합니다.

brew install reattach-to-user-namespace

그런 다음 ~/.tmux.conf에서

bind-key C-y run-Shell "tmux save-buffer - | reattach-to-user-namespace pbcopy" \; display-message "Copied tmux buffer to clipboard"
bind-key C-p run-Shell "reattach-to-user-namespace pbpaste | tmux load-buffer - ; tmux paste-buffer"

더 짧은 방법 (tmux> 2.4의 경우 클립 보드에서 직접 선택 영역을 복사하여 붙여 넣기)

참고 : Linux에는 기본 및 보조 클립 보드 (선택이라고도 함)가 있으므로 Linux에는 두 가지 버전이 있습니다.

리눅스 :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -r" \; display-message "Copied to selection"
bind-key -T copy-mode-vi Y send-keys -X copy-pipe "xclip -r -selection clipboard" \; display-message "Copied to clipboard"
bind-key C-p run-Shell "xclip -o | tmux load-buffer - && tmux paste-buffer"

Mac :

bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy" \; display-message "Copied to clipboard"

이 명령 사용자 정의

  • 명령이 상태 표시 줄에서 수행 한 작업을 알려주지 않게하려면 display-message와 그 앞에 오는 \;를 제거하십시오.

  • Vi 대신 Emacs 스타일 복사 모드를 사용하는 경우 copy-mode-vi 인스턴스를 copy-mode로 바꾸십시오.

  • Linux를 실행 중이고 xsel 대신 xclip를 사용하려면 xclip -rxsel -i -p로 바꾸고 xclip -oxsel -o -p

  • -rxclip -r는 선택 사항이며 마지막 줄 바꿈을 제거합니다. 명령을 복사하는 데 유용하며 붙여 넣을 때 즉시 실행되지 않습니다.

  • SSH를 통해 터널링하는 경우 https://unix.stackexchange.com/a/354581/14252

참조 :

10
Jason Axelson

다른 솔루션을 시도한 후 최종 설정은 다음과 같습니다.

# move x clipboard into tmux paste buffer
bind C-p run "xclip -o | tmux load-buffer -
# move tmux copy buffer into x clipboard
bind C-y run "tmux save-buffer - | xclip -i -selection clipboard"

show-buffer 대신 save-buffer를 사용하면 분할 된 상태에서 줄 바꿈으로 표시된대로 데이터없이 실제 데이터를 제공합니다.

또한 이것을 사용하여 tmux 복사 모드에서 선택/복사를 시작합니다.

bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

복사 선택을 'y'키와 병합하고 x 클립 보드로 옮길 수 있다고 생각합니다.

9
Ownatik

나는 여분의 키 누름을 좋아하지 않기 때문에 더 야심 찬 것을 원했습니다. [를 사용하여 복사 모드를 시작하고 오른쪽 텍스트를 강조 표시 한 다음]를 눌러 텍스트를 클립 보드에 복사하십시오.

또한 tmux는 줄 바꿈하는 표현식에 줄 바꿈을 포함하는 것을 좋아합니다 (이상하게도 줄 바꿈은 wrong 장소에 있습니다! 그래서 C-]가 개행을 제거하는 표현식을 복사하기를 원했습니다.

Tmux 1.6에서 나는 이것을 시도했다 :

bind [ copy-mode
bind -t vi-copy ] run "tmux send-keys Enter; tmux show-buffer | xclip -i -selection clipboard;"
bind -t vi-copy C-] run "tmux send-keys Enter; tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard;"

그러나 tmux가 복잡한 것을 vi-copy 테이블에 바인딩하는 것을 좋아하지 않기 때문에 작동하지 않았습니다. 그래서 나는 이것을 대신해서 끝내었다.

bind [ copy-mode \;                                                        \
    bind -n ] run                                                          \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | xclip -i -selection clipboard;                     \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]" \;                                                  \
    bind -n C-] run                                                        \
    "tmux send-keys Enter;                                                 \
     tmux show-buffer | Perl -pe 's/\n//' | xclip -i -selection clipboard; \
     tmux unbind -n C-];                                                   \
     tmux unbind -n ]"

] 또는 C-] 이외의 다른 방법으로 복사 모드를 종료하면 이상한 일 (] 또는 C-]이 다음에 사용할 때 재밌게 작동합니다. 이것은 내가 상상 한 바인딩으로 더 고칠 수 있지만, 대부분의 시간을 원합니다.

7
Leif

Mac OS X 용 솔루션. 다음 두 단계를 수행하십시오.

  1. Chris Johnsen의 해결 방법을 사용하십시오. https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. 이 코드를 tmux 구성에 추가하십시오 (~/.tmux.conf)

# paste clipboard into tmux buffer
bind v run-Shell "reattach-to-user-namespace -l zsh -c 'tmux set-buffer \\"$(pbpaste)\\"; tmux paste-buffer'"
# put tmux buffer into x clipboard
bind y run-Shell "reattach-to-user-namespace -l zsh -c 'tmux show-buffer | pbcopy'"
4
Alex Gaudio

이것은 xclip을 사용하여 원격 (ssh) tmux 세션에서 버퍼를 복사하는 데있어 두 가지 주요 문제를 해결 해야하는 다소 긴 대답입니다.

1. 무 반응 xclip

나에게 @Grauwolf의 answerxclip 작동하지 않았습니다 (tmux 창을 완전히 응답하지 않습니다). 아치 위키의 Tmux 페이지 에서 이유를 찾았습니다.

xsel은 xsel과 달리 현재 로케일에 맞지 않는 원시 비트 스트림을 인쇄하는 데 더 효과적입니다. 그럼에도 불구하고 xclip은 tmux의 버퍼에서 읽은 후에 STDOUT을 닫지 않기 때문에 xclip 대신 xsel을 사용하는 것이 더 좋습니다. 따라서 tmux는 복사 작업이 완료되었음을 알지 못하고 xclip이 종료 될 때까지 계속 기다리므로 tmux가 응답하지 않습니다. 해결 방법은 xclip의 STDOUT을/dev/null로 리디렉션합니다

따라서 바인딩은 다음과 같아야합니다.

bind-key C-y run "tmux save-buffer - | xclip -i -sel clip > /dev/null"

이제 tmux 세션이 로컬 인 경우 작동합니다.

2. xclip을 X에 연결할 수 없습니다

ssh에서 tmux를 사용하는 경우 -X,이 작동하지 않습니다 직접 가능성이 큽니다.

Shell 변수 $DISPLAY를 올바르게 설정해야하기 때문입니다.

완벽한 솔루션

그래서 나를 위해 완벽한 작업 솔루션~/.tmux.conf에 다음 줄을 넣는 것입니다.

set-option -g update-environment "DISPLAY"
bind-key C-y run "export DISPLAY=`tmux show-env | sed -n 's/^DISPLAY=//p'`; tmux save-buffer - | xclip -i -selection clipboard >/dev/null"
# Or more concise:
bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's/^DISPLAY=//p'` >/dev/null

기본에서 붙여 넣기 :

bind-key C-p run "xclip -d `tmux show-env | sed -n s/^DISPLAY=//p` -o | tmux load-buffer - && tmux paste-buffer"

$DISPLAY를 소싱하는 동안 .tmux.conf가 올바르게 설정되지 않은 이유를 완전히 이해하지 못하므로 tmux show-envsed로 추출해야합니다. .

Tmux> = 1.8 인 경우 copy-pipe를 사용하여이 명령을 적용 할 수 있습니다.

bind-key -t vi-copy y copy-pipe 'xclip -in -selection clipboard -d `tmux show-env | sed -n s/^DISPLAY=//p` >/dev/null'
4
PlasmaBinturong

내가 받아 들인 대답의 약간 수정 된 변형.

또한 xclip의 primary 기본 클립 보드 (마우스 선택 및 마우스 가운데 클릭과 함께 제공되는 클립 보드) 외에 시스템 클립 보드 (Ctrl-C, Ctrl-V)를 사용하는 것이 좋습니다. 시스템 클립 보드를 선택하려면 -selection clipboardxclip에 대한 인수.

또한 버퍼를 클립 보드에 복사하는 동안 복사 할 버퍼를 선택할 수있는 기능이 좋습니다. choose-buffer 그런 다음 인수를 save-buffer 사용하여 -b %%.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b %% - | xclip -i -selection clipboard\""
# Paste from clipboard
bind C-v run "xclip -o -selection clipboard | tmux load-buffer - ; tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b %% - | xclip -i \""
# Paste from primary
bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"

PDATE : 어떻게 든 tmux 1.8과 두 개의 openSUSE 12.2 설치에서 tmux run-Shell는 파이프를 통해 stdin에서 읽는 xclip로 호출됩니다. 나는 대신 xsel를 시험해보기로 결정했고 효과가있는 것 같습니다. 이들은 xsel를 사용하는 동등한 키 바인딩입니다. 나는 또한 && 더 강력하게 붙여 넣기 명령을 연결합니다.

# Copy into clipboard
bind C-c choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i -b\""
# Paste from clipboard
bind C-v run "xsel -o -b | tmux load-buffer - && tmux paste-buffer"
# Copy into primary
bind C-y choose-buffer "run \"tmux save-buffer -b '%%' - | xsel -i\""
# Paste from primary
bind C-p run "xsel -o | tmux load-buffer - && tmux paste-buffer"
4
Tuxdude

xclip를 사용하여 Arch Wiki에 대한 해결책이 있습니다.

# move tmux copy buffer into x clipboard
bind-key C-y save-buffer /tmp/tmux-buffer \; run-Shell "cat /tmp/tmux-buffer | xclip"

https://wiki.archlinux.org/index.php/Tmux

4
jasonwryan

이 답변 중 많은 부분이 zsh의 우분투 14.04에서 그대로 작동하지 않았습니다. 내 셸이 그와 관련이 있는지 확실하지 않지만 복사에는 이 전략 , 붙여 넣기에는 이 전략 을 사용하는 작업 버전이 있습니다.

    bind-key -t vi-copy 'v' begin-selection
    bind-key -t vi-copy 'y' copy-pipe "xclip -sel clip -i"
    bind-key ] run-Shell "xclip -sel clip -o | tmux load-buffer - ; tmux paste-buffer" 

몇 가지 참고 사항 :

  • 복사 파이프의 경우 클립 보드를 -sel clip -i. 이 줄은 yank를 tmux 버퍼에 결합하여 xclip으로 보냅니다.
  • 실제로 붙여 넣으려면 -sel clip -o

이것은 vim/zsh/tmux 설정에서 아름답게 작동합니다.

3
brianclements

Tmux 버퍼에있는 것을 내 클립 보드에 복사하는 적절한 방법을 찾으려고합니다. 나는 같은 몇 가지 다른 것을 시도했다

Emacs 스타일 바인딩에는 몇 가지 다른 옵션이 있습니다. (Vi-style이 비슷해야합니까?) emacs에서 "복사 선택"을 수행하는 일반적인 바인딩은 M-w이므로 tmux에서 동일한 바인딩을 갖는 것이 매우 편리합니다.

1-이상적이지만 작동하지 않습니다 (tmux 제한으로 인해?)

unbind-key -t emacs-copy M-w
bind-key -t emacs-copy M-w copy-selection\; \
  run-Shell "tmux save-buffer - | xsel --input --clipboard"

2-나에게 잘 맞는 손상 : tmux에서 emacs-copy에 다른 키 바인딩을 사용하도록 허용하십시오. 예를 들어 C-M-w를 사용하십시오. (이 바인딩은 복사 모드뿐만 아니라 복사 모드에서만 유용하게 "전역 적으로"정의됩니다)

bind-key -n C-M-w send-keys M-w\; \
 run-Shell "tmux save-buffer - | xsel --input --clipboard" 
3
Hugo Heden

@Leif 답변의 개선 된 버전은 다음과 같습니다.

tmux bind-key '[' run "tmux copy-mode;
tmux bind-key -n ']' run \"tmux send-keys Enter; tmux save-buffer - | xclip -i -selection clipboard;
tmux unbind-key -n ']'\";
tmux bind-key -n q run \"tmux unbind -n ']'; tmux send-keys q\";
tmux bind-key -n C-c run \"tmux unbind -n ']'; tmux send-keys C-c\""

이런 식으로] 이외의 다른 방법으로 복사 모드를 종료하면 위의 코드가 tundle/tmux-yank tmux 텍스트를 시스템 클립 보드에 복사하기위한 tmux 플러그인으로 랩핑됩니다. OS X 및 Linux에서 tmux> = 1.6.

1
Javier López

Tmux 버전 2.2 이상이 설치된 OS-X에서는 다음이 작동합니다.

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"
1
Kyle Kloepper

copyq 여러 줄 클립 보드 관리자를 사용합니다. (Windows, OSX, Linux에서 작동합니다.)

  • ~/.tmux.conf에 다음 줄을 추가하십시오.

    set-window-option -g mode-keys vi
    bind C-y run 'out=`tmux save-buffer - ` && copyq add "$out"'
    
  • cygwincopyq.exe~/.bashrc 위치를 요구합니다.

    export PATH="$PATH:/cygdrive/c/Program Files (x86)/CopyQ"
    
1
Oleg Svechkarenko