mode salin tmux - pilih blok teks

39

Saya menggunakan tmux dengan tombol vi, dan copy / paste berfungsi dengan baik selama Anda memilih satu baris teks, atau jika Anda hanya memiliki satu jendela. Ketika saya ingin memilih blok teks (beberapa baris, tetapi tidak lebar penuh), maka saya mengalami masalah. Jika saya memiliki beberapa jendela vim dibuka, maka itu akan memilih teks dari semuanya, dan yang saya butuhkan adalah memilih teks hanya dari satu jendela. Yaitu, sama seperti pemilihan visual dalam vim.

Apakah ini mungkin dilakukan?

Srećko Toroman
sumber
Bagaimana Anda mengaktifkan ikatan kunci Vi di tmux?
romainl
tambahkan "set-window-option -g mode-keys vi" ke ~ / .tmux.conf Anda
Srećko Toroman
1
Sepertinya jawaban tidak sampai pada pertanyaan Anda menggunakan mode blok visual - "beberapa baris, tetapi tidak lebar penuh" juga apa yang saya cari. Apakah Anda menemukan solusi sendiri?
dmonopoly
Tidak, masih belum ada solusi.
Srećko Toroman
Sebenarnya ada solusinya.
Srećko Toroman

Jawaban:

46

Pastikan untuk memeriksa bagian bawah posting ini untuk binding yang diperlukan yang perlu masuk ke file .tmux.conf Anda.

Saya menganggap kunci awalan Anda adalah Ca:

  • Ca berarti: tekan Ctrl+A
  • Ca [berarti: tekan Ctrl+ Alalu tekan[

Untuk melakukan pemilihan teks persegi panjang dari (1,1) hingga (2,2) di tmux:

  • Pergi ke mode salin: Ca [
  • Pindahkan bagian tengah garis
  • Tekan Cv
  • Tekan spasi
  • Pindahkan pilihan dengan jkhl
  • Setelah Anda puas dengan pilihan Anda tekan Enter (atau y jika Anda memiliki ikatan dalam file conf Anda).
  • Anda dapat menempelkan buffer salinan terbaru dengan: Ca]

Perhatikan bahwa menekan spacediperlukan untuk pemilihan persegi panjang.

Untuk memilih garis seperti yang biasa Anda lakukan, buka mode salin, dan tekan v, pilih dengan tombol jkhl dan tekan y.

Saya memiliki binding ini di .tmux.conf saya:

Sebelum versi 2.4 (20 April 2017) :

setw -g mode-keys vi
bind-key -t vi-copy 'v' begin-selection     # Begin selection in copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle  # Begin selection in copy mode.
bind-key -t vi-copy 'y' copy-selection      # Yank selection in copy mode.

Setelah versi 2.4 :

setw -g mode-keys vi
bind-key -T copy-mode-vi 'v' send -X begin-selection     # Begin selection in copy mode.
bind-key -T copy-mode-vi 'C-v' send -X rectangle-toggle  # Begin selection in copy mode.
bind-key -T copy-mode-vi 'y' send -X copy-selection      # Yank selection in copy mode.

Adalah penting untuk melepaskan ikatan binding persegi panjang-toggle default:

unbind-key -t vi-copy v  # Prior to version 2.4
unbind-key -T copy-mode-vi v

Kalau tidak, pengikatan 'Cv' baru tidak berfungsi.

Catatan: untuk memiliki satu .tmux.confyang berfungsi lintas versi, lihat pertanyaan ini .

Amir H. Sadoughi
sumber
1
Terima kasih banyak. Penekanannya ada pada tmux.conf Anda - Anda bisa mengedit jawabannya dengan memasukkan bind-key -t vi-copy 'Cv' rectangle-toggle di awal.
Srećko Toroman
Pertanyaan aslinya menanyakan bagaimana cara membuat seleksi persegi panjang bekerja dengan "mode-keys vi". Tidak perlu lagi mengikat kunci untuk menjawab pertanyaan ini. Lihat jawaban lain; itu hanya "v" dan "spasi" dari mode pemilihan.
Lqueryvg
ini bekerja selain fakta bahwa jkhl tidak berfungsi, saya harus menggunakan tombol panah untuk bergerak, apakah ada cara untuk mengubah ini?
Maks
Apa perbedaan antara senddan send-keys. Saya melihat di superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key digunakan. Apakah tanda kutip juga penting?
user2442366
15

Anda dapat memilih blok visual seperti dalam tipe-vi vsebelum memulai pemilihan. Di halaman manual, ini disebut "Rectangle toggle".

Lars Kotthoff
sumber
2
Itulah tepatnya yang saya gunakan. Tetapi itu memiliki masalah yang saya jelaskan di atas. Persegi panjang selalu lebar penuh. Saya membutuhkan persegi panjang seperti VIM (x1, y1) - (x2, y2) :)
Srećko Toroman
1
@ Srećko Toroman apa yang Anda maksud persis dengan lebar penuh?
gitaarik
9

Seperti yang ditunjukkan Lars, vsebenarnya melakukan apa yang Anda minta dengan beralih antara mode persegi panjang dan mode pemilihan garis penuh. spacedan enterdigunakan masing-masing untuk memulai pilihan baru dan menyalinnya. Masuk ke mode salin menggunakan awalan Anda diikuti [dan tempel pilihan Anda disalin ke jendela tmux menggunakan]

Ini membingungkan saya juga karena vfungsi dalam vim seperti spacehalnya pada tmux, untuk memulai pemilihan.

Penerbitan :list-keys -t vi-copydi tmux akan menampilkan tabel lengkap perintah dalam mode salin.

bind-key -t vi-copy    C-b page-up                                                      
bind-key -t vi-copy    C-c cancel
bind-key -t vi-copy    C-e scroll-down
bind-key -t vi-copy    C-f page-down
bind-key -t vi-copy    C-h cursor-left
bind-key -t vi-copy  Enter copy-selection
bind-key -t vi-copy    C-y scroll-up
bind-key -t vi-copy Escape clear-selection
bind-key -t vi-copy  Space begin-selection
bind-key -t vi-copy      $ end-of-line
bind-key -t vi-copy      , jump-reverse
bind-key -t vi-copy      / search-forward
bind-key -t vi-copy      0 start-of-line
bind-key -t vi-copy      1 start-number-prefix
bind-key -t vi-copy      2 start-number-prefix
bind-key -t vi-copy      3 start-number-prefix
bind-key -t vi-copy      4 start-number-prefix
bind-key -t vi-copy      5 start-number-prefix
bind-key -t vi-copy      6 start-number-prefix
bind-key -t vi-copy      7 start-number-prefix
bind-key -t vi-copy      8 start-number-prefix
bind-key -t vi-copy      9 start-number-prefix
bind-key -t vi-copy      : goto-line
bind-key -t vi-copy      ; jump-again
bind-key -t vi-copy      ? search-backward
bind-key -t vi-copy      B previous-space
bind-key -t vi-copy      D copy-end-of-line
bind-key -t vi-copy      E next-space-end
bind-key -t vi-copy      F jump-backward
bind-key -t vi-copy      G history-bottom
bind-key -t vi-copy      H top-line
bind-key -t vi-copy      J scroll-down
bind-key -t vi-copy      K scroll-up
bind-key -t vi-copy      L bottom-line
bind-key -t vi-copy      M middle-line
bind-key -t vi-copy      N search-reverse
bind-key -t vi-copy      T jump-to-backward
bind-key -t vi-copy      W next-space
bind-key -t vi-copy      ^ back-to-indentation
bind-key -t vi-copy      b previous-word
bind-key -t vi-copy      e next-word-end
bind-key -t vi-copy      f jump-forward
bind-key -t vi-copy      g history-top
bind-key -t vi-copy      h cursor-left
bind-key -t vi-copy      j cursor-down
bind-key -t vi-copy      k cursor-up
bind-key -t vi-copy      l cursor-right
bind-key -t vi-copy      n search-again
bind-key -t vi-copy      q cancel
bind-key -t vi-copy      t jump-to-forward
bind-key -t vi-copy      v rectangle-toggle
bind-key -t vi-copy      w next-word
bind-key -t vi-copy BSpace cursor-left
bind-key -t vi-copy  NPage page-down
bind-key -t vi-copy  PPage page-up
bind-key -t vi-copy     Up cursor-up
bind-key -t vi-copy   Down cursor-down
bind-key -t vi-copy   Left cursor-left
bind-key -t vi-copy  Right cursor-right
bind-key -t vi-copy   C-Up scroll-up
bind-key -t vi-copy C-Down scroll-down
sini
sumber
Saya tidak mengerti lagi. Diberikan jendela Vim dengan split vertikal, bagaimana Anda memilih persegi panjang di split pertama saja? Di sini, persegi panjang multiline akan selalu membungkus panel Tmux penuh. Ini tidak seperti pemilihan blok Vim. Saya menggunakan tmux 1.5, mungkin ini berbeda dalam versi Anda?
Srećko Toroman
Ya, di sini, v dipetakan untuk memulai seleksi. Kotak-toggle tidak ditentukan. Jadi saya kira Anda berdua benar, saya hanya perlu memperbarui klien saya?
Srećko Toroman
Jika Anda memiliki jendela split vim terbuka di panel tmux tunggal, tidak bisakah Anda menggunakan kemampuan tarik dan tempel vim? Jika di sisi lain Anda memiliki dua panel tmux, masing-masing dengan jendela vim sendiri, tmux pilih / salin harus dapat membungkus di tepi panel. Saya menggunakan tmux 1.7
sini
6

Karena tidak ada jawaban lain yang memberikan solusi optimal untuk masalah ini, saya tidak di atas necromancy.

Ada cara agar pemilihan blok berfungsi dengan cara yang sama di Vim, tanpa harus menekan ruang. Hanya Ctrl-V yang sederhana, tertanam dalam memori otot Anda.
Ini membutuhkan pengeditan .tmux.conf Anda (tetapi menggunakan mode-vi sudah melakukannya) dan saya tidak yakin itu berfungsi untuk tmux <2.4.

Tambahkan ini ke .tmux.conf Anda untuk mereplikasi pemilihan Vim dan yank bindings:

# set vi-mode
set-window-option -g mode-keys vi
# keybindings
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle \; send -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# comment the preceding line and uncomment the following to yank to X clipboard
# bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"

Masuk ke mode pemilihan dan arahkan ke tempat Anda ingin memulai pemilihan. Sekarang vmulai seleksi reguler (karakter per karakter, bijaksana baris), <C-v>mulai pemilihan blok dan V(shift-v) memulai pemilihan garis. Terlepas dari jenis seleksi, ytarik ke tmux paste buffer (atau X clipboard; lihat komentar kode di atas).

Sama seperti Vim.

andrejr
sumber
Bekerja untuk saya, miliki upvote terhadap necomancy Anda 👏👏👏
mahemoff
2

EDIT: Setelah memeriksa kode sumber, saya sudah menulis ulang jawaban saya sepenuhnya.

Awalnya saya pikir ini tidak mungkin karena saya tidak bisa vmembuatnya bekerja, tetapi jawaban lain benar tentang menjadi kunci yang benar untuk ini, tetapi tidak jelas bagaimana cara menggunakannya, terutama jika Anda terbiasa vim.

Juga, itu tidak akan berhasil bagi saya karena saya vterikat begin-selection- saya pikir saya pasti telah menyalin ide ini dari tempat lain untuk meniru cara vim untuk memulai pemilihan karakter yang bijaksana, tidak tahu itu akan menyebabkan masalah lebih jauh di jalan dengan blokir pilihan.

$ tmux -V
tmux 1.9a
$ tmux list-keys -t vi-copy  | grep " v "
bind-key -t vi-copy      v begin-selection     # suppressed my block selection mode

Setelah saya menghapus ikatan ini (dengan mengomentari baris di saya .tmux.confdan memulai ulang tmux), itu mulai bekerja, tetapi masih agak membingungkan karena sama sekali tidak sama dengan vim.

Dengan binding default, itu harus berfungsi sebagai berikut:

  1. Pastikan Anda memiliki tmux unning dengan setw -g mode-keys vidi .tmux.conf.
  2. ketik C-a [untuk memulai mode salin
  3. pindahkan kursor ke tempat Anda ingin memulai seleksi
  4. mengetik v
  5. ketik Spaceuntuk memulai seleksi
  6. gerakkan kursor dan Anda akan melihat pilihan segi empat
  7. Anda dapat menekan vlagi untuk mengaktifkan kembali pilihan ke pemilihan karakter atau sebaliknya.

Anda tidak perlu mengetik vsebelum Anda menekan Space. Anda bisa memulai pemilihan karakter-bijaksana dengan Spacepertama dan tekan vsesudahnya untuk beralih ke mode pemilihan persegi panjang.

Ini sangat berbeda dari vim di dalam tmux Anda harus mengetik dua karakter: Spacedan vuntuk masuk ke mode pemilihan persegi panjang. Dalam vim Anda hanya perlu mengetik Ctrl-V.

Juga di vim vmemulai pemilihan karakter-bijaksana, bukan memblokir.

Sayangnya, sepertinya tidak ada mode pemilihan garis-bijaksana di tmux ( Shift-vin vim).
EDIT: Sepertinya Tmux versi 2.0 menyediakan mode pemilihan garis-bijaksana dengan Shift-v(saya belum mencobanya!)

Lqueryvg
sumber
Tekan "v" dan Anda dapat memilih jalur. Tidak perlu ruang.
Amir H. Sadoughi
1
@ AmirH.Sadoughi, itu karena (sesuai jawaban Anda) Anda telah mengubah default dan mengikat "v" untuk memulai pemilihan alih-alih "spasi". Jika Anda mulai dengan .tmux.conf kosong Anda harus menemukan perilaku yang saya jelaskan benar; Anda harus menekan "spasi" untuk memulai seleksi.
Lqueryvg
1
Terima kasih telah mengoreksi saya. Untuk mengatasi kalimat terakhir Anda (tentang pemilihan garis-bijaksana), saya mencoba mengatakan bahwa dengan konfigurasi saya, saya dapat melakukan pemilihan blok dengan cv-space, dan saya dapat melakukan pemilihan garis dengan v. Jadi, menekan "awalan v "memungkinkan saya memilih jalur.
Amir H. Sadoughi
Saya merasa sangat sulit untuk percaya karena pemilihan garis-bijaksana hanya ditambahkan ke Tmux baru-baru ini ( Shift-vdalam rilis 2.0 Maret 2015), tentu saja setelah jawaban saya dan lama setelah jawaban asli Anda. Mungkin Anda dan saya berbicara tentang dua hal yang berbeda ketika kita berbicara tentang pemilihan garis. Silakan bandingkan dengan 3 mode pemilihan dalam VIM (dengan v, Shift-vdan Ctrl-v).
Lqueryvg
Anda benar, saya baru saja mengujinya. vPilihan saya adalah karakter yang bijaksana. Saya pada versi 1.9a dan tidak memiliki pilihan garis-vim seperti. Jadi, dengan versi 2.0, tiga mode persis yang dimiliki vim juga dimungkinkan di tmux, kan?
Amir H. Sadoughi