Completamento automatico per i comandi della riga di comando utilizzati spesso?


15

Per alcuni progetti scrivo spesso un paio di comandi, come ad esempio:

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

e

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

Vedendo che sono abbastanza pigro, cerco di evitare di digitare quei comandi ancora e ancora. Quindi, naturalmente, posso usare molto il tasto su per ritrovare quei comandi, ma spesso ho anche tanti comandi in mezzo, che la ricerca richiede ancora più tempo rispetto alla semplice digitazione.

Ora mi chiedo se esiste un qualche tipo di utilità che può suggerire un comando completo che uso molto, quando non l'ho ancora digitato tutto. Per esempio, posso digitare "cd an /" e questo suggerisce già il resto del percorso perché l'ho usato così tanto il mese scorso.

Ho trovato qualcosa chiamato Bash Smart Complete. Ma questo è un po '"stupido" in quanto non osserva i comandi che ho usato prima. Ho appena trovato anche questa risposta SO , che suggerisce di inserire molti comandi in un file. Ciò, tuttavia, non è abbastanza reattivo in quanto avrei bisogno di creare un nuovo file per esso ogni volta che avvio nuovi progetti o cambio cartelle o argomenti di programma.

Qualcuno conosce qualche altra utilità o altro modo per raggiungere questo obiettivo? Oppure, qualcuno saprebbe come potrei modificare il Bash Smart Complete in modo che possa guardare i comandi che ho usato per dire il mese scorso e completare il comando che si adatta e che è stato usato di più nell'ultimo mese?

[EDIT] Di seguito sono riportate alcune risposte davvero fantastiche. Non ho ancora indicato una risposta definita. Non perché non mi piacciano le risposte, ma perché nessuno di loro è un vincitore assoluto. Penso che Finalterm sia un grande progetto. Purtroppo è ancora piuttosto ruvido attorno ai bordi. Per esempio; non supporta ancora copia-incolla. Vorrei tenere d'occhio quel progetto, perché quando sarà maturo penso che sarà un'ottima app terminale. Per quanto riguarda le altre risposte; o hanno suggerito di creare un alias, che non è quello che voglio fare perché crea lavoro extra invece di toglierlo o di usare Ctrl + R, il che è geniale (non lo sapevo!). Un paio di persone hanno suggerito di usare Ctrl + R, quindi non posso davvero evidenziare una risposta sull'altra.

Quindi per ora sto sicuramente usando Ctrl + R, e in futuro potrei usare Finalterm.

Grazie per tutte le ottime risposte ragazzi!


2
Dovresti davvero provare zsh. Offre tutto ciò che stai chiedendo e molto altro. Passando da bash a zsh
Basharat Sialvi il

Secondo la pagina man di BASH, la funzione è presente anche in BASH come "dinamica-storia completa". Di default è legato ad Alt + Tab che lo rende inutile, ma si può cambiare l'associazione con "bind".
Boris Bukh,

1
@BasharatSial che cosa fa specificamente zsh per aiutarlo?
poolie,

Risposte:


16

Se i comandi vengono spesso utilizzati, vengono registrati nella cronologia dei comandi bash tracce .bash_history.

Ora il trucco: è possibile invertire la ricerca in questa cronologia per rieseguire i comandi premendo CTRL-r .

Nella modalità di ricerca della cronologia inversa, bash mostra, mentre digiti , il comando più recente nella cronologia che inizia con il tuo dato input. Quindi premere Invio per accettare ed eseguire il comando proposto. Continuare a premere CTRL-R per passare ai comandi più vecchi con lo stesso prefisso.

Questo è integrato in bash, non è necessario personalizzare gli script o installare il software :) È una delle funzionalità più utili di bash, imho.


3
Usa [ CTRL-g ] per uscire dalla modalità di ricerca della cronologia, se non esegui un comando (come se non avessi trovato quello che ti serviva).
MountainX-for-Monica,

8

Incolla (Ctrl-Shift-V) quanto segue in una schermata del terminale:

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

Esci (Ctrl-D) dalla schermata del terminale, quindi apri di nuovo Terminale.

Ora puoi semplicemente digitare il primo paio di caratteri, quindi premere Su o Giù per scorrere l'elenco filtrato


3
Questa è la risposta più semplice per completare il lavoro!
cxrodgers,

8

Termine finale

Esiste questa promettente Terminale chiamata termine finale molto promettente . Tra le sue numerose funzionalità, ha anche una cronologia di comandi di remebering, in modo da poterlo selezionare. Ecco alcune altre funzionalità:

Termine finale

Puoi leggere di più al riguardo in questo articolo .

Ecco il sito web dei creatori. http://finalterm.org/

Per installarlo

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

avvertimento

Ho detto che è promettente. L'unico problema è che è alla versione 0.1. Quindi alcune cose piace vime nanonon funzionano ancora bene. Ho anche notato che non supporta ancora Drag-and-Drop e copia e incolla. Ma ha la funzione richiesta. Man mano che il software matura, diventerà uno dei migliori terminali per il desktop.

Immagine dello schermo

Ecco la funzione in azione:

 funzione in azione

Spero che sia di aiuto.

* Sono su Saucy, quindi è per questo che ho uno sfondo di Salamander :)


Grazie per il consiglio! Ho controllato finalterm e sembra buono. Sfortunatamente non sembra ancora supportare il copia-incolla. Ho provato Ctrl + V, Ctrl + Maiusc + V e facendo clic con il tasto destro, ma nessuno di questi sembra funzionare. Quindi terrò a mente questo per il futuro!
kramer65,

Questo è il più grande svantaggio che ho visto. Tuttavia, il progetto è giovane, e quindi spero che questo verrà aggiunto presto. Riesco a vedere un'app terminale senza supporto copia-incolla.
Max Tither,

7

Utilizzare un aliasper l'intero comando o aggiungere la directory nel proprio $PATH. Inoltre, non è necessario modificare le directory in cui è eseguibile il tuo eseguibile (o script o altro), quindi è abbastanza semplice. Entrambi i metodi richiedono il riavvio del terminale in uso prima che le modifiche abbiano effetto.

Ecco come creare un bash aliasesempio (aggiungi la seguente riga al tuo ~/.bashrcfile):

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

In questo modo, tutto ciò che devi fare è inserire runmyprojectnel terminale ovunque tu sia, senza dover specificare opzioni / argomenti.

In alternativa, è possibile aggiungere il percorso del progetto nella $PATHvariabile di ambiente. Per fare ciò, aggiungi le seguenti righe nel tuo ~/.bashrcfile:

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

In questo caso dovrai comunque specificare le opzioni / gli argomenti per il tuo eseguibile quando lo esegui.


1
Il fatto è che vorrei che il terminale rispondesse al mio uso. Con questo devo cambiare l'alias ogni volta che inizio a lavorare su nuovi progetti o quando cambio la struttura delle directory del mio progetto. La parte principale della mia domanda è che voglio che impari da ciò che uso, invece di dirgli cosa devo fare.
kramer65,

Ah capisco Quindi la risposta attualmente più votata dovrebbe fare il trucco. O almeno da vicino.
Oaskamay,

4

Quando mi trovo spesso a dover passare a una directory come questa:

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

Lo farei solo una volta:

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

E da quel momento in poi usa:

cd ~/pr[tab]

Quando si tratta di:

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

Vorrei usare la ricerca della cronologia di Bash. Al prompt dei comandi basta premere Ctrl-R e digitare 'runmy'. Voila, l'intero comando con tutte le opzioni come è stato inserito l'ultima volta è proprio lì per essere reinserito. Se non mi piacessero le opzioni che ho usato l'ultima volta e volessi guardare i comandi precedenti, continuerei a premere Ctrl-R per scorrere tutti i comandi precedenti che contenevano "runmy".

La ricerca della cronologia Ctrl-R potrebbe aiutare anche con il comando 'cd', se non ti piace l'idea del collegamento simbolico. È molto probabile che [Ctrl-R] ​​/ proj riporti l'ultimo comando usato per cd in quella directory.

Piuttosto che aggiungere un alias o passare a una shell speciale, preferisco sempre imparare a usare le funzionalità bash progettate per aiutare in questo genere di cose. In questo modo posso utilizzare le stesse funzionalità su macchine remote o se devo sedermi al terminale di un collega.


Grazie per il tuo suggerimento Il fatto è che non voglio impostare un'altra cosa di cui mi occupo quando, ad esempio, la cartella del progetto cambia o inizio un nuovo progetto. Il fatto è che vorrei che il terminale rispondesse al mio uso. La parte principale della mia domanda è che voglio che impari da ciò che uso, invece di dirgli cosa devo fare. Mi piace molto la funzione Ctrl-R però. Grazie per quello!
kramer65,


2

Prova questo ... Funziona con tutti i comandi nel tuo file di cronologia ... è la stessa cosa di Ctrl+ R, ma penso che sia più intuitivo :)

  1. modificare /etc/inputrc

    sudo vim /etc/inputrc
  2. decommentare o aggiungere queste due righe

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


quindi prova a scrivere alcuni comandi elencati nella cronologia ...

piace...

ls -lah

Scrivi

ls

e premere

Page Upo Page Dnper navigare attraverso il file della cronologia alla ricerca di comandi che iniziano con "ls"

Se hai fatto tutto nel modo giusto, dovrebbe completare automaticamente il tuo comando ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.