ZSH PS1 adicionando espaçamento ao tabulação

1

Estou tendo um problema com zsh / oh-my-zsh com meu prompt personalizado do PS1 (que eu trouxe do bash).

Quando uso o prompt interno do zsh / oh-my-zsh e a guia para preenchimento automático, isso funciona como esperado.

Quando eu uso o meu próprio prompt PS1, toda a área de entrada se move por cerca de 8 espaços e fica lá até que eu envie uma pausa / nova linha.

Exemplos:

Eu digitei vim a e tabbed

Criada em tema, robbyrussell com o prompt padrão:

Mesmotema,promptpersonalizadodoPS1:

PS1 string e definições de variáveis em .zshrc:

# Monokai colours
D=$'\e[37;40m'
PINK=$'\e[35;40m'
GREEN=$'\e[32;40m'
ORANGE=$'\e[33;40m'    

export PS1='${PINK}andrew${D}@${ORANGE}macbook${D}:%~$ '

Como teste, eu tentei meu prompt sem as variáveis de cor e ele funciona

    
por Andrew White 25.03.2015 / 03:25

2 respostas

2

Parece que os códigos ANSI estão mexendo com o seu terminal, possivelmente devido a algumas interações com o outro conteúdo de PS1 ou porque você não redefine para o padrão.

Felizmente, em zsh não há necessidade de usar códigos de escape ANSI. Você pode usar %F{color} e %K{color} para definir cores de primeiro e segundo plano respectivamente e %f e %k para redefinir os valores padrão (consulte o Zsh Manual para mais informações)

Qualquer um deles deve fazer o truque:

PS1='%5Fandrew%f@%3Fmacbook%f:%~$ '
PS1='%F{5}andrew%f@%F{3}macbook%f:%~$ '
PS1='%F{magenta}andrew%f@%F{yellow}macbook%f:%~$ '

Eu usei %f em vez de %7F ou %F{white} , supondo que você realmente quisesse desabilitar a cor desse lugar (portanto, nomeando a variável D em vez de WHITE ). Se você quiser usar %F{white} , deverá colocar um %f no final de PS1 .

Se você usa um terminal de 88 cores ou 256 cores, você pode até mesmo usar esses índices dessas cores. Por exemplo, %F{221} te daria um amarelo escuro.

Observe também que geralmente é desnecessário export PS1 in zsh - ou bash .

    
por 25.03.2015 / 15:19
1

A solução limpa foi dada pela resposta da @ Adaephon , que eu definitivamente recomendo. No entanto, também quero dar-lhe a causa dos seus problemas:

Os problemas são resultantes porque zsh conta os códigos de escape no comprimento do prompt. Isso está errado, porque esses códigos são processados pelo emulador de terminal e não são exibidos e resultam no deslocamento quando o prompt é parcialmente redesenhado.

Mas, para esse caso, uma sintaxe especial pode ser usada nas strings de prompt. Citado de man zshmisc :

%{...%} Include a string as a literal escape sequence. The string within the braces should not change the cursor position. Brace pairs can nest.

Então, no seu exemplo, você acabaria com

PS1='%{${PINK}%}andrew%{${D}%}@%{${ORANGE}%}macbook%{${D}%}:%~$ '

que parece feio e difícil de ler, mas funciona como esperado.

Finalmente, também uma observação: Se você usa PS1='...' (aspas simples), você precisa ativar a opção PROMPTSUBST , para que seus códigos de escape coloridos sejam substituídos sempre que o prompt for exibido. Se você usar PS1="..." (aspas duplas), os códigos de escape serão substituídos uma vez ao definir PS1 . Este último não é dinâmico, mas é suficiente no seu caso específico.

    
por 25.03.2015 / 18:23