Suppression de l'espace inutile à la fin de l'invite de droite de zsh ($ RPROMPT)

18

Dans zsh, il y a toujours un caractère espace à droite de mon invite de droite. J'ai essayé avec un .zshrc très simple tel que:

PROMPT="#"
RPROMPT="*"

Il y a toujours un espace après le * à droite de l'écran.

Voici une capture d'écran montrant le problème (j'ai sélectionné l'espace sur l'une des lignes). http://i.imgur.com/cnfa2eJ.png

Merci.

Frozax
la source

Réponses:

20

TL; DR

Tout ce que vous avez à faire est de le mettre dans votre ~/.zshrc(ou dans le même fichier que votre thème d'invite):

ZLE_RPROMPT_INDENT=0

Détails

Dans les versions de ZSH menant à 5.0.2, une valeur dans le code source C de ZSH appelée rprompt_off(qui définissait le décalage de la marge droite) était codée en dur 1.

Mais dans la version 5.0.5, les développeurs ont ajouté la possibilité de remplacer cette valeur par défaut en définissant la ZLE_RPROMPT_INDENTvariable d'environnement.

La raison de ce "retrait" est que certains terminaux plus anciens commenceraient à défiler si la dernière cellule de l'affichage avait un caractère.

Pour les versions de ZSH antérieures à 5.0.5

Si vous utilisez une ancienne version de ZSH et ne pouvez pas mettre à jour, vous pouvez toujours vous débarrasser de cet espace en effectuant les deux opérations suivantes:

  1. Trick ZSH en pensant à votre rprompt est un personnage plus court que utilise réellement l'emballage standard invisible séquence:%{...%}
  2. Ensuite, envoyer une séquence d'échappement de retour de curseur en utilisant terminfo: %{terminfo[cub1]}

Consultez la FAQ et ce message sur la liste de diffusion pour plus d'informations.

Anthony Michael Cook
la source
5
Cela semble également placer le curseur de saisie un caractère à gauche de l'endroit où il se trouverait normalement. En utilisant les invites de cette question, par exemple, le curseur est placé sur la marque de hachage, plutôt qu'immédiatement à sa droite. (Pour moi, définir le décalage à une valeur inférieure à zéro fait apparaître les invites et le curseur aux bons endroits. Observé avec zsh 5.0.8 et 5.2.)
Rob Kennedy
Fonctionne pour moi en 5.2.
Anthony Michael Cook
5
Cela a fonctionné pour moi dans la version 5.2, mais j'ai maintenant des problèmes avec PROMPT: le dernier caractère de PROMPT a disparu et le basculement de la saisie semi-automatique remplit ce dernier caractère avec le premier caractère de l'entrée actuelle. Par exemple, se %git<Tab>transforme en%ggit
roboslone
Vous n'avez pas besoin d'utiliser les astuces pour les nouvelles versions de ZSH.
Anthony Michael Cook
5
Après avoir défini ZLE_RPROMPT_INDENT = 0, j'ai remarqué les mêmes problèmes de glitch de dessin avec l' invite gauche que certains autres mentionnent ci-dessus. Cependant, presque tout fonctionne comme prévu si j'utilise -1 au lieu de 0, c'est-à-dire ZLE_RPROMPT_INDENT = -1. J'ai vu cette astuce sur github.com/bhilburn/powerlevel9k/issues/… . Presque, car avec -1, il n'utilise jamais la ligne de fond d'une fenêtre de terminal sur macOS.
Marc Liyanage
2

J'ai envoyé un rapport de bogue aux responsables de zsh, mais il semble que ce comportement soit d'origine. Ce problème m'a cependant énervé tellement que j'ai décidé de patcher et de compiler zsh moi-même comme correctif temporaire. Si vous êtes sous OS X et utilisez Homebrew (vous devriez), vous pouvez installer zsh, y compris mon correctif, en exécutant:

brew install https://gist.github.com/padde/7963205/raw/eaedcc557859a40db87282fc39256fccd52d0aad/zsh.rb

vous voudrez probablement ajouter /usr/local/bin/zshà /etc/shellset chsh -s /usr/local/bin/zshaprès. Enfin, voici le diff brut pour tous ceux qui sont intéressés:

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)
    else
        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;
        /*
Patrick Oscity
la source
PWS (mainteneur zsh) vient de publier un correctif étendu , donc l'indentation RPROMPT devrait bientôt figurer dans les sources `` officielles ''.
mpy
Merci d'avoir posté le lien. Dans l'attente de la prochaine version!
Patrick Oscity
1

Je pense que l'espace blanc à droite est codé en dur. Mais vous pouvez tromper zshavec le paramètre suivant:

RPROMPT="%{*%}"

qui en principe dit zshque l'étoile n'occupe aucun personnage; de man zshmisc:

%{...%} Incluez une chaîne comme séquence d'échappement littérale. La chaîne entre accolades ne doit pas modifier la position du curseur. (...)

L'inconvénient est que vous "décalez" le blanc à la fin de PROMPT:

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

Les |symboles désignent les bords terminaux, ■ le curseur.


Une autre idée serait d'augmenter COLUMNSde 1:

COLUMNS=$((COLUMNS + 1))

Mais il faut penser à un moyen de le faire uniquement pour le rendu rapide, mais pas pour les commandes. Et cela avalera le dernier caractère de chaque ligne d'une ligne de commande multiligne.

mpy
la source
1
Merci. J'ai essayé de jouer avec l'astuce% {...%}, en traitant mon temps et l'état de git affiché à droite. Cela ne me dérange pas l'espace supplémentaire sur le PROMPT parce que j'en ai un habituellement. Cependant, il y a un gros inconvénient avec cette solution: lorsque j'active l'auto-complétion avec TAB, l'espace supplémentaire est supprimé et cela fait des choses étranges :)
Frozax