Как очистить буфер прокрутки в Tmux?

Ответы:

211

Этот же вопрос мучает меня уже довольно давно. Вот лучшее, что я придумал. Поместите это в ваш файл .tmux.conf:

bind -n C-k clear-history

Это связывает ctrl-k с командой tmux clear-history. -N после связывания делает это таким образом, что вам не нужно вводить префикс команды tmux (по умолчанию ctrl-b). Я использую bash, поэтому ctrl-l уже делает то же самое, что набирать «clear» в командной строке. С этими двумя ключами я получаю хорошую комбинацию ctrl-l, ctrl-k, которая перемещает весь буфер прокрутки за пределы экрана («очистить»), а затем удаляет всю эту историю (команда tmux «clear-history»).

Она не так хороша, как комбинация из 1-й клавиши Terminal, iTerm или Konsole, чтобы очистить ее, но это мир лучше, чем вводить все время в историю.

juanpaco
источник
15
Ницца. Я делал bind k send-keys "clear"\; send-keys "Enter"для очистки части, но использование встроенного ctrl+lпроще, и clear-historyизбавиться от истории прокрутки является хорошим дополнением.
Хенрик Н
1
это переплетает мои панели вверх, удаляя весь текст со всех панелей и удаляя границы вокруг них! Есть идеи, что с этим?
Ян Воан
Хлоп. Какую оболочку вы используете? Случайно ли уже есть поведение, определенное для ctrl + k?
Хуанпако
iTerm2. Просто видел, что ctrl + k уже делает это без набора привязки tmux, поэтому это должно быть отображение iTerm2.
Ян Воан
Weird. Я также использую iTerm2. Я не обновлял его в течение некоторого времени, так что может быть разница в версии. Я также больше не использую Ck, потому что это вызвало проблемы с моими привязками vim. Я использую Cn сейчас.
Хуанпако
58

Как правильно сказал @juanpaco, clear-historyэто команда для очистки буфера прокрутки.
Я добавлю, что мне нравится также очищать, что на экране в той же команде. Выпуск send-keys -Rсбрасывает (очищает) экран, поэтому я использую следующее в моем.tmux.conf

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

Это очищает экран и буфер прокрутки.

z5h
источник
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.
иван
35

Каждый ответ здесь говорит о добавлении новых привязок клавиш.

Если вы просто хотите делать это время от времени, вам вообще не нужно отображение ...

Префикс по умолчанию <Ctrl-b>

Просто введите <prefix>:в соответствующую панель, а затем введите clear-historyи нажмите Enter.

Одна из замечательных особенностей tmux заключается в том, что вы можете просто запустить любую из таких команд ... или запустить их в оболочке / скрипте, как они tmux command... или создать для них комбинацию клавиш.

JonnyRaa
источник
8
Можно ввести первые три символа cle, а затем выполнить автозаполнение <tab>в первый раз, а затем во второй раз использовать <up arrow>для доступа к предыдущей записи. Таким образом, это довольно быстро.
BCT
1
Это не работает для меня, потому что, когда я начинаю печатать после нажатия <Ctrl-b> the клавиши c`, устанавливается создание нового окна.
fraxture
@fraxture Я думаю, что вы неправильно поняли - после того, как вы нажали <Ctrl-b>, а затем нажмите, :чтобы получить интерактивную подсказку - вот где вы
наберете
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

не удается очистить текущий текст экрана из истории - команда clear-history запускается в отдельном потоке для ключей отправки.

cage433
источник
5
есть один нюанс с этим подходом, и он заключается в том, что он работает только на локальных оболочках, потому что он отправляет tmux clear-history в виде строки для записи на активную панель. Я приспособил это к: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и запускаю его всякий раз, когда хочу очистить экран и буфер прокрутки.

Все это так:

ЦБС

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
ideasman42
источник
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 в Терминале.

Первые ключи отправки Cu и ключи отправки Ck очистят все, что в данный момент набрано в приглашении, чтобы убедиться, что «clear && tmux clear-history» успешна (например, если вы набрали «ABCDEFG» в приглашении и имеете ваш курсор между D и E, это гарантирует, что «ABCD clear && tmux clear-historyEFG» не будет отправлено в оболочку, что приведет к ошибке).

Клавиши отправки "Вверх" и последние клавиши отправки 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 ...» не потерпела неудачу. Но это чертовски близко!

Brett
источник
2

почему нет? bind -n C-l send-keys C-l

klebervirgilio
источник
Я бы тоже хотел узнать, есть ли причина не рекомендовать это.
Гастон Санчес
2
Во-первых, в этом нет необходимости: в -n C-lосновном говорится «поймай это», и тогда ты сразу же пропускаешь эту вещь. (т.е. это не работает.)… Во-вторых, ваше намерение отключено, потому что ⌃Lочищает экран , а не прокручивает назад: если вы нажмете, ⌃B [а затем прокрутите вверх, вы увидите, что все прокрутки по-прежнему записаны; цель этого вопроса, чтобы очистить этот скроллинг (tmux в), а не видимый терминал.
ELLIOTTCABLE
2

После долгих исследований и тратить время. Я нашел лучший способ для меня на Zsh и Terminal.app

Я использую, prefix-cчтобы очистить экран и prefix-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

С 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

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

ELLIOTTCABLE
источник