Salin teks dari satu panel tmux ke panel lain (menggunakan vim)

133

Saya memiliki dua file dibuka di vim, masing-masing dalam satu panel tmux. Saya ingin menyalin, katakanlah 10 baris dari satu file ke file lainnya.

Bagaimana saya bisa melakukan ini dengan tidak menggunakan mouse Copy-> Paste?

Patryk
sumber
2
Anda bisa melibatkan tmux , tetapi umumnya ada cara yang lebih sederhana. Apakah kedua instance Vim pada mesin (lokal?) Yang sama? Biasanya, saya hanya akan menggunakan file sementara untuk itu (yaitu secara visual memilih baris :w /tmp/lines,, lalu :r /tmp/linesdalam contoh lain). Atau, jika Vim Anda tahu cara berbicara dengan clipboard sistem Anda, Anda bisa menggunakan +atau *mendaftar untuk menghindari file sementara.
Chris Johnsen

Jawaban:

194

Anda harus menggunakan pintasan tmux. Dengan asumsi pintasan perintah tmux Anda adalah default: Ctrl+ b, lalu:

  1. Ctrl+ b, [Masuk ke mode salin (?).

  2. Pindah ke mulai / akhir teks untuk menyorot.

  3. Ctrlspace

    Mulai menyorot teks (di Arch Linux). Ketika saya telah mengkompilasi tmux dari sumber di OSX dan Linux lain, Spacebiasanya dengan sendirinya berfungsi. Teks yang dipilih mengubah warna, jadi Anda akan tahu jika perintahnya berhasil.

  4. Pindah ke ujung teks yang akan disalin.

  5. Alt+ wMenyalin teks yang dipilih ke tmux clipboard. (Di Mac gunakan Esc+ w.)

  6. Pindahkan kursor ke panel tmux yang berlawanan, atau jendela tmux yang sama sekali berbeda. Letakkan kursor di tempat Anda ingin menempelkan teks yang baru saja Anda salin.

  7. Ctrl+ b, ]Tempel teks yang disalin dari clipboard tmux.

tmux cukup baik dalam memetakan perintah ke pintasan keyboard khusus.

Lihat Ctrl+ b, ?untuk daftar lengkap pintasan keyboard yang ditetapkan.

Alex Leach
sumber
4
Terima kasih. Hanya sidenode: Alt + w tidak berfungsi di Mac. Alt telah dipetakan ke Esc secara default. Karena itu Esc + w.
Karan
11
jika Anda menggunakan screenpintasan: Ctrl + A [(masukkan mode salin), Space(mulai sorot), Enter(sorot akhir), Ctrl + A ](tempel).
jfs
11
Perlu dicatat bahwa "masuk" berfungsi untuk saya sedangkan alt + w tidak.
Elijah Lynn
3
Seperti disebutkan dalam awhan.wordpress.com/2010/06/20/copy-paste-in-tmux , jika Anda memiliki binding kunci vi, langkah 5 harus diganti dengan Enterkunci.
Ying Xiong
3
bagaimana Jika saya perlu menyalin dan menempel ke editor teks? Untuk beberapa alasan sepertinya tidak mengambil teks yang dipilih bahkan setelah menekan 'enter' setelah memilih teks.
uday
34

Sayangnya, saya belum bisa menambahkan komentar pada jawaban Alex Leach jadi saya akan memasukkan addendum di sini untuk pengguna Mac OS X:

  1. Enter Menyalin teks yang dipilih
Mieczysław Daniel Dyba
sumber
1
Terima kasih! Saya di Ubuntu Xenial, menggunakan byobu/ tmuxdengan semua pengaturan default, ini berfungsi, Alt + w tidak.
Andrea Zonca
1
Ini tidak berfungsi pada OS X Yosemite dengan tmux 2.0, juga tidak alt + w, juga tidak esc + w :(
weberc2
Bekerja untuk saya juga di Windows menggunakan terminal Zoc.
jdhao
15

Jika Anda menggunakan vim dan tmux pada macOS (Diuji pada macOS 10.12.2, tmux 2.3):

(Asumsikan bahwa kombinasi kunci awalan dari tmux adalah prefix. Awalan adalah ctrl+ bsecara default.)

  • Salinan:
    1. Tekan prefix+ [untuk masuk ke mode salin.
    2. Gunakan tombol panah untuk pergi ke awal / akhir pemilihan teks.
    3. Tekan ctrl+ space(Jika Anda telah menetapkan ctrl+ spacesebagai awalan, Tekan ctrl+ space+ spacesebagai gantinya)
    4. Gunakan tombol panah untuk pindah ke sisi lain seleksi.
    5. Tekan ctrl+ w.
  • Tempel:
    1. Tekan prefix+ ]dalam mode sisipkan.
Hamid Rohani
sumber
9

Saya terhubung ke server CentOS saya pada mesin Windows menggunakan klien ssh terminal ZOC . Inilah yang bekerja untuk saya:

  • Masuk ke mode salin: <prefix>+[
  • Mulai salin: <Space>
  • Salin teks: <Enter>
  • Rekatkan teks: <prefix>+]
jdhao
sumber
2

Anda dapat menggunakan papan klip sistem dengan "* y dan" * p alih-alih y dan p normal.

Johan
sumber
1
Untuk menggunakan papan klip sistem, Anda harus menggunakan "+2yy- salin dua baris ke papan klip X11 "+dd- potong baris ke papan klip X11 "+p- tempel papan klip X11
Patryk
Apakah saya perlu mengetikkan sesuatu sebelum menggunakan perintah ini?
Thomas Ahle
@ThomasAhle, no .. secara harfiah tanda kutip ganda ("), diikuti oleh plus (+) diikuti oleh 2ys (y). Pastikan Anda berada dalam mode normal. Jika Anda berada dalam mode normal, Anda harus dapat menggunakan h,j,k,luntuk Saya juga kadang melihat di VM ubuntu saya, register "+" menghilang, untuk alasan yang tidak diketahui. Untuk memverifikasi bahwa Anda memiliki +register, Anda dapat mengetik :regdan memeriksa apakah ada string "+di kolom pertama.
alpha_989
Ya, ini dia, ini jawabannya. Jauh lebih sederhana daripada yang disarankan lainnya (menggunakan tmux copy / paste) dan ini tidak mengacaukan nomor baris. Apakah ini akan menyebabkan masalah jika Anda memetakan kembali standar ydan pke "+ydan "+p?
ryan
1

Jika sudah vimterbuka, lebih baik menggunakan vim copy paste untuk menyalin teks.

Tmux copy paste akan berfungsi, namun ada beberapa kelemahan.

Pertama, ketika menyalin beberapa baris teks, Anda harus memilih beberapa baris. Tmux copy paste biasanya tidak mengerti yang vimmemiliki nomor baris atau ada tanda di selokan vim (seperti angka relatif / angka absolut). Akibatnya, itu akan menyalinnya juga.

Kedua, saya telah menemukan bahwa jika teks memiliki format bahasa tertentu, dan Anda langsung mencoba menyalin paste menggunakan tmux ke vim, itu akan mengacaukan format. Ini bisa dihindari dengan menggunakan set paste!. Namun, ini membutuhkan lebih banyak pekerjaan.

Gunakan "+yuntuk menyalin dan "+pmenempel

Vimnative menyediakan metode untuk menyalin tempel antara buffer vim dan clipboard sistem, menggunakan salah satu "+yatau "*y. Kemudian menempel menggunakan "+patau "*p. Ini akan menghindari menyalin nomor relatif di selokan atau tanda acak lainnya yang tidak relevan dengan vim

alpha_989
sumber
0

Beberapa opsi untuk penggunaan vim karena urutan pintasan tmux agak panjang dan saya merasa sulit untuk diingat

Seperti jawaban di atas, Anda dapat menggunakan "+ydan "*ymenyalin dan kemudian "+pdan "*pmasing - masing untuk menempel. Jika Anda ingin vim menggunakan clipboard secara default sehingga Anda bisa y/plangsung menggunakannya .

set clipboard=unamed "sets the default copy register to be *
set clipboard=unamedplus "sets the default copy register to be +

sumber untuk perintah clipboard: https://vi.stackexchange.com/questions/84/how-can-i-copy-text-to-the-system-clipboard-from-vim

Avi Areman
sumber