Почему клавиши «control-left» и «control-right» (клавиши со стрелками) не осуществляют навигацию по слову в «less»?

Я даже не csh, но в manpage сказано, что это то же самое, что &>> в bash и семействе - то есть открыто для добавления (>>) и также перенаправляет stderr вместо просто stdout.

Формы с '&' направляют диагностический вывод в указанный файл, а также в стандартный вывод. имя расширяется так же, как и имена входных файлов с '

http://linux.die.net/man/1/csh:

Формы, включающие '&', направляют диагностический вывод в указанный файл, а также в стандартный вывод. файл, а также в стандартный вывод. имя расширяется таким же образом как и '

>> имя

>>& имя

>>! имя

>>&! имя

Как '>', но добавляет вывод в конец имени. Если переменная оболочки noclobber установлена, то ошибкой будет то, что файл не не существует, если не указана одна из форм '!'.

1
15.03.2019, 12:18
4 ответа

В конце концов мне удалось заставить это работать. (Я связался с автором less, чей ответ указал, что я немного усложняю вещи, чем они должны быть.)

Вот lesskeyфайл конфигурации, который я использовал.

#! /usr/bin/env lesskey
#line-edit
\e[1;5D word-left
\e[1;5C word-right
\e[3;5~ word-delete

Запуск lesskey в этом файле и запуск нового экземпляра Ctrl -← и Ctrl -→ переход через (пробел -с разделителями? )слово и Ctrl -Удалить удалить вправо до конца текущего слова. Я предполагаю, что недостатком этого решения является то, что оно жестко -закодировано для определенных escape-последовательностей, сгенерированных моим эмулятором терминала; другие ответы объясняют, почему общий механизм «клавиша управления + стрелка» был невозможен.

0
27.01.2020, 23:14

Попробуйте Alt+wиAlt+b

w будет использоваться для поиска вперед, а b — для поиска назад.

2
27.01.2020, 23:14

Поскольку вы не используете OS/2

Я не шучу.

Код обработки ввода OS/2 вlessимеет отображение «специального ключа» для и #x2388; Управление + и & #x2388; Управляйте аккордами + на его внутренние события SK_CTL_LEFT_ARROWи SK_CTL_RIGHT_ARROW.

Код Unix просто не имеет эквивалентного отображения. Он опирается на termcap, а termcap, как известно, несовершенен в этой области.

То, что в документе в квадратных скобках, верно, а то, что в скобках, неверно. Вам придется использовать и #x238b; ПобегB , и #x238b; ПобегF , и #x238b; Побег(так! )и и #x238b; Побег(так! )последовательности (не аккорды, обратите внимание )до тех пор, пока кто-нибудь не сделает lessлучше. Пожалуйста, отправьте отчет.

(В некоторых эмуляторах терминала вы можете настроить клавишу-модификатор, чтобы вызвать & #x238b; Escape для префикса. Это верно не для всех эмуляторов терминалов и терминалов, в частности для тех, чьи последовательности управления вводом эмулируются здесь (, которые, скорее, сообщают о модификаторах в последовательности CSI ), и важной частью является то, что первый полученный символ по lessс терминала . lessне имеет понятия о таком модификаторе.)

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

3
27.01.2020, 23:14

lessпредставляет собойприложение termcap , использующее интерфейс termcap для получения всей информации, которую оно «знает» о данном терминале. Если его разработчик не введетжестко -закодированноеповедение (, как это сделано в очень немногих программах, которые я не буду упоминать ),lessне будет поддерживать для этих комбинаций клавиш, поскольку они не являются стандартными функциями (, см., например, столбец termcap возможностей, перечисленных в ncurses' terminfo (5 )), и не имеют 2-присвоенных им имен персонажей (см. терминальную базу данных для сводки расширений ).

Между прочим, ссылаясь на мой ответ и бегло взглянув на исходный -код , я не вижу ничего, что соответствовало бы левому/правомусловодвижение (, если только это не является предполагаемым значением сдвига влево/вправоA_LSHIFTиA_RSHIFT). git fault говорит, что они, а также комментарий на странице руководства о слове относятся к 2007 году (версии 394 ). Эти выглядят более многообещающе (из 2016 года):

    SK(SK_CTL_RIGHT_ARROW),0,       A_RRSHIFT,
    SK(SK_CTL_LEFT_ARROW),0,        A_LLSHIFT

, но в комментарии к регистрации написано только

commit e5c195113d1666ac506ea3f65545d436d96fe099
Author: Mark Nudelman <markn@greenwoodsoftware.com>
Date:   Sat Oct 22 15:25:44 2016 +0000

    New commands ESC-{ and ESC-} to shift to start/end of displayed lines.

Читая код (в command.c)для сдвига, я не увидел ничего, что не согласуется с выводом о том, чтоlessлистает по столбцам(одиночным символам )а не слов , но комментарий ОП указал на эти:

    ESC,SK(SK_LEFT_ARROW),0,        EC_W_LEFT,      /* ESC LEFTARROW */
    SK(SK_CTL_LEFT_ARROW),0,        EC_W_LEFT,      /* CTRL-LEFTARROW */
    ESC,'w',0,                      EC_W_RIGHT,     /* ESC w */
    ESC,SK(SK_RIGHT_ARROW),0,       EC_W_RIGHT,     /* ESC RIGHTARROW */
    SK(SK_CTL_RIGHT_ARROW),0,       EC_W_RIGHT,     /* CTRL-RIGHTARROW */

, которые используютпробелв качестве разделителя для "слов". Возможно, когда разработчик вносил эти изменения, он имел в виду подражание vi, который может делать и то и другое (, хотя слова vi разделены по-другому ).

Предлагаемые*выходлевая -стрелкаи т. д. приведены с помощью этих строк из таблицы:

    ESC,SK(SK_LEFT_ARROW),0,        EC_W_LEFT,      /* ESC LEFTARROW */

    ESC,SK(SK_RIGHT_ARROW),0,       EC_W_RIGHT,     /* ESC RIGHTARROW */

Однако — текущая программа не содержит назначений , использующих эти символы SK_CTL_RIGHT_ARROWили SK_CTL_LEFT_ARROW. Это должно быть сделано в lesskey , например, в этом операторе case(или рядом, во всяком случае):

            switch (*++p)
            {
            case 'u': ch = SK_UP_ARROW; break;
            case 'd': ch = SK_DOWN_ARROW; break;
            case 'r': ch = SK_RIGHT_ARROW; break;
            case 'l': ch = SK_LEFT_ARROW; break;
            case 'U': ch = SK_PAGE_UP; break;
            case 'D': ch = SK_PAGE_DOWN; break;
            case 'h': ch = SK_HOME; break;
            case 'e': ch = SK_END; break;
            case 'x': ch = SK_DELETE; break;
            default:
                error("illegal char after \\k", NULL_PARG);
                *pp = p+1;
                return ("");
            }

Без присвоений в коде они только жестко -закодированы, не настраиваются.

Конфигурации MSDOS / OS/2 отличаются от конфигурации Unix наличием (жестко -закодированной )таблицы кодов клавиш:

#if MSDOS_COMPILER || OS2
        static char k_right[]           = { '\340', PCK_RIGHT, 0 };
        static char k_left[]            = { '\340', PCK_LEFT, 0  };
        static char k_ctl_right[]       = { '\340', PCK_CTL_RIGHT, 0  };
        static char k_ctl_left[]        = { '\340', PCK_CTL_LEFT, 0  };

и позволяет использовать их в операторе case:

#if MSDOS_COMPILER || OS2
        case SK_INSERT:
                s = k_insert;
                break;
        case SK_CTL_LEFT_ARROW:
                s = k_ctl_left;
                break;
        case SK_CTL_RIGHT_ARROW:
                s = k_ctl_right;
                break;

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

Повторное посещение страницы руководства lesskey , там написано следующее:

An action may be followed by an "extra" string. When such a command is entered while running less, the action is performed, and then the extra string is parsed, just as if it were typed in to less. This feature can be used in certain cases to extend the functionality of a command. For example, see the "{" and ":t" commands in the example below. The extra string has a special meaning for the "quit" action: when less quits, first character of the extra string is used as its exit status.

Это означает, что вы могли бы сделать что-то подобное:

\e[1;5D     noaction \e\e[D
\e[1;5C     noaction \e\e[C

для преобразования в дополнительную строку , которая использует предопределенное слово -shift.

1
27.01.2020, 23:14

Теги

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