ฉันจะล้างบัฟเฟอร์การเลื่อนใน Tmux ได้อย่างไร?


คำตอบ:


211

คำถามเดียวกันนี้รบกวนฉันมาระยะหนึ่งแล้ว นี่คือสิ่งที่ดีที่สุดที่ฉันคิดไว้ วางสิ่งนี้ลงในไฟล์. tmux.conf ของคุณ:

bind -n C-k clear-history

สิ่งนี้จะเชื่อม ctrl-k กับคำสั่ง clear-history ของ tmux -n after bind ทำให้คุณไม่ต้องออกคำนำหน้าคำสั่ง tmux (ctrl-b โดยค่าเริ่มต้น) ฉันใช้ bash ดังนั้น ctrl-l จึงเทียบเท่ากับการพิมพ์ "clear" ที่บรรทัดคำสั่ง ด้วยสองปุ่มเหล่านี้ฉันได้รับคำสั่ง ctrl-l, ctrl-k คอมโบซึ่งย้ายบัฟเฟอร์เลื่อนทั้งหมดออกจากหน้าจอ ("ชัดเจน") แล้วลบประวัติทั้งหมดนั้น (คำสั่ง tmux "ล้างประวัติ")

มันไม่ค่อยดีเท่าเทอร์มินัล, iTerm's หรือคอมโบ 1 คีย์ของ Konsole สำหรับการเคลียร์มัน แต่มันเป็นโลกที่ดีกว่าการพิมพ์ในประวัติศาสตร์ที่ชัดเจนตลอดเวลา


15
ดี ฉันได้ทำbind k send-keys "clear"\; send-keys "Enter"เพื่อล้างส่วน แต่การใช้ในตัวctrl+lเป็นเรื่องง่ายและclear-historyการกำจัดประวัติ scrollback เป็นส่วนเสริมที่ดี
Henrik N

1
การเชื่อมโยงนี้ทำให้สกรูบานหน้าต่างของฉันหมดนำข้อความทั้งหมดออกจากบานหน้าต่างทั้งหมดและลบเส้นขอบรอบ ๆ พวกเขา! มีความคิดเห็นเกี่ยวกับเรื่องอะไรบ้าง?
Ian Vaughan

Yikes คุณใช้โปรแกรมเชลล์อะไร โดยบังเอิญมีการกำหนดพฤติกรรมบางอย่างสำหรับ ctrl + k หรือไม่
juanpaco

iTerm2 เพิ่งเห็นว่า ctrl + k ทำสิ่งนี้ไปแล้วโดยไม่ตั้งค่าการโยง tmux ดังนั้นจึงต้องเป็นการแม็พ iTerm2
Ian Vaughan

แปลก. ฉันใช้ iTerm2 เช่นกัน ฉันไม่ได้อัปเดตบางครั้งดังนั้นอาจเป็นความแตกต่างของรุ่น ฉันยังไม่ได้ใช้ Ck อีกต่อไปเพราะนั่นทำให้เกิดปัญหากับการผูก vim ของฉัน ฉันใช้ Cn ตอนนี้
juanpaco

58

ตามที่ @juanpaco ระบุไว้อย่างถูกต้องclear-historyเป็นคำสั่งเพื่อล้างบัฟเฟอร์การเลื่อนกลับ
ฉันจะเพิ่มที่ฉันต้องการที่จะล้างสิ่งที่อยู่บนหน้าจอในคำสั่งเดียวกัน การออกsend-keys -Rหน้าจอรีเซ็ต (ลบล้าง) ดังนั้นฉันจึงใช้สิ่งต่อไปนี้ใน.tmux.conf

bind-key b send-keys -R \; clear-history

เป็นการลบหน้าจอและบัฟเฟอร์การเลื่อน


1
โดยตรงจากเอกสารคู่มือ tmux บนsend-keys: "แฟล็ก -R ทำให้สถานะเทอร์มินัลถูกรีเซ็ต" คุณอาจต้องอัปเดต
z5h

20
ข้อเสียของการใช้ -R คือว่าบรรทัดอินพุตปัจจุบันของคุณมีการซ่อนอยู่แตกต่างจากเมื่อคุณล้างเทอร์มินัลด้วย Ctrl + l สิ่งที่ฉันทำคือbind -n C-l send-keys C-l \; clear-history
volpato

6
สำหรับผู้ที่ไม่ทราบ (เช่นฉันไม่ทราบ) ให้ไปที่สถานะเพื่อป้อนclear-historyคำสั่งกดCtrl+Bจากนั้นเริ่มคำสั่งด้วยเครื่องหมายโคลอน ( :)
palswim

1
@ volpato ฉันชอบวิธีการของคุณ แต่ฉันคิดว่ามันยังเหลือ 'หน้าจอ' หนึ่งของบัฟเฟอร์ในการเลื่อนกลับ ไม่รู้ว่าทำไม - R ทำให้ช่องว่างพรอมต์ แต่ฉัน 'แก้ไข' มันโดยการเพิ่ม Cm พิเศษในตอนท้าย (แต่นั่นทำให้มันอยู่ในบรรทัดที่สอง)
Gdogg

2
send-keys -R C-l \; clear-historyคุณสามารถรวมตัวนี้
ivan

35

ทุกคำตอบที่นี่พูดถึงการเพิ่มการเชื่อมโยงคีย์ใหม่

หากคุณต้องการทำในบางครั้งคุณไม่จำเป็นต้องทำแผนที่เลย ...

ค่าเริ่มต้นของคำนำหน้าเป็น <Ctrl-b>

เพียงพิมพ์<prefix>:ในบานหน้าต่างที่เกี่ยวข้องจากนั้นพิมพ์clear-historyและกด Enter

หนึ่งในสิ่งที่ยอดเยี่ยมเกี่ยวกับ tmux คือคุณสามารถเรียกใช้คำสั่งใด ๆ เช่นนั้น ... หรือเรียกใช้งานในเชลล์ / สคริปต์เช่นtmux command... หรือสร้างแป้นพิมพ์ลัดสำหรับพวกเขา


8
เป็นไปได้ที่จะพิมพ์อักขระสามตัวแรกcleจากนั้นเติมข้อความอัตโนมัติด้วย<tab>ในครั้งแรกจากนั้นในครั้งที่สองใช้<up arrow>เพื่อเข้าถึงรายการก่อนหน้า วิธีนี้มันค่อนข้างเร็ว
BCT

1
สิ่งนี้ไม่ทำงานสำหรับฉันเพราะเมื่อฉันเริ่มพิมพ์หลังจากกดปุ่ม<Ctrl-b> the c` ถูกตั้งค่าให้สร้างหน้าต่างใหม่
fraxture

@fraxture ฉันคิดว่าคุณเข้าใจผิด - หลังจากที่คุณกด <Ctrl- หมุดจากนั้นกด:มันจะให้คุณโต้ตอบพร้อม
รับคำ

21

หากคุณต้องการรวมCTRL-Lกับประวัติย่อให้เพิ่มสิ่งนี้ใน~/.tmux.conf:

bind u send-keys C-l \; run-shell "sleep .3s" \; clear-history

สิ่งนี้สามารถใช้งานได้หากคุณอยู่ใน MySQL shell เป็นต้น


1
ดูเหมือนจะไม่ทำงานในระหว่างพูดtail -f some.logใช่มั้ย มีวิธีรวมctrl-Zกับสิ่งนี้หรือไม่? สามารถดูเหมือนจะทำให้ถูกต้อง
แอรอน Gibralter

19

ฉันพบว่าใช้send-keys -Rช้าหน่อย - นี่เป็นอีกวิธีหนึ่งในการล้างหน้าจอและประวัติด้วยคำสั่งเดียว

bind-key C send-keys "clear && tmux clear-history" \; send-keys "Enter"  

การเรียก tmux ที่ซ้อนกันถูกใช้เป็นสิ่งที่ชัดเจนยิ่งขึ้น

bind-key C send-keys "clear" \; send-keys "Enter" \; clear-history

ล้มเหลวในการล้างข้อความปัจจุบันของหน้าจอจากประวัติ - คำสั่งล้างประวัติดูเหมือนว่าจะทำงานในเธรดแยกต่างหากเพื่อส่งคีย์


5
มีหนึ่ง caveat ด้วยวิธีการนี้และมันใช้งานได้บนเชลล์โลคัลเท่านั้นเนื่องจากมันส่งประวัติ tmux clear เป็นสตริงที่จะเขียนไปยังบานหน้าต่างที่แอ็คทีฟ ฉันได้ปรับเป็น:bind-key E send-keys "C-k" \; send-keys "C-u" \; send-keys "clear" \; send-keys "Enter" \; run-shell "sleep .3s; tmux clear-history"
Santi P.

12

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

ทั้งหมดนี้คือ:

CLS

clear;
tmux clear-history;

3
แต่ถ้าคุณไม่มีสิทธิ์เข้าถึงบรรทัดคำสั่ง เช่นเมื่อเซิร์ฟเวอร์กำลังทำงานและคุณกำลังดูบันทึก
zudduz

คุณจะดูบันทึกจากที่ไหน ผ่านเว็บเซิร์ฟเวอร์? ถ้าเป็นเช่นนั้นฉันไม่เข้าใจว่าทำไมถึงเกี่ยวข้องกับ tmux
Brad Parks

1
ยินดีที่ได้ดูบันทึกเซิร์ฟเวอร์และเครื่องมือแก้ไข vim ของคุณพร้อมกัน
zudduz

คุณใช้ tmux splits หรือไม่ ถ้าไม่ใช่แค่แบ่งหน้าต่างของคุณออกเป็น 2 และดูบันทึกของคุณเป็นหนึ่งและใช้เสียงเรียกเข้าที่อื่นโดยเพียงแค่เรียกใช้ 'tmux split "ในเซสชั่น tmux ของคุณ ... แต่บางทีฉันอาจไม่ได้รับสิ่งที่คุณกำลังทำอยู่?
Brad Parks

10

พบว่าสิ่งนี้ทำงานได้ดีที่สุดใน TMUX 2.6 การล้างหน้าจอการเลื่อนย้อนกลับ

ใช้ Ctrl-L

bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history

6

Ctrl-L ใช้ในคอนโซลแอปพลิเคชันเพื่อวาดหน้าจอใหม่ ฉันพบว่าเมื่อผูกพันกับsend-keys -Rมันจะทำให้ปุ่มลูกศรทำงานไม่ถูกต้องในบางแอปพลิเคชัน (เช่น vim, mc)

เพื่อรักษาฟังก์ชันการวาดใหม่ในแอปพลิเคชันคอนโซลฉันใช้:

bind-key -n C-l if-shell -F '#{alternate_on}' 'send-keys C-l' 'send-keys -R C-l; clear-history'

สิ่งนี้ต้องการตัวเลือก tmux alternate-screenที่จะเปิด (ซึ่งเป็นค่าเริ่มต้น)


3

ฉันใช้แหล่งข้อมูลข้างต้นรวมทั้งแหล่งข้อมูลอื่นมาเพื่อ:

bind k send-keys C-u \; send-keys C-k \; send-keys " clear && tmux clear-history" \; send-keys "Enter" \; run-shell "sleep .3s" \; send-keys "Up" \; send-keys C-u 

พื้นที่ว่างชั้นนำใน "clear && tmux clear-history" ป้องกันคำสั่งไม่ให้เขียนลงในไฟล์ประวัติ (หากคุณมีการตั้งค่าเชลล์ของคุณเพื่อจัดการช่องว่างนำหน้าด้วยวิธีนี้ google "hist ไม่สนใจช่องว่าง" + ชื่อเชลล์เพิ่มเติม ข้อมูล). ฉันชอบที่จะมีคำสั่งนี้ไม่ปรากฏในประวัติของฉันเนื่องจากนี่คือแบบอินไลน์กับ ctrl-k ในเทอร์มินัล

send-keys ตัวแรก Cu และ send-keys Ck จะล้างสิ่งที่พิมพ์อยู่ในพรอมต์เพื่อให้แน่ใจว่า "clear && tmux clear-history" สำเร็จ (เช่นถ้าคุณพิมพ์ "ABCDEFG" ที่พรอมต์และมี เคอร์เซอร์ของคุณระหว่าง D และ E ทำให้แน่ใจได้ว่า "ABCD clear && tmux clear-historyEFG" ไม่ได้ถูกส่งไปยังเชลล์ซึ่งจะล้มเหลว)

send-keys "Up" และ send-keys ตัวสุดท้าย Cu จะทำการล้างรายการสุดท้ายออกจากประวัติภายในของเชลล์ แม้จะมีช่องว่างต่อท้ายที่กล่าวถึงข้างต้นประวัติภายในของเชลล์จะรวมบรรทัด "clear ... " การส่งและ Ctrl-u กำจัดสิ่งนี้

สุดท้ายใน iTerm ฉันตั้ง ctrl-k เพื่อทำแผนที่ไปที่ ctrl-a k (ฉันมีคำนำหน้า tmux ของฉันตั้งไว้ที่ ctrl-a) ดังนั้นฉันสามารถพิมพ์ ctrl-k ซึ่งเป็นสิ่งที่มือของฉันต้องการทำจากหลายปีที่ผ่านมา ดังนั้น. ฉันทำสิ่งนี้โดยไปที่ iTerm> ค่ากำหนด> โปรไฟล์> ปุ่มและเพิ่มทางลัดเพื่อส่งรหัสฐานสิบหก "0x01 0x6B" มีบทความที่ดีที่นี่ซึ่งให้ข้อมูลเพิ่มเติมเกี่ยวกับการใช้รหัสฐานสิบหกกับ tmux และ iTerm: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

นั่นสวยมากให้ ctrl-k กับ tmux สิ่งเดียวที่ยังคงดีพอที่ฉันคือ ctrl-k จริงที่ไม่มี tmux จะไม่มีปัญหาหากคุณมีบางสิ่งที่พิมพ์ในพรอมต์และจะรักษาสิ่งที่คุณพิมพ์ในขณะที่ล้างหน้าจอ ตามที่กล่าวไว้วิธีการนี้ต้องล้างสิ่งที่พิมพ์ดังนั้นคำสั่ง "clear ... " จะไม่ล้มเหลว แต่มันก็ใกล้ดีจริงๆ!


2

ทำไมจะไม่ล่ะ? bind -n C-l send-keys C-l


ฉันก็อยากจะรู้เหมือนกันถ้ามีเหตุผลที่จะไม่แนะนำสิ่งนี้
Gaston Sanchez

2
ก่อนอื่นไม่จำเป็น: -n C-lโดยทั่วไปจะพูดว่า 'จับสิ่งนี้' แล้วคุณจะผ่านสิ่งนั้นไปทันที (กล่าวคือนี่คือไม่มีตัวเลือก) ... ประการที่สองความตั้งใจของคุณถูกปิดเนื่องจาก⌃Lล้างหน้าจอไม่ใช่การเลื่อนกลับ: หากคุณกด⌃B [แล้วเลื่อนขึ้นคุณจะเห็นว่าการเลื่อนทั้งหมดยังคงถูกบันทึกไว้ เป้าหมายของคำถามนี้คือการที่ชัดเจนว่า (tmux ของ) scrollback ไม่ขั้วที่มองเห็นได้
ELLIOTTCABLE

2

หลังจากการวิจัยและการใช้เวลามากมาย ฉันได้พบวิธีที่ดีที่สุดสำหรับฉันใน zsh และ terminal.app

ฉันใช้prefix-cเพื่อล้างหน้าจอและprefix-Cเพื่อล้างประวัติและบัฟเฟอร์การเลื่อนและไม่ทิ้งบรรทัดข้างบนเพราะฉันคิดว่ามันน่ารำคาญ

ไม่มีเสียงเรียกเข้า

# clear screen
bind c send-keys 'C-l'
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys

ด้วย Vim

# check if the pane is running vim
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"

# clear screen
bind c if-shell "$is_vim" "send-keys c" "send-keys 'C-l'"
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys

2

สำหรับการแก้ไขอย่างรวดเร็วเพื่อล้างบานหน้าต่าง tmux แต่ละรายการคุณสามารถตั้งชื่อแทน ...

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'

1

ดังนั้นฉันจึงได้ใช้พลูวิธี 's จากข้างต้นในขณะที่ แต่ฉันได้รับการเลี้ยงดูขึ้นกับข้อ จำกัด ดังกล่าว (โดยทั่วไปที่⌃Lผ่านเป็นความหมายเว้นแต่ประปาไปยังโปรแกรมที่เข้าใจมัน.)

ดังนั้นฉันได้ปรับปรุงวิธีการต่าง ๆ ในคำตอบต่าง ๆ ของหัวข้อนี้ แม้ว่าจะซับซ้อนวิธีนี้ใช้ได้กับทั้งเชลล์และคำสั่งอื่น ๆ :

# ⌃K: Clears the current pane (from <https://stackoverflow.com/a/34162098>)
bind-key -n C-k \
   if-shell "test \"$(printf '#{pane_current_command}' | tail -c 2)\" = sh" \
      "send-keys C-l ; run-shell 'sleep .3s' ; clear-history" \
      "split-window -vp 100 ; clear-history -t ! ; kill-pane"

ลองด้วยtail -f /private/var/log/system.logหรือบางสิ่งบางอย่าง!


คำเตือน:

มีหมายเหตุสำคัญที่นี่: นี่คือการปรับขนาดบานหน้าต่างที่กำลังล้างข้อมูลอย่างชัดเจนถ้าไม่ใช่เชลล์ นี้สามารถก่อให้เกิดพฤติกรรมในบางโปรแกรมบรรทัดคำสั่งฟังสำหรับการปรับขนาดSIGWINCHES; แต่เหตุผลของฉันอยู่ที่นี้ไม่ได้เป็นปัญหาใหญ่เพราะผู้เป็นโปรแกรมที่คุณมีโอกาสมากที่จะไม่ได้พยายามที่จะ 'ชัดเจน' อยู่แล้ว

นอกจากนี้สถานการณ์การอ้างอิงเชลล์เป็นระเบียบอยู่แล้วและสามารถกลายเป็นสถานการณ์ที่ฝังตัวได้ง่ายขึ้น#{pane_current_command}ดังนั้นโปรดระวังคุณอาจต้องแก้ไขสิ่งนี้ตามdefault-commandการตั้งค่าของคุณ

เช่นเดียวกับการทดสอบการสิ้นสุดของการจับคู่คำสั่ง"sh"นั้น ถ้าคุณมีdefault-commandสิ่งที่ต้องการ/bin/bash --loginหรือสิ่งที่ซับซ้อนที่เกี่ยวข้องกับexecการออกคำสั่งที่เกิดขึ้นจริงอาจจะไม่จบลงด้วย"sh"; ใช้⌃B :เพื่อดำเนินการdisplay-message '#{pane_current_command}'ถ้าคุณต้องการดูสิ่งที่ถูกทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.