โหมดการคัดลอก tmux - เลือกบล็อคข้อความ


39

ฉันกำลังใช้ tmux กับปุ่ม vi และการคัดลอก / วางทำงานได้ดีตราบใดที่คุณเลือกข้อความหนึ่งบรรทัดหรือถ้าคุณมีเพียงหน้าต่างเดียว เมื่อฉันต้องการเลือกบล็อกข้อความ (หลายบรรทัด แต่ไม่เต็มความกว้าง) จากนั้นฉันประสบปัญหา ถ้าฉันเปิดหน้าต่าง vim หลายหน้าต่างมันจะเลือกข้อความจากหน้าต่างทั้งหมดและสิ่งที่ฉันต้องการคือเลือกข้อความจากหน้าต่างเดียวเท่านั้น นั่นคือเช่นเดียวกับการเลือกภาพในเสียงเรียกเข้า

เป็นไปได้ที่จะทำ?


คุณเปิดใช้งานการทำคีย์เวิร์ด Vi ใน tmux ได้อย่างไร?
romainl

เพิ่ม "set-window-option -g mode-keys vi" ใน ~ / .tmux.conf ของคุณ
Srećko Toroman

1
ดูเหมือนว่าคำตอบจะไม่เกิดกับคำถามของคุณในการใช้โหมดบล็อกภาพ - "หลายบรรทัด แต่ไม่ใช่ความกว้างเต็ม" เป็นสิ่งที่ฉันกำลังมองหา คุณพบทางออกของคุณเองไหม?
dmonopoly

ยังไม่ได้แก้ปัญหา
Srećko Toroman

ที่จริงแล้วมีวิธีแก้ปัญหาคือ
Srećko Toroman

คำตอบ:


46

ตรวจสอบให้แน่ใจว่าได้ตรวจสอบที่ด้านล่างของโพสต์นี้สำหรับการผูกที่จำเป็นที่ต้องเข้าไปในไฟล์. tmux.conf ของคุณ

ฉันสมมติว่าคีย์คำนำหน้าของคุณคือ Ca:

  • Ca หมายถึง: กดCtrl+A
  • Ca [หมายถึง: กดCtrl+ Aจากนั้นกด[

หากต้องการเลือกสี่เหลี่ยมผืนผ้าข้อความจาก (1,1) ถึง (2,2) ใน tmux:

  • ไปที่โหมดคัดลอก: Ca [
  • ย้ายกึ่งกลางของบรรทัด
  • กด Cv
  • กด Space
  • ย้ายส่วนที่เลือกด้วย jkhl
  • เมื่อคุณพอใจกับสิ่งที่คุณเลือกแล้วกด Enter (หรือ y หากคุณมีผลผูกพันในไฟล์ conf ของคุณ)
  • คุณสามารถวางบัฟเฟอร์การคัดลอกล่าสุดได้โดย: Ca]

ขอให้สังเกตว่าการกดspaceมีความจำเป็นสำหรับการเลือกรูปสี่เหลี่ยมผืนผ้า

ในการเลือกเส้นอย่างที่คุณทำตามปกติให้ไปที่โหมดถ่ายสำเนาและกด v เลือกด้วย jkhl keys และกด y

ฉันมีการผูกเหล่านี้ใน. tmux.conf ของฉัน:

ก่อนหน้าเวอร์ชั่น 2.4 (20 เมษายน 2560) :

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.

หลังจากเวอร์ชัน 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.

สิ่งสำคัญคือการยกเลิกการผูกการสลับสี่เหลี่ยมเริ่มต้น:

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

มิฉะนั้นการผูกข้อมูล 'Cv' ใหม่จะไม่ทำงาน

หมายเหตุ: หากต้องการมีซิงเกิ้ล.tmux.confที่ใช้งานได้ในหลายเวอร์ชันให้ดูคำถามนี้


1
ขอบคุณมาก. ความสำคัญอยู่ที่ tmux.conf ของคุณ - คุณสามารถแก้ไขคำตอบเพื่อรวม bind-key -t vi-copy 'Cv' rectangle-toggle ที่จุดเริ่มต้น
Srećko Toroman

คำถามเดิมถามวิธีการเลือกแบบสี่เหลี่ยมทำงานกับ "mode-keys vi" ไม่จำเป็นต้องผูกกุญแจใหม่เพื่อตอบคำถามนี้ ดูคำตอบอื่น ๆ มันเป็นแค่ "v" และ "space" จากโหมดการเลือก
Lqueryvg

สิ่งนี้ทำงานได้นอกเหนือจากข้อเท็จจริงที่ว่า jkhl ไม่ทำงานฉันต้องใช้ปุ่มลูกศรเพื่อเลื่อนไปรอบ ๆ มีวิธีใดบ้างที่จะเปลี่ยนแปลงสิ่งนี้
สูงสุด

ความแตกต่างระหว่างsendและsend-keysคืออะไร ฉันเห็นในsuperuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-keyใช้ เครื่องหมายคำพูดมีความสำคัญเช่นกันหรือไม่
user2442366

15

คุณสามารถเลือกบล็อกภาพเหมือนในรูปแบบ vi vก่อนเริ่มการเลือก ใน manpage สิ่งนี้เรียกว่า "Rectangle toggle"


2
นั่นคือสิ่งที่ฉันใช้ แต่นั่นมีปัญหาที่ฉันอธิบายไว้ข้างต้น สี่เหลี่ยมผืนผ้ากว้างเต็มเสมอ ฉันต้องการสี่เหลี่ยมผืนผ้าคล้าย VIM (x1, y1) - (x2, y2) :)
Srećko Toroman

1
@ Srećko Toroman คุณหมายความว่าอย่างไรกับความกว้างเต็ม?
gitaarik

9

ดังที่ Lars ชี้ให้เห็นvจริง ๆ แล้วทำสิ่งที่คุณขอโดยสลับระหว่างโหมดสี่เหลี่ยมผืนผ้าและโหมดการเลือกแบบเต็มบรรทัด spaceและenterจะถูกใช้ตามลำดับเพื่อเริ่มการเลือกใหม่และคัดลอก เข้าสู่โหมดการคัดลอกโดยใช้คำนำหน้าของคุณตามด้วย[และวางสิ่งที่คุณคัดลอกไว้ในหน้าต่าง tmux ใด ๆ ที่ใช้]

สิ่งนี้ทำให้ฉันสับสนเนื่องจากvฟังก์ชั่นเป็นกลุ่มเช่นเดียวกับspaceใน tmux เพื่อเริ่มต้นการเลือก

การออก:list-keys -t vi-copyใน tmux จะแสดงตารางคำสั่งทั้งหมดในโหมดการคัดลอก

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

ฉันไม่ได้รับมันอีก ในหน้าต่าง Vim ที่มีการแบ่งแนวตั้งคุณจะเลือกสี่เหลี่ยมในการแบ่งแรกเท่านั้นได้อย่างไร ที่นี่สี่เหลี่ยมผืนผ้าหลายบรรทัดจะห่อบานหน้าต่าง Tmux แบบเต็มเสมอ มันไม่เหมือนตัวเลือก Vim block ฉันใช้ tmux 1.5 อาจจะแตกต่างกันในเวอร์ชั่นของคุณ?
Srećko Toroman

ใช่ที่นี่ v ถูกแมปกับตัวเลือกเริ่มต้น สลับสี่เหลี่ยมไม่ได้กำหนด ดังนั้นฉันเดาว่าคุณทั้งคู่ถูกต้องฉันแค่ต้องอัปเดตลูกค้าของฉัน
Srećko Toroman

หากคุณมีหน้าต่าง vim แบบแยกเปิดในบานหน้าต่าง tmux เดียวคุณไม่สามารถใช้ความสามารถในการงัดแงะและวางได้หรือไม่? หากในอีกทางหนึ่งคุณมีสองบานหน้าต่าง tmux แต่ละบานมีหน้าต่างเป็นกลุ่มของตัวเองการเลือก / การคัดลอก tmux ควรสามารถห่อที่ขอบบานหน้าต่าง ฉันใช้ tmux 1.7
ที่นี่

6

เนื่องจากไม่มีคำตอบอื่นใดที่ให้ทางออกที่ดีที่สุดสำหรับปัญหานี้

มีวิธีให้การเลือกบล็อกทำงานแบบเดียวกับ Vim โดยไม่จำเป็นต้องกดเว้นวรรค เพียงแค่ Ctrl-V ที่เรียบง่ายฝังอยู่ในหน่วยความจำกล้ามเนื้อของคุณ
มันต้องการการแก้ไข. tmux.conf ของคุณ (แต่การใช้โหมด vi ทำเช่นนั้นแล้ว) และฉันไม่แน่ใจว่ามันจะทำงานกับ tmux <2.4

เพิ่มไปยัง. tmux.conf ของคุณเพื่อทำซ้ำการเลือก Vim และการเชื่อมโยง 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เริ่มเลือกปกติ (ตัวละครตัวละครตัวละครบรรทัดฉลาด) <C-v>เริ่มต้นการเลือกบล็อกและV(Shift-v) เริ่มต้นการเลือกบรรทัด โดยไม่คำนึงถึงชนิดของการเลือกyyanks to tmux paste buffer (หรือคลิปบอร์ด X; ดูความคิดเห็นของโค้ดด้านบน)

เหมือนกับเสียงเรียกเข้า


ทำงานให้ฉันมี upvote สู่ necomancy ของคุณ👏👏👏
mahemoff

2

แก้ไข: หลังจากตรวจสอบซอร์สโค้ดฉันได้เขียนคำตอบใหม่ทั้งหมด

ตอนแรกฉันคิดว่ามันเป็นไปไม่ได้เพราะฉันไม่สามารถทำงานได้ แต่คำตอบอื่น ๆ นั้นถูกต้องเกี่ยวกับvการเป็นกุญแจที่ถูกต้องสำหรับสิ่งนี้ แต่ก็ไม่ชัดเจนว่าจะใช้สิ่งนี้อย่างไรโดยเฉพาะอย่างยิ่ง

นอกจากนี้มันจะไม่ได้ผลสำหรับฉันเพราะฉันvผูกไว้กับbegin-selection- ฉันคิดว่าฉันต้องคัดลอกความคิดนี้จากที่อื่นเพื่อเลียนแบบวิธีการเริ่มต้นการเลือกตัวละครที่ฉลาดโดยไม่รู้ตัวว่าไม่รู้ว่ามันจะทำให้เกิดปัญหาตามมาอีก การเลือกบล็อก

$ 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

เมื่อฉันลบการเชื่อมโยงนี้ (โดยการแสดงความคิดเห็นออกบรรทัดในของฉัน.tmux.confและเริ่ม tmux) มันเริ่มทำงาน แต่ก็ยังค่อนข้างสับสนเพราะมันไม่เหมือนกับเสียงเรียกเข้าเลย

ด้วยการผูกค่าเริ่มต้นควรทำงานดังนี้:

  1. ตรวจสอบให้แน่ใจว่าคุณมี tmux setw -g mode-keys viอยู่ใน.tmux.confตัว
  2. พิมพ์C-a [เพื่อเริ่มโหมดการคัดลอก
  3. เลื่อนเคอร์เซอร์ไปยังตำแหน่งที่คุณต้องการเริ่มการเลือก
  4. ชนิด v
  5. พิมพ์Spaceเพื่อเริ่มการเลือก
  6. เลื่อนเคอร์เซอร์และคุณจะเห็นตัวเลือกรูปสี่เหลี่ยมผืนผ้า
  7. คุณสามารถกดvอีกครั้งเพื่อสลับการเลือกกลับไปเป็นการเลือกแบบตัวละครหรือในทางกลับกัน

คุณจะได้ไม่ต้องพิมพ์ก่อนที่คุณจะกดv Spaceคุณสามารถเริ่มต้นการเลือกตัวละครที่ฉลาดด้วยSpaceแรกและกดvหลังจากนั้นเพื่อสลับไปยังโหมดการเลือกรูปสี่เหลี่ยมผืนผ้า

มันค่อนข้างแตกต่างจากเสียงเรียกเข้าที่ใน tmux คุณต้องพิมพ์อักขระสองตัว: Spaceและvเพื่อเข้าสู่โหมดการเลือกรูปสี่เหลี่ยมผืนผ้า Ctrl-Vในกลุ่มคุณมีเพียงชนิด

นอกจากนี้ในกลุ่มจะvเริ่มต้นการเลือกอักขระที่ฉลาดไม่ใช่บล็อก

น่าเศร้าที่ดูเหมือนว่าจะไม่มีโหมดการเลือกบรรทัดใน tmux ( Shift-vเป็นกลุ่ม)
แก้ไข: ดูเหมือนว่า Tmux เวอร์ชั่น 2.0 จะมีโหมดการเลือกแบบ line-wise ด้วยShift-v(ฉันยังไม่ได้ลองเลย!)


กด "v" และคุณสามารถเลือกบรรทัด ไม่ต้องการพื้นที่
Amir H. Sadoughi

1
@ AmirH.Sadoughi นั่นเป็นเพราะ (ตามคำตอบของคุณ) คุณได้เปลี่ยนค่าเริ่มต้นและผูก "v" เพื่อเริ่มต้นการเลือกแทน "space" หากคุณเริ่มต้นด้วย. tmux.conf ที่ว่างเปล่าคุณควรค้นหาพฤติกรรมที่ฉันอธิบายว่าถูกต้อง คุณต้องกด "space" เพื่อเริ่มการเลือก
Lqueryvg

1
ขอบคุณสำหรับการแก้ไขฉัน เพื่อพูดประโยคสุดท้ายของคุณ (เกี่ยวกับการเลือกบรรทัดที่ชาญฉลาด) ฉันพยายามบอกว่าด้วยการกำหนดค่าของฉันฉันสามารถทำการเลือกบล็อกด้วย cv-space และฉันสามารถเลือกบรรทัดด้วย v ดังนั้นกด "คำนำหน้า v "อนุญาตให้ฉันเลือกบรรทัด
Amir H. Sadoughi

ฉันพบว่ามันยากมากที่จะเชื่อเพราะการเลือกแบบชาญฉลาดนั้นเพิ่งถูกเพิ่มใน Tmux เมื่อเร็ว ๆ นี้ ( Shift-vในรุ่น 2.0 มีนาคม 2015) แน่นอนหลังจากคำตอบของฉันและนานหลังจากคำตอบเดิมของคุณ บางทีคุณและฉันกำลังพูดถึงสองสิ่งที่แตกต่างกันเมื่อเราพูดถึงการเลือกที่ชาญฉลาด กรุณาเปรียบเทียบกับ 3 โหมดที่เลือกใน VIM (มีv, Shift-vและCtrl-v)
Lqueryvg

คุณถูกต้องฉันแค่ทดสอบมัน ตัวvเลือกของฉันคือตัวละครที่ฉลาด ฉันใช้เวอร์ชัน 1.9a และไม่มีตัวเลือกอื่น ๆ ดังนั้นด้วยเวอร์ชัน 2.0 สามโหมดที่แน่นอนที่เป็นกลุ่มนั้นมีความเป็นไปได้ใน tmux ด้วยใช่ไหม?
Amir H. Sadoughi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.