Alternative zur Strg-R-Rückwärtssuche in Bash

Alternative zur Strg-R-Rückwärtssuche in Bash

Ich bin zufrieden und mag die Rückwärtssuchfunktion der Bash-Shell sehr Ctrl. REinige meiner Kollegen mögen sie nicht, da sie manchmal verwirrend ist. Ich verstehe sie. Wenn Sie die falschen Zeichen eingeben, ist die aktuelle Position im Verlauf irgendwo in der Vergangenheit und Sie werden die letzten Übereinstimmungen nicht finden.

Gibt es eine benutzerfreundlichere Alternative für die Rückwärtssuche im Shell-Verlauf?

Ich möchte bei Bash bleiben. Der Vorschlag einer alternativen Shell ist keine Antwort auf diese Frage.

Das Problem mit der „verlorenen Position“ wird hier erklärt:Suchposition des Bash-Verlaufs zurücksetzen. Diese Lösungen funktionieren. Das stimmt. Aber meiner Meinung nach sind die Lösungen dort weder einfach noch benutzerfreundlich. Diese Lösungen sind nicht einfach und unkompliziert. Das sind Lösungen aus der Vergangenheit. Früher musste der Mensch lernen, wie der Computer die Eingaben wollte. Aber heute sollten die Tools die Eingaben auf eine Weise akzeptieren, die für den Benutzer einfach ist.

Vielleicht kennt jemand eine IDE von Jetbrains wie PyCharm. Wenn man nach "foobar" sucht, bekommt man sogar die Zeilen, die "foo_bar" enthalten. Das ist ja super, das ist Unix :-)

Antwort1

Ich benutze das Fuzzy-Finder-ProgrammFZF. Ich habe meine eigenen Tastenkombinationen und Shell-Skripte geschrieben, umFZFals mein bevorzugtes Werkzeug zur Rückwärtssuche in einer interaktivenSchlagShell-Geschichte. Fühlen Sie sich frei, den Code von meinem zu kopieren und einzufügenKonfigurationGitHub-Repository.

~/.bashrc-Konfigurationsdatei

# 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 Konfigurationsdatei ##

$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 ausführbares Bash-Skript

#!/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-Skript mit Quellcode

Übernommen und leicht adaptiert ausFZFs Schlag TastenbelegungenIn der folgenden Datei sind die mit dem Emacs-Modus kompatiblen Tastenkombinationen für die umgekehrte Verlaufssuche in Bash aufgeführt Ctrl-R(ungetestet):

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

Antwort2

  • Pfeil nach oben: nur bei ganz neuen Sachen praktisch.
  • grep blablabla ~/.bash_history: Sie müssen Bash so einstellen, dass der Verlauf nach jedem Befehl in einer Datei gespeichert wird.

Von mir aus ~/.bashrcmöchten Sie vielleicht herausfinden, was die Befehle bewirken und welche Optimierungen möglich sind.

# 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

Antwort3

McFlyist eine weitere Option. Es ist sehr einfach zu installieren - Sie können es durch tun brewoder einfach herunterladendie neueste Binärdatei. Es ist in Rust geschrieben, also sind sie statisch verknüpft. Kein Abhängigkeits-Unsinn.

Fügen Sie dann einfach dies zu Ihrem .bashrc/ hinzu .zshrc:

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

Es bietet Ihnen eine auf intelligente Weise sortierte Vollbild-Benutzeroberfläche.

Bildbeschreibung hier eingeben

Antwort4

FZFkommt mit Unterstützung für Bash (auch Zsh & Fish).

@Tim Freskes Antwortbeschreibt ihre Änderungen für die Tastenkombination im vi-Stil.

Standard-Tastenkombinationensind im Emacs-Stil. Das überschreibt sogar das Ctrl- rVerhalten bei der Fuzzy-Suche, ohne die Position zu verlieren. Sie sind möglicherweise nicht standardmäßig aktiviert. Um sie zu aktivieren, fügen Sie Folgendes hinzu .bashrc:

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

(Wenn dies nicht funktioniert, führen Sie apt-cache show fzfdie Suche nach ...fzf/README...der Datei durch. Dort sind Befehle für Bash, Zsh, Fish und Vim aufgelistet.)

verwandte Informationen