it-swarm-tr.com

Tamponu panoya kopyalamak için tmux alma

Bir tmux arabellek ne panoya kopyalamak için iyi bir yol bulmaya çalışıyorum. Gibi birkaç farklı şey denedim

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

bu beni oldukça yaklaştırıyor, tek yapmam gereken önek-p yaptıktan sonra kontrol-d tuşuna basmak.

Yaparak düzeltmeyi denedim

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

Ama bu işe yaramıyor. Aslında bunu sadece

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

hiçbir şey yapmaz, bu yüzden bölünmüş pencerenin bir Shell komutunda << beğenmediğini varsayıyorum.

Herhangi bir fikir?

Düzenleme: select-pane -t 2 istiyorsanız, gerçekten önemli değil. Sadece belirli bir düzen kullanıyorum ve bölme 2, başka bir şey yaparken bölmeyi tercih ettiğim, böylece varsayılan olarak bölmeleri içeren bağlarıma giriyor.

121
Digital Powers

Burada belgelerin yeni satırlara ihtiyacı var. Örneğin, bir Shell betiğinde,

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

Tmux'un yeni satırlar koymanıza izin vermediğini düşünmüyorum ve öyle olsa bile, bu iyi bir yaklaşım olmaz. Verilerin bir satırda tek başına HERE içeriyorsa (ör. .tmux.conf)?

Arabellek içeriğini geçici bir dosyaya yazmanızı öneririm. Test edilmemiş:

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

Bu komutu iki ayrı tmux örneğinde kullanırsanız bir yarış durumu vardır. Bunu nasıl çözeceğimi bilmiyorum.

Bu çalışmalı:

# 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 için daha basit bir çözüm

Bu Alex'in cevabından kaynaklanır ve o sırada var olmayan şeyleri kullanır.

homebrew (ve değilseniz, neden siz değilsiniz?)

brew install reattach-to-user-namespace

Sonra ~/.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"

arabelleğini tmux'dan (zaten tmux kullanarak bir şey kopyalamış olmalısınız) Mac çalışma alanına kopyalamak için <tmux-key> Control-c. Artık Command-v veya pbpaste

Mac çalışma alanındaki bir şeyi yapıştırmak için <tmux-key> Control-v.

41
docwhat

1.8 sürümünden itibaren copy-pipe Komutu eklendi. Bir seçimi tmux arabelleğine kopyalar ve bir komuta yönlendirir. Artık önek bağlamaya gerek yok. İşte bir örnek:

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

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

Şimdi copy-mode İçinde seçilmiş bir metin seçtiğinizde, y bu metni OS panosunun yanı sıra tmux arabelleğine de kopyalar. Ancak, panodan tmux arabelleğine metin almak istiyorsanız yardımcı olmaz.

40
Tyler Holien

Denemek isteyebilirsiniz tmux-yank eklentisi . Doğrudan sistem panosuna (OS X ve Linux) ve mevcut Shell satırını sorma gibi diğer güzelliklere kopyalamayı sağlar.

16
user80379

İşte kapsamlı bir cevap girişimi.

Önce küçük bir tarih

Bu soru ilk sorulduğunda (Haziran, 2011) Tmux'dan panoya metin kopyalamanın iki adımlı bir işlem olması gerekiyordu, önce seçilen metni Tmux'un arabelleğine kopyalayın, ardından metni Tmux'un arabelleğinden sistem panosuna kopyalayın.

1.8'de (Mart 2013), seçilen metni doğrudan sistem panosuna (veya başka bir hedefe) kopyalamanızı sağlayan copy-pipe Komutu eklendi.

Daha sonra 2.4'te (Nisan, 2017) anahtar tablolar önemli ölçüde değiştirildi ve bu sayfadaki cevapların çoğu eski.

Orijinal soruyu cevaplama

Linux :

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 kullanıyorsanız, bir terminalde aşağıdaki komutu çalıştırarak reattach-to-user-namespace Yüklemeniz gerekir:

brew install reattach-to-user-namespace

Sonra ~/.tmux.conf dosyasında:

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"

Daha Kısa Yöntem (bir seçimi doğrudan tmux> 2.4 için panoya kopyalayıp yapıştırın)

Not: Linux'un iki sürümü vardır çünkü Linux'un birincil ve ikincil panosu vardır (seçim olarak da bilinir).

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"

Bu komutları özelleştirme

  • Komutun size durum satırında ne yaptığını söylemesini istemiyorsanız, sadece display-message (Ve ondan önce gelen \;) Seçeneğini kaldırın.

  • Vi yerine Emacs tarzı kopyalama modunu kullanıyorsanız, copy-mode-vi Örneğinin yerine copy-mode

  • Linux kullanıyorsanız ve xsel yerine xclip kullanmak istiyorsanız, xclip -r Yerine xsel -i -p Ve xclip -o Yerine xsel -o -p

  • -r İçindeki xclip -r İsteğe bağlıdır, son yeni satırı kaldırır. Komutları kopyalamak için kullanışlıdır, daha sonra bunları yapıştırdığınızda hemen yürütülmezler.

  • SSH üzerinden tünel yapıyorsanız https://unix.stackexchange.com/a/354581/14252

Referanslar:

10
Jason Axelson

Farklı bir çözüm denedikten sonra, son kurulumum:

# 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 yerine save-buffer kullanıldığında, bölerken satır sonları ile gösterilen veriler olmadan gerçek veriler elde edilir.

Ayrıca tmux kopyalama modunda seçimi/kopyalamayı başlatmak için bunu kullanıyorum:

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

Kopya seçimini 'y' tuşu ile birleştirmek VE x panosuna taşımak mümkün olabilir sanırım.

9
Ownatik

Fazladan tuşa basmaktan hoşlanmıyorum, bu yüzden daha iddialı bir şey istedim. Kopyalama moduna [ile girin, sağdaki metni vurgulayın ve ardından metni panoya kopyalamak için] tuşuna basın.

Ayrıca, tmux ifadelere yeni satırlar eklemeyi sever (ve garip bir şekilde bu yeni satırlar yanlış yerde! İfadenin ekranda sarıldığı yer değildir). Bu yüzden C-] 'nin yeni satırları kaldırarak ifadeyi kopyalamasını istedim.

Tmux 1.6'da bunu denedim:

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;"

ancak bu işe yaramadı çünkü tmux karmaşık şeyleri vi-copy tablosuna bağlamaktan mutlu görünmüyor. Bunun yerine bunu yaptım:

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 ]"

Bu,] veya C-] dışında başka bir şekilde kopyalama modundan çıkarsanız, garip şeylere (] veya C-] bir sonraki kullanışınızda komik davranır, ancak yalnızca bir kez) yol açar. Bu, hayal ettiğim bazı bağlarla düzeltilebilir, ancak çoğu zaman istediğim şey budur.

7
Leif

Mac OS X için bir çözüm. Şu 2 adımı izleyin:

  1. Chris Johnsen'ın geçici çözümünü kullanın: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. Bu kodu tmux yapılandırmanıza ekleyin (~/.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

Bu, uzak (ssh) bir tmux oturumundan arabelleği kopyalamak için xclip kullanarak iki büyük sorunu düzeltmesi gereken oldukça uzun cevabım:

1. Tepkisiz xclip

Benim için @ Grauwolf's answer ile xclip işe yaramadı (tmux bölmesini tamamen tepkisiz hale getiriyor). Neden Arch wiki'nin Tmux sayfasında :

xclip, bu amaç için de kullanılabilir, xsel'in aksine, geçerli yerel ayara uymayan ham bit akışı yazdırmak için daha iyi çalışır. Bununla birlikte, xclip yerine xsel kullanmak daha temizdir, çünkü xclip, tmux'un tamponundan okuduktan sonra STDOUT'u kapatmaz. Bu nedenle, tmux kopyalama görevinin tamamlandığını bilmez ve xclip'in sonlandırılmasını beklemeye devam eder, böylece tmux'u yanıt vermiyor hale getirir. Geçici çözüm xdlip'nin STDOUT öğesini/dev/null dizinine yönlendirmektir.

Yani bağlanma şöyle olmalıdır:

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

Şimdi, tmux oturumunuz yerel ise bu işe yarar.

2. xclip X'e bağlanamıyor

ssh -X üzerinde tmux kullanıyorsanız, bu çalışmaz doğrudan.

Çünkü Shell değişkeni $DISPLAY düzgün ayarlanmalıdır.

Tam çözüm

Benim için, tam çalışma çözümü benim ~/.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

Birincilden yapıştırmak için:

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

Nedenini tam olarak anlamıyorum $DISPLAY kaynaklanırken _ doğru ayarlanmamış .tmux.conf, bu yüzden tmux show-env ve sed.

Tmux> = 1.8'iniz varsa, bu komutu 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

Kabul ettiğim cevabın biraz değiştirilmiş bir çeşidi.

Ayrıca xclip'in primary varsayılan panosuna (fare seçimi ve fare orta tıklamaları ile aldığınız) ek olarak sistem panosunu (Ctrl-C, Ctrl-V) kullanmayı tercih ederim. Sistem panosunu seçmek için xclip öğesine -selection clipboard Argümanını iletmeniz gerekir.

Ayrıca bir tamponu panoya kopyalarken, hangi arabelleği kopyalamak istediğimi seçme yeteneğini seviyorum. choose-buffer Kullanılarak yapılır ve sonra save-buffer Kullanılarak argümanı -b %% 'Ya geçirir.

# 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"

GÜNCELLEME: Her nasılsa tmux 1.8 ve benim openSUSE 12.2 kurulumlarımdan ikisinde, tmux run-Shell Bir kanal üzerinden xclip okuma ile çağrıldığında bir askıda kaldığını görüyorum. Bunun yerine xsel denemeye karar verdim ve işe yarıyor gibi görünüyor. Bunlar xsel kullanan eşdeğer anahtar bağlamalarıdır. Ayrıca daha fazla sağlamlık için yapıştırılan komutları zincirlemek için && Kullandım.

# 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

Arch Wiki'de xclip kullanan bir çözüm var:

# 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

Bu yanıtların birçoğu Ubuntu 14.04 için zsh'da olduğu gibi çalışmadı. Kabuğumun bununla bir ilgisi olup olmadığından emin değilim, ancak işte kopya için bu strateji ve yapıştırma için bu strateji kullanmanın çalışan sürümü.

    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" 

Bazı notlar:

  • copy-pipe için, panomu -sel clip -i. Bu satır, yank ile tmux buffer'ı birleştirir ve xclip'e gönderir.
  • aslında yapıştırmak için, -sel clip -o

Bu benim vim/zsh/tmux kurulumum için güzel çalışıyor.

3
brianclements

Bir tmux arabellek ne panoya kopyalamak için iyi bir yol bulmaya çalışıyorum. Gibi birkaç farklı şey denedim

Emacs tarzı ciltlemeler için birkaç farklı seçenek vardır. (Vi tarzı benzer olmalıdır?) Emacs içinde "kopya seçimi" yapmak için tipik bağlanma M-w'dir, bu nedenle tmux'da aynı bağlamaya sahip olmak çok uygun olacaktır.

1 - İdeal olur, ancak çalışmaz (tmux sınırlaması nedeniyle?)

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 - Benim için iyi sonuç veren uzlaşma: tmux'da emacs-copy için farklı bir tuş bağlama kullanmayı kabul edin. Örneğin C-M-w kullanın. ("Genel olarak" tanımlanacak olan bu ciltleme - yalnızca kopyalama modunda değil, yalnızca kopyalama modunda yararlıdır)

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

Ve @Leif cevabının geliştirilmiş versiyonu şöyle olabilir:

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\""

Bu şekilde kopyalama modundan başka bir şekilde çıkarsanız sonuç olmaz], yukarıdaki kod tundle/tmux-yank tmux metnini sistem panosuna kopyalamak için bir tmux eklentisi içine alınır. OS X ve Linux'ta tmux> = 1.6.

1
Javier López

Tmux sürüm 2.2 veya daha yenisine sahip OS-X'te aşağıdakiler çalışır:

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

copyq çok satırlı bir pano yöneticisi kullanıyorum. (Windows, OSX, Linux ile çalışır.)

  • Aşağıdaki satırları ~/.tmux.conf:

    set-window-option -g mode-keys vi
    bind C-y run 'out=`tmux save-buffer - ` && copyq add "$out"'
    
  • cygwin talep _ copyq.exe konumunda ~/.bashrc:

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