Isso pode ser feito com bash também. O truque é usar um PROMPT_COMMAND personalizado que consulte o terminal para a posição do cursor (conforme esta questão ).
Esta solução provavelmente pode ser estendida para outros shells, mas eu estou familiarizado apenas com bash . (Veja a resposta do @muru para uma solução zsh ). E talvez já exista uma opção em bash para fazer isso automaticamente.
Coloque isso no seu .bashrc :
function new.line.if.not.on.left {
local foo
local garbage
local column
echo -n -e "3[6n" # as the terminal for the position
read -s -d \[ garbage # ignore the first part of the response
read -s -d R foo # store the position in foo
column="$(echo "$foo" | cut -d';' -f2)" # skip over the row number
test "$column" "!=" 1 && { tput smso; echo "%"; tput rmso; }
}
PROMPT_COMMAND="new.line.if.not.on.left; $PROMPT_COMMAND"
A última linha envia uma chamada para new.line.if.not.on.left para o seu PROMPT_COMMAND (como você já pode ter um PROMPT_COMMAND definido).
A função bash new.line.if.not.on.left funciona da seguinte forma:
-
echo -n -e "3[6n"é uma peça mágica que pergunta ao terminal sobre a linha e coluna da posição atual do cursor. O terminal "responde" enviando uma entrada de teclado falsa com a resposta. -
%código%. A primeira parte da resposta é uma algaravia, algum tipo de código de escape. Ignore-o armazenando-o em
read -s -d \[ garbage. -
garbage. Armazene a resposta falsa do teclado na variável bashread -s -d R foo. Ofooé necessário para impedir que-secoe a entrada na tela novamente. Ereadé o delimitador - a entrada falsa é terminada por um-d R, não por uma nova linha, como você poderia esperar. -
Rextrai o número da coluna da resposta (ou seja, ignorando o número da linha) e armazena o resultado emcolumn="$(echo "$foo" | cut -d';' -f2)" -
columnSe o número da coluna atual não for 1, imprima o sinal de porcentagem (e uma nova linha). Os comandostest "$column" "!=" 1 && { tput smso; echo "%"; tput rmso; }ativam o "modo de destaque" - o que deve fazer com que otputse destaque mais - talvez em negrito ou talvez invertendo as cores do plano de fundo e do primeiro plano.