создание bind -p для чтения человеком

Вы можете поместить команду в фон, чтобы сохранить текущий bash открытым:

some_program with its arguments &

Чтобы вернуться к запуску, вы можете использовать команду fg и ^+z, чтобы снова поместить ее в фон

1
04.03.2019, 17:01
2 ответа

console-decode-ecma48 did not appear to work;

Судя по ответу на вопрос, это действительно сработало. Что не сработало, так это ваша команда echo, которую вы вызвали неправильно, в первую очередь не сгенерировав управляющие последовательности. Показанный декодированный вывод — это то, что ваша echoкоманда фактически испускает .

% echo -n '\e[1;5D'
\e[1;5D% 

console-decode-ecma48декодирует фактические ECMA -48 управляющие последовательности, используемые в терминальном вводе и выводе, а не закодированные их представления.Таким образом, вам нужно передать ему фактические управляющие последовательности ECMA -48.

Существуют способы заставить echoсделать это, но то, что происходит с echo, варьируется от оболочки к оболочке, и лучшим подходом является использование printf.

% printf '\e[1;5D' | console-decode-ecma48 --input
Control+CUB 1
% 

Однако это не идеально, потому что кодировка, используемая GNU Readline, уникальна и не используется полностью ни с чем другим, например, escape-последовательности, используемые в printfи (, иногда )в echo, или в кодировке vis/unvis.

printfбудет обрабатывать многие из ваших оставшихся неизвестных, но не может преобразовать \C-последовательности в управляющие коды. Вам нужно будет заранее перевести формы \C-cв восьмеричные управляющие последовательности, которые понимает printf. В противном случае он просто не напечатает правильную последовательность из 48 символов ECMA -для декодирования в первую очередь.

% printf '\C-g' | console-decode-ecma48 --input
'\'
'C'
'-'
'g'
% printf '\007' | console-decode-ecma48 --input
BEL
% 

Опция --inputнеобходима, поскольку это вход терминала , который вы декодируете. Для обработки и #x2387; Alt ключевые аккорды вам также нужна опция --no-7bitдля предотвращения декодирования (почти всех )ECMA -48 7 -битовый код расширения и другие escape-последовательности, которые в противном случае будут декодированы в соответствии с ECMA -48 в их правильное значение.

% printf '\eD' | console-decode-ecma48 --input
IND
% printf '\eb' | console-decode-ecma48 --input
EMI
% printf '\eD' | console-decode-ecma48 --input --no-7bit
Meta 'D' 
% printf '\eb' | console-decode-ecma48 --input --no-7bit
Meta 'b' 
% 

Перебирая вывод bind -pи подавая первую последовательность полей последовательно в printf(, переводя \C-cв восьмеричный escape заранее ), я оставляю читателю в качестве упражнения, как ясно из вопроса, который вы знаю, как это сделать.

Значения стандартных сокращений, используемых в выходных данных, см. в пояснениях и стандартах, на которые имеются ссылки в руководстве.

Дополнительная литература

1
27.01.2020, 23:30

Много информации о последовательностях клавиш можно почерпнуть из справочной страницы console_codes. Например, для \e[1;5Cимеем:

ECMA-48 CSI sequences

CSI (or ESC [) is followed by a sequence of parameters, at most NPAR (16), that are decimal numbers separated by semicolons. (...) The action of a CSI sequence is determined by its final character.

Это говорит нам о том, что первое число 1— это параметр, а C— это действие. Глядя дальше вниз, мы можем успешно найти действие:

C CUF Move cursor right the indicated # of columns.

Это означает, что последовательность описывает клавишу, которая перемещает курсор вправо на один символ... это клавиша !

Недокументированный (? )Здесь префикс 5указывает на клавишу управления. Это упоминается в следующем документе , хотя я думаю, что это было бы проще (, но уж точно не просто! )чтобы угадать.

Я не знаю простого способа преобразовать подобный управляющий код в удобочитаемую -форму, однако преобразование в обратном направлении простое, нужно просто нажать C -v в Bash, за которым следует комбинация клавиш,и его управляющая последовательность будет отображаться на экране в символической форме, например, Ctrl + v , Ctrlдаст ^[[1;5C.

2
27.01.2020, 23:30

Теги

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