chế độ sao chép tmux - chọn khối văn bản


39

Tôi đang sử dụng tmux với các phím vi và sao chép / dán hoạt động tốt miễn là bạn chọn một dòng văn bản hoặc nếu bạn chỉ có một cửa sổ. Khi tôi muốn chọn một khối văn bản (nhiều dòng, nhưng không đầy đủ chiều rộng), thì tôi gặp rắc rối. Nếu tôi có nhiều cửa sổ vim được mở, thì nó sẽ chọn văn bản từ tất cả chúng, và điều tôi cần là chỉ chọn văn bản từ một cửa sổ. Đó là, giống như một lựa chọn trực quan trong vim.

Đây có phải là có thể làm gì?


Làm thế nào để bạn kích hoạt keybindings trong tmux?
romainl

thêm "set-window-option -g mode-key vi" vào ~ / .tmux.conf
Srećko Toroman

1
Có vẻ như câu trả lời không nhận được câu hỏi của bạn về việc sử dụng chế độ khối trực quan - "nhiều dòng, nhưng không đầy đủ chiều rộng" cũng là điều tôi đang tìm kiếm. Bạn đã tìm thấy giải pháp của riêng bạn?
độc quyền

Không, vẫn không có giải pháp.
Srećko Toroman

Trên thực tế, có một giải pháp.
Srećko Toroman

Câu trả lời:


46

Hãy chắc chắn kiểm tra phần dưới của bài đăng này để biết các ràng buộc cần thiết cần phải đi vào tệp .tmux.conf của bạn.

Tôi giả sử khóa tiền tố của bạn là Ca:

  • Ca có nghĩa là: nhấn Ctrl+A
  • Ca [có nghĩa là: nhấn Ctrl+ Arồi nhấn[

Để thực hiện lựa chọn hình chữ nhật của văn bản từ (1,1) đến (2,2) trong tmux:

  • Chuyển đến chế độ sao chép: Ca [
  • Di chuyển giữa dòng
  • Nhấn Cv
  • Ấn nút cách
  • Di chuyển lựa chọn với jkhl
  • Khi bạn hài lòng với lựa chọn của mình, nhấn Enter (hoặc y nếu bạn có ràng buộc trong tệp conf của bạn).
  • Bạn có thể dán bộ đệm sao chép mới nhất bằng cách: Ca]

Lưu ý rằng nhấn spacelà cần thiết để lựa chọn hình chữ nhật.

Để chọn các dòng như bạn thường làm, hãy chuyển sang chế độ sao chép và nhấn v, chọn bằng các phím jkhl và nhấn y.

Tôi có các ràng buộc này trong .tmux.conf của mình:

Trước phiên bản 2.4 (ngày 20 tháng 4 năm 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.

Sau phiên bản 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.

Điều quan trọng là hủy liên kết ràng buộc hình chữ nhật mặc định:

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

Mặt khác, ràng buộc 'Cv' mới không hoạt động.

Lưu ý: để có một bản duy nhất .tmux.confhoạt động trên các phiên bản, hãy xem câu hỏi này .


1
Cảm ơn bạn rất nhiều. Trọng tâm là trên tmux.conf của bạn - bạn có thể chỉnh sửa câu trả lời để bao gồm khóa-ràng buộc -t vi-copy 'Cv' hình chữ nhật-chuyển đổi lúc đầu.
Srećko Toroman

Câu hỏi ban đầu hỏi làm thế nào để lựa chọn hình chữ nhật hoạt động với "phím chế độ vi". Không cần phải liên kết lại các khóa để trả lời câu hỏi này. Xem các câu trả lời khác; nó chỉ là "v" và "khoảng trắng" từ chế độ lựa chọn.
Lqueryvg

Điều này hoạt động khác với thực tế là jkhl không hoạt động, tôi phải sử dụng các phím mũi tên để di chuyển xung quanh, có cách nào để thay đổi điều này không?
Tối đa

Sự khác biệt giữa sendsend-keys. Tôi thấy trong superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key được sử dụng. Ngoài ra các dấu ngoặc kép quan trọng?
dùng2442366

15

Bạn có thể chọn một khối trực quan giống như trong vi - gõ vtrước khi bắt đầu lựa chọn. Trong trang chủ, đây được gọi là "Chuyển đổi hình chữ nhật".


2
Đó chính xác là những gì tôi đang sử dụng. Nhưng đó là một vấn đề mà tôi đã mô tả ở trên. Hình chữ nhật luôn có chiều rộng đầy đủ. Tôi cần một hình chữ nhật giống như VIM (x1, y1) - (x2, y2) :)
Srećko Toroman

1
@ Srećko Toroman bạn có ý nghĩa gì chính xác với chiều rộng đầy đủ?
gitaarik

9

Như Lars chỉ ra, vthực sự làm những gì bạn đang yêu cầu bằng cách chuyển đổi giữa chế độ hình chữ nhật và chế độ chọn toàn dòng. spaceenterđược sử dụng tương ứng để bắt đầu một lựa chọn mới và sao chép nó. Nhập chế độ sao chép bằng tiền tố của bạn theo sau [và dán lựa chọn đã sao chép của bạn vào bất kỳ cửa sổ tmux nào bằng cách sử dụng]

Điều này làm tôi bối rối vì các vchức năng trong vim cũng như spacetrong tmux, để bắt đầu lựa chọn.

Phát hành :list-keys -t vi-copytrong tmux sẽ hiển thị bảng lệnh đầy đủ trong chế độ sao chép.

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

Tôi không nhận được nó một lần nữa. Đưa ra một cửa sổ Vim có phân chia dọc, làm thế nào để bạn chọn một hình chữ nhật chỉ trong lần phân chia đầu tiên? Ở đây, hình chữ nhật đa dòng sẽ luôn bao bọc toàn bộ khung Tmux. Nó không giống như lựa chọn khối Vim. Tôi đang sử dụng tmux 1.5, có lẽ nó khác phiên bản của bạn?
Srećko Toroman

Vâng, ở đây, v được ánh xạ để bắt đầu lựa chọn. Chuyển đổi hình chữ nhật là không xác định. Vì vậy, tôi đoán cả hai bạn đều đúng, tôi chỉ cần cập nhật khách hàng của tôi?
Srećko Toroman

Nếu bạn có một cửa sổ chia vim mở trong một khung tmux duy nhất, bạn có thể sử dụng khả năng yank và dán của vim không? Mặt khác, nếu bạn có hai tấm tmux, mỗi tấm có cửa sổ vim riêng, thì chọn / sao chép tmux sẽ có thể bọc ở các cạnh của khung. Tôi đang sử dụng tmux 1.7
ở đây

6

Vì không có câu trả lời nào khác đưa ra giải pháp tối ưu cho vấn đề, nên tôi không ở trên mức cần thiết.

Có một cách để lựa chọn khối hoạt động giống như trong Vim, mà không phải nhấn phím cách. Chỉ cần một Ctrl-V đơn giản, ăn sâu vào bộ nhớ cơ bắp của bạn.
Nó yêu cầu chỉnh sửa .tmux.conf của bạn (nhưng đã sử dụng chế độ vi đã làm như vậy) và tôi không chắc nó hoạt động cho tmux <2.4.

Thêm phần này vào .tmux.conf của bạn để sao chép lựa chọn Vim và các ràng buộc yank:

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

Vào chế độ lựa chọn và điều hướng đến nơi bạn muốn bắt đầu lựa chọn. Bây giờ vbắt đầu lựa chọn thông thường (theo từng ký tự, theo dòng), <C-v>bắt đầu chọn khối và V(shift-v) bắt đầu chọn dòng. Bất kể loại lựa chọn, yyanks đến bộ đệm dán tmux (hoặc X clipboard; xem nhận xét mã ở trên).

Tương tự như Vim.


Làm việc cho tôi, có một sự ủng hộ đối với sự cần thiết của bạn
mahemoff

2

EDIT: Sau khi kiểm tra mã nguồn, tôi đã viết lại câu trả lời của mình hoàn toàn.

Ban đầu tôi nghĩ điều này là không thể vì tôi không thể làm việc này, nhưng các câu trả lời khác đều đúng về việc vlà chìa khóa chính xác cho việc này, nhưng không rõ ràng làm thế nào để sử dụng nó, đặc biệt là nếu bạn đã quen với vim.

Ngoài ra, nó sẽ không hiệu quả với tôi vì tôi đã vbị ràng buộc begin-selection- Tôi nghĩ rằng tôi phải sao chép một cách mù quáng ý tưởng này từ một nơi khác để bắt chước cách vim để bắt đầu lựa chọn nhân vật, không biết nó sẽ gây ra vấn đề gì nữa lựa chọn khối.

$ 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

Khi tôi đã gỡ bỏ ràng buộc này (bằng cách nhận xét dòng trong .tmux.conftmux của tôi và khởi động lại), nó bắt đầu hoạt động, nhưng nó vẫn khá khó hiểu vì nó không giống với vim chút nào.

Với các ràng buộc mặc định, nó sẽ hoạt động như sau:

  1. Hãy chắc chắn rằng bạn đã tmux unning với setw -g mode-keys vitrong của bạn .tmux.conf.
  2. C-a [để bắt đầu chế độ sao chép
  3. di chuyển con trỏ đến nơi bạn muốn bắt đầu lựa chọn
  4. kiểu v
  5. Spaceđể bắt đầu lựa chọn
  6. di chuyển con trỏ và bạn sẽ thấy một lựa chọn hình chữ nhật
  7. bạn có thể nhấn vmột lần nữa để chuyển lựa chọn trở lại thành lựa chọn thông minh hoặc ngược lại.

Bạn không cần phải gõ vtrước khi nhấn Space. Trước tiên, bạn có thể bắt đầu lựa chọn ký tự thông minh Spacevà nhấn vsau đó để chuyển sang chế độ chọn hình chữ nhật.

Nó khá khác so với vim ở chỗ trong tmux bạn phải nhập hai ký tự: Spacevđể vào chế độ chọn hình chữ nhật. Trong vim bạn chỉ phải gõ Ctrl-V.

Ngoài ra trong vim vbắt đầu một lựa chọn nhân vật khôn ngoan, không phải khối.

Đáng buồn thay, dường như không có chế độ lựa chọn dòng khôn ngoan trong tmux ( Shift-vtrong vim).
EDIT: Có vẻ như Tmux phiên bản 2.0 cung cấp chế độ lựa chọn theo dòng thông minh với Shift-v(mặc dù tôi chưa thử!)


Nhấn "v" và bạn có thể chọn dòng. Không cần không gian.
Amir H. Sadoughi

1
@ AmirH.Sadoughi, đó là vì (theo câu trả lời của bạn) bạn đã thay đổi mặc định và ràng buộc "v" để bắt đầu lựa chọn thay vì "khoảng trắng". Nếu bạn bắt đầu với một .tmux.conf trống, bạn sẽ thấy hành vi tôi mô tả là chính xác; bạn phải nhấn "khoảng trắng" để bắt đầu lựa chọn.
Lqueryvg

1
Cảm ơn vì đã sửa tôi. Để giải quyết câu cuối cùng của bạn (về lựa chọn dòng khôn ngoan), tôi đã cố gắng nói rằng với cấu hình của mình, tôi có thể thực hiện lựa chọn khối với cv-space và tôi có thể thực hiện lựa chọn dòng với v. Vì vậy, nhấn "tiền tố v "Cho phép tôi chọn các dòng.
Amir H. Sadoughi

Tôi thấy điều đó rất khó tin bởi vì lựa chọn theo dòng thông minh chỉ được thêm vào Tmux gần đây ( Shift-vtrong phiên bản 2.0 tháng 3 năm 2015), chắc chắn sau câu trả lời của tôi và rất lâu sau câu trả lời ban đầu của bạn. Có lẽ bạn và tôi đang nói về hai điều khác nhau khi chúng ta nói về lựa chọn theo dòng. Hãy so sánh với 3 chế độ lựa chọn trong VIM (với v, Shift-vCtrl-v).
Lqueryvg

Bạn nói đúng, tôi chỉ thử nó. vLựa chọn của tôi là nhân vật khôn ngoan. Tôi đang dùng phiên bản 1.9a và không có lựa chọn dòng giống như vim. Vì vậy, với phiên bản 2.0, ba chế độ chính xác mà vim có cũng có thể có trong tmux, phải không?
Amir H. Sadoughi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.