Rechercher une commande précédente avec le même préfixe lorsque j'appuie sur Haut à l'invite du shell

19

Venant d'un monde FreeBSD, je souhaite que le terminal Linux se comporte comme FreeBSD, en particulier la version 9.1, essentiellement lorsque vous tapez cdle terminal et appuyez sur la flèche "vers le haut", vous pouvez parcourir toutes les commandes de l'historique en commençant par cdce qui vous fait gagner beaucoup de temps.

Je ne sais pas comment activer cette fonctionnalité dans Linux Debian ou CentOS, ce qui m'oblige à taper le tout, quelqu'un pourrait-il m'aider.

Abdelilah Benaou
la source
7
C'est une fonction du shell, pas du terminal. Quel shell utilisez-vous dans FreeBSD? Vous pourrez peut-être obtenir le même shell (ou similaire) pour Linux.
cjm
J'utilise le shell tcsh.
Abdelilah Benaou
2
J'utilise tcsh sous OS X et je n'ai pas eu ce comportement pratique ... Après quelques recherches, j'ai trouvé que je pouvais l'activer en mettant bindkey -k (up|down) history-search-(back|for)wardmon .tcshrc comme décrit ici . Cool!
Garrett Albright

Réponses:

34

Ajoutez ce qui suit à ~/.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

Explication

~/.inputrcest le fichier de configuration pour GNU readline . De nombreux shells, y compris bashet tcshutilisent readline pour l'édition en ligne de commande. Les deux lignes ci-dessus indiqueront à readline d'appeler sa fonctionnalité de recherche d'historique lorsque les séquences d'échappement pour la touche flèche vers le haut ( \e[A) et la touche flèche vers le bas ( \e[B) sont rencontrées.

Thomas Nyman
la source
J'aime ajouter F12 pour mettre le dernier mot de la dernière ligne à la fin de la commande en cours. Last wordest souvent un chemin que je veux essayer dans divers clichés obscurs. Et Shift F12 pour me remettre à éditer toute la dernière ligne depuis le début. ~/.inputrcest un outil pratique.
jalanb
Le Shift F12 nécessite le mode vi .
jalanb
6

Ce qui se passe, c'est que FreeBSD et Linux utilisent des shells différents par défaut. FreeBSD utilise par défaut tcsh , qui avait de meilleures fonctionnalités interactives que bash dans le passé (mais bash a rattrapé) mais des fonctionnalités de script nettement pires .

La façon la plus simple d'obtenir l'environnement auquel vous êtes habitué serait de passer votre shell en tcsh sous Linux. À condition que tcsh soit installé à l'échelle du système (si ce n'est pas le cas, demandez à votre administrateur système de l'installer), exécutez chsh -s tcshpour changer votre shell par défaut.

Alternativement, vous pouvez configurer bash pour avoir cette commande à laquelle vous êtes habitué. Par défaut, les flèches Upet Downnaviguent entre toutes les commandes de l'historique, pas seulement celles qui commencent par le préfixe que vous avez tapé. Pour changer cela au comportement auquel vous êtes habitué, placez les lignes suivantes dans le fichier d'initialisation de bash, qui se trouve .bashrcdans votre répertoire personnel. Exécutez . ~/.bashrcou démarrez un nouveau shell pour relire le fichier d'initialisation.

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

Les séquences d'échappement sont ce que votre terminal envoie au shell lorsque vous appuyez sur une touche fléchée. Uppeut être \eOA(évasion, O, A) ou en \e[Afonction de votre terminal, et de même pour Down.

Par défaut, bash propose différentes liaisons de touches pour rechercher l'historique des commandes. Vous pouvez appuyer sur Ctrl+ R, puis saisir quelques caractères pour rechercher une commande contenant cette sous-chaîne n'importe où sur la ligne. Appuyez sur Ctrl+ Spour avancer au lieu de reculer. La recherche est incrémentielle (c.-à-d. Que vous tapez); Alt+ Pet Alt+ Nvous donnent une recherche non incrémentielle.

Au lieu de bash et tcsh, vous pouvez passer à zsh, qui a des fonctionnalités intéressantes que l'on ne trouve pas dans d'autres shells . Zsh a Ctrl+ Ret Ctrl+ Spar défaut, tout comme bash. Pour obtenir Upet Downcomme vous l'avez fait dans tcsh, mettez les lignes suivantes ~/.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

Si vous souhaitez utiliser le même shell partout, vous pouvez également utiliser bash ou zsh sur FreeBSD, à condition que le port soit installé (encore une fois, demandez à votre administrateur système).

Gilles 'SO- arrête d'être méchant'
la source
1

tcshest disponible pour la plupart des distributions Linux. Essayez d'installer le tcshpackage, puis exécutez-le chsh -s /bin/tcshpour en faire votre shell par défaut.

cjm
la source
1
Ou vous pourriez envisager de passer à bash (je l'ai fait).
Keith Thompson
1

D'autres réponses s'y attaquent, mais si vous en voulez plus, jetez un œil à https://github.com/zsh-users/zsh-history-substring-search

Prezto ( https://github.com/sorin-ionescu/prezto ) regorge également de goodies zsh.

Fuad Saud
la source
Merci pour votre réponse, d'ailleurs je ne vois toujours pas quels sont les avantages de zsh sur bash ou tcsh?
Abdelilah Benaou
1
Hum, vous pouvez faire à peu près toutes les choses de base dans tous ces coquilles. J'utilise zsh en raison du bundle prezto assez bien entretenu (probablement le grand changeur de jeu), de la bonne invite (qui est une fonctionnalité exclusive) et parce qu'il se sent plus poli que bash (consiguration et autres).
Fuad Saud du