Как автоматически вставить строку после приглашения

Используйте этот пакет, чтобы открыть Geany. Это откроет отдельный сокет, специфичный для каждой рабочей области.

Например, в Thunar используйте «открыть в другом приложении» и укажите на этот командный файл.

#!/bin/sh

socket=`xprop -root _NET_CURRENT_DESKTOP`
socket=${socket##* }

if [ "$socket" ]
then
    if [ "$DISPLAY" ]
    then
        socket="${DISPLAY%.*}-$socket"
        socket=${socket#*:}
    else
        socket="NODISPLAY-$socket"
    fi
    exec geany --socket-file "/tmp/geany_socket_$socket" "$@"
else
    exec geany "$@"
fi
2
26.08.2018, 18:18
2 ответа

С zshэто должно быть просто вопросом:

precmd() print -z 'foo '

Или, чтобы избежать переопределения команд, поставленных в очередь пользователем, с помощью Alt+q:

zle-line-init() { [ -n "$BUFFER" ] || LBUFFER='foo '; }
zle -N zle-line-init

С помощью bashвместо xdotoolвы можете использоватьTIOCSTIioctl:

insert() {
  perl -le 'require "sys/ioctl.ph";
            ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV' -- "$@"
}
PROMPT_COMMAND='insert "foo "'

Это предпочтительнее xdotool, поскольку он вставляет эти символы непосредственно во входной буфер устройства bash, с которого считывается. xdotoolбудет работать только в том случае, если запущен X-сервер (не будет работать на консоли или реальных терминалах или надssh(без -X), например ), который идентифицируется как $DISPLAYи это тот, с которым вы взаимодействуете, и который работает эмулятор терминала bash, имеет фокус при оценке $PROMPT_COMMAND.

Теперь, как и в вашем случае xdotool, поскольку ioctl()выполняется до отображения подсказки, а дисциплина линии терминала tty выводится из режима icanon+echoс помощью readline, вы, вероятно, увидите эхо того fooиз-за дисциплины линии tty, которая портит отображение.

Вы можете обойти это, вместо этого вставив строку, чье эхо невидимо (, например U+200B, если используются исключительно локали Unicode ), и привязать ее к действию, которое вставляет"foo ":

insert() {
  perl -le 'require "sys/ioctl.ph";
            ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV' -- "$@"
}
bind $'"\u200b":"foo "'
PROMPT_COMMAND="insert $'\u200b'"

Или вы можете задержать TIOCSTIioctl на время, достаточное для инициализации readline:

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 "'

Если, как и в подходах zsh, вы хотите обработать случай, когда пользователь вводит текст до отображения подсказки,вы можете либо

  • слить , что при выполнении tcflush(0, TCIFLUSH)в perlперед TIOCSTIioctl (также требуется опция -MPOSIX)или
  • Как и в подходе zsh, убедитесь, что fooвставлен в начале буфера, вставив^A(при условии, что вы используетеemacs(режим редактирования по умолчанию ), в котором курсор перемещается в начало строки )до fooи ^Eпосле (для перехода к концу):

    insert_with_delay 0.05 $'\1foo \5'
    

    или

    bind $'"\u200b":"\1foo \5"'
    
7
27.01.2020, 21:51

То, о чем вы просите, звучит не очень часто, поэтому неудивительно, что нет простого способа сделать это.

С чистым башом,вы можете использовать встроенную команду readдля чтения строки, а затем evalдля ее выполнения. Смоделируйте подсказку (Я аппроксимирую вашу подсказку ниже ).

#!/bin/bash    
PROMPT=$'\e[1m'$USER@$HOSTNAME:$PWD$' $ \e[0m'
IFS= read -r -e -i "foo " -p "$PROMPT" line
eval "$line"
exit

Поместите это в сценарий и скажите эмулятору терминала запустить этот сценарий.

Либо запустите Screen в эмуляторе терминала. Вы можете использовать его команду stuffдля имитации ввода.

3
27.01.2020, 21:51

Теги

Похожие вопросы