Bash: как настроить сочетание клавиш для запуска программы и вставить ее вывод в положение курсора? - PullRequest
1 голос
/ 19 марта 2020

При вводе команды в Bash я хотел бы иметь возможность нажимать комбинацию клавиш для запуска программы и вставлять вывод программы в командную строку в позиции курсора. Например:

$ cat <Ctrl-G>
# bash runs a program that prints "some-file" to stdout
$ cat some-file

Я бы хотел, чтобы она работала для каждой команды - не только cat.

. Я попробовал следующий подход:

bind -x '"\C-g":"echo some-file"'

, но «some-file» выводится на терминал, а не в командную строку:

$ cat <Ctrl-G>
some-file
$ cat 

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Ответ заключается в переменных READLINE_LINE и READLINE_POINT, установленных bind :

-x keyseq: команда-команда

Причина shell- команда, которая будет выполняться при вводе keyseq. Когда команда shell выполняется, оболочка устанавливает переменную READLINE_LINE на содержимое буфера строки Readline, а переменную READLINE_POINT - текущее местоположение точки вставки. Если выполненная команда изменит значение READLINE_LINE или READLINE_POINT, эти новые значения будут отражены в состоянии редактирования.

Например:

stuff() { 
    local pre="${READLINE_LINE:0:$READLINE_POINT}"
    local suf="${READLINE_LINE:$READLINE_POINT}"
    local stuff='my string here'
    READLINE_LINE="${pre}$stuff$suf"
    ((READLINE_POINT += ${#stuff}))
}

bind -x '"\C-g":"stuff;"'

Кредиты Грегу Вуледжу, который ответил на мой вопрос в help- bash список рассылки

0 голосов
/ 21 марта 2020

У меня есть Lubuntu, и поэтому X windows, OpenBox и я решаем эту проблему, определяя ярлыки в Openbox.

nano ~/.config/openbox/lubuntu-rc.xml
#setting shortcuts to point at a special bash script
openbox --reconfigure # restart shortcuts

Таким образом, если я нажимаю Ctrl + G в любом месте, он запускает данный скрипт, который выводит результат в буфер обмена, скажем:

 echo "Hello World at $(date +%Y-%m-%d_%H-%M-%S)" | xsel -b -i 

Затем я вставляю вывод в Bash терминал (Ctrl + Shift + V).

Я знаю, что это не чисто BASH, но это может вам как-то помочь.

PS. Если мне нужно отправить ключи непосредственно в приложение, я использую xdotool .

...