введите строку с помощью xdotool, не вводя ее дважды на экране (выбор типа fzf)
Я хотел бы выбрать что-то в fzf и ввести этот выбор как команду, которую я могу редактировать и в конечном итоге вызвать. Решение может выглядеть так:
seq 5 | sed "s/^/echo Testing /" | fzf | xargs -I{} xdotool type "{}"
но вывод на терминале выглядит так:
[me@~~~_09:40:22 ~]$ seq 5 | sed "s/^/echo Testing /" | fzf | xargs -I{} xdotool type "{}"
echo Testing 3[me@~~~_09:40:26 ~]$ echo Testing 3
это работает, но потенциально длинная команда будет напечатана дважды. Это больше похоже на «проблему» xdotool. Он вводит текст перед вызовом команды завершенной, поэтому сначала он пишется, затем команда завершается, и то, что было написано, «дублируется» в командной строке.
Я хотел бы знать, можно ли как-то запустить эту демонстрационную команду, чтобы получить просто:
[me@~~~_09:40:22 ~]$ seq 5 | sed "s/^/echo Testing /" | fzf | xargs -I{} xdotool type "{}"
[me@~~~_09:40:26 ~]$ echo Testing 3
Я пытался поиграться с задержками, вложенными командами, но не могу в этом разобраться. Может ли кто-нибудь помочь?
1 ответ
Всякий раз, когда что-либо вводится в терминал, оно отображается эхом. Это то, что мы видим. Когда bash перезапускается, он устанавливает терминал в режим raw, чтобы обрабатывать все специальные символы, редактировать и т. д., а также отключает эхо. Затем он читает напечатанное и покорно повторяет его.
Вы можете обойти это, отключив эхо перед запуском, например:
.. fzf | (stty -F /dev/tty -echo; xargs -I{} xdotool type "{}"; stty -F /dev/tty echo)
Обратите внимание, вместоxdotool
вы также можете использовать ioctlTIOCSTI
. Для этого существует несколько источников C и скриптов Perl. Вот один сstty
включено:
#!/usr/bin/perl
# https://superuser.com/a/1663171/458747
use strict;
eval 'sub TIOCSTI () {0x5412;}' unless defined(&TIOCSTI);
system('stty -F /dev/tty -echo');
my $str;
if($#ARGV<0){ $str = join("",<STDIN>); } # read stdin if no args
else{ $str = join(" ",@ARGV); }
foreach my $ch (split('',$str)){
ioctl(STDOUT, &TIOCSTI, $ch) or die $!;
}
system('stty -F /dev/tty echo');
Если вы поместите это в файлpushtype
ты можешь избежатьxargs
и просто...fzf|pushtype
.