Làm cách nào để xóa bộ đệm cuộn trong Tmux?


Câu trả lời:


211

Câu hỏi tương tự này đã gây khó chịu cho tôi trong một thời gian khá dài. Đây là điều tốt nhất tôi nghĩ ra. Đặt phần này vào tệp .tmux.conf của bạn:

bind -n C-k clear-history

Điều này liên kết ctrl-k với lệnh xóa lịch sử tmux. -N sau khi liên kết làm cho nó để bạn không phải phát hành tiền tố lệnh tmux (ctrl-b theo mặc định). Tôi sử dụng bash, vì vậy ctrl-l đã thực hiện tương đương với việc gõ "xóa" trong dòng lệnh. Với hai phím này, tôi nhận được một tổ hợp ctrl-l, ctrl-k đẹp mắt, di chuyển tất cả bộ đệm cuộn ra khỏi màn hình ("xóa") và sau đó xóa tất cả lịch sử đó (lệnh "xóa lịch sử" của tmux).

Nó không hoàn toàn đẹp như các combo 1 phím của Terminal, iTerm hay Konsole để xóa nó, nhưng đó là một thế giới tốt hơn so với việc gõ vào lịch sử rõ ràng mọi lúc.


15
Đẹp. Tôi đã từng làm bind k send-keys "clear"\; send-keys "Enter"phần xóa, nhưng sử dụng phần dựng sẵn ctrl+lthì đơn giản hơn và clear-historyđể thoát khỏi lịch sử cuộn lại là một bổ sung tốt.
Henrik N

1
ràng buộc này làm tôi hoảng loạn, loại bỏ tất cả văn bản khỏi tất cả các bảng và loại bỏ các đường viền xung quanh chúng! Bất cứ ý tưởng về những gì lên với điều đó?
Ian Vaughan

Rất tiếc. Bạn sử dụng chương trình shell nào? Có phải tình cờ đã có một số hành vi được xác định cho ctrl + k?
juanpaco

iTerm2. Chỉ thấy rằng ctrl + k đã làm điều này mà không có bộ ràng buộc tmux, vì vậy nó phải là một ánh xạ iTerm2.
Ian Vaughan

Kỳ dị. Tôi cũng sử dụng iTerm2. Tôi đã không cập nhật nó một thời gian, vì vậy nó có thể là một sự khác biệt về phiên bản. Tôi cũng không sử dụng Ck nữa, vì điều đó gây ra vấn đề với các ràng buộc vim của tôi. Tôi sử dụng Cn bây giờ.
juanpaco

58

Như @juanpaco đã nêu chính xác, clear-historylà lệnh xóa bộ đệm cuộn.
Tôi sẽ thêm rằng tôi cũng muốn xóa những gì trên màn hình trong cùng một lệnh. Phát hành send-keys -Rthiết lập lại (xóa) màn hình, vì vậy tôi sử dụng các mục sau trong.tmux.conf

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

Điều này sẽ xóa màn hình VÀ bộ đệm cuộn lại.


1
Trực tiếp từ tài liệu tmux trên send-keys: "Cờ -R khiến trạng thái đầu cuối được đặt lại." Bạn có thể chỉ cần cập nhật.
z5h

20
Hạn chế của việc sử dụng -R là các dòng đầu vào hiện tại của bạn bị ẩn, khác với khi bạn xóa thiết bị đầu cuối của mình bằng Ctrl + l. Những gì tôi đã làm làbind -n C-l send-keys C-l \; clear-history
volpato

6
Đối với những người bạn không biết (như tôi đã không biết), hãy đến trạng thái để nhập clear-historylệnh, nhấn Ctrl+Bvà sau đó bắt đầu lệnh bằng dấu hai chấm ( :).
palswim

1
@volpato Tôi thích cách tiếp cận của bạn, nhưng tôi thấy nó vẫn để lại một 'màn hình' của bộ đệm trong cuộn lại. Không biết tại sao. -R làm trống lời nhắc, nhưng tôi đã 'giải quyết' nó bằng cách thêm một Cm bổ sung vào cuối (nhưng sau đó đặt nó lên dòng thứ hai).
Gdogg

2
Bạn có thể ngưng tụ điều này để send-keys -R C-l \; clear-history.
ivan

34

Mỗi câu trả lời ở đây nói về việc thêm các ràng buộc quan trọng mới.

Nếu bạn chỉ muốn làm điều đó đôi khi bạn không cần một bản đồ nào cả ...

Tiền tố mặc định là <Ctrl-b>

Chỉ cần gõ <prefix>:vào khung có liên quan và sau đó gõ clear-historyvà nhấn enter.

Một trong những điều thú vị về tmux là bạn có thể chạy bất kỳ lệnh nào như vậy ... hoặc chạy chúng trong shell / script như tmux command... hoặc tạo một phím tắt cho chúng.


7
Có thể nhập ba ký tự đầu tiên cle, sau đó tự động hoàn thành với <tab>lần đầu tiên, sau đó sử dụng lần thứ hai <up arrow>để truy cập mục nhập trước đó. Cách này khá nhanh.
BCT

1
Điều này không hiệu quả với tôi vì khi tôi bắt đầu nhập sau khi nhấn <Ctrl-b> the phím c` được đặt để tạo một cửa sổ mới.
fraxture

@fraxture Tôi nghĩ bạn hiểu nhầm - sau khi bạn nhấn <Ctrl-b> rồi nhấn :nó sẽ đưa ra lời nhắc tương tác - đó là nơi bạn nhập 'c'
JonnyRaa

21

Nếu bạn muốn kết hợp CTRL-Lcộng với lịch sử rõ ràng, hãy thêm phần này vào ~/.tmux.conf:

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

Điều này thậm chí hoạt động nếu bạn đang ở trong một vỏ MySQL chẳng hạn.


1
Điều này dường như không hoạt động trong thời gian, nói tail -f some.log, phải không? Có cách nào để kết hợp ctrl-Zvới điều này? Dường như có thể làm cho nó đúng.
Aaron Gibralter

19

Tôi thấy việc sử dụng send-keys -Rhơi chậm - đây là một cách khác để xóa màn hình và lịch sử chỉ bằng một lệnh

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

Một cuộc gọi tmux lồng nhau được sử dụng như là rõ ràng hơn

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

không xóa văn bản hiện tại của màn hình khỏi lịch sử - lệnh xóa lịch sử dường như chạy trong một luồng riêng cho các phím gửi.


5
Có một cảnh báo với cách tiếp cận này và nó chỉ hoạt động trên các shell cục bộ, bởi vì nó gửi lịch sử rõ ràng tmux dưới dạng chuỗi được ghi vào khung hoạt động. Tôi đã điều chỉnh nó thành: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

Cách đơn giản hơn hầu hết, tôi chỉ cần tạo một kịch bản shell được gọi clsvà chạy nó bất cứ khi nào tôi muốn xóa màn hình và bộ đệm cuộn lại.

Tất cả chỉ có thế này:

cls

clear;
tmux clear-history;

3
Nhưng nếu bạn không có quyền truy cập vào dòng lệnh. Chẳng hạn như khi một máy chủ đang chạy và bạn đang xem nhật ký.
zudduz

bạn sẽ xem nhật ký từ đâu? Qua một máy chủ web? Nếu vậy, thì tôi không hiểu tại sao tmux lại tham gia?
Công viên Brad

1
Thật tuyệt khi có thể xem nhật ký máy chủ và trình soạn thảo vim của bạn cùng một lúc.
zudduz

Bạn có sử dụng chia tách tmux? Nếu không, chỉ cần chia cửa sổ của bạn thành 2 và xem nhật ký của bạn thành một, và sử dụng vim trong cái khác bằng cách chạy `tmux split" bên trong phiên tmux của bạn ... Nhưng có lẽ tôi không hiểu bạn đang làm gì?
Brad

10

Đã tìm thấy tính năng này hoạt động tốt nhất trong TMUX 2.6, xóa màn hình, cuộn lại, nhưng vẫn giữ dấu nhắc hiển thị sau.

Sử dụng Ctrl-L

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

6

Ctrl-L được sử dụng trong các ứng dụng bảng điều khiển để vẽ lại màn hình. Tôi thấy rằng khi bị ràng buộc với send-keys -Rnó sẽ khiến các phím mũi tên không còn hoạt động chính xác trong một số ứng dụng (ví dụ: vim, mc).

Để giữ lại chức năng vẽ lại trong các ứng dụng bảng điều khiển, tôi đã sử dụng:

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

Điều này đòi hỏi tùy chọn tmux alternate-screenđược bật (theo mặc định).


3

Tôi đã sử dụng một số nguồn trên cộng với các nguồn khác để đưa ra:

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 

Không gian hàng đầu trong "Clear && tmux Clear-history" ngăn lệnh được ghi vào tệp lịch sử (cung cấp cho bạn thiết lập shell của bạn để xử lý các khoảng trắng hàng đầu theo cách này; google "hist bỏ qua khoảng trắng" + tên của shell của bạn để biết thêm thông tin). Tôi muốn có lệnh này không hiển thị trong lịch sử của tôi vì đây là nội tuyến hơn với ctrl-k trong Terminal.

Khóa gửi đầu tiên Cu và khóa gửi Ck sẽ xóa bất cứ thứ gì hiện đang gõ tại dấu nhắc để đảm bảo rằng "xóa && tmux xóa lịch sử" thành công (ví dụ: nếu bạn đã gõ "ABCDEFG" tại dấu nhắc và có con trỏ của bạn giữa D và E, điều này đảm bảo rằng "ABCD xóa && tmux xóa lịch sửEFG" không được gửi đến trình bao, điều này sẽ thất bại).

Khóa gửi "Lên" và khóa gửi cuối cùng Cu xóa các mục cuối cùng khỏi lịch sử nội bộ của trình bao. Ngay cả với không gian dấu được đề cập ở trên, lịch sử bên trong của vỏ sẽ bao gồm dòng "xóa ...". Gửi lên và Ctrl-u thoát khỏi điều này.

Cuối cùng, trong iTerm, tôi đặt ctrl-k thành ánh xạ thành ctrl-a k (Tôi có tiền tố tmux của mình được đặt thành ctrl-a), vì vậy tôi có thể nhập ctrl-k, đó là điều mà tay tôi muốn làm từ rất nhiều năm làm vì thế. Tôi làm điều này, bằng cách truy cập iTerm> Preferences> Profiles> Keys và thêm một phím tắt để gửi mã hex "0x01 0x6B". Có một bài viết tuyệt vời ở đây cung cấp thêm thông tin về việc sử dụng mã hex với tmux và iTerm: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Điều đó khá nhiều mang lại cho tôi ctrl-k với tmux. Điều duy nhất vẫn còn khó chịu với tôi là ctrl-k thực sự không có tmux không có vấn đề gì nếu bạn hiện đang có một cái gì đó gõ vào dấu nhắc và sẽ giữ lại những gì bạn đã gõ trong khi xóa màn hình. Như đã đề cập, cách tiếp cận này cần phải xóa những gì đã gõ để lệnh "xóa ..." không thất bại. Nhưng nó khá gần!


2

tại sao không? bind -n C-l send-keys C-l


Tôi cũng muốn biết với tôi nếu có lý do để không khuyến nghị điều này.
Gaston Sanchez

2
Trước hết, điều đó không cần thiết: -n C-lvề cơ bản là nói 'hãy nắm bắt điều này', và sau đó bạn ngay lập tức vượt qua điều tương tự. (ví dụ: đây là một không-op.) ... Thứ hai, bạn dự định là tắt, bởi vì ⌃LClears màn hình , chứ không phải cuộn lại: nếu bạn nhấn ⌃B [và sau đó di chuyển lên, bạn sẽ thấy rằng tất cả các scrollback vẫn ghi nhận; mục tiêu của câu hỏi này là để xóa cuộn đó (tmux), chứ không phải thiết bị đầu cuối có thể nhìn thấy.
ELLIOTTCABLE 8/12/2015

2

Sau rất nhiều nghiên cứu và dành thời gian. Tôi đã tìm thấy cách tốt nhất cho tôi trên zsh và terminal.app

Tôi đang sử dụng prefix-cđể xóa màn hình và prefix-Cxóa lịch sử và bộ đệm cuộn và không để lại dòng nào ở trên vì tôi thấy khó chịu.

Không có Vim

# 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

Với 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

Để khắc phục nhanh để xóa các bảng tmux riêng lẻ, bạn có thể thiết lập bí danh ...

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

1

Vì vậy, tôi đã sử dụng cách tiếp cận của plu từ trên cao trong một thời gian, nhưng tôi đã chán ngấy với những hạn chế của nó (về cơ bản, việc ⌃Lthông qua là vô nghĩa trừ khi được dẫn đến một chương trình hiểu nó.)

Vì vậy, tôi đã cải thiện các cách tiếp cận khác nhau trong các câu trả lời khác nhau cho chủ đề này; Mặc dù phức tạp, cách tiếp cận này hoạt động với cả shell các lệnh khác :

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

Hãy thử nó với tail -f /private/var/log/system.loghoặc một cái gì đó!


Hãy cẩn thận:

Có một lưu ý quan trọng ở đây: đây là vô hình thay đổi kích thước khung bị xóa, nếu nó không phải là một vỏ. Điều này có thể kích hoạt hành vi thay đổi kích thước trong một số ứng dụng dòng lệnh nghe SIGWINCHes; nhưng lý do của tôi là đây không phải là một vấn đề lớn, bởi vì đó là những chương trình mà bạn rất có thể sẽ không cố gắng 'xóa' bằng mọi cách .

Bên cạnh đó, tình hình vỏ trích dẫn đã là một mớ hỗn độn, và có thể dễ dàng trở thành nhiều hơn một khi nhúng #{pane_current_command}, vì vậy hãy cẩn thận, bạn có thể phải sửa đổi này dựa trên của bạn default-commandthiết lập.

Điều tương tự cũng áp dụng cho thử nghiệm của tôi về việc kết thúc lệnh khớp đó "sh"; nếu bạn có một default-commandcái gì đó giống /bin/bash --loginhoặc một cái gì đó phức tạp liên quan exec, lệnh thực tế có thể không kết thúc bằng "sh"; sử dụng ⌃B :để thực thi display-message '#{pane_current_command}'nếu bạn muốn xem những gì đang được thử nghiệm.

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.