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

К вашему сведению, я использую Tmux через приложение Mac OS X Terminal.

16 ответов

Решение

Этот же вопрос мучает меня уже довольно давно. Вот лучшее, что я придумал. Поместите это в ваш файл.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, чтобы очистить ее, но это мир лучше, чем вводить все время в clear-history.

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

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

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

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

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

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

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

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

Если вы хотите объединить CTRL-L плюс очистить историю, добавьте это в свой ~/.tmux.conf:

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

Это даже работает, если вы, например, находитесь в оболочке MySQL.

Обнаружил, что это лучше всего работает в TMUX 2.6, очистка экрана, прокрутка, но сохранение запроса, отображаемого после.

Использует Ctrl-L

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

Я нашел с помощью 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, кажется, выполняется в отдельном потоке для ключей отправки.

Намного проще, чем большинство, я только что создал сценарий оболочки clsи запускайте его всякий раз, когда я хочу очистить экран и буфер прокрутки.

Все это так:

ЦБС

clear;
tmux clear-history;

если вы очистите свой экран с помощью clear, можно проверить TMUXустановлен, и создайте псевдоним соответственно.

поместите это в свой .bashrc:

      if [[ $TMUX ]]; then
  alias clear='clear && tmux clear-history'
fi

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 быть включенным (что по умолчанию).

Для быстрого исправления очистки отдельных панелей tmux вы можете настроить псевдоним...

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

Я использовал некоторые из вышеперечисленных плюс другие источники, чтобы придумать:

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 очищают последние элементы из внутренней истории ваших оболочек. Даже с указанным выше пробелом внутренняя история оболочки будет содержать строку "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..." не потерпела неудачу. Но это чертовски близко!

Почему бы и нет? bind -n C-l send-keys C-l

Итак, я какое-то время использовал подход " сверху", но я устал от его ограничений (в основном, ⌃L пропущено бессмысленно, если оно не передано в программу, которая его понимает.)

Так что я усовершенствовал различные подходы в разных ответах на эту тему; хотя и сложный, этот подход работает как с оболочками, так и с другими командами:

# ⌃K: Clears the current pane (from <https://stackru.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 или что-то!


Предостережения:

Здесь есть одно важное замечание: это невидимое изменение размера очищаемой панели, если это не оболочка. Это может вызвать изменение размера в некоторых приложениях командной строки, прослушивающих SIGWINCHэс; но я считаю, что это не большая проблема, потому что это программы, которые вы, скорее всего, не будете пытаться "очистить" в любом случае.

Кроме того, ситуация с кавычками в оболочке уже беспорядок и может легко стать более единообразной при встраивании #{pane_current_command} так что будьте осторожны, возможно, вам придется изменить это на основе вашего default-command установка.

То же самое относится и к моему тестированию соответствия этой команды "sh"; если у тебя есть default-command что-то вроде /bin/bash --login или что-то сложное с участием exec фактическая команда может не заканчиваться "sh"; использование ⌃B : выполнить display-message '#{pane_current_command}' если вы хотите увидеть, что проверяется.

После долгих исследований и тратить время. Я нашел лучший способ для меня на 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

Если вы хотите полностью очистить панель, другой вариант - временно изменить размер панели до одной строки, очистить историю, а затем снова изменить ее размер. Это должно работать, возможно, без мерцания с одной цепочкой команд tmux. Преимущество заключается в том, что он работает независимо от того, какая программа запущена на панели. Конечно, это немного усложняет логику сценария оболочки.

      bind-key -n F11 run "
    if [[ #{window_panes} == "1" ]] ; then
        tmux send-keys C-l; sleep 0.1 ; tmux clear-history ;
    else
        restored_height=$((#{pane_height} + #{pane_at_bottom}));
        tmux resize-pane -y 1 \\; clear-history \\; resize-pane -y \${restored_height} ;
    fi
"

Если вы боретесь с OSX с Iterm:

Другие вопросы по тегам