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 ~/.bashrc
mö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 brew
oder 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.
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 fzf
die Suche nach ...fzf/README...
der Datei durch. Dort sind Befehle für Bash, Zsh, Fish und Vim aufgelistet.)