Alternativa a la búsqueda inversa Ctrl-R en bash

Alternativa a la búsqueda inversa Ctrl-R en bash

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 ~/.bashrcEs 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 brewo 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.

ingrese la descripción de la imagen aquí

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 fzfy busque ...fzf/README...el archivo, enumera los comandos para bash, zsh, fish y vim)

información relacionada