7

Мой хостер недавно обновился до нового CentOS, и я «персонализировал» его, и теперь я что-то упускаю.

На моем домашнем сервере Ubuntu я могу forward-word и backward-word с помощью клавиш ALT + RIGHT / LEFT. Я ничего не делал для этого. Я также могу ALT + BACKSPACE, чтобы удалить слово.

На моем новом CentOS я могу сделать ALT + BACKSPACE, но я не могу заставить работать ALT + RIGHT / LEFT ! ALT + B / F работают, но это просто неприемлемо, потому что это работает только для левой ALT, и мои пальцы не такие худые. (справа ALT + B / F просто печатает "b" или "f")

Я пытался скопировать часть /etc /inputrc в CentOS, но это ничего не дает.

ALT или CTRL, мне все равно, но мне действительно нужен ярлык. У последнего CentOS его не было, но с Ubuntu я скучал по CentOS.

Мой CentOS /etc/inputrc:

"\e[5C": forward-word
"\e[5D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word

Моя Ubuntu /etc/inputrc:

"\e[1;5C": forward-word
"\e[1;5D": backward-word
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word

Я даже не знаю, что они все значат !? Что такое [1;5C для ключа ??

3 ответа3

8

Благодаря вашему вопросу я наконец-то прочитал и расширил понимание, ура!

Таким образом, очень хорошим источником информации является man readline . Привязки клавиш, указанные в различных файлах inputrc управляют работой библиотеки чтения строк BASH. В соответствии с man-страницей readline вы можете использовать либо символические имена клавиш, либо escape-последовательности:

   Key Bindings
       The syntax for controlling key bindings in the inputrc file is
       simple.  All that is required is the name of  the  command  or
       the  text  of a macro and a key sequence to which it should be
       bound. The name may be specified in one of two ways: as a sym‐
       bolic  key  name, possibly with Meta- or Control- prefixes, or
       as a key sequence.  The name and key sequence are separated by
       a  colon.  There can be no whitespace between the name and the
       colon.

       When using the form keyname:function-name or macro, keyname is
       the name of a key spelled out in English.  For example:

              Control-u: universal-argument
              Meta-Rubout: backward-kill-word
              Control-o: "> output"

На странице man также указано, что файл конфигурации по умолчанию - ~/.inputrc поэтому я рекомендую разместить там свои привязки.

Если вы хотите использовать обычные буквенные клавиши (например, Control - g), Control-g: forward-word работает нормально. Клавиши со стрелками сложнее. Я попытался и не смог найти название клавиши для клавиш со стрелками. Ни один из тех, которые я пробовал (left-arrow , left :left), не сработал, поэтому кажется, что мы застряли с escape-последовательностями.

К сожалению, точная escape-последовательность отличается в эмуляторах терминала (вот почему ваш Ubuntu inputrc имел несколько строк). Чтобы выяснить, какую escape-последовательность использует ваш любимый терминал, запустите read а затем введите интересующую вас последовательность клавиш. В terminator , xterm и gnome-terminal , Control - Left дают:

$ read
^[[1;5D

в aterm:

$ read
^[Od    <-- that is a capital O not a zero (0).

Немного поэкспериментировав, я понял, что ^[[D - слева, а ^[[1;5D - это управление - слева). Первая ^[ - это клавиша Esc , используемая здесь, я полагаю, для обозначения escape-последовательности.

В любом случае, чтобы связать Control - слева forward-word таким образом, чтобы это работало для всех, я добавил эти строки в мой ~/inputrc:

"\e[1;5D": backward-word
"\eOd": backward-word

По причинам, которые я не до конца понял, Control представлен символом \e который должен быть Esc.

Мой последний файл ~/.inputrc который работает для всех терминалов, перечисленных выше:

"\e[1;5D": backward-word
"\eOd": backward-word
"\e[1;5C": forward-word
"\eOc": forward-word
1

Как это сделать в Iterm2, чтобы он работал при подключении к любому хосту.

Примечание. Я пишу это только потому, что другой вопрос (https://superuser.com/questions/1042937/getting-ctrlarrows-to-move-word-at-a-time-on-newest-iterm2?rq=1) имеет связан с этим вопросом как дубликат, но этот вопрос не дает ответа на вопрос, как это сделать в Iterm2, поэтому на самом деле он не является дубликатом.

Если вы используете OS X и используете Iterm2, вы можете сопоставить Alt/Ctrl+→ (стрелка вправо) и Alt/Ctrl+ со стандартными командами readline Meta+F и Meta+B. В приведенном ниже примере предполагается, что escape-ключ является мета-ключом. Для этого откройте Iterm2.

  1. Нажмите: Меню -> Настройки ...
  2. Нажмите вкладку «Профили».
  3. Нажмите на свой профиль или профиль по умолчанию.
  4. Нажмите на вкладку «Ключи».
  5. Нажмите знак «+» рядом с «Загрузить предустановку…»
  6. Введите комбинацию клавиш в первом поле (например, Ctrl+)
  7. Выберите «Send Text», «Send Hex» (подробнее об отправке Hex в «Как привязать последовательность клавиш к управляющей клавише» ниже) или «Send Escape Sequence». В этом случае мы используем «Send Escape Sequence».
  8. В последнем поле выберите символы, которые readline может интерпретировать.
  9. ^[ это последовательность readline для escape. Эта запись отображает Opt+ на Esc+F (может быть Alt+F в других терминалах)

пример окна сопоставления клавиш

Как сопоставить ярлыки с неэкранирующими последовательностями (Ctrl, Alt, Cmd и т.д.)

  1. Загрузите «Ключевые коды» из магазина приложений. Установите его и откройте.
  2. Находясь в открытом окне Key Codes, нажмите Ctrl+ [некоторая клавиша], в этом случае я буду использовать Ctrl+ W для удаления предыдущего слова в readline.
  3. Обратите внимание на поле «Юникод».
  4. Теперь сопоставьте вашу последовательность клавиш, используя inerm, предпочтения-> Ключи ->+ (последовательность приведена выше).
  5. Введите в поле «Сочетание клавиш» что-то вроде в этой ситуации Opt+ Backspace.
  6. Измените «Действие» на «Отправить шестнадцатеричный код».
  7. Введите в последнем поле ранее отмеченный гекс; в этом случае 23 / 0x17 .
  8. Нажмите «ОК», и ярлык должен теперь работать в окне терминала и работать в любой системе, где доступна readline.
0

Спасибо за вопрос. Была ли эта проблема с PuTTY на CentOS 7 и решена путем добавления этого в условное выражение $if mode=emacs :

# for PuTTY
"\e\e[C": forward-word
"\e\e[D": backward-word

Активировал настройку с помощью Ctrl + X, затем Ctrl + R

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .