Dans un système avec Ubuntu 14.04 et bash
, j'ai la PS1
variable se terminant par le contenu suivant:
\u@\h:\w\$
afin que l'invite apparaisse comme
user@machinename:/home/mydirectory$
Parfois, cependant, le répertoire actuel a un nom long, ou il se trouve dans des répertoires avec des noms longs, de sorte que l'invite ressemble à
user@machinename:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name$
Cela remplira la ligne dans le terminal et le curseur ira sur une autre ligne, ce qui est ennuyeux.
J'aimerais plutôt obtenir quelque chose comme
user@machinename:/home/mydirectory1/...another_long_name$
Existe-t-il un moyen de définir la PS1
variable pour "envelopper" et "compacter" le nom du répertoire, pour ne jamais dépasser un certain nombre de caractères, en obtenant une invite plus courte?
Réponses:
Tout d'abord, vous voudrez peut-être simplement changer le
\w
avec\W
. De cette façon, seul le nom du répertoire courant est imprimé et non son chemin complet:Cela pourrait ne pas être suffisant si le nom du répertoire lui-même est trop long. Dans ce cas, vous pouvez utiliser la
PROMPT_COMMAND
variable pour cela. Il s'agit d'une variable bash spéciale dont la valeur est exécutée sous forme de commande avant que chaque invite ne soit affichée. Donc, si vous définissez cela sur une fonction qui définit l'invite souhaitée en fonction de la longueur du chemin de votre répertoire actuel, vous pouvez obtenir l'effet que vous recherchez. Par exemple, ajoutez ces lignes à votre~/.bashrc
:L'effet ressemble à ceci:
la source
Ajouter un retour de personnage est ma principale solution à cela
Donc mon invite (qui a aussi d'autres choses, ce qui la rend encore plus longue) ressemble à ceci:
Vous remarquerez que le $ est retourné en tant que nouvelle ligne
J'y parviens avec
Notez que, même si sur une ligne distincte, des arborescences de répertoires très longues telles que
/home/durrantm/Dropbox/96_2013_archive/work/code/ruby__rails
sont raccourcis àc'est-à-dire "les 3 principaux répertoires / _ / les deux derniers répertoires", ce qui m'intéresse généralement
Cela garantira que la ligne ne sera jamais trop longue en raison de la longueur de l'arborescence des répertoires. Si vous voulez toujours l'arborescence complète des répertoires, ajustez simplement LOCATION, c.-à-d.
la source
$
? (Voir ceci .)~ / .Bash_prompt créé:
Ajouté dans mon ~ / .bash_profile:
La sortie est:
la source
Ce n'est pas une solution pour raccourcir les longs chemins, mais un moyen pratique d'obtenir une meilleure vue d'ensemble tout en gardant toutes les informations sur les chemins visibles, consiste à ajouter une nouvelle ligne avant le dernier caractère. De cette façon, le curseur démarre toujours dans la même colonne, même si le chemin est assez long pour passer, mais la ou les fenêtres de votre console doivent être suffisamment hautes pour ne pas faire défiler les lignes précédentes trop rapidement. J'ai supprimé les codes couleurs pour plus de clarté:
la source
J'utilise cela, il s'enroule sur plusieurs lignes et indentations par la longueur de
user@host
sorte qu'il suppose que le courantPS1
est effectivement '\u@\h:\w$
'. Il ne tronque pas le chemin et s'adapte à la largeur de terminal actuelle. Il ne fait que diviser le chemin/
, donc il ne traite pas avec élégance les très longs répertoires (mais il conserve des espaces pour la sélection / copie). Il s'assure que vous avez toujours au moins un espace de 20 caractères disponibles pour la saisie.Cela fonctionne en retirant la magie
\w
(correspond uniquement\w$
à cela)PS1
et en la remplaçant$PWD
, puis en l'enveloppant comme une simple chaîne de caractères. Il recalcule àPS1
chaque fois à partir de la valeur d'origine qui est enregistrée_PS1
, cela signifie que les échappements "invisibles" sont également préservés, ma chaîne d'invite d'origine complètexterm
et l'invite en gras:Et le résultat final dans un terminal de 80 colonnes:
Cela fonctionne à partir de bash-3.2 tel qu'il
printf -v var
est utilisé. En raison de diverses complexités, il faudra un certain ajustement pour d'autres variations dePS1
.(Le chemin dans la barre de titre xterm n'est ni encapsulé ni abrégé, ce qui pourrait être fait en incorporant l'une des autres réponses ici dans la fonction ci-dessus.)
la source
Comme alternative, dans mon .zshrc j'abrège la première lettre de chaque répertoire si la largeur de pixel est supérieure à une certaine largeur:
devient:
Voici la fonction zsh pour le faire:
En fait, je l'utilise pour mettre à jour le titre du terminal afin qu'avec plusieurs onglets, je puisse garder directement quel onglet est lequel. Le fichier .zshrc complet pour ce faire est ici .
C'est très pratique car il garde le contexte et en zsh vous permet de tabuler rapidement un répertoire dans le même format. (par exemple, la saisie se
cd /h/m/s/<tab>
terminera automatiquementcd /home/mydirectory1/second_directory
)la source
Essayez d'utiliser ce script Python . Il coupe les sections individuelles du nom du chemin, exactement comme vous le vouliez dans votre question. Il utilise également les points de suspension unicode qui occupent une seule colonne au lieu de trois.
Exemple de sortie pour votre chemin (quand on lui donne une limite de 30 caractères):
Il convient de noter que cette solution gère correctement Unicode dans les noms de répertoire à l'aide de
wcswidth
.${#PWD}
, que d'autres réponses ont utilisé, va mal évaluer la largeur visuelle de tout chemin contenant des caractères UTF-8.la source