Альтернатива обратному поиску Ctrl-R в bash

Альтернатива обратному поиску Ctrl-R в bash

Я счастлив и мне очень нравится функция Ctrlобратного Rпоиска оболочки bash. Некоторым моим коллегам она не нравится, так как иногда она сбивает с толку. Я их понимаю. Если вы введете неправильные символы, текущая позиция в истории окажется где-то в прошлом, и вы не найдете недавних совпадений.

Существует ли более удобная альтернатива для поиска в истории оболочки?

Я хочу придерживаться bash. Предложение альтернативной оболочки не является ответом на этот вопрос.

Проблема с «потерянной позицией» объясняется здесь:Сбросить позицию поиска истории bash. Эти решения работают. Это верно. Но, с моей точки зрения, эти решения не являются простыми и удобными для пользователя. Эти решения не являются простыми и прямыми. Это решения прошлого. В прошлом человеку нужно было узнать, каким образом компьютер хотел получить ввод. Но сегодня инструменты должны принимать ввод таким образом, чтобы это было легко для пользователя.

Может кто знает IDE для jetbrains типа PyCharm. Если поискать "foobar", то даже строки, содержащие "foo_bar", будут. Это здорово, это unix :-)

решение1

Я использую программу Fuzzy Finder.ФЗФ. Я написал свои собственные сочетания клавиш и скрипты оболочки для использованияФЗФкак мой инструмент для обратного поиска интерактивногоБашИстория оболочки. Не стесняйтесь копировать и вставлять код из моегоКонфигурацияРепозиторий GitHub.

Файл конфигурации ~/.bashrc

# Test if fuzzy finder program _Fzf_ is installed.
#
if type -p fzf &> /dev/null; then

  # Test if _Fzf_ specific _Readline_ file is readable.
  #
  if [[ -f ~/.inputrc.fzf && -r ~/.inputrc.fzf ]]; then

    # Make _Fzf_ available through _Readline_ key bindings.
    #
    bind -f ~/.inputrc.fzf
  fi
fi

Файл конфигурации ~/.inputrc.fzf ##

$if mode=vi

  # Key bindings for _Vi_ _Insert_ mode
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  set keymap vi-insert

  "\C-x\C-a": vi-movement-mode
  "\C-x\C-e": shell-expand-line
  "\C-x\C-r": redraw-current-line
  "\C-x^": history-expand-line
  "\C-r": "\C-x\C-addi$(HISTTIMEFORMAT= history | fzf-history)\C-x\C-e\C-x\C-r\C-x^\C-x\C-a$a"

  # Key bindings for _Vi_ _Command_ mode
  # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  set keymap vi-command

  "\C-r": "i\C-r"
  "\ec": "i\ec"

$endif

fzf-history исполняемый Bash-скрипт

#!/usr/bin/env bash
#
# Retrieve command from history with fuzzy finder
# ===============================================
# Tim Friske <[email protected]>
#
# See also:
#   * man:bash[1]
#   * man:fzf[1]
#   * man:cat[1]

shopt -os nounset pipefail errexit errtrace
shopt -s extglob globstar

function print_help {
  1>&2 cat \
<<'HELP'
usage:
  HISTTIMEFORMAT= history | fzf-history
HELP
}

function fzf_history {
  if [[ -t 0 ]]; then
    print_help
    exit
  fi

  local fzf_options=()
  fzf_options+=(${FZF_DEFAULT_OPTS:-})
  fzf_options+=('--tac' '-n2..,..' '--tiebreak=index')
  fzf_options+=(${FZF_HISTORY_FZF_OPTS:-})
  fzf_options+=('--print0')

  local cmd='' cmds=()
  while read -r -d '' cmd; do
    cmds+=("${cmd/#+([[:digit:]])+([[:space:]])/}")
  done < <(fzf "${fzf_options[@]}")
  if [[ "${#cmds[*]}" -gt 0 ]]; then
    (IFS=';'; printf '%s\n' "${cmds[*]}")
  fi
}

fzf_history "$@"

key-bindings.bash исходный скрипт Bash

Взято и немного адаптировано изFZF-ы Баш привязки клавишфайл, в котором приведены сочетания клавиш, совместимые с режимом Emacs, для обратного поиска по истории Bash Ctrl-R(не проверено):

if [[ ! -o vi ]]; then
  # Required to refresh the prompt after fzf
  bind '"\er": redraw-current-line'
  bind '"\e^": history-expand-line'

  # CTRL-R - Paste the selected command from history into the command line
  bind '"\C-r": " \C-e\C-u\C-y\ey\C-u$(HISTTIMEFORMAT= history | fzf-history)\e\C-e\er\e^"'
fi

решение2

  • Стрелка вверх: применимо только для совсем недавних событий.
  • grep blablabla ~/.bash_history: вам придется настроить bash на сохранение истории в файл после каждой команды.

Из моего руководства ~/.bashrcВы, возможно, захотите узнать, что делают команды, и что можно изменить.

# don't put duplicate lines in the history. See bash(1) for more options
HISTCONTROL=ignorespace:ignoredups:erasedups
HISTFILESIZE=99999
HISTSIZE=99999
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
# append to the history file, don't overwrite it
shopt -s histappend
#history
shopt -s cmdhist
shopt -s histreedit
shopt -s histverify
shopt -s lithist

решение3

МакФлайэто еще один вариант. Его очень легко установить - вы можете сделать это через brewили просто скачатьпоследний двоичный файл. Он написан на Rust, поэтому они статически связаны. Никакой ерунды с зависимостями.

Затем просто добавьте это в свой .bashrc/ .zshrc:

eval "$(mcfly init bash)" # or zsh

Он предоставляет вам полноэкранный пользовательский интерфейс, упорядоченный каким-то разумным образом.

введите описание изображения здесь

решение4

ФЗФпоставляется с поддержкой bash (также zsh и fish).

Ответ @Tim Freskeописывает их модификации для сочетания клавиш в стиле vi.

Привязки клавиш по умолчаниюявляются стилем emacs. Который даже переопределяет поведение Ctrl- rдля fuzzy find без потери позиции. Они могут быть не включены по умолчанию. Чтобы включить их, добавьте это в .bashrc:

source /usr/share/doc/fzf/examples/key-bindings.bash

(Если это не сработает, выполните команду apt-cache show fzffind ...fzf/README...file, в ней перечислены команды для bash, zsh, fish и vim)

Связанный контент