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

Я обнаружил, что оболочка 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.

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

Заранее спасибо!


person kYuZz    schedule 20.08.2012    source источник
comment
В системе, которая у меня есть под рукой, man readline предполагает, что аббревиатура для Control будет C, а не Ctrl. (Отказ от ответственности: я не тестировал.)   -  person ruakh    schedule 21.08.2012


Ответы (5)


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

К сожалению, в моей системе (правда, это OSX, но я не думаю, что это странное поведение по сравнению с Linux) и Tab, и Ctrl-Tab отправляют одно и то же ввод с клавиатуры в оболочку. Фактически, и 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, запустив cat из терминала и нажав Shift-Tab, вы увидите "^[[Z", где ^[ представляет escape-символ, а другие персонажи прежние.

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

person John Wordsworth    schedule 20.08.2012
comment
Давайте представим, что вы используете cd и menu-complete и циклически перебираете каталоги. Какую клавишу вы нажимаете, чтобы выбрать этот каталог и начать прокручивать содержимое этого каталога? Есть ли что-то еще, чтобы установить/привязать? - person Tony; 30.07.2016
comment
@Tony Для этого я использую стрелку вправо. То же, что и в vim. - person Bruno Bronosky; 05.03.2019

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

# 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

Изменить: Ctrlq по умолчанию привязан к quoted-insert, то есть указывает оболочке воспринимать следующую клавишу буквально. quoted-insert также привязан к Ctrlv, поэтому вы не потеряете эту функциональность, если повторно привяжете Ctrlq. Во всяком случае, я обнаружил, что AltESC также работает по умолчанию для отображения возможных завершений (насколько я могу судить, это эквивалентно TAB< /кбд>); обратите внимание, что он может быть захвачен Gnome, затем либо дважды нажмите ESC, либо перепривяжите «Переключить окна напрямую» в «Настройки» → «Устройства» → «Клавиатура» → «Навигация».

person Arch Stanton    schedule 26.11.2017
comment
В ~/.bash_profile используйте: bind TAB:menu-complete и bind '"\e[Z": menu-complete-backward' (обратите внимание на использование одинарных и двойных кавычек!). - person Erik; 21.09.2018

Следующее должно достичь того, что вы ищете (если я правильно понимаю!)

В вашем .inputrc

# display all possible matches for an ambiguous pattern at first tab
set show-all-if-ambiguous on

# next tab(s) will cycle through matches
TAB: menu-complete
# shift tab cycles backward
"\e[Z": menu-complete-backward
person Tate Thurston    schedule 07.08.2018

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

person chepner    schedule 20.08.2012

С чего начать, если вы можете или не можете это сделать, зависит от вашей клавиатуры и ваших драйверов, и нет единого ответа на все вопросы. Каждое нажатие и отпускание клавиши генерирует упорядоченную пару клавиш (нажатие и отпускание) (скан-код), эти коды затем преобразуются ядром в коды клавиш, например, на клавиатуре моего ноутбука 0x3a 0xba преобразуются в код клавиши 15 (вниз и вверх), затем переведены в действия, такие как буква возврата c a / вы можете назначать действия символам клавиш, используя код клавиши / шестнадцатеричный / двоичный / восьмеричный код, какие коды соответствуют каким буквам, определяется таблицей перевода ядра, которая достаточно стандартизирована, однако сигнал первой части, который переведен в коды клавиш отличаются для большинства клавиатур.

Продолжая предыдущий пример, для меня вкладка Shift (а также Alt и Control и любая комбинация) создает код клавиши 15, однако в шестнадцатеричном формате он создает 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a, и это потому, что Shift Alt и Control являются специальными клавишами (модификаторы ) они умножаются на коды клавиш и заполняют таблицу дампов. Ядро также ограничено количеством назначений, это определяется вашим выбором раскладки клавиш и разделяет ресурсы с цветами вашего терминала (если ваш набор символов определен выше порога, он ограничивает диапазон цветов вашего терминала). И все это уходит в окно, если вы используете xserver и имеете совершенно новую систему. Большинство из этих вещей могут быть изменены, модифицированы и манипулированы пользователем и установленными программами. Моя точка зрения на все это состоит в том, чтобы подчеркнуть, что нет универсального способа сопоставления клавиши табуляции, и она будет менять драйверы клавиатуры на драйверы kbd (теперь, если вы найдете решение, которое отлично работает для вас :)), но шансы это не будет переносимым и может не работать, если вы поменяете клавиатуру и не сможете переводить между xserver и tui. Что я рекомендую, так это изучить шаги по изменению вашего kbd на ходу.

will give you the decimal octal hex notation for a key press on the same line

--full-table -1 >> keytable 

предоставит вам задокументированный полный список сочетаний кодов клавиш и символов клавиш в формате, который даст вам лучшее представление о вашем макете, и оттуда вы можете либо использовать loadkey для изменения значения ключей, либо добавить запись в .inputrc или ваш основной rc-файл. Вы также можете создать собственный файл key.map. Дальнейшая трансляция управляющей последовательности определяется переменной $TERM, и каждый эмулятор виртуального терминала может быть разным.

infocmp "$TERM"

даст вам список ваших терминальных escape-последовательностей

Ресурсы:

https://man7.org/linux/man-pages/man4/console_codes.4.html

https://www.gnu.org/software/screen/manual/html_node/Input-Translation.html

http://kbd-project.org/docs/scancodes/scancodes.html

https://www.vt100.net/

Итак, подведем итоги. Ваши драйверы клавиатуры Ваш выбор kemap Ваш эмулятор виртуального терминала и ваше ядро ​​образуют основу для переназначения сложных клавиш (tab/s-tab/a-tab)

person rayiik    schedule 29.12.2020