Com zsh
, deve ser apenas uma questão de:
precmd() print -z 'foo '
Ou para evitar a substituição de comandos enfileirados pelo usuário com Alt + q :
zle-line-init() { [ -n "$BUFFER" ] || LBUFFER='foo '; }
zle -N zle-line-init
Com bash
, em vez de xdotool
, você pode usar o TIOCSTI
ioctl
:
insert() {
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV' -- "$@"
}
PROMPT_COMMAND='insert "foo "'
É preferível que xdotool
insira esses caracteres diretamente no buffer de entrada do dispositivo bash
está lendo. xdotool
só funcionaria se houvesse um servidor X em execução (não funcionaria no console ou terminais reais ou acima de ssh
(sem -X
), por exemplo), que é o identificado por $DISPLAY
e isso é o que você está interagindo e que o emulador de terminal bash
está sendo executado tem o foco quando $PROMPT_COMMAND
é avaliado.
Agora, como em seu caso xdotool
, porque o ioctl()
é feito antes que o prompt seja exibido e a disciplina de linha terminal tty esteja fora do modo icanon+echo
por readline, é provável que você veja o < em> echo desse foo
pela disciplina de linha tty bagunçando a exibição.
Você poderia contornar isso inserindo uma sequência cujo echo é invisível (como U + 200B se estiver usando exclusivamente localidades Unicode) e vincula-se a uma ação que insira "foo "
:
insert() {
perl -le 'require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV' -- "$@"
}
bind $'"\u200b":"foo "'
PROMPT_COMMAND="insert $'\u200b'"
Ou você pode atrasar o TIOCSTI
ioctl o suficiente para a readline ter tempo para inicializar:
insert_with_delay() {
perl -le 'require "sys/ioctl.ph";
$delay = shift @ARGV;
unless(fork) {
select undef, undef, undef, $delay;
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV;
}' -- "$@";
}
PROMPT_COMMAND='insert_with_delay 0.05 "foo "'
Se, como em zsh
se aproxima, você deseja manipular o caso em que o usuário digita o texto antes que o prompt seja exibido, você poderia
-
drenar isso fazendo um
tcflush(0, TCIFLUSH)
emperl
antes doTIOCSTI
ioctl (também precisa de uma opção-MPOSIX
) ou -
como na abordagem
zsh
, certifique-se de quefoo
esteja inserido no início do buffer inserindo^A
(supondo que você use o modo de ediçãoemacs
(padrão), onde ele move o cursor para o início da linha) antes defoo
e^E
após (para passar para o final):insert_with_delay 0.05 $'foo '
ou
bind $'"\u200b":"foo "'