Pesquise um comando anterior com o mesmo prefixo quando pressiono Cima no prompt do shell

19

Vindo de um mundo FreeBSD, desejo que o terminal Linux se comporte como o FreeBSD, especialmente a versão 9.1, basicamente quando você digita cdo terminal e pressiona a seta "para cima", pode navegar por todos os comandos do histórico, começando com o cdque faz você ganhar muito tempo.

Não sei como habilitar esse recurso no Linux Debian ou CentOS, o que me força a digitar o todo, alguém poderia me ajudar.

Abdelilah Benaou
fonte
7
Isso é uma função do shell, não do terminal. Qual shell você está usando no FreeBSD? Você pode obter o mesmo shell (ou similar) para Linux.
Cjm 17/10/2013
Estou usando o shell tcsh.
Abdelilah Benaou
2
Estou usando o tcsh no OS X e não tive esse comportamento atraente ... Depois de algumas pesquisas, descobri que podia habilitá-lo, colocando bindkey -k (up|down) history-search-(back|for)ward-o .tcshrc como descrito aqui . Legal!
Garrett Albright

Respostas:

34

Adicione o seguinte a ~/.inputrc:

# Press up-arrow for previous matching command
"\e[A":history-search-backward
# Press down-arrow for next matching command
"\e[B":history-search-forward

Explicação

~/.inputrcé o arquivo de configuração do GNU readline . Muitos shells, incluindo bashe tcshusam o readline para edição de linha de comando. As duas linhas acima instruirão o readline a invocar sua funcionalidade de pesquisa de histórico quando as seqüências de escape da tecla de seta para cima ( \e[A) e tecla de seta para baixo ( \e[B) forem encontradas.

Thomas Nyman
fonte
Eu gosto de adicionar F12 para colocar a última palavra da última linha no final do comando atual. Last wordé frequentemente um caminho que eu quero experimentar em vários clichês arcanos. E Shift F12 para me colocar de volta editando toda a última linha desde o início. ~/.inputrcé uma ferramenta útil.
jalanb
O Shift F12 one requer o modo vi .
jalanb
6

O que está acontecendo é que o FreeBSD e Linux usam diferentes shells por padrão. O FreeBSD assume como padrão o tcsh , que tinha melhores recursos interativos do que o bash no passado (mas o bash alcançou), mas recursos de script notavelmente piores .

A maneira mais direta de obter o ambiente com o qual você está acostumado seria mudar seu shell para o tcsh no Linux. Desde que o tcsh esteja instalado em todo o sistema (se não estiver, peça ao administrador do sistema para instalá-lo), execute chsh -s tcshpara alterar seu shell padrão.

Como alternativa, você pode configurar o bash para ter este comando ao qual está acostumado. Por padrão, as setas Upe Downnavegam entre todos os comandos do histórico, não apenas aqueles que começam com o prefixo digitado. Para mudar isso para o comportamento que você está acostumado, coloque as seguintes linhas no arquivo de inicialização do bash, que está .bashrcno seu diretório pessoal. Execute . ~/.bashrcou inicie um novo shell para reler o arquivo de inicialização.

bind '"\eOA": history-search-backward'
bind '"\e[A": history-search-backward'
bind '"\eOB": history-search-forward'
bind '"\e[B": history-search-forward'

As seqüências de escape são o que o seu terminal envia ao shell quando você pressiona uma tecla de seta. Uppode ser \eOA(escape, O, A) ou \e[Adependendo do seu terminal, e similarmente para Down.

Por padrão, o bash oferece diferentes associações de teclas para pesquisar o histórico de comandos. Você pode pressionar Ctrl+ e R, em seguida, inserir alguns caracteres para procurar um comando contendo essa substring em qualquer lugar da linha. Pressione Ctrl+ Spara avançar ou não para trás. A pesquisa é incremental (ou seja, conforme você digita); Alt+ Pe Alt+ Nfornecem uma pesquisa não incremental.

Em vez de bash e tcsh, você pode alternar para zsh, que possui alguns recursos interessantes não encontrados em outros shells . O Zsh possui Ctrl+ Re Ctrl+ Spor padrão, assim como o bash. Para obter Upe Downcomo você tinha no tcsh, insira as seguintes linhas ~/.zshrc:

bindkey '\eOA' history-beginning-search-backward
bindkey '\e[A' history-beginning-search-backward
bindkey '\eOB' history-beginning-search-forward
bindkey '\e[B' history-beginning-search-forward

Se você deseja usar o mesmo shell em qualquer lugar, também pode usar o bash ou o zsh no FreeBSD, desde que a porta esteja instalada (novamente, pergunte ao administrador do sistema).

Gilles 'SO- parar de ser mau'
fonte
1

tcshestá disponível para a maioria das distribuições Linux. Tente instalar o tcshpacote e execute-o chsh -s /bin/tcshpara torná-lo seu shell padrão.

cjm
fonte
1
Ou você pode considerar mudar para o bash (eu fiz).
amigos estão dizendo sobre keith thompson
1

Outras respostas resolvem isso, mas se você quiser mais, dê uma olhada https://github.com/zsh-users/zsh-history-substring-search

O Prezto ( https://github.com/sorin-ionescu/prezto ) também está cheio de itens do zsh.

Fuad Saud
fonte
Obrigado pela sua resposta, a propósito, ainda não vejo quais benefícios têm o zsh sobre o bash ou o tcsh?
Abdelilah Benaou 22/10
1
Hum, você pode fazer praticamente todas as coisas básicas em todas essas conchas. Eu uso o zsh por causa do pacote prezto bem conservado (provavelmente o grande trocador de jogos), pelo prompt certo (que é um recurso exclusivo) e porque parece mais polido que o bash (configuração e outras coisas).
Fuad Saud