Автодополнение Bash не работает после определенной команды

Автодополнение Bash не работает после определенной команды

Я использую graphViz под bash / Cygwin, но почему-то при его вызове автозаполнение bash tab ничего не делает.

Примеры файлов:

  • myGraph.graphvizэто входной файл
  • myGraph.graphviz.pngдолжен быть выходной файл.

Команда для создания графики:

dot -T png -o myGraph.graphviz.png myGraph.graphviz

Конечно, я хочу внести свой вклад.

точка -T png -o мой Tab.png мойTab

для автодополнения этих имен файлов, но ничего не происходит! Я могу ввести и он выдает , но почему он не работает после ? Нужен ли bash дополнительный модуль автодополнения для каждой команды, которую я могу ввести?cat myTabcat myGraph.graphvizdot

решение1

Я создал файлы примеров в своем Debian. Действительно, не работает. Затем (после завершения вручную) тоже не работает. Есть две отдельные проблемы.dot -T png -o myTabdot -T png -o myGraph.graphviz.png myTab


Общее руководстводля программ Graphviz указывается:

-ooutfile
Записать вывод в файлвыходнойфайл. […]

Автодополнение Bash в моем Debian подчиняется этому буквально: оно поддерживает , а не . Даже если последнее работает с (и я этого не знаю), автодополнение его не поддерживает. Вам следует действовать следующим образом:-ooutfile-o outfiledot

точка -T png -omyTab

без пробела после -o. В моих тестах выше работает.


Чтобы сделать вторую Tabработу, я проверил /usr/share/bash-completion/completions/dot. Соответствующая строка ближе к концу:

_filedir dot

Это предложит вам каталоги, в которые можно спуститься, и файлы, которые можно указать, но только файлы с именами, заканчивающимися на .dotили .DOT. Вероятно, вы можетевручнуюукажите файл, не соответствующий этому шаблону, и ничего плохого не произойдет, однако если вы полагаетесь на механизм завершения, то имя файла должно заканчиваться правильно.

На самом деле я вообще не знаю dot, я немного знаю дополнения Bash. Может быть, требование не имеет смысла, и дополнение for dotбыло бы полезнее, если бы оно позволялолюбойфайл. В таком случае я копирую исходный файл /etc/bash_completion.d/и изменяю копию, так что строка

_filedir dot

в конце функция становится

_filedir

Это общесистемное изменение. Изменение не повлияет на существующие оболочки, поэтому запустите новую, bashчтобы протестировать ее. Если вы не можете (или не хотите) вносить изменения, /etc/bash_completion.d/см.этот ответ. Он предоставляет возможность иметь свой личный (специфичный для пользователя) bash_completion.d/.

Обратите внимание, что это изменение позволит вам печатать, и автодополнение будет работать. Однако в этом конкретном случае это не имеет никакого отношения к внутреннему, это общее автодополнение для операндов, и оно будет работать даже после какой-то неожиданной или недопустимой опции (например, ).dot -T png -o myTab-odot -T png -: myTab

решение2

Это может произойти, если в системе есть другая dotкоманда, для которой установлено реальное определение автозаполнения, и эта команда не ожидает файл в этой точке. Вы получаете автозаполнение файла для всех параметров по умолчанию для неизвестных команд, но определенные команды могут устанавливать свое собственное определенное автозаполнение. Проверьте /etc/bash_completionи /etc/bash_completion.d/.

PS: Другое объяснение заключается в том, что dotскрипт автодополнения не соответствует документу или вы допустили ошибку в своих аргументах.

Связанный контент