13

Bash has the PROMPT_DIRTRIM option, e.g. when I set PROMPT_DIRTRIM=3, then a long path like:

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

would show instead as:

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

Does a similar option exist for zsh?

17

To get a similar effect bash, that is including the ..., try:

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

This checks, if the path is at least 4 elements long (%(4~|true|false)) and, if true, prints some dots with the last 3 elements (.../%3~), otherwise the full path is printed %~.


I noticed that bash seems to shorten paths in the home directory differently, for example:

~/.../some/long/path

For a similar effect, you may want to use:

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

This checks, whether the path is longer then 5 elements, and in that case prints the first element (%-1~), some dots (/…/) and the last 3 elements. It is not exactly the same as paths, that are not in your home directory, will also have the first element at the beginning, while bash just prints dots in that case. So

/this/…/some/silly/path

instead of

.../some/silly/path

But this might not necessarily a bad thing.

  • I like the first version better, but note that it shows ~/a/b as .../a/b instead of ~/a/b. To fix that, you can use %(5~|…/%3~|%~). – momar Apr 22 '16 at 11:17
  • For those new to zsh (like me), you want to use this syntax with the PROMPT environment variable in your .zprofile, e.g.: EXPORT PROMPT="%(5~|%-1~/…/%3~|%4~)" – Ryan H. Jun 6 at 14:28
  • 1
    @RyanH. Thanks, reading my answer again I notice, that I never mentioned, where these settings need to be made. I will have to fix that. Two small things about your comment: settings for interactive shell sessions should be made in .zshrc and there is really no need to export any shell internal parameters like PROMPT. – Adaephon Jun 6 at 14:38
  • @Adaephon Thanks for the info. I will fix! :) – Ryan H. Jun 6 at 14:47
7

In addition to the other answers given here, you can also use %< to truncate the path to a given number of characters. I find this preferable to using %<n>d, since individual path elements may obviously be quite long in themselves. Using %< yields a far more predictable maximum prompt length.

For example, to left-truncate the path element with tilde expansion (%~) to 15 characters, replacing removed characters with .., you can do something like this:

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

This is documented in the Zsh manual under Prompt Expansion, right at the end of the page.

3

You can use %3d prompt expansion:

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

The general form is %d, if any positive integer follow d specifies the trailing components to show of current path, zero mean show the whole path, negative integer means the leading path to show:

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

See http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html or man 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 ‘~’.

So to get something similar to PROMPT_DIRTRIM=3, you could use %3d or %3~, e.g.

% mkdir -p ~/a/b/c/d
% cd ~/a/b/c/d
% PS1='%n@%m: %3d%% '
user@computer: b/c/d% 
  • This won't show the "..." like in bash, though. – Elronnd Apr 1 '16 at 4:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.