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-s
ecoe 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. -
R
extrai 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)"
-
column
Se 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 otput
se destaque mais - talvez em negrito ou talvez invertendo as cores do plano de fundo e do primeiro plano.