Alternativa à pesquisa reversa Ctrl-R no bash

Alternativa à pesquisa reversa Ctrl-R no bash

Estou feliz e gosto muito do recurso de pesquisa Ctrlreversa Rdo shell bash. Alguns dos meus colegas não gostam, pois às vezes é confuso. Eu os entendo. Se você inserir os caracteres errados, a posição atual no histórico estará em algum lugar no passado e você não encontrará as correspondências recentes.

Existe uma alternativa mais amigável para pesquisar retroativamente no histórico do shell?

Eu quero ficar com o bash. Sugerir um shell alternativo não é uma resposta a esta pergunta.

O problema com a "posição perdida" é explicado aqui:Redefinir a posição de pesquisa do histórico do bash. Essas soluções funcionam. Isso mesmo. Mas a solução aí não é fácil e amigável no meu ponto de vista. Estas soluções não são simples e diretas. Estas são soluções do passado. No passado, o ser humano precisava aprender como o computador desejava a entrada. Mas hoje as ferramentas devem aceitar a entrada de uma forma que seja fácil para o usuário.

Talvez alguém conheça um IDE de jetbrains como o PyCharm. Se você procurar por "foobar", obterá até mesmo as linhas que contêm "foo_bar". Isso é ótimo, isso é unix :-)

Responder1

Estou usando o programa fuzzy finderFZF. Eu escrevi minhas próprias combinações de teclas e scripts de shell para utilizarFZFcomo minha ferramenta preferida para pesquisar reversamente um interativoBashhistória da Shell. Sinta-se à vontade para copiar e colar o código do meuConfiguraçãoRepositório GitHub.

Arquivo de configuração ~/.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

Arquivo de configuração ~/.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

Script Bash executável 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 "$@"

script Bash de origem key-bindings.bash

Retirado e ligeiramente adaptado deFZFs Bash combinações de teclasarquivo aqui estão as combinações de teclas compatíveis com o modo Emacs para a pesquisa reversa do histórico do Bash com Ctrl-R(não testado):

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

Responder2

  • Seta para cima: prático apenas para coisas muito recentes.
  • grep blablabla ~/.bash_history: você terá que configurar o bash para salvar o histórico em um arquivo após cada comando.

Do meu, ~/.bashrcvocê pode querer descobrir o que os comandos fazem e ajustar.

# 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

Responder3

McFlyé outra opção. É muito fácil de instalar - você pode fazer isso brewou apenas baixaro último binário. Está escrito em Rust, então eles estão vinculados estaticamente. Sem bobagens de dependência.

Em seguida, basta adicionar isto ao seu .bashrc/ .zshrc:

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

Ele oferece uma interface de usuário em tela cheia, organizada de maneira inteligente.

insira a descrição da imagem aqui

Responder4

FZFvem com suporte para bash (também zsh & fish).

Resposta de @Tim Freskedescreve suas modificações para atalhos de teclado no estilo vi.

Atalhos de teclas padrãosão do estilo emacs. O que até substitui o comportamento Ctrl- rpara localização difusa sem perder posição. Eles podem não estar habilitados por padrão. Para habilitá-los, adicione isto a .bashrc:

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

(Se isso não funcionar, faça apt-cache show fzfe encontre ...fzf/README...o arquivo, ele lista comandos para bash, zsh, fish e vim)

informação relacionada