Автозавершение для приложений сделано оболочкой?

Разработка не является первой вещью, которая приходит на ум при установке ОС. Выполнение так просто отогнало бы многообещающих новых пользователей от сообщества Linux. Фокус был бы определенно при получении рабочей системы, работающей сразу же и затем других требований, характерных для пользователя.

2
10.09.2014, 06:20
1 ответ

Бежит в снаряде

Здесь два отдельных вопроса:

Где выполнено завершение , и
. К какому другому программному компоненту он принадлежит .

Реализация завершения тесно взаимодействует с редактором командной строки, который является частью оболочки; в основном нужно, чтобы работал в оболочке.

Большая часть завершения реализована в большинстве shell'ов в виде функций shell;

Отдельный пакет

Вы спрашивали, является ли он каким-то образом частью приложения или частью shell'а;
. На практике она не первая и не вторая, а независимая.

Большинство завершений под Ubuntu находятся в отдельном пакете bash-completion, большую коллекцию завершений, которые можно было бы ожидать.
Не является частью бэша, но управляется и выпускается самостоятельно.

Код

Давайте посмотрим на ваш пример завершения для evince:

$ apt-file list bash-completion | grep evince
bash-completion: /usr/share/bash-completion/completions/evince
$ ls -l /usr/share/bash-completion/completions/evince
-rw-r--r-- 1 root root 967 Apr  7 16:10 /usr/share/bash-completion/completions/evince

Интересно! Нам не нужно было искать что-то общее, например, завершение для PDF-просмотрщиков, но мы нашли что-то непосредственно связанное с evince.

Файл содержит реализацию функции оболочки; часть его состоит из строковых констант, описывающих, как evince может быть использовано в командной строке - это наиболее интересные части /usr/share/bash-completion/completions/evince :

_evince() {
    [  ...  ]
    case $prev in --gdk-no-debug|--gtk-module|--gtk-debug|--gtk-no-debug|\
        -p|--page-label|-i|--page-index|-l|--find|--display)
    [  ...  ]
    _filedir '@(@(?(e)ps|?(E)PS|[pf]df|[PF]DF[...]|bmp|xpm|ico|xwd|tga|pcx)'
    [  ...  ]

Она описывает общие опции, такие как --gtk-debug, опции специфики приложения, такие как --page-label, и перечисляет расширения имен файлов, которые могут быть обработаны с помощью evince, такие как .eps и .pdf.

Hands on

Можно показать функции, определенные в текущей оболочке со встроенным объявлением. Если вы попробуете это сделать в новой оболочке, вы получите сообщение об ошибке:

$ declare -f -p _evince
bash: declare: _evince: not found

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

Чтобы загрузить функцию, мы пытаемся использовать ее, используя завершение evince. Наведя курсор на позицию |, нажмите клавишу Tab;

$ evince -|<TAB>

Может быть показано некоторое завершение. Теперь функция должна быть загружена, и выглядеть, как в файле выше, если мы распечатаем ее:

$ declare -f -p _evince

Чтобы перечислить все имена функций, или увидеть все функции, которые в данный момент загружены - включая те, которые не связаны с завершением, используйте:

$ declare -F | less
$ declare -f | less
2
27.01.2020, 22:13

Теги

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