MAC-терминал: как Чтобы распечатать команду истории в командной строке, не выполняя ее?

Судя по контексту вопроса, shift+up и shift+down означают shift-cursor-up и shift-cursor-down (а не, например, shift-page-up и shift-page-down), потому что в вопросе спрашивалось о выборе нескольких строк.

На самом деле это более чем один вопрос:

  • во-первых, как заставить ncurses распознавать shift+up и т.д.,
  • делает ли это библиотека меню ncurses, и
  • как получить меню, делающее это, если нет.

Во-первых, ncurses предоставляет предопределенные (согласно X/Open Curses) определения для переносимого (больше/меньше) набора специальных клавиш. Обратившись к terminfo(5), вы можете заметить:

   key_sf                    kind   kF   scroll-forward key
   key_sleft                 kLFT   #4   shifted left-arrow
                                         key
   key_sr                    kri    kR   scroll-backward key
   key_sright                kRIT   %i   shifted right-arrow
                                         key

но там нет ничего, обозначенного как "сдвинутая вверх клавиша со стрелкой". Только с некоторой оглядкой можно связать kind и kri с kLFT и kRIT. До добавления поддержки модифицированных специальных клавиш в xterm в 1999 году, существовало небольшое количество предшествующих работ:

Patch #94 - 1999/3/27 - XFree86 3.9Pf
добавить параметры к функциональным клавишам, чтобы указать, установлены ли shift, control или alt. Коды основаны на описании DEC VT510 с клавиатурой PC, полученном от Джеффри Альтмана.

Позже эта схема была изменена, чтобы уменьшить путаницу в приложениях. Другие разработчики, скопировавшие эту возможность из xterm, не последовали этому примеру, внеся изменения в свои программы:

Patch #167 - 2002/8/24 - XFree86 4.2.0
добавьте ресурс modifyCursorKeys для управления тем, как shift- и подобные модификаторы используются для создания управляющей последовательности курсора. По умолчанию модифицированная последовательность экранирования всегда начинается с CSI и помещает модификатор в качестве второго параметра, чтобы не запутать приложения, которые интерпретируют первый параметр как счетчик повторов. Оригинальное поведение можно получить, установив ресурс в 0 (обсуждение в группе новостей с Stephen J Turnbull, Jeffrey Altman).

Между тем, в ncurses показалось полезным включить эти параметры в описания терминалов (поскольку ncurses использует базу данных терминалов, а не, скажем, таблицы, как в tmux). Они опираются на функцию для определяемых пользователем возможностей, введенную в ncurses 5.0. В базе данных терминалов эта возможность упоминается для xterm в 2004:

# 2004-07-17
#       * add xterm-pc-fkeys -TD

где (помимо консолидации более ранней работы, сделанной еще в 2001) предпринята попытка разобраться с вариациями кодировок модификаторов, которые могут использоваться с различными комбинациями ресурсов xterm - а также с похожими, которые в разной степени отличаются от схемы кодирования xterm.

Соглашение, используемое для пользовательских возможностей, началось с добавления kDN и kUP в список (ваши shift+down и shift+up), и номера, соответствующего кодам модификаторов xterm. Гораздо позже выяснилось, что kind и kri могут иметь одно и то же значение. Но в результате вы можете найти описания терминалов с kDN и kUP (которые читает только ncurses - другие приложения и библиотеки, читающие базу данных терминалов напрямую, пренебрегали этим около 16 лет).

Расширенные возможности обобщены в базе данных терминалов.

Теперь (начиная вторую часть), ncurses действительно предоставляет библиотеку меню. Это (с некоторыми расширениями, такими как поддержка многобайтовых символов) повторная реализация библиотеки меню SVr4. Обратитесь к странице руководства для menu_driver(3x) для этого, а также к программам в ncurses-examples, которые демонстрируют библиотеку. Короткий ответ заключается в том, что библиотека меню не предопределяет поведение, о котором вы спрашиваете, но что приложение может использовать библиотеку для выполнения того, о чем его просят. Для начала посмотрите, как использовать эту деталь:

REQ_TOGGLE_ITEM
Выбрать/отменить выбор элемента.

Более серьезная проблема возникает при использовании в этом приложении возможностей, определяемых пользователем. Большинство приложений, использующих библиотеки форм и меню, полагаются на использование регистров с предопределенными символами для специальных клавиш. Для shift+up и shift+down это не так (если только не было замечено и применено совпадение kind и kri). Для определяемых пользователем возможностей не существует предопределенных кодов клавиш (таких как KEY_DOWN в curses.h). Вместо этого у вас есть определяемые временем выполнения значения, определяемые функцией key_defined . Таким образом, вместо простого case-statement (в is нет KEY_SDOWN в curses.h), необходимо некоторое перенаправление.

2
27.06.2018, 20:39
3 ответа

Я думаю, вы ищете вариант histverify:

Не помню какие файлы идут из коробки на Маке, но у меня:

$ cat ~/.bash_profile
[[ -f ~/.bashrc ]] && source ~/.bashrc

$ cat ~/.bashrc
...
shopt -s histverify
...

Если эта опция включена, при использовании замены истории вы получите возможность редактировать команду перед ее выполнением. Из справочной страницы bash:

histverify
If set, and readline is being used, the results of history substitution are not immediately passed to the shell parser. Instead, the resulting line is loaded into the readline editing buffer, allowing further modification.

2
27.01.2020, 22:02

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

Вы также можете использовать:

CTRL +r

После этого начните вводить команду, и она появится в соответствии с вашим вводом. Затем вы можете либо нажать ESCAPE, чтобы получить его в приглашении, не выполняя его, либо вы можете выполнить его с помощью клавиши Enter, если хотите.

1
27.01.2020, 22:02

Если вы введете историю в командной строке, будет показан список прошлых команд, которому будет предшествовать число. если вы введете восклицательный знак, за которым следует номер команды, эта команда будет повторена. Например, !12 отобразит 12-ю команду из списка истории и запустит эту команду.

0
27.01.2020, 22:02

Теги

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