Судя по контексту вопроса, shift+up
и shift+down
означают shift-cursor-up
и shift-cursor-down
(а не, например, shift-page-up
и shift-page-down
), потому что в вопросе спрашивалось о выборе нескольких строк.
На самом деле это более чем один вопрос:
shift+up
и т.д., Во-первых, 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
), необходимо некоторое перенаправление.
Я думаю, вы ищете вариант 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.
Стрелка вверх будет проходить по командам, начиная с последней. Я рекомендую вам использовать это с командами, которые были запущены относительно недавно, чтобы вам не пришлось сходить с ума со стрелкой вверх.
Вы также можете использовать:
CTRL +r
После этого начните вводить команду, и она появится в соответствии с вашим вводом. Затем вы можете либо нажать ESCAPE
, чтобы получить его в приглашении, не выполняя его, либо вы можете выполнить его с помощью клавиши Enter
, если хотите.
Если вы введете историю в командной строке, будет показан список прошлых команд, которому будет предшествовать число. если вы введете восклицательный знак, за которым следует номер команды, эта команда будет повторена. Например, !12 отобразит 12-ю команду из списка истории и запустит эту команду.