Shift-Space меньше

9

В современных веб-браузерах и других программах с текстовым содержимым Spaceпрокручивается более или менее на экране. ShiftSpaceпрокручивается во всем, кроме less.

Как можно использовать ShiftSpaceдля прокрутки вверх less? Или, в качестве альтернативы, есть другой пейджер (совместимость с POSIX - мое единственное требование), который мог бы выполнить эту работу?

Мне сказали, что некоторые терминальные эмуляторы и некоторые терминальные библиотеки пользовательского интерфейса (ncurses?) Не распознают ShiftSpace. Это действительная проблема?

Орфей
источник
Что не так с вашей кнопкой PgUp ? Не достаточно большой?
Златовласка
@goldilocks: нет ничего плохого в желании использовать Shift-Space, особенно если вы привыкли использовать его с другими инструментами. Просто бывает невозможно lessотличить Пространство от Пространства Сдвига.
Кит Томпсон,
Вы можете настроить свой терминал (эмулятор) для отправки bили ^B(0x2) после <shift-Space>. Обратите внимание, что bво многих конфигурациях клавиатуры он находится над пробелом
Стефан Шазелас
@KeithThompson: Надеюсь, просто дружеская насмешка. Я сочувствую; Я хотел бы /повсеместно принять в качестве «поискового текста» различные общепринятые инструменты, но в то же время я опасаюсь навязывать чрезмерные мегоманиакальные стандарты, которые в любом случае еще проще сделать что-то, что можно сделать одним (универсально узнаваемым) нажатием клавиши. Интересно узнать, что в данном случае это техническое ограничение (см. Ответ 200_success), а не обманчивый дизайн, который объясняет.
Златовласка
1
@KeithThompson, см. translationsРесурс для виджета VT100.
Стефан Шазелас

Ответы:

6

Я думаю, что вы вызвали культурный конфликт, вызванный техническими ограничениями. Поскольку Shift+ Spaceгенерирует тот же вывод Space, что и терминальная модель Unix, обрабатывает их одинаково. Чтобы различать их, вам нужна среда программирования, которая поддерживает события нажатия клавиш вверх / вниз. Это возможно в X11 и в эмуляторах терминала, которые поддерживают переназначение ключей. Пример переназначения Shift+ Spaceв PageUp:

# For [u]rxvt, in ~/.Xdefaults:
URxvt.keysym.Shift-space: \033[5~
200_success
источник
1
Большинство эмуляторов терминала поддерживают переназначение ключей, поэтому это можно сделать с большинством эмуляторов терминала ( xterm -xrm 'XTerm.VT100.translations: #override Shift <KeyPress> space: string(0x2)'например, в xterm, или вы отправляете ту же последовательность, что и при отправке <PageUp>). Конечно, это сделает ввод текста, удерживая клавишу Shift, неудобным.
Стефан Шазелас
1

В эмуляторах терминала эта функция прервала бы ввод текста в верхнем регистре со встроенными пробелами, удерживая клавишу Shift. Например, если вы хотите ввести «Это заголовок», вам нужно отпустить Shift между «A» и «T». Удерживание нажатой приведет к удалению курсора и неправильному расположению остальной части введенного вами текста. Я считаю, что это будет гораздо более раздражающим, чем то, что вы получаете с помощью функции прокрутки вверх.

При обычном поведении при наборе текста и прокрутке вверх всякий раз, когда прокручивается Space, потребуется редизайн и интенсивное сотрудничество со стороны приложений (например, приложение, способное переключать то, что отправляет Shift + Space), я почти уверен, что этого не произойдет.

Ключевое отличие состоит в том, что приложение с графическим интерфейсом знает «контекст», редактируете ли вы или просматриваете контент, эмуляторы терминала не могут этого знать.

Эгмонт
источник
1

Эмуляторы терминала отправляют один и тот же символ при Spaceи Shift+Space. Если бы они этого не сделали, то было бы неудобно печатать текст, удерживая Shiftклавишу (см . Ответ @ egmont, который расширяет этот аргумент).

Однако вы можете обойти эту проблему, сопоставив Shift+Spaceпоследовательность символов, которая в конечном итоге будет вставлять пробел по умолчанию, и для которой вы можете настроить приложения, например lessпрокрутку вверх при таком нажатии клавиши.

Например, такая последовательность может быть ` DEL SPC(изменить , DELчтобы BSв системах , где БС является eraseсимволом).

Для xtermдобавления ресурса:

XTerm.VT100.translations: #override \
  Shift <KeyPress> space: string("`") string(0x7f) string(" ") 

И настроить lessс помощью:

printf '%s\n' '#command' '`\177\40 back-screen' | lesskey -
Стефан Шазелас
источник
1

lessв настоящее время не поддерживает это, но это определенно может быть добавлено .

Если программа использует управляющую последовательность xterm для установки значения modifyOtherKeys2 путем записи \e[>4;2mв терминал, то xtermаннотируются ключи с дополнительной информацией о том, какие клавиши-модификаторы активны. Специально для Spaceключа, с modifyOtherKeysактивным в xterm, Shift+ Spaceпревращается в \e[27;2;32~. lessпришлось бы правильно интерпретировать это как Shift+, Spaceа затем вызвать прокрутку вверх.

Хотя это определенно будет работать в xterm, оно не будет работать во всех терминальных приложениях. Но те терминалы, которые не распознают эту escape-последовательность для включения, modifyOtherKeysбудут просто игнорировать эту escape-последовательность и продолжать посылать программам обычный пробел, когда вы нажимаете Shift+ Space.

На веб-сайте xterm есть довольно подробная страница, объясняющая, как modifyOtherKeysрассчитываются коды: https://invisible-island.net/xterm/modified-keys.html

Эндрю
источник