Raccourcir le chemin dans l'invite zsh

18

Basha l' PROMPT_DIRTRIMoption, par exemple quand je mets PROMPT_DIRTRIM=3, puis un long chemin comme:

user@computer: /this/is/some/silly/path

apparaîtrait à la place comme:

user@computer: .../some/silly/path

Existe-t-il une option similaire pour zsh?

pfnuesel
la source

Réponses:

22

Pour obtenir un effet similaire bash, c'est-à-dire incluant le ..., essayez:

%(4~|.../%3~|%~)

Ceci vérifie si le chemin est long d'au moins 4 éléments ( %(4~|true|false)) et, s'il est vrai, imprime quelques points avec les 3 derniers éléments ( .../%3~), sinon le chemin complet est imprimé %~.


J'ai remarqué que cela bashsemble raccourcir les chemins dans le répertoire personnel différemment, par exemple:

~/.../some/long/path

Pour un effet similaire, vous pouvez utiliser:

%(5~|%-1~/…/%3~|%4~)

Ceci vérifie si le chemin est plus long que 5 éléments et dans ce cas, imprime le premier élément ( %-1~), certains points ( /…/) et les 3 derniers éléments. Ce n'est pas exactement la même chose que les chemins, qui ne sont pas dans votre répertoire personnel, auront également le premier élément au début, alors bashque les points seront imprimés dans ce cas. Donc

/this/…/some/silly/path

au lieu de

.../some/silly/path

Mais ce n'est pas nécessairement une mauvaise chose.

Adaephon
la source
1
J'aime mieux la première version, mais notez qu'elle apparaît ~/a/bcomme .../a/bau lieu de ~/a/b. Pour résoudre ce problème, vous pouvez utiliser %(5~|…/%3~|%~).
momar
Pour ceux qui ne connaissent pas zsh (comme moi), vous souhaitez utiliser cette syntaxe avec la PROMPTvariable d'environnement dans votre .zprofile, par exemple:EXPORT PROMPT="%(5~|%-1~/…/%3~|%4~)"
Ryan H.
1
@RyanH. Merci, en relisant ma réponse, je remarque que je n'ai jamais mentionné où ces réglages doivent être effectués. Je vais devoir arranger ça. Deux petites choses à propos de votre commentaire: les paramètres des sessions shell interactives doivent être définis .zshrcet exportaucun paramètre interne du shell n'est vraiment nécessaire PROMPT.
Adaephon
@Adaephon Merci pour l'info. Je vais réparer! :)
Ryan H.
8

En plus des autres réponses données ici, vous pouvez également utiliser %<pour tronquer le chemin d'accès à un nombre donné de caractères . Je trouve cela préférable à l'utilisation %<n>d, car les éléments de chemin individuels peuvent évidemment être assez longs en eux-mêmes. L'utilisation %<donne une longueur d'invite maximale beaucoup plus prévisible.

Par exemple, pour tronquer à gauche l'élément path avec l'extension tilde ( %~) à 15 caractères, en remplaçant les caractères supprimés par .., vous pouvez faire quelque chose comme ceci:

PROMPT='%n@%m:%15<..<%~%<<%# '

Ceci est documenté dans le manuel Zsh sous Expansion rapide , à la fin de la page.

wjv
la source
4

Vous pouvez utiliser %3d l'expansion rapide :

/home/cuonglm/.config/fish/functions $ PS1='%3d $ '
.config/fish/functions $

La forme générale est la suivante %d: si un entier positif suit dspécifie les composants de fin à afficher du chemin actuel, la moyenne zéro affiche le chemin entier, un entier négatif signifie le chemin principal à afficher:

.config/fish/functions $ PS1='%-2d $ '
/home/cuonglm $
cuonglm
la source
3

Voir http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html ouman zshmisc

%d
%/
Current working directory. If an integer follows the ‘%’, it specifies a number of trailing components of the current working directory to show

%~
As %d and %/, but if the current working directory starts with $HOME, that part is replaced by a ‘~’.

Donc, pour obtenir quelque chose de similaire PROMPT_DIRTRIM=3, vous pouvez utiliser %3dou %3~, par exemple

% mkdir -p ~/a/b/c/d
% cd ~/a/b/c/d
% PS1='%n@%m: %3d%% '
user@computer: b/c/d% 
Mikel
la source
Cela ne montrera pas le "..." comme dans bash, cependant.
Elronnd