Répertoire courant abrégé dans l'invite du shell?

23

vim a une fonctionnalité vraiment sympa qu'il utilise dans ses chemins quand ils sont un peu longs:

entrez la description de l'image ici

Il abrège le chemin d'accès au document dans l'onglet en haut. Existe-t-il un moyen de faire quelque chose de similaire à cela, donc mon invite bash ne ressemble pas à ceci:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 
Naftuli Kay
la source
2
Alors, qu'est-ce que tu veux rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? Idéalement, en utilisant un certain seuil pour la longueur maximale d'invite?
nicerobot
C'est exactement ce que je recherche.
Naftuli Kay
D'accord, j'ai fourni ma réponse.
nicerobot

Réponses:

14

Essayez ceci :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

ou, bash pur:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

puis

PS1='\u@\h ${PS1X} $ '

produit (notez le ~pour ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

J'ai amélioré ma réponse grâce à @ enzotib

nicerobot
la source
1
Pouvez-vous donner un exemple de ce à quoi cela ressemblerait en tant qu'invite pour la postérité?
Naftuli Kay
(0) Votre lien github est rompu. (1) Vous voudrez peut-être regarder de plus près le $PWD~test. Actuellement, si HOMEest /home/edet PWDest /home/edwina, vous obtenez ~winadans la version Perl et ~/inadans la version shell. (2) Votre code shell s'étouffe si le répertoire en cours contient des caractères génériques (c'est-à-dire une extension de nom de chemin); par exemple, PWD= /abc/*/def. Vous pouvez résoudre ce problème en ajoutant set -o noglobou set -f. … (Suite)
G-Man dit «Réintègre Monica» le
(Suite)… (3) Vous n'avez pas besoin de presque autant d'appareils orthodontiques. Dans la commande Perl, $HOME(qui se trouve entre guillemets doubles) et $PWDsont assez bons. Dans la commande shell, les trois dernières références variables shell sont très bien, mais les trois premiers peuvent être "${PWD#$HOME}", "$PWD"et "$p". (4) Voir aussi la réponse de mbentley et mes commentaires à ce sujet.
G-Man dit `` Réintègre Monica '' le
15

Similaire à la réponse @nicerobot, mais un peu plus court:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

Cela montrera l'exemple de sortie suivant:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$
enzotib
la source
13

J'aime PROMPT_DIRTRIMbash ...

export PROMPT_DIRTRIM=2

changera votre exemple d'invite en ...

rfkrocktk@work-laptop ../com/tkassembled/ $

Ça marche pour moi.

BentFX
la source
Ne fait pas ce qu'il a demandé mais merci de m'avoir informé de la fonctionnalité.
nicerobot
3
@nicerobot Oui, vous aviez la vraie réponse. :) Je sais que cela ne donne pas l'abréviation qu'il demandait, mais souvent lorsque nous voyons des options simples, nos attentes changent. De plus, il est standard, et en tant que tel, je pensais qu'il méritait une mention.
BentFX
1
Je pense que l'une des fonctions de SE est non seulement de fournir la réponse parfaite à la question, mais également de fournir d'autres options au PO et à ceux qui trouvent la question par la recherche. Remarquez le contexte de réponse que j'ai fourni "J'aime ... ça marche pour moi". Certains croient encore qu'il mérite un vote à la baisse.
BentFX
J'ai tendance à voir les réponses descendre votèrent qui ne répondent pas directement à la question , mais je suis d' accord avec vous offrant des solutions de rechange peuvent être une réponse valide ou réponse .
nicerobot
La réponse de BentFX ne répond pas à la question de l'OP dans son ensemble mais exactement au sujet Répertoire courant abrégé dans l'invite du shell? ce qui est probablement pour la plupart des visiteurs de ce sujet ce qu'ils recherchent.
TNT
4

Pour compléter la réponse d' Enzotib , l'extrait suivant:

  1. Convertir /Path/To/Your/Home/en ~/(donc un chemin sera ~/a/b/cau lieu de /P/T/Y/H/a/b/c)
  2. Utilisez la première lettre d'un «fichier de points» au lieu d'afficher uniquement le point ( /a/./c/ddeviendra /a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

Assurez-vous d'utiliser des guillemets simples ou bash le développera prématurément.

renlo
la source
3

Le format à utiliser dans votre PS1est \W(voir la PROMPTINGsection dans la bashpage de manuel).

PS1="\u@\h \W\$ "

Et vous voudrez peut-être lire les autres options là-bas, vous pouvez faire des trucs sympas avec votre ligne de commande.

Kevin
la source
2
Je pense que \ W ne fait pas du tout ce qu'il demande.
nicerobot
1
@nicerobot Il ne donne pas la première initiale de chaque composant du chemin, mais il donne le répertoire de travail actuel de manière plus courte. Je suis presque sûr qu'il n'est pas possible d'abréger le répertoire de cette manière sans utiliser un script plutôt laid exécuté à chaque invite. Nous verrons ce qu'il a à dire à ce sujet.
Kevin
1

J'adore la sortie de l'exemple de nicerobot mais j'ai trouvé un problème. J'ai un répertoire qui contient un trait d'union A-E, et c'était -Ecomme un argument pour printfquand c'était mon répertoire de travail actuel. Pour résoudre ce problème, j'ai ajouté --au dernier printfet ajouté des guillemets autour de la sortie au cas où il n'y aurait rien à produire:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"
mbentley
la source
(1) Bonne prise sur la question du nom de répertoire contenant -comme deuxième caractère. S'il est vrai que --c'est la solution générale au problème des arguments en commençant par -, une meilleure méthode printfest de dire printf "%s" "${q:1}", car cela protège également contre les arguments contenant %. (Par exemple, essayez PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def. (2) Voir aussi mes commentaires sur la réponse de nicerobot.
G-Man dit 'Reinstate Monica'