Saisie automatique pour les commandes de ligne de commande souvent utilisées?

15

Pour certains projets, je tape souvent quelques commandes, comme par exemple:

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

et

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

Voyant que je suis assez paresseux, j'essaie d'éviter de taper ces commandes en entier encore et encore. Je peux donc bien sûr beaucoup utiliser la touche Haut pour retrouver ces commandes, mais souvent, j'ai aussi tellement de commandes entre les deux, que la recherche prend encore plus de temps que la simple saisie.

Je me demande maintenant s'il existe une sorte d'utilitaire qui peut suggérer une commande complète que j'utilise beaucoup, alors que je ne l'ai pas encore entièrement tapée. Pour que je puisse par exemple taper 'cd an /' et qu'il suggère déjà le reste du chemin car je l'ai tellement utilisé le mois dernier.

J'ai trouvé quelque chose appelé Bash Smart Complete. Mais c'est un peu "stupide" en ce qu'il ne regarde pas les commandes que j'ai utilisées auparavant. Je viens également de trouver cette réponse SO , qui suggère de mettre les commandes que j'utilise beaucoup dans un fichier. Cependant, cela ne répond pas suffisamment en ce que je devrais créer un nouveau fichier pour chaque fois que je démarre de nouveaux projets ou que je change de dossier ou d'argument de programme.

Quelqu'un connaît-il un autre utilitaire ou un autre moyen d'y parvenir? Ou, quelqu'un pourrait-il savoir comment je pourrais modifier le Bash Smart Complete afin qu'il puisse regarder les commandes que j'ai utilisées au cours du dernier mois et terminer la commande qui correspond et qui a été le plus utilisée au cours du mois dernier?

[MODIFIER] Voici quelques réponses vraiment intéressantes. Je n'ai encore marqué aucune réponse définitive. Non pas parce que je n'aime pas les réponses, j'aime bien, mais parce qu'aucun d'eux n'est un gagnant absolu. Je pense que le Finalterm est un excellent projet. Malheureusement, il est encore assez rugueux sur les bords. Par exemple; il ne prend pas encore en charge le copier-coller. Cependant, je garderais un œil sur ce projet, car quand il arrivera à maturité, je pense que ce sera une excellente application de terminal. Quant aux autres réponses; soit ils ont suggéré de créer un alias, ce qui n'est pas ce que je veux faire car cela crée du travail supplémentaire au lieu de le supprimer, ou d'utiliser Ctrl + R, ce qui est génial (je ne le savais pas!). Quelques personnes ont suggéré d'utiliser Ctrl + R, donc je ne peux pas vraiment mettre une réponse en surbrillance.

Donc, pour l'instant, j'utilise définitivement Ctrl + R, et à l'avenir, je pourrais utiliser Finalterm.

Merci pour toutes les bonnes réponses les gars!

kramer65
la source
2
Tu devrais vraiment essayer zsh. Il offre tout ce que vous demandez et bien plus encore. Passer de bash à zsh
Basharat Sialvi
Selon la page de manuel de BASH, la fonction est également présente dans BASH en tant qu '«historique complet dynamique». Par défaut, il est lié à Alt + Tab, ce qui le rend inutile, mais on peut changer la liaison avec "bind".
Boris Bukh
1
@BasharatSial que fait spécifiquement zsh pour vous aider?
poolie

Réponses:

16

Si les commandes sont souvent utilisées, elles sont enregistrées dans les pistes bash de l'historique des commandes dans .bash_history.

Maintenant, l'astuce: vous pouvez inverser la recherche dans cet historique pour réexécuter les commandes en appuyant sur CTRL-r .

En mode de recherche d'historique inverse, bash affiche en direct, au fur et à mesure de la frappe , la commande la plus récente de l'historique qui commence par votre entrée donnée. Appuyez ensuite sur Entrée pour accepter et exécuter la commande proposée. Continuez à appuyer sur CTRL-R pour passer aux anciennes commandes avec le même préfixe.

C'est intégré dans bash, pas besoin de personnaliser les scripts ou d'installer le logiciel :) C'est l'une des fonctionnalités les plus utiles de bash, à mon humble avis.

catchmeifyoutry
la source
3
Utilisez [ CTRL-g ] pour sortir du mode de recherche d'historique, si vous n'exécutez pas une commande (comme si vous n'avez pas trouvé celle dont vous aviez besoin).
MountainX-for-Monica
8

Collez (Ctrl-Maj-V) ce qui suit dans un écran de 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

Quittez (Ctrl-D) l'écran du terminal, puis ouvrez à nouveau le terminal.

Maintenant, vous pouvez simplement taper les deux premiers caractères, puis appuyez sur Haut ou Bas pour faire défiler la liste filtrée

Scott May
la source
3
C'est la réponse la plus simple qui fait le travail!
cxrodgers
8

Durée finale

Il y a cette très prometteuse App terminal appelé terme final . Parmi ses nombreuses fonctionnalités, il a également un historique de commandes de remémoration, afin que vous puissiez ensuite le sélectionner. Voici quelques fonctionnalités supplémentaires:

Durée finale

Vous pouvez en savoir plus à ce sujet dans cet article .

Voici le site des créateurs. http://finalterm.org/

Pour l'installer

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

avertissement

J'ai dit que c'était prometteur. Le seul problème est qu'il s'agit de la version 0.1. Donc, certaines choses aiment vimet nanone fonctionnent pas encore bien. J'ai également remarqué qu'il ne prend pas encore en charge le glisser-déposer et le copier-coller. Mais il a la fonctionnalité que vous demandez. À mesure que le logiciel évolue, il deviendra l'un des meilleurs terminaux pour le bureau.

Capture d'écran

Voici la fonction en action:

 fonction en action

J'espère que cela t'aides.

* Je suis sur Saucy, c'est pourquoi j'ai une formation en salamandre :)

Max Tither
la source
Merci pour le conseil! J'ai vérifié finalterm et ça a l'air bien. Malheureusement, il ne semble pas encore prendre en charge le copier-coller. J'ai essayé Ctrl + V, Ctrl + Shift + V et un clic droit, mais aucun de ceux-ci ne semble fonctionner. Je vais donc garder celui-ci à l'esprit pour l'avenir!
kramer65
C'est le plus gros inconvénient que j'ai vu. Cependant, le projet est jeune, et j'espère donc que cela sera ajouté bientôt. Je peux voir une application de terminal sans prise en charge du copier-coller.
Max Tither
7

Utilisez un aliaspour l'ensemble de votre commande ou ajoutez le répertoire dans votre $PATH. De plus, vous n'avez pas besoin de changer les répertoires à l'endroit où votre exécutable (ou script, ou autre) doit être exécuté, c'est donc assez simple. Les deux méthodes nécessitent que vous redémarriez le terminal que vous utilisez avant que les modifications prennent effet.

Voici comment créer un bash aliaspour votre exemple (ajoutez la ligne suivante à votre ~/.bashrcfichier):

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

De cette façon, tout ce que vous devez faire est d'entrer runmyprojectdans le terminal où que vous soyez, sans avoir à spécifier d'options / arguments.

Vous pouvez également ajouter votre chemin de projet dans votre $PATHvariable d'environnement. Pour ce faire, ajoutez les lignes suivantes dans votre ~/.bashrcfichier:

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

Dans ce cas, vous devrez toujours spécifier vos options / arguments pour votre exécutable lors de son exécution.

oaskamay
la source
1
Le fait est que je voudrais que le terminal soit sensible à mon utilisation. Avec cela, je dois changer l'alias chaque fois que je commence à travailler sur de nouveaux projets ou lorsque je change la structure de répertoire de mon projet. La partie principale de ma question est que je veux qu'il apprenne de ce que j'utilise, au lieu de lui dire quoi faire.
kramer65
Ah, je vois. Ensuite, la réponse actuellement la mieux notée devrait faire l'affaire. Ou du moins de près.
oaskamay
4

Lorsque je me retrouve fréquemment à devoir passer à un répertoire comme celui-ci:

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

Je ferais juste ça une fois:

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

Et à partir de là, utilisez:

cd ~/pr[tab]

Quand cela vient à:

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

J'utiliserais la recherche d'historique bash. À l'invite de commande, appuyez simplement sur Ctrl-R et tapez «runmy». Voila, toute la commande avec toutes les options telles qu'elle a été entrée pour la dernière fois est là pour être rentrée. Si je n'aimais pas les options que j'ai utilisées la dernière fois et que je voulais regarder les commandes précédentes, je continuerais d'appuyer sur Ctrl-R pour parcourir toutes les commandes précédentes qui contenaient "runmy".

La recherche d'historique Ctrl-R pourrait également aider avec la commande 'cd', si vous n'aimez pas l'idée du lien symbolique. [Ctrl-R] ​​/ proj est très susceptible de ramener la dernière commande que vous avez utilisée pour cd dans ce répertoire.

Plutôt que d'ajouter un alias ou de passer à un shell spécial, je préfère toujours apprendre à utiliser les fonctionnalités bash conçues pour aider avec ce genre de choses. De cette façon, je peux utiliser les mêmes fonctionnalités sur des machines distantes ou si je dois m'asseoir sur le terminal d'un collègue.

Steven K
la source
Merci pour votre suggestion. Le fait est que je ne veux pas définir autre chose dont je dois m'occuper lorsque, par exemple, le dossier du projet change ou que je démarre un nouveau projet. Le fait est que je voudrais que le terminal soit sensible à mon utilisation. La partie principale de ma question est que je veux qu'il apprenne de ce que j'utilise, au lieu de lui dire quoi faire. J'aime bien la fonction Ctrl-R. Merci pour celui-là!
kramer65
4

appuyez sur control + r sur votre clavier - cela vous mettra en mode d'historique inversé et vous pouvez taper la partie que vous connaissez et la commande entière affichera

Il existe d'autres moyens répertoriés ici

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

J'ai plutôt tendance à utiliser le contrôle R

exussum
la source
2

Essayez ceci ... Cela fonctionne pour toutes les commandes de votre fichier historique ... c'est la même chose que Ctrl+ R, mais je pense que c'est plus intuitif :)

  1. Éditer /etc/inputrc

    sudo vim /etc/inputrc
  2. décommenter ou ajouter ces deux lignes

    "\e[5~": history-search-backward
    
    "\e[6~": history-search-forward
  3. déconnexion / connexion


puis essayez d'écrire une commande répertoriée dans l'historique ...

comme...

ls -lah

écrire

ls

et appuyez sur

Page Upou Page Dnpour naviguer dans votre fichier d'historique à la recherche de commandes commençant par "ls"

Si vous avez tout fait correctement, il devrait compléter automatiquement votre commande ...

Wolfy
la source