Вот неполное решение. Я думаю, что это может быть сделано для работы, более или менее.
Сначала мы организуем захват всех выходных данных клавиатуры, выполняя их в среде script
. (Есть много проблем с этим; см. Ниже.) Нам нужно передать флаг -f
в script
чтобы он немедленно сбрасывал вывод в файл машинописи. Мы также выбираем имя файла в /tmp
:
script -f /tmp/typescript
Внутри скриптовой среды мы определяем сочетание клавиш для извлечения последней строки файла машинописного текста и помещаем его в историю: (Я связал команды с Ctl+y Ctl+y, предполагая, что вы не печатаете это очень часто , Ошибка в bash не позволяет связывать команды с последовательностями длиннее двух байтов, что исключает, например, все клавиши Fn
.)
bind -x '"\C-y\C-y":history -s $(tail -n2 X|head -n1)'
Теперь, чтобы вставить последнюю строку вывода в текущую командную строку, нам просто нужно набрать ctl-y ctl-y ! ! esc ^
который скопирует последнюю строку вывода в историю, затем вставит расширение истории, затем запустит расширение истории. Вероятно, есть лучший способ сделать это, но такого рода работы. Однако клавиш много, поэтому мы назначаем их макросу клавиатуры:
bind '"\eOP":"\C-y\C-y!!\e^"'
До определенного момента, это работает. Однако теперь нам нужно разобраться с уродливостью script
, который сохраняет результат точно так, как он был сгенерирован , управляющими кодами VT-102 и всем остальным. Он сохраняет то, что вы ввели, точно так же, как вы его ввели, включая все ошибки, которые вы возвратили, пробелы и новые символы. Сохраняет возврат каретки (ctl-m
), который отправляется в конце каждой строки. Короче говоря, это не тот текст, который вы бы хотели вставить в командную строку.
Концептуально, однако, это работает. Все, что ему нужно, - это лучший инструмент для сохранения выходных данных сеанса и, возможно, более элегантный способ вставить результат вызова команды оболочки, чем вставить его в историю, а затем вернуть обратно.