Estoy contento y me gusta mucho la función de búsqueda hacia Ctrlatrás Rdel shell bash. A algunos de mis compañeros no les gusta porque a veces resulta confuso. Los entiendo. Si ingresa los caracteres incorrectos, la posición actual en el historial estará en algún lugar del pasado y no encontrará las coincidencias recientes.
¿Existe una alternativa más fácil de usar para buscar hacia atrás en el historial del shell?
Quiero seguir con bash. Sugerir un caparazón alternativo no es una respuesta a esta pregunta.
El problema con la "posición perdida" se explica aquí:Restablecer la posición de búsqueda del historial de bash. Estas soluciones funcionan. Así es. Pero la solución no es fácil ni fácil de usar según mi punto de vista. Estas soluciones no son simples ni directas. Éstas son soluciones del pasado. En el pasado, el ser humano necesitaba aprender la forma en que la computadora quería la entrada. Pero hoy las herramientas deberían aceptar la entrada de una manera que sea fácil para el usuario.
Quizás alguien conozca un IDE de jetbrains como PyCharm. Si busca "foobar", incluso obtendrá líneas que contienen "foo_bar". Eso es genial, eso es Unix :-)
Respuesta1
Estoy usando el programa Fuzzy Finder.FZF. He escrito mis propias combinaciones de teclas y scripts de shell para utilizarFZFcomo mi herramienta preferida para realizar búsquedas inversas en un interactivoIntentoLa historia del caparazón. Siéntete libre de copiar y pegar el código de miconfiguraciónRepositorio de GitHub.
~/.bashrc archivo de configuración
# 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 archivo de configuración ##
$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
Script Bash ejecutable de fzf-history
#!/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 script Bash fuente
Tomado y ligeramente adaptado deFZF Intento atajos de tecladoEl archivo aquí son las combinaciones de teclas compatibles con el modo Emacs para la búsqueda inversa del historial de Bash con Ctrl-R(no probado):
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
Respuesta2
- Flecha hacia arriba: sólo práctica para material muy reciente.
grep blablabla ~/.bash_history
: tendrás que configurar bash para guardar el historial en un archivo después de cada comando.
De mi ~/.bashrc
Es posible que desee saber qué hacen y modifican los comandos.
# 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
Respuesta3
McFlyes otra opción. Es muy fácil de instalar: puede hacerlo a través brew
o simplemente descargarlo.el último binario. Está escrito en Rust por lo que están vinculados estáticamente. Sin tonterías de dependencia.
Luego simplemente agrega esto a tu .bashrc
/ .zshrc
:
eval "$(mcfly init bash)" # or zsh
Le brinda una interfaz de usuario de pantalla completa ordenada de alguna manera inteligente.
Respuesta4
FZFviene con soporte para bash (también zsh y fish).
La respuesta de @Tim Freskedescribe sus modificaciones para la combinación de teclas estilo vi.
Combinaciones de teclas predeterminadasson de estilo emacs. Lo que incluso anula el Ctrlcomportamiento rde búsqueda difusa sin perder posición. Es posible que no estén habilitados de forma predeterminada. Para habilitarlos, agregue esto a .bashrc
:
source /usr/share/doc/fzf/examples/key-bindings.bash
(Si esto no funciona, hágalo apt-cache show fzf
y busque ...fzf/README...
el archivo, enumera los comandos para bash, zsh, fish y vim)