Как перемещаться в обратном поиске bash?

40

Bash предлагает функциональность для обратного поиска через Ctrl+ R. Затем можно ввести часть команды, которая покажет подходящую запись из истории.

Предположим, это моя история:

vim foo1
vim foo2 # I want to go here
vim foo3 # this is where I land, how to go back?

Я ищу foo. Нажатие Ctrl+ Rснова показывает следующую подходящую запись поиска. Часто со мной случается, что я слишком быстр и перехожу намеченный результат, и vim foo3мне показывают, и теперь я хочу вернуться к vim foo2.

Отсюда мой вопрос: как мне ориентироваться в обратном поиске?

k0pernikus
источник
Какой терминал вы используете? Например. гном-терминал, консоль, и так далее ...
вареса
1
Ну, я не слишком знаком с этим ... Ключ должен быть Ctrl + S, но некоторые терминалы, кажется, съели ключ, прежде чем он достигнет обратного поиска
varesa
Ctrl + shift + R - поиск вперед, в то время как ctrl + R
devansvd
Связанный: unix.stackexchange.com/questions/73498/…
k0pernikus
Связанный: stackoverflow.com/questions/791765/…
k0pernikus

Ответы:

36

Вы можете получить доступ к этому через forward-search-historyфункцию, которая по умолчанию привязана к ctrl+s. К сожалению ctrl+s, используется для сигнализации xoffпо умолчанию, что означает, что вы не можете использовать его для изменения направления поиска. Есть два решения для решения проблемы: одно отключение отправки xoff/xonсигналов, а другое изменение привязки клавиш дляforward-search-history

Отключить xon / xoff

Запустите stty -ixonв своем терминале или добавьте его в свой ~/.bashrc. Это позволяет использовать ctrl+sиспользовать forward-search-historyфункцию истории.

Для получения дополнительной информации о потоке управления посмотрите на Как разморозить после случайного нажатия Ctrl-S в терминале? и некоторые ответы

Изменить связывание клавиш

Если вы не хотите изменять поведение по умолчанию, ctrl+sвы можете изменить связывание клавиш для forward-search-historyс bind. Поскольку большинство ключей уже определены в bash, вам, возможно, придется проявить творческий подход:

bind "\C-t":forward-search-history

Это связывается ctrl+tс вперед-розыскной-историей, но следует помнить , что по умолчанию ctrl+tпрогоновtranspose-chars

Ульрих Дангел
источник
Я попробовал ваше первое решение stty -ixonв zshи она работает очень хорошо. Однако есть ли какие-либо нежелательные побочные эффекты при отключении xoff/xonсигнализации?
студент
@student Вы больше не можете использовать ctrl+sдля приостановки вывода терминала. Если вы никогда не использовали его раньше, это не проблема
Ульрих Дангел
1
Для чего это стоит, я пошел со вторым решением. Отличный материал ! Я никогда не знал, что вы можете заморозить консоль, нажав C-s.. очень полезно при использовании tail в журналах сервера. Аккуратно! (Хотелось бы, чтобы у меня был еще один голос :))
Ашутош Джиндал
Я не мог получить вариант № 2 для работы на OSX. Я должен был сделать это вместо этого:bind '"\C-t": history-search-forward'
stiemannkj1
0

В качестве альтернативы простому обратному поиску и прямому поиску, предоставляемому вашим bash, вы можете рассмотреть:

fzf , самоописанный "нечеткий искатель командной строки".

Он может заменить поиск по умолчанию вашего bash (и других терминалов).

Его преимущества в том, что он:

  • печатает список ваших команд из истории
    • переключает хронологическую или релевантную сортировку, снова нажимая Ctrl + R
  • можно перемещаться с помощью клавиш со стрелками (или Ctrl + J / Ctrl + K)
  • позволяет искать несколько игл

Мой рабочий процесс теперь полностью зависит от базового обратного поиска на машинах, которые я контролирую.

k0pernikus
источник