Ao iniciar o XTerm, o prompt inicia na primeira linha do terminal. Ao executar comandos, o prompt desce até chegar ao fundo e, a partir de então, permanece lá (nem mesmo Shift- Page Downou o mouse pode mudar isso). Em vez de o início da vida útil do terminal ser "especial", o prompt deve sempre estar na parte inferior do terminal. Observe que eu tenho um prompt de várias linhas .
Obviamente, ele deve funcionar como antes (redimensionável, rolável, sem novas linhas desnecessárias na saída e nenhuma saída desaparecendo misteriosamente), portanto, PROMPT_COMMAND='echo;echo;...'
ou similar, não é uma opção. A solução idealmente não deve ser específica do shell.
Edit: A solução atual , enquanto trabalha em casos simples, tem alguns problemas:
- É específico do Bash . Uma solução ideal deve ser portátil para outras conchas.
- Ele falha se outros processos modificar
PS1
. Um exemplo é o virtualenv, que adiciona(virtualenv)
no início dePS1
, que desaparece sempre logo acima da dobra. - Ctrl- lagora remove a última página do histórico.
Existe uma maneira de evitar esses problemas, além de bifurcar o XTerm?
clear
comando.Respostas:
Se estiver usando
bash
, o seguinte deve fazer o truque:Ou (menos eficiente, pois executa um
tput
comando antes de cada prompt, mas funciona após o redimensionamento da janela do terminal):Para impedir a
tput
alteração do código de saída, você pode salvá-lo e redefini-lo explicitamente:Observe que a variável
retval
é local; isso não afeta nenhumaretval
variável que você possa ter definido no shell.Como a
cup
capacidade da maioria dos terminais é a mesma\e[y;xH
, você também pode codificá-la:Se você quiser que seja seguro contra redefinições posteriores do PS1, você também pode utilizar a
PROMPT_COMMAND
variável. Se definido, ele será executado como comando antes da saída do prompt. Portanto, o efeito também pode ser alcançado porÉ claro que, embora a redefinição
PS1
não afete isso, alguns outros softwares também podem mudarPROMPT_COMMAND
.fonte
tput
diferem de muitosecho
comandos? (Pedindo por curiosidade) #'\[$(tput cup "$LINES")\]'
funciona lindamente . Obrigado!tput
: Parece redefinir$exit_code
. Corrigido usando\[\e[$LINES;1H\]
.tput
que preserva o código de saída.Como uma pequena simplificação da resposta anterior, achei mais fácil executar:
no começo de
.bashrc
ou.zshrc
. Apenas faz o trabalho.Prós:
Contras:
clear
paraclear; tput ...
não ajuda;fonte
As respostas usadas
$LINES
são desnecessariamente não portáteis. Conforme feitoresize
, você pode simplesmente pedirxterm
para definir a posição com um número de linha arbitrariamente grande, por exemplo,(supondo que você tenha uma janela menor que 10 mil linhas, desconsiderando a rolagem ).
Como a sequência não será alterada como um efeito colateral do redimensionamento da janela, você pode calcular isso uma vez e colá-la na sequência de prompt como uma constante, por exemplo,
e depois
de acordo com suas preferências.
Quanto a outros processos de modificação
PS1
: você terá que recalcularPS1
após essas alterações, para garantir que ela tenha a aparência desejada. Mas não há detalhes suficientes na pergunta para apontar onde fazer as alterações.E finalmente: o comportamento de conclusão de tabulação não combina com esse tipo de alteração, devido às suposições do bash.
fonte
PS1="${TPUT_END} myprompt: "
, ou mesmoPS1="${TPUT_END}${PS1}"