Як я можу очистити буфер прокрутки у Tmux?


Відповіді:


211

Це ж питання мучить мене вже досить давно. Ось найкраще, що я придумав. Вставте це у свій .tmux.conf файл:

bind -n C-k clear-history

Це пов'язує ctrl-k з командою очищення історії tmux. Прив'язка -n after прив'язує її, тому вам не доведеться видавати префікс команди tmux (за замовчуванням ctrl-b). Я використовую bash, тому ctrl-l вже робить еквівалент набору "clear" в командному рядку. За допомогою цих двох клавіш я отримую хороший комбінат ctrl-l, ctrl-k, який переміщує весь буфер прокрутки з екрана ("ясний"), а потім видаляє всю цю історію (команда tmux "clear-history").

Це не так приємно, як комбінації терміналів, iTerm або Konsole за допомогою одного ключа для його очищення, але це світ краще, ніж весь час вводити в чітку історію.


15
Приємно. Я займався bind k send-keys "clear"\; send-keys "Enter"очищенням частини, але використовувати вбудований ctrl+lпростіше, і clear-historyпозбутися історії прокрутки - хороше доповнення.
Генрік Н

1
це прив'язування прикручує мої панелі, видаляючи весь текст із усіх панелей і видаляючи межі навколо них! Будь-які ідеї, що з цим?
Ian Vaughan

Yikes. Яку програму оболонки ви використовуєте? Чи випадково це вже якась поведінка визначена для ctrl + k?
juanpaco

iTerm2. Щойно видно, що ctrl + k вже робить це без набору зв'язування tmux, тому це має бути iTerm2 відображення.
Ян Вон

Дивно. Я також використовую 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
волпато

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 Я думаю, що ви неправильно розумієте - після натискання клавіші <Ctrl-b> а потім натискання :вона дає вам інтерактивне підказку - саме там ви введете 'c'
JonnyRaa

21

Якщо ви хочете поєднати CTRL-Lплюс чисту історію, додайте це до своєї ~/.tmux.conf:

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

Це навіть працює, якщо, наприклад, ви знаходитесь в оболонці MySQL.


1
Це, здається, не працює, скажімо tail -f some.log, правда? Чи є спосіб поєднати ctrl-Zце? Може здатися, що це правильно.
Аарон Гібралтер

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
Є один застереження при такому підході, і це те, що він працює лише на локальних оболонках, оскільки він надсилає tmux чітку історію як рядок для запису на активну панель. Я адаптував це до:bind-key E send-keys "C-k" \; send-keys "C-u" \; send-keys "clear" \; send-keys "Enter" \; run-shell "sleep .3s; tmux clear-history"
Санті П.

12

Шлях простіше, ніж більшість, я просто створив скрипт оболонки, який називається cls, і запускати його, коли я хочу очистити екран і буфер прокрутки.

Все, що це:

cls

clear;
tmux clear-history;

3
Але що робити, якщо у вас немає доступу до командного рядка. Наприклад, коли працює сервер і ви переглядаєте журнали.
zudduz

звідки ви б дивилися журнали? Через веб-сервер? Якщо так, то я не розумію, чому tmux задіяний?
Бред Паркс

1
Приємно одночасно переглядати журнали сервера та редактор vim.
zudduz

Чи використовуєте ви tmux спліти? Якщо ні, просто розділіть вікно на 2 та перегляньте ваші журнали в одному, а в іншому використовуйте vim, просто запустівши `tmux split 'всередині вашого tmux сесії ... Але, можливо, я не отримую те, що ви робите?
Бред Паркс

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 ignore space" + ім'я оболонки для отримання додаткової інформації інформація). Мені подобається, що ця команда не відображається в моїй історії, оскільки це більше відповідає ctrl-k в Терміналі.

Перші клавіші відправлення Cu та клавіші відправлення Ck очистять все, що введено в даний момент під час підказки, щоб забезпечити успіх "clear && tmux clear-history" (наприклад, якщо ви ввели запит "ABCDEFG" і підключили ваш курсор між D і E, це гарантує, що "ABCD clear && tmux clear-historyEFG" не буде надіслано до оболонки, що може вийти з ладу).

Клавіші відправки "Вгору" та останні клавіші відправлення Cu очищають останні елементи з внутрішньої історії оболонок. Навіть при згадуваному вище пробілі внутрішня історія оболонки буде включати рядок "ясно ...". Відправлення і 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


Я також хотів би дізнатися і мене, якщо є причина не рекомендувати цього.
Гастон Санчес

2
Перш за все, це не обов’язково: в -n C-lосновному кажуть "зловити це", і тоді ти негайно передаєш те саме. (Тобто це не є не-оп.) ... По- друге, ваше намір вимкнений, тому що ⌃Lочищає частини екрану , а НЕ сувій назад: якщо ви натиснете ⌃B [і потім виконайте прокрутку вгору, ви побачите , що все ще прокрутка записується; мета цього питання - зрозуміти, що (tmux's) прокрутка, а не видимий термінал.
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

З Вімом

# 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

Таким чином, я деякий час використовую підхід плагіна зверху , але мені надоєли його обмеження (в основному, ⌃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}'якщо ви хочете побачити, на що тестується.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.