Как я могу выполнить поиск в буфере вывода оболочки tmux?

Вопрос или проблема

Я не могу сделать так, чтобы это работало. Как я могу искать в буфере оболочки tmux?

Поиск в режиме копирования

Чтобы искать в буфере истории tmux для текущего окна, нажмите Ctrlb [, чтобы войти в режим копирования.

Если вы используете сочетания клавиш emacs (по умолчанию), нажмите Ctrls, затем введите строку для поиска и нажмите Enter.
Нажмите n, чтобы искать ту же строку снова.
Нажмите Shiftn для обратного поиска.
Нажмите Escape дважды, чтобы выйти из режима копирования.
Вы можете использовать Ctrlr, чтобы искать в обратном направлении.
Обратите внимание, что поскольку tmux управляет клавиатурой в режиме копирования, Ctrls работает независимо от настройки stty ixon (которую я предпочитаю иметь как stty -ixon, чтобы включить прямой поиск в Bash).

Если вы используете сочетания клавиш vi (Ctrlb:set-window-option -g mode-keys vi), нажмите /, затем введите строку для поиска и нажмите Enter. Нажмите n, чтобы искать ту же строку снова. Нажмите Shiftn для обратного поиска, как в режиме emacs. Нажмите q дважды, чтобы выйти из режима копирования. Вы можете использовать ?, чтобы искать в обратном направлении.

find-window

Если вы хотите переключиться на окно, основываясь на чем-то, что в нем отображается (это также включает имена и заголовки окон, но не историю), (начиная с того, что открыто более одного окна) нажмите Ctrlb f, затем введите строку для поиска и нажмите Enter. Вы переключитесь на окно, содержащее этот текст, если он найден. Если несколько окон совпадают, вы увидите список для выбора.

Войти в режим копирования и начать поиск за один раз

bind-key / copy-mode \; send-key ?

это позволяет вам сделать только:

 Ctrl + B /

и начать вводить поисковый запрос, который будет искать сверху (последние строки первыми).

Сохранить в файл и использовать vim

Когда дела становятся более сложными, я просто хочу использовать нормальный редактор: https://unix.stackexchange.com/questions/26548/write-all-tmux-scrollback-to-a-file

bind-key P 'capture-pane' \; capture-pane -S - \; save-buffer /tmp/tmux \; delete-buffer

Теперь P сбрасывает буфер в файл, и затем я просто:

vim /tmp/tmux

Мы можем автоматизировать процесс еще больше, автоматически открывая vim также как предложил pkfm:

bind-key v 'capture-pane' \; \
  capture-pane -S - \; \
  save-buffer /tmp/tmux \; \
  delete-buffer \; \
  send-keys Escape 'ddivim /tmp/tmux' Enter

Предполагается, что ваша оболочка находится в режиме vi, так что:

  • Escape переходит в обычный режим
  • dd очищает любую существующую команду
  • i переходит в режим вставки
  • затем мы запускаем vim /tmp/tmux

Проверено в tmux 3.0.

Вы можете использовать vim для просмотра/редактирования/поиска/сохранения журнала экрана, свертывая журнал при каждом запросе bash:

tmux capture-pane -pS -1000000 |
  vim +":setl fen fdm=expr fde=getline(v:lnum)=~'^\\\\S\\+\\\\$\\\\s'?'>1':1"  -  

Настройте регулярное выражение в соответствии с вашим запросом, используйте четыре обратные косые черты для каждой обратной косой черты в регулярном выражении.

Или добавьте функцию vim в ~/.vimrc:

command!           MoshFoldTmuxLog :setl fen fdm=expr
  \   fde=getline(v:lnum)=~'^\\S\\+\\$\\s'?'>1':1 

И в ~/.bashrc добавьте дату к приглашению, если у вас много журналов для поиска. например

PS1='\u@\h:\w:\D{%F-%T}$?:\$ ' # пользователь-хост-путь-дата-время-код ошибки 
alias tmux-log='tmux capture-pane -pS -1000000 | vi +MoshFoldTmuxLog -'         

Вот решение, которое я нашел.

Вы можете изменить целевой путь и имя файла:

# Сохранить содержимое экрана в файл
bind p command-prompt -p 'Сохранить историю в:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'

После перезагрузки конфигурационного файла tmux вы можете нажать prefix p в моем случае Ctrl+a p
Вы можете изменить bind p на предпочитаемую комбинацию клавиш.

Сначала у меня это не работало, потому что я перезаписывал bind p в другой строке, поэтому я просто закомментировал это.

При поиске вывода оболочки tmux дважды у вас возникнет проблема: поле ввода для поиска, похоже, не поддерживает вставку изначально. Я думаю, это причина, по которой люди хотят реальный редактор или оболочку, чтобы завершить сложные поиски. Я ответил на другой аналогичный вопрос. Я не уверен, что люди готовы рассмотреть направление, о котором я говорю, поэтому я оставил ссылку (Оригинальное название поста: TMUX: можете ли вы вставить последний буфер в поле поиска) здесь для справки тем, кто в этом нуждается 🙂

Содержание оригинального поста примерно следующее:

В моей версии tmux 3.2a действительно есть предустановленные клавиши поиска (# и *) в режиме копирования vi.

bind-key -T copy-mode-vi \# send-key -FX search-backward "#{copy_cursor_word}"
bind-key -T copy-mode-vi * send-key -FX search-forward "#{copy_cursor_word}"

Они используют #{copy_cursor_word} непосредственно в качестве целевого поиска, но что если текст под курсором представляет собой сплошный абзац текста (например, значение переменной cmake)? Если вы часто выполняете такой поиск, вы поймете, что это не так просто. Нам нужен более точный поиск.

Версия 1

bind-key -T copy-mode-vi \\ command-prompt -I "#{copy_cursor_word}" -p "(поиск вверх)" "send -X search-backward \"%%%\""

(Вы можете изменить сочетание клавиш ‘\’ на соответствующее значение клавиши в вашей конфигурации tmux.)

Через это определение вы можете редактировать содержимое, захваченное tmux, и подать искомые ключевые слова.

Постер действительно задал хороший вопрос. В чистом tty окружении, на которое он конкретно ссылается, tmux “является” самой системой, и графические системы могут еще не существовать 🙂

Мой аналогичный рабочий сценарий: оболочка ищет ключевые слова в файлах под определенным путем, а затем tmux проходит значения ключевых переменных в результатах поиска оболочки. Стандартный поиск copy-mode-vi в tmux требует ручного ввода ключевых слов — на мой взгляд, в чистом tty окружении нет простого способа вставки (скажем, в режиме консоли linux — без мыши, без графического интерфейса, и пожалуйста, не говорите о prefix ], мы говорим о поле ввода поиска режима copy-mode-vi, а не о операции вставки после выхода из этого режима). Поэтому был принят альтернативный метод — выбор ключевых слов в результатах поиска оболочки (версия 1) — сейчас это не идеально и находится в процессе улучшения.

Улучшенная версия после внедрения оболочки:

Версия 2

bind-key -T copy-mode-vi \\ run-shell 'tmux command-prompt -I "$(tmux show-buffer)" -p "(поиск вверх)" "send -X search-backward \"%%%\""'

Но тут возникает вопрос: если копируемое содержимое является скриптом tmux, будет ли оно показано как выполняемое? Например, в man tmux

#{?pane_in_mode,#[fg=white#,bg=red],#[fg=red#,bg=white]}#W .

Когда вы вытаскиваете этот текст в режиме copy-mode-vi, строка поиска не отобразит ничего. Если это обычный текст, проблем нет.

Таким образом, версия 1 не так плоха, как кажется, правда?

Версия 3

bind-key -T copy-mode-vi y run 'tmux send-keys -X copy-pipe ; \
tmux set -q @buffer_content "#{l:$(tmux show-buffer)}"'
bind-key : command-prompt -I '#{@buffer_content}' -p '>' \; \
run 'tmux set -u "@buffer_content"'
# Не дублируйте следующие \\ с версией 4
bind-key -T copy-mode-vi \\ command-prompt -I '#{@buffer_content}' -p '(поиск вверх)' 'send -X search-backward "%%%"'

Версия 3 избегает проблем первых двух версий (но все еще не реализует саму операцию вставки). Я применяю это к двум ситуациям: будь то копирование содержимого экрана в поле поиска режима “copy-mode-vi” или в редактор строк интерактивного окна режима “command-prompt”, это основывается на одной и той же логике: определить дополнительную переменную @buffer_content для хранения последней переменной буфера, она будет автоматически вставлена в текущий запущенный редактор строк в оригинальной форме. Вы можете редактировать и отправлять содержимое нормально для дальнейшей обработки.

Вот связанная ссылка Выполнить произвольную команду в режиме копирования tmux. Метод, который она предоставляет, такой же, как тот, который я использую. У него есть преимущество автоматического копирования выборки, поскольку он должен работать в режиме copy-mode (через send-keys), которое реализация все еще требует кэширования в пользовательской переменной tmux на моем компьютере и должно использовать интерфейс “-I”. Моя соответствующая версия показана ниже:

Версия 4

bind-key -T copy-mode-vi \\ send-keys -X copy-selection \; \
run 'tmux set -gq @buffer_command "#{l:$(tmux show-buffer)}"' \; \
command-prompt -I '#{@buffer_command}' -p 'поиск вверх>' 'send -X search-backward "%%%"' \; \
run 'tmux set -u "@buffer_command"'

bind-key -T copy-mode-vi : send-keys -X copy-selection \; \
run 'tmux set -gq @buffer_command "#{l:$(tmux show-buffer)}"' \; \
command-prompt -p '>' -I '#{@buffer_command}' \; \
run 'tmux set -u "@buffer_command"'

Связанное обсуждение
Как я могу искать в буфере вывода оболочки tmux?

Указанный выше код может нормально работать в среде KISS Linux Console (в основном в минимальной среде Linux, кроме самого tmux). В разных системах могут быть получены различные результаты. Если у вас есть другое решение или лучшее решение, пожалуйста, ответьте или откройте другую тему для обсуждения. Спасибо

Обновление:
Tmux 3.4 поддерживает C-y в status-keys, равный vi. Указанная реализация опускает операцию вставки в рабочем процессе, что имеет свои преимущества для поиска/отладки в среде оболочки.

Ответ или решение

Для поиска в выводном буфере оболочки tmux вы можете воспользоваться режимом копирования (copy mode), который позволяет просматривать и исследовать историю вывода терминала. Вот подробное руководство о том, как это сделать.

Вход в режим копирования

Чтобы начать поиск в буфере tmux, выполните следующие шаги:

  1. Вход в режим копирования:
    Нажмите Ctrl + b, затем [, чтобы войти в режим копирования. В этом режиме вы сможете прокручивать вывод и выделять текст.

Поиск в режиме копирования

В зависимости от того, какой тип клавишных сочетаний (Emacs или Vim) вы используете, поиск будет происходить по-разному:

Если вы используете настройки по умолчанию (Emacs):

  1. Нажмите Ctrl + s, введите искомую строку и нажмите Enter.
  2. Для поиска следующего вхождения нажмите n, а для обратного поиска – Shift + n.
  3. Чтобы выйти из режима копирования, дважды нажмите Escape.

Если вы используете настройки Vim:

  1. Нажмите /, введите строку для поиска и нажмите Enter.
  2. Нажмите n для поиска следующего вхождения и Shift + n для обратного поиска.
  3. Чтобы выйти из режима копирования, дважды нажмите q.

Подсказка: Быстрый поиск

Вы можете настроить tmux, чтобы сразу начать поиск при входе в режим копирования. Например, добавив следующий код в ваш .tmux.conf:

bind-key / copy-mode \; send-key ?

Теперь, когда вы нажмете Ctrl + b, а затем /, вы сразу можете начать вводить искомый текст.

Сохранение вывода в файл

Если вам нужно провести более сложные операции поиска или редактирования, возможно, вам понадобится сохранить вывод tmux в файл и использовать текстовый редактор, такой как vim. Вот пример команды для сохранения:

bind p command-prompt -p 'Save history to:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'

После этого, вы можете открыть сохраненный файл в vim для более удобного поиска.

Использование vim для поиска с разбиением по строкам

Вы можете использовать следующую команду для захвата вывода и открытия его в vim с настройками, позволяющими сворачивать длинные логи:

tmux capture-pane -pS -1000000 | vim +":setl fen fdm=expr fde=getline(v:lnum)=~'^\\S\\+\\$\\s'?'>1':1" -

Это позволит вам исследовать данные с использованием мощи vim для редактирования и поиска.

Заключение

Описанные методы позволят вам эффективно искать и обрабатывать вывод в tmux. Использование режима копирования и интеграция с редакторами, такими как vim, повысит вашу продуктивность при работе с терминалом. Не забудьте экспериментировать с настройками tmux, чтобы адаптировать его под свои нужды.

Спасибо за внимание, и удачи в вашем использовании tmux!

Оцените материал
Добавить комментарий

Капча загружается...