Tenho certeza de que vi alguém ter uma parte do prompt alinhada à direita na janela do terminal e, em seguida, iniciar o cursor real em uma segunda linha. Eu sei que posso alcançar a segunda linha com um "\ n" no PS1, mas não consigo descobrir como alinhar parte dela à direita. Foi o que vi apenas espaço em branco adicionado entre as duas strings?
bash
command-line
ps1
Felix Andersen
fonte
fonte
.inputrc
tiveremset show-mode-in-prompt on
. Ambos não calculam o comprimento dos códigos ANSI CSI não imprimíveis e não os incluem adequadamente no\[
e\]
como mencionado pelo @Mu Mind. Veja esta resposta para uma resolução.Com base nas informações que encontrei aqui, fui capaz de descobrir uma solução mais simples para alinhar à direita, acomodando conteúdo de comprimento variável à direita ou à esquerda, incluindo suporte para cores. Adicionado aqui para sua conveniência ...
Nota sobre cores: usar a
\033
fuga em favor de alternativas, sem\[\]
agrupamentos, mostra-se mais compatível e, portanto, recomendado.O truque é escrever primeiro o lado direito, depois usar return (
\r
) para retornar ao início da linha e continuar a sobrescrever o conteúdo do lado esquerdo, como segue:Estou usando
tput cols
no Mac OS X para recuperar a largura do terminal / console,terminfo
já que meu$COLUMNS
var não está preenchido,env
mas você pode substituir o*
valor " " substituível em%*s
, fornecendo "${COLUMNS}
" ou qualquer outro valor de sua preferência.O próximo exemplo usado
$RANDOM
para gerar diferentes tamanhos de conteúdo inclui cores e mostra como você pode extrair funções para refatorar a implementação para funções reutilizáveis.Como
printf
o comprimento da string é o número de caracteres que precisamos para compensar a quantidade de caracteres necessária para renderizar as cores, você o encontrará sempre aquém do final da tela por causa dos caracteres ANSI não impressos sem compensação. Os caracteres necessários para a cor permanecem constantes e você descobrirá que também printf leva em consideração a alteração no comprimento, conforme retornado por,$RANDOM
por exemplo, 'que mantém nosso alinhamento correto intacto.Este não é o caso com sequências linha de escape Bash especial (ou seja,.
\u
,\w
,\h
,\t
), Embora, uma vez que estes só irá gravar um comprimento de 2, porque festa só irá traduzir-los quando a solicitação é apresentada, após printf tornou a corda. Isso não afeta o lado esquerdo, mas é melhor evitá-los à direita.No entanto, não importa se o conteúdo gerado permanecerá em comprimento constante. Como na
\t
opção de hora, que sempre renderiza a mesma quantidade de caracteres (8) por 24 horas. Somente precisamos levar em consideração a compensação necessária para acomodar a diferença entre 2 caracteres contados, o que resulta em 8 caracteres quando impressos, nesses casos.Lembre-se de que pode ser necessário triplicar o escape de
\\\
algumas seqüências de escape que, de outra forma, mantêm significado para as strings. Como no exemplo a seguir, o escape do diretório de trabalho atual\w
não tem significado, caso contrário, ele funciona conforme o esperado, mas o tempo\t
, que significa um caractere de tabulação, não funciona como o esperado sem o escape triplo primeiro.nJoy!
fonte
Usar
printf
com$COLUMNS
funcionou muito bem, algo como:Isso justificava perfeitamente para mim.
fonte
A seguir, colocaremos a data e hora atuais em VERMELHO no RHS do terminal.
Vantagens:
shellcheck
limpar \ limpo..inputrc
tiverset show-mode-in-prompt on
.\[
e,\]
para que a edição do texto digitado no prompt não faça com que o prompt seja reimpresso de maneira estranha.Nota : Você vai precisar para assegurar que quaisquer sequências de cores no
$PS1
antes deste código é exeucted estão devidamente fechado em\[
e\]
e que não há assentamento deles.fonte
bash: local: can only be used in a function
, que é trivial de corrigir e depois disso, ele não mostra nada porqueCOLUMNS
não está definido: deve ser substituído por$(tput cols)
. mesmo resultado se o snippet for salvo em um arquivo diferente e, em seguida, originado em.bashrc
.tput cols
se$COLUMNS
não estiver definido. E sim, esse código deve estar dentro de uma função. Eu usoPROMPT_COMMAND='_prompt_bash_set'
e nomeio a função_prompt_bash_set
.Eu apenas pensei em jogar o meu aqui. É quase exatamente o mesmo que o prompt zsh do GRML (exceto as atualizações do zsh, é um pouco melhor em novas linhas e espaços de fundo - o que é impossível de replicar no bash ... muito difícil neste momento, pelo menos).
Passei uns bons três dias nisso (testado apenas em um laptop executando o arco), então aqui está uma captura de tela e depois as coisas que aparecem no meu ~ / .bashrc :)
Atenção - é um pouco louco
importante a parte - todo
^[
(como^[[34m
) é realmente o caractere de escape(char)27
. A única maneira de saber como inserir isso é inserir ctrl+ ( [v) (ou seja, pressionar os dois [e venquanto ctrlé pressionado.Ainda estou trabalhando para tornar as cores configuráveis, mas estou feliz com as cores como estão agora.
Atualmente trabalhando em uma correção para o
^[
personagem louco e fácil troca de cores :)fonte
Você pode usar
printf
para fazer o alinhamento correto:fonte
Acrescentando a resposta de Giles, escrevi algo para lidar melhor com as cores (desde que sejam apropriadamente incluídas
\[
e\]
. É caso a caso e não lida com todos os casos, mas permite definir meu PS1L na mesma sintaxe do PS1 e usa a data (sem cor) como PS1R.Aqui está no github: dbarnett / dotfiles / right_prompt.sh . Eu o uso no meu .bashrc assim:
Nota: Eu também adicionei uma nova linha após o PS1R, que não faz diferença visual, mas parece impedir que o prompt seja distorcido se você rolar para trás através de certos comandos no seu histórico de comandos.
Tenho certeza que alguém pode melhorar isso, e talvez generalizar alguns dos casos especiais.
fonte
Aqui está uma solução baseada em
PROMPT_COMMAND
etput
:A mágica é realizada por:
Qual é dividido por:
No PS1,
tput
é escapado com \ [\] para que não seja contado no comprimento exibido.fonte