AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 523543
Accepted
guettli
guettli
Asked: 2019-06-08 05:39:54 +0800 CST2019-06-08 05:39:54 +0800 CST 2019-06-08 05:39:54 +0800 CST

Alternativa à pesquisa reversa Ctrl-R no bash

  • 772

Estou feliz e realmente gosto do recurso Ctrlde Rpesquisa para trás do 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 para trás no histórico do shell?

Eu quero ficar com bash. Sugerir um shell alternativo não é uma resposta a essa 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 não é fácil e amigável de acordo com o meu ponto de vista. Essas soluções não são simples e diretas. São soluções do passado. No passado, o ser humano precisava aprender a maneira como o computador queria 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", você obterá as linhas que contêm "foo_bar". Isso é ótimo, isso é unix :-)

bash command-history
  • 5 5 respostas
  • 5616 Views

5 respostas

  • Voted
  1. Best Answer
    Tim Friske
    2019-06-08T11:39:04+08:002019-06-08T11:39:04+08:00

    Estou usando o programa fuzzy finder FZF . Eu escrevi minhas próprias combinações de teclas e scripts de shell para utilizar o FZF como minha ferramenta de escolha para pesquisar inversamente o histórico de um shell Bash interativo. Sinta-se à vontade para copiar e colar o código do meu repositório Config GitHub.

    ~/.bashrc arquivo de configuração

    # 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 arquivo de configuração ##

    $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

    Tiradas e ligeiramente adaptadas do arquivo de atalhos de teclado Bash do FZF, aqui estão os atalhos de teclas compatíveis com o modo Emacs para a pesquisa reversa do histórico do Bash com (não testado): Ctrl-R

    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
    
    • 4
  2. ctrl-alt-delor
    2019-06-08T07:15:45+08:002019-06-08T07:15:45+08:00
    • Seta para cima: prático apenas para coisas muito recentes.
    • grep blablabla ~/.bash_history: você terá que definir o bash para salvar o histórico no 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
    
    • 2
  3. pizdelect
    2019-06-08T14:57:05+08:002019-06-08T14:57:05+08:00

    Vale a pena, se você desabilitar o recurso stop/start do seu tty (que você provavelmente não usa muito), você pode mudar a direção da busca pressionando Control-S.

    % stty stop undef
    
    % true str1
    % true str2
    % true str3
    % true str4
    Control-R => (reverse-i-search)`str': true str4
    Control-R => (reverse-i-search)`str': true str3
    Control-S => (i-search)`str': true str3
    Control-S => (i-search)`str': true str4
    

    Quanto a essas combinações de teclas não serem "amigáveis ​​ao usuário" ou intuitivas, elas são combinações de teclas do emacs. emacsnão é para todos , não há nenhuma surpresa nisso (embora eu conheça secretários e outros indivíduos não tão pretensiosos que foram capazes de dominá-los em pouco tempo e sem muito barulho). É mais uma questão de cultura.

    • 1
  4. Timmmm
    2021-12-08T03:00:12+08:002021-12-08T03:00:12+08:00

    McFly é outra opção. É muito fácil de instalar - você pode fazer isso brewou apenas baixar o binário mais recente . Está escrito em Rust, então eles estão vinculados estaticamente. Nenhum absurdo de dependência.

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

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

    Ele oferece uma interface de usuário em tela cheia classificada de alguma maneira inteligente.

    insira a descrição da imagem aqui

    • 0
  5. sm7
    2021-05-26T01:38:19+08:002021-05-26T01:38:19+08:00

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

    A resposta do @Tim Freske descreve suas modificações para a combinação de teclas no estilo vi.

    As associações de teclas padrão são no estilo emacs. O que até substitui o Ctrl- rcomportamento para encontrar fuzzy sem perder posição. Eles podem não estar habilitados por padrão. Para habilitá-los, adicione isso 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 os comandos para bash, zsh, fish e vim)

    • -1

relate perguntas

  • exportar variáveis ​​​​env programaticamente, via stdout do comando [duplicado]

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve