BashでのCtrl-Rリバース検索の代替

BashでのCtrl-Rリバース検索の代替

私はbashシェルのリバース検索機能にとても満足していて本当に好きですCtrlR私の同僚のいくつかは時々混乱するかもしれないので、それは好きではありません。私はそれらを理解します。間違った文字を入力すると、履歴の現在位置は過去のどこかにあり、最も近い一致が見つかりません。

シェル履歴から戻る検索よりもユーザーフレンドリーな選択肢はありますか?

私はbashに固執したいです。代替シェルを提案しても、この問題は解決されません。

「位置の喪失」の問題は、次のように説明されています。Bash履歴検索場所のリセット。これらのソリューションは効果があります。いいですね。しかし、私の視点では、解決策は単純ではなく、ユーザーフレンドリーでもありません。これらの解決策は単純で単純ではありません。これは過去の解決策です。過去には、人間はコンピュータが望む入力を通して学習しなければなりませんでした。しかし、今日のツールは、ユーザーが簡単な方法で入力を受け入れる必要があります。

PyCharmなどのjetbrains IDEについて知っている人がいるかもしれません。 「foobar」を検索すると、「foo_bar」を含む行も表示されます。すごい、それはUnixです:-)

ベストアンサー1

ファジーファインダーを使用しています富士フ。使用するキーバインディングとシェルスクリプトを直接作成しました。富士フリバース検索用に選択した対話型ツール吹くシェルの歴史。私のコードを自由にコピーして貼り付けてください。構成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-binds.bash ソース Bash スクリプト

から抜粋して少し改造FZF 吹く キーバインディングBash履歴の逆検索のためのEmacsモード互換キーバインディングファイルは次のとおりです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

おすすめ記事