Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

In zsh, there is always a space character at the right of my right prompt. I tried with a very simple .zshrc such as:


There is a always a space after the * on the right of the screen.

Here is a screenshot showing the issue (I selected the space on one of the lines).


share|improve this question
up vote 7 down vote accepted


All you need to do is put this in your ~/.zshrc (or in the same file as your prompt theme):



Previous to version 5.0.5 the value now represented by ZLE_RPROMPT_INDENT (called rprompt_off in the source code) was hard-coded as a 1, now it just defaults to 1.

The rationale for this "indent" is because some older terminals would start scrolling if the last cell of the display had a character in it.

For older versions of ZSH

If you're on an older version of ZSH and can't update, you can still get rid of that space by tricking ZSH into thinking your RPROMPT is a character shorter than it actually is and then sending a move-back escape sequence.

Invisible sequence wrapper: %{...%}

Cursor-back escape sequence using terminfo: %{terminfo[cub1]}

Check out the FAQ (update recently) and this post to the mailing list for more info.

share|improve this answer
This also seems to place the input cursor one character to the left of where it would normally be. Using the prompts in this question, for example, the cursor is placed on the hash mark, rather than immediately to its right. (For me, setting the offset to a value less than zero makes the prompts and cursor appear in the correct places. Observed with zsh 5.0.8 and 5.2.) – Rob Kennedy Apr 22 at 19:49
Works for me in 5.2. – Anthony Michael Cook Apr 23 at 0:10

I think the white space to the right is hard-coded. But you can trick zsh with the following setting:


which in principle tells zsh that the star occupies no characters; from man zshmisc:

%{...%} Include a string as a literal escape sequence. The string within the braces should not change the cursor position. (...)

The drawback is, that you "shift" the blank to the end of PROMPT:

|PROMPT="#"                                                                  |
|RPROMPT="%{*%}"                                                             |
|# ■                                                                        *|

The | symbols denote the terminal edges, ■ the cursor.

Another idea would be to increase COLUMNS by 1:


But one has to think of a way how to do this only for the prompt rendering, but not for the commands. And this will swallow the last character on each line on a multi-line command line.

share|improve this answer
Thanks. I tried to play with the %{...%} trick, dealing with my time and git status displayed on the right. I don't mind the extra space on the PROMPT because I do have one usually. However, there is one big drawback with this solution: when I activate auto-completion with TAB, the extra space is removed and it's doing weird things :) – Frozax Oct 8 '13 at 16:53

I have sent a bug report to the zsh maintainers, but it seems this behavior is by design. This issue however annoyed me so much that I decided to patch and compile zsh myself as a temporary fix. If you're on OS X and use Homebrew (you should), then you can install zsh including my patch by running:

brew install

you will likely want to add /usr/local/bin/zsh to /etc/shells and chsh -s /usr/local/bin/zsh afterwards. Lastly, here's the raw diff for anyone who's interested:

diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 17b78ce..f136178 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -1576,7 +1576,7 @@ zrefresh(void)
        put_rpmpt = rprompth == 1 && rpromptbuf[0] &&
        !strchr(rpromptbuf, '\t') &&
-       (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 1;
+       (int)ZR_strlen(nbuf[0]) + rpromptw < winw;
     } else {
 /* insert >.... on first line if there is more text before start of screen */
    ZR_memset(nbuf[0], zr_sp, lpromptw);
@@ -1631,9 +1631,9 @@ zrefresh(void)
    if (put_rpmpt && !iln && !oput_rpmpt) {
        int attrchange;

-       moveto(0, winw - 1 - rpromptw);
+       moveto(0, winw - rpromptw);
        zputs(rpromptbuf, shout);
-       vcs = winw - 1;
+       vcs = winw;
    /* reset character attributes to that set by the main prompt */
        txtchange = pmpt_attr;
share|improve this answer
PWS (zsh maintainer) just posted an extended patch, so RPROMPT indentation should be in the ,,official'' sources soon. – mpy Dec 14 '13 at 22:07
Thanks for posting the link. Looking forward to the next release! – Patrick Oscity Dec 15 '13 at 1:13

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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