Preenchimento automático para comandos de linha de comando frequentemente usados?

15

Para alguns projetos, geralmente digito alguns comandos, como por exemplo:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

e

./runmyproject --with some --command line --options set

Vendo que sou muito preguiçoso, tento evitar digitar esses comandos na íntegra repetidamente. Portanto, é claro que posso usar muito a tecla up-up para encontrar esses comandos, mas muitas vezes também tenho tantos comandos no meio, que a pesquisa leva mais tempo do que apenas digitando-a.

Agora me pergunto se existe algum tipo de utilitário que possa sugerir um comando completo que eu uso muito, quando ainda não o digitei. Para que eu possa, por exemplo, digitar 'cd an /' e que já sugira o resto do caminho, porque eu o usei muito no mês passado.

Eu encontrei algo chamado Bash Smart Complete. Mas isso é um pouco "burro", pois não olha para os comandos que usei antes. Eu também encontrei esta resposta SO , que sugere colocar os comandos que eu uso muito em um arquivo. Isso, no entanto, não é responsivo o suficiente, pois eu precisaria criar um novo arquivo para ele sempre que iniciar novos projetos ou alterar pastas ou argumentos de programas.

Alguém conhece outra utilidade ou outra maneira de conseguir isso? Ou alguém saberia como eu poderia alterar o Bash Smart Complete para que ele possa examinar os comandos que usei, digamos no mês passado, e concluir o comando que se encaixa e foi mais utilizado no mês passado?

[EDIT] Abaixo estão algumas respostas realmente ótimas. Eu não marquei nenhuma como uma resposta definitiva ainda. Não porque eu não goste das respostas, sim, mas porque nenhuma delas é uma vencedora absoluta. Eu acho que o Finalterm é um ótimo projeto. Infelizmente, ainda é um pouco áspero nas bordas. Por exemplo; ainda não suporta copiar e colar. Eu ficaria de olho nesse projeto, porque, quando amadurecer, acho que será um ótimo aplicativo de terminal. Quanto às outras respostas; eles sugeriram a criação de um alias, que não é o que eu quero fazer, porque cria trabalho extra em vez de tirar o trabalho, ou usar Ctrl + R, que é brilhante (eu não sabia disso!). Algumas pessoas sugeriram usar Ctrl + R, então não posso destacar uma resposta sobre a outra.

Então, por enquanto, definitivamente estou usando Ctrl + R e, no futuro, devo usar o Finalterm.

Obrigado por todas as ótimas respostas pessoal!

kramer65
fonte
2
Você realmente deveria tentar zsh. Oferece tudo o que você está pedindo e muito mais. Movendo-se do bash para o zsh
Basharat Sialvi
De acordo com a página do manual do BASH, a função também está presente no BASH como "histórico completo dinâmico". Por padrão, ele é vinculado ao Alt + Tab, tornando-o inútil, mas é possível alterar a ligação com "bind".
Boris Bukh
11
@BasharatSial o que especificamente o zsh faz para ajudar nisso?
poolieby

Respostas:

16

Se os comandos são frequentemente usados, eles são gravados no histórico de comandos que o bash rastreia .bash_history.

Agora o truque: você pode reverter a pesquisa neste histórico para executar novamente os comandos pressionando CTRL-r .

No modo de pesquisa inversa do histórico, o bash mostra, ao vivo, enquanto você digita , o comando mais recente do histórico que começa com a entrada especificada. Em seguida, pressione enter para aceitar e executar o comando proposto. Continue pressionando CTRL-R para alternar para comandos mais antigos com o mesmo prefixo.

Isso está embutido no bash, não há necessidade de personalizar scripts ou instalar software :) É um dos recursos mais úteis do bash, imho.

catchmeifyoutry
fonte
3
Use [ CTRL-g ] para escapar do modo de pesquisa de histórico, se não estiver executando um comando (como se você não encontrou o que precisava).
MountainX-for-Monica
8

Cole (Ctrl-Shift-V) o seguinte em uma tela do terminal:

echo '"\e[A": history-search-backward' > ~/.inputrc
echo '"\e[B": history-search-forward' >> ~/.inputrc
echo 'set show-all-if-ambiguous on' >> ~/.inputrc
echo 'set completion-ignore-case on' >> ~/.inputrc

Saia (Ctrl-D) da tela do terminal e abra o Terminal novamente.

Agora você pode apenas digitar o primeiro par de caracteres e pressionar Cima ou Baixo para rolar pela lista filtrada

Scott May
fonte
3
Esta é a resposta mais simples que faz o trabalho!
cxrodgers
8

Termo Final

Existe um termo final muito promissor chamado App Terminal . Entre seus muitos recursos, ele também possui um histórico de comandos de lembrete, para que você possa selecioná-lo. Aqui estão mais alguns recursos:

Termo Final

Você pode ler mais sobre isso neste artigo .

Aqui está o site dos criadores. http://finalterm.org/

Para instalá-lo

sudo add-apt-repository ppa:versable/finalterm-daily
sudo apt-get update
sudo apt-get install finalterm

Atenção

Eu disse que é promissor. O único problema é que está na versão 0.1. Então, algumas coisas gostam vime nanoainda não funcionam bem. Também notei que ele ainda não suporta Drag-and-Drop e copia e cola. Mas tem o recurso que você solicita. À medida que o software amadurece, ele se tornará um dos melhores terminais para o desktop.

Captura de tela

Aqui está a função em ação:

 função em ação

Espero que isto ajude.

* Estou no Saucy, e é por isso que tenho experiência com salamandras :)

Max Tither
fonte
Obrigado pela dica! Eu verifiquei finalterm e parece bom. Infelizmente, ainda não parece suportar copiar e colar. Tentei Ctrl + V, Ctrl + Shift + V e clique com o botão direito do mouse, mas nenhum deles parece funcionar. Então, eu vou manter isso em mente para o futuro!
kramer65
Essa é a maior desvantagem que eu vi. No entanto, o projeto é jovem e, portanto, espero que isso seja adicionado em breve. Posso ver um aplicativo de terminal sem suporte de copiar e colar.
Max Tither
7

Use um aliaspara todo o seu comando ou adicione o diretório ao seu $PATH. Além disso, você não precisa alterar os diretórios para onde o executável (ou script, ou o que for) deve executá-lo, por isso é bastante simples. Ambos os métodos exigem que você reinicie o terminal que está usando antes que as alterações entrem em vigor.

Veja como criar um bash aliaspara o seu exemplo (adicione a seguinte linha ao seu ~/.bashrcarquivo):

alias runmyproject='an/extremely/long/path/in/which/I/have/some/kinda/project/runmyproject --with some --command line --options set'

Dessa forma, tudo que você precisa fazer é runmyprojectentrar no terminal onde quer que esteja, sem precisar especificar opções / argumentos.

Como alternativa, você pode adicionar o caminho do projeto à sua $PATHvariável de ambiente. Para fazer isso, adicione as seguintes linhas no seu ~/.bashrcarquivo:

PATH=an/extremely/long/path/in/which/I/have/some/kinda/project:$PATH
export PATH

Nesse caso, você ainda precisará especificar suas opções / argumentos para o seu executável ao executá-lo.

oaskamay
fonte
11
A questão é que eu gostaria que o terminal respondesse ao meu uso. Com isso, tenho que alterar o alias toda vez que começo a trabalhar em novos projetos ou quando altero a estrutura de diretórios do meu projeto. A parte principal da minha pergunta é que quero aprender com o que uso, em vez de dizer o que devo fazer.
kramer65
Ah entendo. Em seguida, a resposta mais bem avaliada atualmente deve funcionar. Ou pelo menos de perto.
oaskamay
4

Quando me vejo frequentemente tendo que mudar para um diretório como este:

cd an/extremely/long/path/in/which/I/have/some/kinda/project

Eu faria isso apenas uma vez:

ln -s an/extremely/long/path/in/which/I/have/some/kinda/project ~/project

E a partir de então, use:

cd ~/pr[tab]

Quando se trata de:

./runmyproject --with some --command line --options set

Eu usaria a pesquisa do histórico do bash. No prompt de comando, pressione Ctrl-R e digite 'runmy'. Voila, todo o comando com todas as opções como ele foi inserido pela última vez está ali para ser reinserido. Se eu não gostasse das opções que usei da última vez e quisesse ver os comandos anteriores, continuaria pressionando Ctrl-R para percorrer todos os comandos anteriores que continham "runmy".

A pesquisa de histórico do Ctrl-R também pode ajudar com o comando 'cd', se você não gostar da idéia do link simbólico. É provável que [Ctrl-R] ​​/ proj traga de volta o último comando que você usou para fazer o cd nesse diretório.

Em vez de adicionar um alias ou alternar para um shell especial, eu sempre prefiro aprender a usar os recursos do bash projetados para ajudar com esse tipo de coisa. Dessa forma, posso usar os mesmos recursos em máquinas remotas ou se precisar sentar no terminal de um colega.

Steven K
fonte
Obrigado por sua sugestão. O problema é que não quero definir outra coisa da qual cuide quando, por exemplo, a pasta do projeto for alterada ou inicio um novo projeto. A questão é que eu gostaria que o terminal respondesse ao meu uso. A parte principal da minha pergunta é que quero aprender com o que uso, em vez de dizer o que devo fazer. Eu realmente gosto da função Ctrl-R. Obrigado por esse!
kramer65
4

pressione control + r no teclado - ele colocará você no modo de histórico reverso e você poderá digitar a parte que conhece e todo o comando será exibido

Existem outras maneiras listadas aqui

http://www.talug.org/events/20030709/cmdline_history.html

Eu tendem a usar o controle R mais embora

exussum
fonte
2

Tente isso ... Isso funciona para todos os comandos do seu arquivo de histórico ... é o mesmo que Ctrl+ R, mas acho que é mais intuitivo :)

  1. editar /etc/inputrc

    sudo vim /etc/inputrc
  2. descomente ou adicione essas duas linhas

    "\e[5~": history-search-backward
    
    "\e[6~": history-search-forward
  3. logout / login


tente escrever algum comando listado no histórico ...

gostar...

ls -lah

escrever

ls

e pressione

Page Upou Page Dnnavegar pelo seu arquivo de histórico em busca de comandos que começam com "ls"

Se você fez tudo certo, deve concluir automaticamente seu comando ...

Wolfy
fonte