รับ tmux เพื่อคัดลอกบัฟเฟอร์ไปยังคลิปบอร์ด


118

ฉันกำลังพยายามหาวิธีที่เหมาะสมในการคัดลอกสิ่งที่ฉันมีในบัฟเฟอร์ tmux ลงในคลิปบอร์ดของฉัน ฉันได้ลองทำหลายสิ่งหลายอย่างเช่น

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

สิ่งที่ทำให้ฉันเข้าใกล้อย่างเป็นธรรมสิ่งที่ฉันต้องทำคือกดควบคุม -d หลังจากที่ฉันทำคำนำหน้า -p

ฉันพยายามแก้ไขโดยทำ

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

แต่นั่นไม่ได้ผล อันที่จริงถ้าฉันจับคู่สิ่งนี้กับ

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

มันไม่ได้ทำอะไรเลยฉันสมมติว่า split-window ไม่ชอบ << ในคำสั่ง shell

ความคิดใด ๆ

แก้ไข: คุณสามารถข้ามไปได้select-pane -t 2ถ้าคุณต้องการมันไม่สำคัญเลย ฉันเพิ่งใช้เลย์เอาต์ที่เฉพาะเจาะจงและบานหน้าต่างที่ 2 เป็นสิ่งที่ฉันต้องการแยกเมื่อฉันทำอย่างอื่น


2
ตรวจสอบให้แน่ใจว่าได้ดูคำตอบด้านล่างปี 2014 ซึ่งล่าสุดกว่าคำตอบบางข้อ มันแนะนำปลั๊กอิน tmux yank ที่ใช้งานได้ดีมาก
dmonopoly

สำหรับคำตอบที่เป็นปัจจุบันด้วย Tmux 2.4 (เปิดตัวในเดือนเมษายน 2017) และ 2.6 ดูคำตอบของฉัน
Jason Axelson

คำตอบ:


26

เอกสารที่นี่ต้องขึ้นบรรทัดใหม่ ตัวอย่างเช่นในเชลล์สคริปต์คุณสามารถเขียน

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

ฉันไม่คิดว่า tmux จะช่วยให้คุณใส่บรรทัดใหม่ได้และแม้ว่าจะเป็นเช่นนั้นนี่ก็ไม่ใช่วิธีที่ดี เกิดอะไรขึ้นถ้าข้อมูลมีHEREอยู่คนเดียวในบรรทัด (เช่นเพราะคุณกำลังคัดลอก.tmux.conf)

ฉันขอแนะนำให้เขียนเนื้อหาบัฟเฟอร์ลงในไฟล์ชั่วคราว ยังไม่ทดลอง:

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

มีเงื่อนไขการแย่งชิงหากคุณใช้คำสั่งนี้ในสองอินสแตนซ์ tmux แยกกัน ฉันไม่รู้วิธีแก้ปัญหานี้


ขอบคุณทำงานได้อย่างสมบูรณ์สภาพการแข่งขันไม่ได้เป็นปัญหาสำหรับฉันฉันใช้แค่ 1 ครั้งเท่านั้น
พลังดิจิทัล

เพื่อหลีกเลี่ยงสภาพการแข่งขันฉันขอแนะนำให้ใช้mktempซึ่งใช้ได้อย่างกว้างขวาง
Grief

@Grief ความคิดที่ดี ในกรณีนี้การใช้ PID ของกระบวนการ tmux จะทำงานได้ดีและอาจจะง่ายกว่าในการจัดเรียง ( $PPIDในเชลล์ที่เปิดตัวโดย tmux) แต่คุณจะได้รับชื่อไฟล์ตัวแปรsave-bufferอย่างไร ฉันเดาsave-buffer - | …เหมือนคำตอบของ Grauwolfไฟล์ไหนกันบ้าง?
Gilles

คุณถูกต้องความผิดของฉันมันจะเป็นไปไม่ได้
ความเศร้าโศก

93

สิ่งนี้น่าจะใช้ได้:

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

1
ดังนั้นมันจะ มันดีกว่าการใช้ไฟล์ชั่วคราวขอบคุณ มันจะทำงานอัตโนมัติพร้อม ๆ กับหลาย ๆ เซสชันพร้อมกันซึ่งต้องขอบคุณTMUXตัวแปรสภาพแวดล้อม
Gilles

22
คำแนะนำที่ดีกว่าสำหรับสิ่งต่อไปC-pนี้คือ: bind C-p run "xclip -o | tmux load-buffer - ; tmux paste-buffer"- ไม่มีปัญหาการอ้างถึงหรือปัญหาขีด จำกัด บรรทัดคำสั่ง
docwhat

8
tmux มีเบ็ดเพื่อคัดลอกส่วนที่เลือกลงในคลิปบอร์ดcopy-modeหรือไม่?
Ehtesh Choudhury

1
xclip -oตัวเลือกไม่ทำงานสำหรับฉันดังนั้นฉันจึงเปลี่ยนเป็นbind C-c run "tmux save-buffer - | xclip -selection c"\; display-message "Buffer copied to clipboard"
Pawka

6
ทุกครั้งที่ฉันทำสำเนาด้วยวิธีนี้ tmux จะหยุดตอบสนองต่อแป้นพิมพ์ลัดใด ๆ ทางออกใดที่จะ?
skrat

41

ทางออกที่ง่ายกว่าสำหรับ Mac OS-X

สิ่งนี้สร้างขึ้นจากคำตอบของ Alex และใช้สิ่งที่ไม่มีอยู่ในขณะนั้น

หากคุณใช้โฮมบรูว์ (และถ้าไม่ใช่, ทำไมคุณไม่ใช้) คุณสามารถทำได้ดังนี้:

brew install reattach-to-user-namespace

จากนั้นใน~/.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"

เพื่อคัดลอกบัฟเฟอร์จาก tmux (คุณควรจะมีการคัดลอกแล้วบางสิ่งบางอย่างใช้ tmux) ลงในเครื่อง Mac ด้วยกระดาษแข็ง, <tmux-key> Control-cการใช้งาน ตอนนี้จะพร้อมใช้งานสำหรับCommand-vหรือpbpaste

ในการวางบางสิ่งบางอย่างจากนามบัตร Mac <tmux-key> Control-vใช้


2
คำตอบนี้ยอดเยี่ยม ฉันใช้tmux show-bufferซึ่งทำให้ปัญหาการตัดบรรทัดtmux save-buffer -แก้ไขได้
event_jr

อะไร-ในตอนท้ายของtmux save-buffer -ทำอย่างไร
hekevintran

ปล่อยsave-bufferให้ stdout คุณสามารถแทนที่-ด้วยชื่อไฟล์และมันจะบันทึกไว้ที่นั่น สิ่งนี้จะป้องกันไม่ให้คุณเขียน (และต้องล้างข้อมูล) ไฟล์
docwhat

1
ในขณะที่ OS X 10.10 reattach-to-user-namespace นั้นไม่จำเป็นอีกต่อไป เกือบทุกบทช่วยสอนและเอกสารประกอบเกี่ยวกับ tmux และ OS X กล่าวถึงเพราะการคัดลอกและวางไม่ใช่เรื่องง่ายเมื่อสองสามปีก่อน วันนี้มัน (ส่วนใหญ่) ผลงานออกมาจากกล่อง
Rafael Bugajewski

40

copy-pipeคำสั่งถูกบันทึกเป็นรุ่น 1.8 มันคัดลอกส่วนที่เลือกไปยังบัฟเฟอร์ tmux และไพพ์ไปยังคำสั่ง ขณะนี้ไม่จำเป็นต้องมีการผูกคำนำหน้า นี่คือตัวอย่าง:

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

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

ตอนนี้เมื่อคุณมีข้อความบางส่วนที่เลือกในcopy-mode, yจะคัดลอกข้อความที่ไป tmux buffer เช่นเดียวกับคลิปบอร์ดระบบปฏิบัติการ อย่างไรก็ตามจะไม่ช่วยถ้าคุณต้องการรับข้อความจากคลิปบอร์ดไปยังบัฟเฟอร์ tmux


1
ทำงานได้อย่างสมบูรณ์แบบและเป็นทางออกที่ง่ายที่สุดของกลุ่ม
Naseer

2
ใช้งานไม่ได้กับฉันภายใต้ Linux ระบบนี้ใช้งานได้: unix.stackexchange.com/a/131074/13601
Sebastian Blask

1
ตั้งแต่ OS X 10.10 reattach-to-user-namespaceไม่จำเป็นต้องปรากฏขึ้น
Chris

ทำงานบน el capitan
olleh

2
สิ่งนี้ใช้ไม่ได้กับ Tmux 2.4 ซึ่งวางจำหน่ายในวันที่ 20 เมษายน 2017 แต่คุณต้องใช้bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip"และสำหรับ OS X:bind-key -T copy-mode-vi y send-keys -X copy-pipe "reattach-to-user-namespace pbcopy"
Jason Axelson

16

คุณอาจต้องการที่จะลองปลั๊กอิน tmux-งัด มันช่วยให้การคัดลอกตรงไปยังคลิปบอร์ดของระบบ (OS X และ Linux) และสินค้าอื่น ๆ เช่น yanking บรรทัดเชลล์ปัจจุบัน


7
นี่เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมและสะอาดและควรพิจารณาให้มากขึ้นเนื่องจากเป็นคำตอบล่าสุดมากกว่าคำตอบอื่น ๆ ขอบคุณสำหรับการแบ่งปัน!
dmonopoly

9

หลังจากลองใช้วิธีอื่นแล้วนี่คือการตั้งค่าสุดท้ายของฉัน

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

การใช้ save-buffer แทน show-buffer ให้ข้อมูลจริงโดยไม่มีข้อมูลดังแสดงด้วยตัวแบ่งบรรทัดเมื่อคุณอยู่ในการแยก

ฉันยังใช้สิ่งนี้เพื่อเริ่มต้นการเลือก / คัดลอกใน tmux copy-mode:

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

ฉันเดาว่าอาจเป็นไปได้ที่จะรวมการคัดลอกส่วนที่เลือกด้วยปุ่ม 'y' และย้ายไปที่คลิปบอร์ด x


ฉันพยายามรวมคำสั่งทั้งสองอย่างตามที่คุณพูดไม่ประสบความสำเร็จ ความคิดใด ๆ เกี่ยวกับวิธีที่จะทำ?
Rafael Vega

9

นี่คือความพยายามในการตอบที่ครอบคลุม

ก่อนประวัติศาสตร์เล็กน้อย

เมื่อคำถามนี้ถูกถามเป็นครั้งแรก (มิถุนายน 2011) การคัดลอกข้อความจาก Tmux ไปยังคลิปบอร์ดจะต้องมีกระบวนการสองขั้นตอนให้คัดลอกข้อความที่เลือกไปยังบัฟเฟอร์ของ Tmux แล้วคัดลอกข้อความจากบัฟเฟอร์ของ Tmux ไปยังคลิปบอร์ดของระบบ

ใน 1.8 (มีนาคม, 2013) copy-pipeคำสั่งถูกเพิ่มซึ่งช่วยให้คุณสามารถคัดลอกข้อความที่เลือกตรงไปยังคลิปบอร์ดของระบบ (หรือปลายทางอื่น ๆ )

จากนั้นใน 2.4 (เมษายน 2017) ตารางสำคัญถูกเปลี่ยนแปลงอย่างมีนัยสำคัญทำให้ได้คำตอบมากมายในหน้านี้ซึ่งล้าสมัย

ตอบคำถามเดิม

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 :

หากคุณใช้homebrewคุณควรติดตั้งreattach-to-user-namespaceโดยใช้คำสั่งต่อไปนี้ในเทอร์มินัล:

brew install reattach-to-user-namespace

จากนั้นใน ~ / .tmux.conf ของคุณ:

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 (คัดลอกและวางส่วนที่เลือกตรงจากและไปยังคลิปบอร์ดสำหรับ tmux> 2.4)

หมายเหตุ: มีสองรุ่นสำหรับ Linux เนื่องจาก Linux มีคลิปบอร์ดหลักและรอง (เรียกอีกอย่างว่าการเลือก)

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"

การกำหนดคำสั่งเหล่านี้เอง

  • หากคุณไม่ต้องการให้คำสั่งบอกคุณว่ามันทำอะไรในบรรทัดสถานะเพียงแค่ลบdisplay-message(รวมถึงสิ่ง\;ที่มาก่อนหน้า)

  • หากคุณกำลังใช้โหมดคัดลอกสไตล์ของ Emacs แทนที่จะเป็น vi ให้เปลี่ยนอินสแตนซ์ใด ๆcopy-mode-viด้วยเพียงแค่copy-mode

  • หากคุณใช้งาน Linux และคุณต้องการใช้xselแทนการxclipแทนที่xclip -rด้วยxsel -i -pและxclip -oด้วยxsel -o -p

  • -rในxclip -rเป็นตัวเลือกก็เอาขึ้นบรรทัดใหม่ที่ผ่านมา มันมีประโยชน์สำหรับการคัดลอกคำสั่งจากนั้นเมื่อคุณวางคำสั่งพวกเขาจะไม่ถูกดำเนินการทันที

  • หากคุณกำลังเจาะผ่าน SSH คุณควรศึกษาhttps://unix.stackexchange.com/a/354581/14252

อ้างอิง:


คำสั่งนี้bind-key C-p run-shell "xclip -o | tmux load-buffer - ; tmux paste-buffer"ยังคงใช้ได้หรือไม่? สำหรับtmux>2.4
alpha_989

7

ฉันไม่ชอบการกดปุ่มพิเศษดังนั้นฉันจึงต้องการบางสิ่งที่ทะเยอทะยานมากขึ้น เข้าสู่โหมดคัดลอกด้วย [, ไฮไลต์ข้อความด้านขวาจากนั้นกด] เพื่อคัดลอกข้อความไปยังคลิปบอร์ด

นอกจากนี้ tmux ยังรวมการขึ้นบรรทัดใหม่ในนิพจน์ที่ตัดคำ (และการขึ้นบรรทัดใหม่อย่างผิดปกติเหล่านั้นอยู่ในตำแหน่งที่ไม่ถูกต้อง ! ดังนั้นฉันจึงอยากให้ C-] คัดลอกนิพจน์เพื่อลบบรรทัดใหม่

บน tmux 1.6 ฉันลองทำสิ่งนี้:

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

แต่นั่นไม่ได้ผลเพราะ tmux ดูเหมือนจะไม่มีความสุขที่จะผูกสิ่งที่ซับซ้อนกับตารางสำเนา vi ดังนั้นฉันจึงตัดสินใจทำสิ่งนี้แทน:

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

สิ่งนี้นำไปสู่สิ่งแปลก ๆ (] หรือ C-] จะทำตัวตลกในครั้งต่อไปที่คุณใช้ แต่เพียงครั้งเดียว) หากคุณออกจากโหมดคัดลอกด้วยวิธีอื่นนอกจาก] หรือ C-] สิ่งนี้สามารถแก้ไขได้ด้วยการผูกที่ฉันจินตนาการ แต่นี่คือสิ่งที่ฉันต้องการมากที่สุดของเวลา


stackoverflow.com/a/10954274/69663บันทึกว่ามีรายงานข้อผิดพลาดที่เกี่ยวข้องกับข้อ จำกัด ของการผูก
-key

4

มีวิธีแก้ปัญหาสำหรับ Arch Wiki โดยใช้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


2
tmux สร้างsave-bufferไฟล์อย่างปลอดภัยในไดเร็กทอรีที่แชร์หรือไม่? มิฉะนั้นการวางไว้ใน/tmpนั้นเป็นช่องโหว่ มีการใช้งานcatไม่ได้ผลและการลบไฟล์ชั่วคราวหายไป ถ้างั้นมันก็เป็นเรื่องของการxselเทียบxclipซึ่งเทียบเท่ากันที่นี่และคุณมีทางออกของฉัน
Gilles

1
ขอบคุณ Gilles ฉันจะอัปเดตวิกิเพื่อสะท้อนคะแนนของคุณ
jasonwryan

4

ทางออกสำหรับ Mac OS X ทำตาม 2 ขั้นตอนเหล่านี้:

  1. ใช้วิธีแก้ปัญหาของ Chris Johnsen: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard

  2. เพิ่มรหัสนี้ในการกำหนดค่า tmux ของคุณ (~ / .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

ตัวแปรที่แตกต่างกันเล็กน้อยของคำตอบที่ยอมรับซึ่งฉันทำให้สุก

ฉันชอบที่จะใช้คลิปบอร์ดระบบ (Ctrl-C, Ctrl-V) นอกเหนือจากprimaryคลิปบอร์ดเริ่มต้นของ xclip (อันที่คุณได้จากการเลือกเมาส์และการคลิกเมาส์กลาง) สำหรับการเลือกคลิปบอร์ดระบบที่คุณต้องผ่านอาร์กิวเมนต์-selection clipboardxclip

ในขณะที่การคัดลอกบัฟเฟอร์ไปยังคลิปบอร์ดฉันชอบความสามารถในการเลือกบัฟเฟอร์ที่ฉันต้องการคัดลอก มันจะทำโดยใช้choose-bufferแล้วผ่าน buffer อาร์กิวเมนต์ที่จะใช้save-buffer-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"

ปรับปรุง: อย่างใดด้วย tmux 1.8 และสองของการติดตั้ง openSUSE 12.2 ของฉันฉันเห็นแฮงค์เมื่อtmux run-shellถูกเรียกด้วยxclipการอ่านจาก stdin ผ่านท่อ ฉันตัดสินใจที่จะxselลองแทนและดูเหมือนว่าจะทำงาน xselเหล่านี้เป็นปุ่มลัดเทียบเท่าใช้ ฉันยังใช้&&การโยงคำสั่งในการวางเพื่อความทนทานมากขึ้น

# 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

นี่เป็นคำตอบที่ค่อนข้างยาวของฉันที่ควรแก้ไขปัญหาสำคัญสองข้อด้วยการใช้ xclip เพื่อคัดลอกบัฟเฟอร์จากเซสชัน tmux แบบรีโมต (ssh):

1. xclip ที่ไม่ตอบสนอง

สำหรับฉัน @ คำตอบของ Grauwolf ด้วยxclipไม่ทำงาน (ทำให้บานหน้าต่าง tmux ไม่รับผิดชอบทั้งหมด) ฉันพบว่าทำไมในหน้า Tmux ของ Arch wiki :

xclip สามารถใช้เพื่อจุดประสงค์นั้นได้ซึ่งแตกต่างจาก xsel ซึ่งทำงานได้ดีกว่าในการพิมพ์บิตสตรีมแบบดิบที่ไม่เหมาะสมกับโลแคลปัจจุบัน อย่างไรก็ตามมันเป็น neater ที่จะใช้ xsel แทน xclip เพราะ xclip ไม่ได้ปิด STDOUT หลังจากอ่านจากบัฟเฟอร์ของ tmux ดังนั้น tmux จึงไม่ทราบว่างานการคัดลอกเสร็จสิ้นและยังคงรอการยกเลิกของ xclip ดังนั้นการแสดงผล tmux จึงไม่ตอบสนอง วิธีแก้ปัญหาคือเปลี่ยนเส้นทาง STDOUT ของ xclip เป็น / dev / null

ดังนั้นการรวมควรเป็น:

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

ตอนนี้จะใช้งานได้หากเซสชัน tmux ของคุณเป็นแบบโลคัล

2. xclip ไม่สามารถเชื่อมต่อกับ X

หากคุณใช้ tmux บน ssh -Xมีโอกาสมากที่จะไม่สามารถทำงานได้โดยตรง

นั่นเป็นเพราะตัวแปรเชลล์$DISPLAYจำเป็นต้องตั้งค่าอย่างถูกต้อง

โซลูชั่นที่สมบูรณ์

ดังนั้นสำหรับฉันวิธีการทำงานที่สมบูรณ์คือการใส่บรรทัดต่อไปนี้ในของฉัน~/.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

สำหรับการวางจากหลัก:

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

ผมไม่เข้าใจว่าทำไม$DISPLAYไม่ได้ตั้งค่าอย่างถูกต้องในขณะที่การจัดหา .tmux.confดังนั้นนี่คือเหตุผลว่าทำไมผมต้องดึงมันด้วยและtmux show-envsed

หากคุณมี tmux> = 1.8 คุณสามารถปรับคำสั่งนี้ด้วย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'

/home/linux/.tmux.conf:11: invalid or unknown command: bind-key C-y run "tmux save-buffer - | xclip -i -selection clipboard -d `tmux show-env | sed -n 's[0/0] PLAY=//p'` >/dev/null
ผู้ใช้

@user sedคำสั่งที่คุณแสดงไม่เหมือนกับที่ฉันเขียน ... นี่คือสิ่งที่คุณเขียนไว้ในของคุณ.tmux.confหรือไม่
PlasmaBinturong

ฉันเพิ่งคัดลอกและวางรหัสของคุณ
ผู้ใช้

@ ผู้ใช้แปลก อาจมีแหล่งที่มาของข้อผิดพลาดมากมาย ตรวจสอบก่อนว่าข้อความของคุณไม่เป็นไร แล้วคุณคุ้นเคยกับsedอะไร คำสั่งควรเป็น: sed -n s/^DISPLAY=//p. หรือคุณสามารถใช้:cut tmux show-env DISPLAY | cut -d'=' -f2มันอาจคุ้มค่าที่จะตรวจสอบเวอร์ชั่น tmux ของคุณ
PlasmaBinturong

3

ฉันกำลังพยายามหาวิธีที่เหมาะสมในการคัดลอกสิ่งที่ฉันมีในบัฟเฟอร์ tmux ลงในคลิปบอร์ดของฉัน ฉันได้ลองทำหลายสิ่งหลายอย่างเช่น

สำหรับการผูกสไตล์ emacs มีตัวเลือกที่ต่างกันเล็กน้อย (สไตล์ Vi ควรจะคล้ายกัน?) การผูกแบบทั่วไปสำหรับการทำ "การคัดลอกตัวเลือก" ใน emacs คือ Mw ดังนั้นจะสะดวกมากถ้ามีการผูกใน tmux เดียวกัน

1 - จะดีที่สุด แต่ไม่ทำงาน (เนื่องจากข้อ จำกัด ของ 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 - การประนีประนอมที่ใช้งานได้ดีสำหรับฉัน : ยอมรับโดยใช้ปุ่มลัดอื่นสำหรับ emacs-copy ใน tmux ใช้เช่น CMw (การเชื่อมโยงนี้จะถูกกำหนด "ทั่วโลก" - ไม่เพียง แต่ในโหมดคัดลอก - แต่มีประโยชน์เฉพาะในโหมดคัดลอก)

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

3

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

    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" 

หมายเหตุบางส่วน:

  • -sel clip -iสำหรับการคัดลอกท่อผมต้องระบุคลิปบอร์ดของฉันด้วย บรรทัดนั้นรวมเอา yank to tmux buffer แล้วส่งไปยัง xclip
  • ในการวางจริงฉันต้องระบุคลิปบอร์ดอีกครั้งด้วย -sel clip -o

ตอนนี้ใช้ได้สำหรับการตั้งค่า vim / zsh / tmux ของฉัน


ขอขอบคุณ! -sel clip -iแก้ปัญหา แม้ว่าผมไม่เข้าใจว่าทำไมคุณต้องระบุคลิปบอร์ดอีกครั้งเพื่อวาง (มาตรฐาน]การทำงานสำหรับฉัน)
melekes

1

และคำตอบ @Leif รุ่นที่ปรับปรุงแล้วอาจเป็น:

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

วิธีนี้จะไม่มีผลใด ๆ หากคุณออกจากโหมดการคัดลอกด้วยวิธีอื่นนอกจาก] โค้ดด้านบนจะถูกห่อด้วยtundle / tmux-yank a tmux plugin สำหรับการคัดลอกข้อความ tmux ไปยังคลิปบอร์ดของระบบเป้าหมายคือ tmux> = 1.6 บน OS X และ Linux


1

บน OS-X ที่มี tmux เวอร์ชัน 2.2 หรือใหม่กว่าจะทำงานต่อไปนี้:

bind-key -t emacs-copy MouseDragEnd1Pane copy-pipe "pbcopy"
bind-key -t vi-copy MouseDragEnd1Pane copy-pipe "pbcopy"

1

ฉันใช้copyqผู้จัดการคลิปบอร์ดหลายเส้น (ทำงานได้กับ Windows, OSX, Linux)

  • เพิ่มบรรทัดต่อไปนี้ใน~/.tmux.conf:

    set-window-option -g mode-keys vi
    bind C-y run 'out=`tmux save-buffer - ` && copyq add "$out"'
    
  • cygwinต้องการcopyq.exeสถานที่ใน~/.bashrc:

    export PATH="$PATH:/cygdrive/c/Program Files (x86)/CopyQ"
    
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.