it-swarm-id.com

Mendapatkan tmux untuk menyalin buffer ke clipboard

Saya mencoba mencari cara yang layak untuk menyalin apa yang saya miliki di buffer tmux ke clipboard saya. Saya sudah mencoba beberapa hal yang berbeda seperti

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

yang membuat saya cukup dekat, yang harus saya lakukan adalah menekan control-d setelah saya melakukan prefix-p.

Saya mencoba memperbaikinya dengan melakukan

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

Tapi itu tidak berhasil. Sebenarnya jika saya memasangkan ini ke adil

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

tidak melakukan apa-apa jadi saya berasumsi bahwa split-window tidak suka << dalam perintah Shell.

Ada ide?

Sunting: Anda dapat melewati select-pane -t 2 Jika Anda mau, itu tidak terlalu penting. Saya hanya menggunakan tata letak tertentu dan panel 2 adalah yang saya lebih suka untuk membagi ketika saya melakukan sesuatu yang lain sehingga masuk ke binding saya yang melibatkan pemisahan secara default.

121
Digital Powers

Di sini dokumen perlu baris baru. Misalnya, dalam skrip Shell, Anda dapat menulis

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

Saya tidak berpikir tmux memungkinkan Anda menempatkan baris baru di sana, dan bahkan jika itu terjadi, ini tidak akan menjadi pendekatan yang baik. Bagaimana jika data itu sendiri berisi HERE sendiri di satu baris (mis. Karena Anda menyalin .tmux.conf)?

Saya menyarankan untuk menulis konten buffer ke file sementara. Belum dicoba:

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

Ada kondisi lomba jika Anda menggunakan perintah ini dalam dua instance tmux yang terpisah. Saya tidak tahu bagaimana menyelesaikannya.

Ini seharusnya bekerja:

# 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

Solusi yang lebih sederhana untuk Mac OS-X

Ini membangun dari jawaban Alex dan menggunakan hal-hal yang tidak ada pada saat itu.

Jika Anda menggunakan homebrew (dan jika tidak, mengapa tidak?) Maka Anda bisa melakukan ini:

brew install reattach-to-user-namespace

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

Untuk menyalin buffer dari tmux (Anda seharusnya sudah menyalin sesuatu menggunakan tmux) ke papan tulis Mac, gunakan <tmux-key> Control-c. Sekarang akan tersedia untuk Command-v atau pbpaste

Untuk menempelkan sesuatu dari papan tulis Mac, gunakan <tmux-key> Control-v.

41
docwhat

copy-pipe perintah ditambahkan pada versi 1.8. Ini menyalin pilihan ke buffer tmux dan pipa ke perintah. Sekarang tidak perlu untuk mengikat awalan. Ini sebuah contoh:

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

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

Sekarang ketika Anda memiliki beberapa teks yang dipilih di copy-modey akan menyalin teks itu ke buffer tmux serta clipboard OS. Namun, itu tidak membantu jika Anda ingin mendapatkan teks dari clipboard ke buffer tmux.

40
Tyler Holien

Anda mungkin ingin mencoba plugin tmux-yank . Ini memungkinkan penyalinan langsung ke clipboard sistem (OS X dan Linux) dan beberapa barang lainnya seperti menarik garis Shell saat ini.

16
user80379

Berikut adalah upaya jawaban yang komprehensif.

Pertama, sedikit sejarah

Ketika pertanyaan ini pertama kali ditanyakan (Juni, 2011) menyalin teks dari Tmux ke clipboard harus merupakan proses dua langkah, pertama-tama salin teks yang dipilih ke buffer Tmux, kemudian salin teks dari buffer Tmux ke clipboard sistem.

Pada 1,8 (Maret, 2013) copy-pipe perintah ditambahkan yang memungkinkan Anda untuk menyalin teks yang dipilih langsung ke clipboard sistem (atau tujuan lain).

Kemudian pada 2.4 (April, 2017) tabel kunci diubah secara signifikan sehingga banyak jawaban pada halaman ini menjadi usang.

Menjawab pertanyaan awal

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 :

Jika Anda menggunakan homebrew maka Anda harus menginstal reattach-to-user-namespace dengan menjalankan perintah berikut di terminal:

brew install reattach-to-user-namespace

Kemudian di ~/.tmux.conf Anda:

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"

The Shorter Method (salin dan tempel pilihan langsung dari dan ke clipboard untuk tmux> 2.4)

Catatan: ada dua versi untuk Linux karena Linux memiliki clipboard primer dan sekunder (juga dikenal sebagai seleksi).

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"

Kustomisasi perintah ini

  • Jika Anda tidak ingin perintah memberi tahu Anda apa yang dilakukan di baris status maka hapus saja display-message (dan juga \; yang datang sebelum itu).

  • Jika Anda menggunakan mode salin gaya Emacs alih-alih vi maka ganti instance copy-mode-vi hanya dengan copy-mode

  • Jika Anda menjalankan Linux dan Anda ingin menggunakan xsel alih-alih xclip ganti xclip -r dengan xsel -i -p dan xclip -o dengan xsel -o -p

  • -r di xclip -r adalah opsional, menghapus baris baru terakhir. Ini berguna untuk menyalin perintah, maka ketika Anda menempelkannya mereka tidak akan segera dieksekusi.

  • Jika Anda melakukan tunneling pada SSH maka Anda harus berkonsultasi https://unix.stackexchange.com/a/354581/14252

Referensi:

10
Jason Axelson

Setelah mencoba berbagai solusi, berikut ini adalah pengaturan terakhir saya:

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

menggunakan save-buffer alih-alih show-buffer memberikan data nyata tanpa data seperti yang ditunjukkan dengan jeda baris saat Anda berada di split.

Saya juga menggunakan ini untuk memulai seleksi/salin dalam mode salin tmux:

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

Saya kira mungkin saja untuk menggabungkan seleksi-salinan dengan tombol 'y' DAN memindahkannya ke papan klip x.

9
Ownatik

Saya tidak suka memiliki penekanan tombol ekstra, jadi saya menginginkan sesuatu yang lebih ambisius. Masuk ke mode salin dengan [ sorot teks kanan, dan kemudian tekan] untuk menyalin teks ke clipboard.

Juga, tmux suka memasukkan baris baru dalam ekspresi yang membungkus (dan anehnya baris baru itu berada di tempat salah! Mereka tidak berada di tempat ekspresi dibungkus pada layar). Jadi saya ingin C-] menyalin ekspresi menghapus baris baru.

Pada tmux 1.6 saya mencoba ini:

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

tetapi itu tidak berhasil karena tmux tampaknya tidak senang untuk mengikat hal-hal kompleks ke tabel vi-copy. Jadi saya akhirnya melakukan ini sebagai gantinya:

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

Ini mengarah ke hal-hal aneh (] atau C-] akan bertindak lucu saat lain kali Anda menggunakannya, tetapi hanya sekali) jika Anda keluar dari mode salin dengan cara lain selain] atau C-]. Ini bisa diperbaiki dengan beberapa ikatan lagi yang saya bayangkan, tetapi ini yang paling saya inginkan.

7
Leif

Solusi untuk Mac OS X. Ikuti 2 langkah ini:

  1. Gunakan solusi Chris Johnsen: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. Tambahkan kode ini ke konfigurasi tmux Anda (~/.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

Ini adalah jawaban saya yang agak panjang yang harus memperbaiki dua masalah utama dengan menggunakan xclip untuk menyalin buffer dari sesi tmux jarak jauh (ssh):

1. xclip tidak responsif

Bagi saya @ Grauwolf --- jawab dengan xclip tidak berfungsi (menjadikan panel tmux sama sekali tidak responsif). Saya menemukan alasannya di halaman Tmux dari Arch wiki :

xclip juga dapat digunakan untuk tujuan itu, tidak seperti xsel, ia berfungsi lebih baik untuk mencetak bitstream mentah yang tidak sesuai dengan lokal saat ini. Namun demikian, lebih baik menggunakan xsel daripada xclip, karena xclip tidak menutup STDOUT setelah membaca dari buffer tmux. Karena itu, tmux tidak tahu bahwa tugas penyalinan telah selesai, dan terus menunggu penghentian xclip, sehingga membuat tmux tidak responsif. Solusinya adalah untuk mengarahkan ulang STDOUT dari xclip ke/dev/null

Jadi pengikatannya harus:

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

Sekarang, ini akan berfungsi jika sesi tmux Anda bersifat lokal.

2. xclip tidak dapat terhubung ke X

Jika Anda menggunakan tmux lebih dari ssh -X , ada kemungkinan besar ini tidak akan bekerja secara langsung.

Itu karena variabel Shell $DISPLAY perlu diatur dengan benar.

Solusi lengkap

Jadi bagi saya, solusi kerja lengkap adalah dengan meletakkan baris berikut di ~/.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

Untuk menempelkan dari primer:

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

Saya tidak sepenuhnya mengerti mengapa $DISPLAY tidak diatur dengan benar saat sumber .tmux.conf, jadi ini sebabnya saya harus mengekstraknya dengan tmux show-env dan sed.

Jika Anda memiliki tmux> = 1.8, Anda dapat menyesuaikan perintah ini dengan 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

Varian yang sedikit dimodifikasi dari jawaban yang diterima, yang saya buat.

Saya juga lebih suka menggunakan clipboard sistem (Ctrl-C, Ctrl-V) selain xclip's primary clipboard default (yang Anda dapatkan dengan pemilihan mouse dan klik tengah mouse). Untuk memilih clipboard sistem, Anda harus lulus -selection clipboard argumen ke xclip.

Juga saat menyalin buffer ke clipboard, saya suka kemampuan untuk memilih buffer yang ingin saya salin. Itu dilakukan menggunakan choose-buffer lalu meneruskan buffer argumen ke save-buffer menggunakan -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: Entah bagaimana dengan tmux 1.8 dan dua instalasi openSUSE 12.2 saya, saya melihat hang ketika tmux run-Shell dipanggil dengan xclip membaca dari stdin melalui pipa. Saya malah memutuskan untuk mencoba xsel dan itu sepertinya berhasil. Ini adalah binding kunci yang setara menggunakan xsel. Saya juga menggunakan && untuk mengaitkan perintah di tempel agar lebih kokoh.

# 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

Ada solusi di Arch Wiki menggunakan xclip:

# 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

Banyak dari jawaban ini tidak berfungsi untuk Ubuntu 14.04 saya di zsh apa adanya. Tidak yakin apakah Shell saya ada hubungannya dengan itu, tetapi ini adalah versi kerja saya menggunakan strategi ini untuk salinan, dan strategi ini untuk menempel.

    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" 

Beberapa catatan:

  • untuk copy-pipe, saya perlu menentukan clipboard saya dengan -sel clip -i. Baris itu menggabungkan yank ke tmux buffer dan mengirimkannya ke xclip.
  • untuk benar-benar menempelkannya, saya harus menentukan lagi clipboard mana dengan -sel clip -o

Ini berfungsi dengan baik sekarang untuk pengaturan vim/zsh/tmux saya.

3
brianclements

Saya mencoba mencari cara yang layak untuk menyalin apa yang saya miliki di buffer tmux ke clipboard saya. Saya sudah mencoba beberapa hal yang berbeda seperti

Untuk binding gaya emacs ada beberapa opsi berbeda. (Vi-style harus serupa?) Penjilidan khas untuk melakukan "copy-selection" di emacs adalah M-w, jadi akan sangat nyaman untuk memiliki ikatan yang sama dalam tmux.

1 - Apakah ideal, tetapi tidak berfungsi (karena batasan 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 - Kompromi yang bekerja dengan baik untuk saya: Terima menggunakan keybinding berbeda untuk emacs-copy di tmux. Gunakan misalnya C-M-w. (Ikatan ini yang akan didefinisikan "secara global" - tidak hanya dalam mode salin - tetapi hanya berguna dalam mode salin)

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

Dan versi perbaikan jawaban @Leif bisa berupa:

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

Dengan cara ini tidak ada konsekuensi jika Anda keluar dari mode salin dengan cara lain selain], kode di atas dibungkus tundle/tmux-yank plugin tmux untuk menyalin teks tmux ke dalam clipboard sistem, ia menargetkan tmux> = 1.6 pada OS X dan Linux.

1
Javier López

Pada OS-X dengan tmux versi 2.2 atau lebih baru yang berikut ini akan berfungsi:

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

Saya menggunakan copyq manajer clipboard multiline. (Ini bekerja dengan Windows, OSX, Linux.)

  • Tambahkan baris berikut dalam ~/.tmux.conf:

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

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