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, ~/.bashrc
você 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 brew
ou 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.
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 fzf
e encontre ...fzf/README...
o arquivo, ele lista comandos para bash, zsh, fish e vim)