Как очистить буфер прокрутки в 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..." не потерпела неудачу. Но это чертовски близко!
Итак, я какое-то время использовал подход " сверху", но я устал от его ограничений (в основном, ⌃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
"