Eu tenho um texto de prompt dinâmico como este e não há problemas com o typeahead. Mas, em vez de incorporar a substituição de processo diretamente em PS1
, uso PROMPT_COMMAND
para chamar métodos de configuração. Eles produzem o texto dinâmico apropriado que é armazenado em variáveis e as variáveis são então incorporadas em PS1
.
Então, tente algo assim ...
export ps1_head_text
build_prompt() {
export PS1="\${ps1_head_text}..."
}
ps1_head() {
if (( $(cursor_col) > 1 )); then
ps1_head_text=$'\n'╭-
else
ps1_head_text=╭-
fi
}
export PROMPT_COMMAND=ps1_head
Eu acabei fazendo isso precisamente porque eu tive problemas com a substituição de processos (embora eu não me lembre se foi um erro ou algum outro problema).
Editar: Agora que penso nisso, você pode ter problemas de tempo ... se PROMPT_COMMAND
for chamado por vez, o que impede uma leitura correta da posição do cursor. Se isso acontecer, provavelmente você está no barco "use zsh". Mas dê uma chance.
Atualização: de acordo com comentário da dave_thompson_085 ler a resposta para emitir uma seqüência de escape (para imprimir a posição do cursor) pode entrar em conflito com a entrada typeahead.
Faz sentido, pois a leitura está ocorrendo no mesmo shell em que o texto do cabeçalho é digitado. Então, e se você não fizer isso no mesmo shell? O rodeia com parentes para colocá-lo em um subshell ajuda? Que tal redirecionar a resposta do terminal (por exemplo, para um arquivo ou pipe ou qualquer outro) e lê-lo de lá?
Parece que há uma maneira de superar o problema, por isso estou jogando algumas coisas contra a parede para ver o que pega.