Подтвердить что ты не робот

Получение "полного" и "полного меню" для совместной работы

Я узнал, что оболочка Bash поддерживает тип автозаполнения, который отличается от "традиционного" автозаполнения, где все возможности доступны в следующей строке.

С "традиционным" автозаполнением, если я наберу ch, а затем нажмите клавишу Tab, я получу что-то вроде:

$ ch
chacl  chgrp  chmod  chown  chvt

Но если я добавлю следующую строку в мой /etc/inputrc (который переназначает клавишу Tab во встроенную функцию menu-complete):

Tab: menu-complete

тогда изменяется поведение оболочки: слово, которое должно быть заполнено, заменяется "inline" на одно совпадение из списка возможных завершений, и если я снова нажимаю клавишу Tab, слово заменяется на следующее совпадение.

Я нашел это полезным, но я все же хотел сохранить традиционное автозаполнение и связать его с комбинацией клавиш Ctrl + Tab. Поэтому я добавил следующую строку в мой файл /etc/inputrc, в соответствии с тем, что предлагает документация библиотеки readline:

Ctrl-Tab: complete

Однако, добавление этой строки, похоже, делает как Tab, так и Ctrl-Tab вызов традиционной функции complete.

Кто-нибудь знает, что я делаю неправильно?

Спасибо заранее!

4b9b3361

Ответ 1

Начнем с того, что я не большой эксперт в этой области, но думаю, я могу ответить на ваш вопрос. Прежде всего, если вы используете Bash, Bash - это оболочка, которая интерпретирует команды клавиатуры, которые она получает с терминала/консоли. Пока вы сообщаете Bash, как реагировать на конкретные комбинации клавиш в файле inputrc, ваш терминал точно определяет, какой символ "отправляется" в оболочку, прежде чем файл inputrc даже войдет в уравнение.

К сожалению, в моей системе (предоставлено, это OSX - но я не думаю, что это странное поведение по сравнению с Linux), и Tab, и Ctrl-Tab отправляют тот же ввод клавиатуры в оболочку. Infact, как Tab, так и Ctrl-Tab отправить команду Ctrl-I в оболочку, и действительно, если я введу Ctrl-I при использовании терминала, он выполнит завершение, как если бы я нажал Tab.

Программное обеспечение (установленное на большинстве Linux-систем по умолчанию), showkey сообщит вам, какие клавиши получает оболочка, когда вы нажимаете определенные входы клавиатуры, когда вы их нажимаете.

В любом случае, мое предложение - использовать Shift-Tab, который, как представляется, отправляет собственный ключ-код в оболочку. Shift-Tab на моем компьютере отображается (с помощью showkey) как "<ESC> [Z", что, по моему мнению, довольно стандартно по всей доске. Таким образом, ваш файл inputrc со следующими связями должен позволить вам использовать Shift-Tab вместо Ctrl-Tab для достижения желаемого:

Tab: menu-complete
"\e[Z": complete

\ e во втором привязке представляет escape-символ, а [Z - это просто символы, как показано с помощью showkey. Вы можете получить аналогичный эффект на OSX, просто используя cat, бегущую кошку из терминала, и нажатие Shift-Tab покажет вам "^ [[Z", где ^ [представляет escape-символ, а остальные символы как раньше.

Я знаю, что это точно не решает ваш вопрос, но поскольку я не думаю, что вы можете использовать Ctrl-Tab как комбинацию клавиш, не перекрестно сопоставляя Ctrl-Tab с другим связыванием ключей внутри вашего терминала (более вероятно чтобы быть проще, если вы используете терминал GUI), это, вероятно, так близко, как вы можете получить без значительных усилий!

Ответ 2

Я не уверен, что Ctrl-Tab - настоящий персонаж; мой терминал, например, игнорирует комбинацию. Я думаю, что единственный способ использовать Ctrl-Tab - использовать эмулятор терминала для сопоставления его с какой-то неиспользуемой escape-последовательностью, а затем привязать эту последовательность к complete.

Ответ 3

У меня есть Shift Tab связанный с menu-complete-backward, поэтому он возвращается на один шаг, если я пропустил правильное завершение, и я сопоставил Ctrl q с complete, поэтому, если есть несколько возможных завершений я нажал Ctrl q, чтобы перечислить их, не выполняя их.

# Make Tab cycle between possible completions
# Cycle forward: Tab
# Cycle backward: Shift-Tab

TAB: menu-complete
"\e[Z": menu-complete-backward

# Make C-q display the list of possible completions

Control-q: complete

# Display the list of matches when no further completion is possible

set show-all-if-unmodified on