bash での Ctrl-R 逆検索の代替

bash での Ctrl-R 逆検索の代替

Ctrl私は bash シェルの後方検索機能に満足しており、本当に気に入っていますR。同僚の中には、時々混乱するため、この機能を好まない人もいます。その気持ちはわかります。間違った文字を入力すると、履歴の現在の位置が過去のどこかになり、最近の一致が見つかりません。

シェルの履歴を後方に検索するための、よりユーザーフレンドリーな代替手段はありますか?

私は bash を使い続けたいと思っています。代替シェルを提案することは、この質問に対する答えにはなりません。

「失われたポジション」の問題については、ここで説明されています。bash 履歴の検索位置をリセットするこれらのソリューションは機能します。その通りです。しかし、私の観点からすると、これらのソリューションは簡単でユーザーフレンドリーではありません。これらのソリューションは単純で簡単ではありません。これらは過去のソリューションです。過去には、人間はコンピューターが入力を要求する方法を学ぶ必要がありました。しかし、今日のツールは、ユーザーにとって簡単な方法で入力を受け入れる必要があります。

おそらく、PyCharm のような JetBrains の IDE を知っている人がいるでしょう。"foobar" を検索すると、"foo_bar" を含む行も表示されます。これは素晴らしい、これが Unix です :-)

答え1

私はファジーファインダープログラムを使用していますFZF独自のキーバインディングとシェルスクリプトを作成して、FZFインタラクティブな逆検索ツールとしてバッシュシェルの歴史。私のコードをコピーして貼り付けてください。設定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の バッシュ キーバインディングここのファイルは、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

答え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

何らかのインテリジェントな方法で整理されたフルスクリーン UI が提供されます。

ここに画像の説明を入力してください

答え4

FZFbash (zsh および fish) のサポートが付属しています。

@Tim Freske の回答vi スタイルのキーバインドに対する変更について説明します。

デフォルトのキーバインディングこれらは emacs スタイルです。これにより、位置を失うことなくあいまい検索を行うCtrl-r動作がオーバーライドされます。これらはデフォルトでは有効になっていない可能性があります。有効にするには、以下を追加します.bashrc

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

(これが機能しない場合は、実行しapt-cache show fzfてファイルを見つけてください...fzf/README...。bash、zsh、fish、vim のコマンドがリストされます)

関連情報