Используйте этот пакет, чтобы открыть 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
С zsh
это должно быть просто вопросом:
precmd() print -z 'foo '
Или, чтобы избежать переопределения команд, поставленных в очередь пользователем, с помощью Alt+q:
zle-line-init() { [ -n "$BUFFER" ] || LBUFFER='foo '; }
zle -N zle-line-init
С помощью bash
вместо xdotool
вы можете использоватьTIOCSTI
ioctl
:
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'"
Или вы можете задержать TIOCSTI
ioctl на время, достаточное для инициализации 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
перед TIOCSTI
ioctl (также требуется опция -MPOSIX
)или Как и в подходе zsh
, убедитесь, что foo
вставлен в начале буфера, вставив^A
(при условии, что вы используетеemacs
(режим редактирования по умолчанию ), в котором курсор перемещается в начало строки )до foo
и ^E
после (для перехода к концу):
insert_with_delay 0.05 $'\1foo \5'
или
bind $'"\u200b":"\1foo \5"'
То, о чем вы просите, звучит не очень часто, поэтому неудивительно, что нет простого способа сделать это.
С чистым башом,вы можете использовать встроенную команду 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
для имитации ввода.