Windows bash tab completion

How to enable TAB completion for the .NET CLI

This article applies to: вњ”пёЏ .NET Core 2.1 SDK and later versions

This article describes how to configure tab completion for four shells, PowerShell, Bash, zsh, and fish. For other shells, refer to their documentation on how to configure tab completion.

Once set up, tab completion for the .NET CLI is triggered by typing a dotnet command in the shell, and then pressing the TAB key. The current command line is sent to the dotnet complete command, and the results are processed by your shell. You can test the results without enabling tab completion by sending something directly to the dotnet complete command. For example:

If that command doesn’t work, make sure that .NET Core 2.0 SDK or above is installed. If it’s installed, but that command still doesn’t work, make sure that the dotnet command resolves to a version of .NET Core 2.0 SDK and above. Use the dotnet —version command to see what version of dotnet your current path is resolving to. For more information, see Select the .NET version to use.

Examples

Here are some examples of what tab completion provides:

Input becomes because
dotnet a⇥ dotnet add add is the first subcommand, alphabetically.
dotnet add p⇥ dotnet add —help Tab completion matches substrings and —help comes first alphabetically.
dotnet add p⇥⇥ dotnet add package Pressing tab a second time brings up the next suggestion.
dotnet add package Microsoft⇥ dotnet add package Microsoft.ApplicationInsights.Web Results are returned alphabetically.
dotnet remove reference ⇥ dotnet remove reference ..\..\src\OmniSharp.DotNet\OmniSharp.DotNet.csproj Tab completion is project file aware.

PowerShell

To add tab completion to PowerShell for the .NET CLI, create or edit the profile stored in the variable $PROFILE . For more information, see How to create your profile and Profiles and execution policy.

Add the following code to your profile:

To add tab completion to your bash shell for the .NET CLI, add the following code to your .bashrc file:

To add tab completion to your zsh shell for the .NET CLI, add the following code to your .zshrc file:

Включение заполнения клавишей TAB для .NET CLI How to enable TAB completion for the .NET CLI

Эта статья относится к следующему. ✔️ SDK для .NET Core 2.1 и более поздних версий This article applies to: ✔️ .NET Core 2.1 SDK and later versions

В этой статье описывается, как включить автодополнение клавишей TAB для четырех оболочек: PowerShell, Bash, zsh и fish. This article describes how to configure tab completion for four shells, PowerShell, Bash, zsh, and fish. Сведения о том, как настроить заполнение нажатием клавиши TAB в других оболочках, см. в соответствующей документации. For other shells, refer to their documentation on how to configure tab completion.

После настройки автодополнение можно активировать нажатием клавиши TAB для .NET CLI, введя в командной строке dotnet и нажав клавишу TAB. Once set up, tab completion for the .NET CLI is triggered by typing a dotnet command in the shell, and then pressing the TAB key. Текущая командная строка будет передана команде dotnet complete , а оболочка обработает результаты. The current command line is sent to the dotnet complete command, and the results are processed by your shell. Вы можете проверить результаты без активации автодополнения клавишей TAB, передав что-либо непосредственно команде dotnet complete . You can test the results without enabling tab completion by sending something directly to the dotnet complete command. Пример: For example:

Если команда не сработала, убедитесь, что установлен пакет SDK для .NET Core 2.0 или более поздней версии. If that command doesn’t work, make sure that .NET Core 2.0 SDK or above is installed. Если он установлен, но команда все равно не работает, проверьте, что команда dotnet разрешается как минимум в версию пакета SDK для .NET Core 2.0. If it’s installed, but that command still doesn’t work, make sure that the dotnet command resolves to a version of .NET Core 2.0 SDK and above. Воспользуйтесь командой dotnet —version , чтобы узнать, к которой версии dotnet указывает текущий путь. Use the dotnet —version command to see what version of dotnet your current path is resolving to. Дополнительные сведения см. в статье Выбор версии .NET для использования. For more information, see Select the .NET version to use.

Примеры Examples

Ниже приведено несколько примеров возможностей, которые предоставляет автодополнение клавишей TAB: Here are some examples of what tab completion provides:

Входные данные Input becomes becomes because because
dotnet a⇥ dotnet add add является первой подкомандой в алфавитном порядке. add is the first subcommand, alphabetically.
dotnet add p⇥ dotnet add —help При автодополнении клавишей TAB подстроки сопоставляются и первой по алфавиту является —help . Tab completion matches substrings and —help comes first alphabetically.
dotnet add p⇥⇥ dotnet add package После второго нажатия клавиши TAB подставляется следующее предложение. Pressing tab a second time brings up the next suggestion.
dotnet add package Microsoft⇥ dotnet add package Microsoft.ApplicationInsights.Web Результаты возвращаются в алфавитном порядке. Results are returned alphabetically.
dotnet remove reference ⇥ dotnet remove reference ..\..\src\OmniSharp.DotNet\OmniSharp.DotNet.csproj Автодополнение клавишей TAB зависит от файла проекта. Tab completion is project file aware.

PowerShell PowerShell

Чтобы добавить автодополнение клавишей TAB для .NET CLI в PowerShell, создайте или измените профиль, хранящийся в переменной $PROFILE . To add tab completion to PowerShell for the .NET CLI, create or edit the profile stored in the variable $PROFILE . Дополнительные сведения см. в разделах How to create your profile (Как создать свой профиль) и Profiles and execution policy (Профили и политика выполнения). For more information, see How to create your profile and Profiles and execution policy.

Добавьте в свой профиль представленный ниже код: Add the following code to your profile:

bash bash

Чтобы добавить автодополнение клавишей TAB для .NET CLI в bash, добавьте в свой файл .bashrc представленный ниже код: To add tab completion to your bash shell for the .NET CLI, add the following code to your .bashrc file:

zsh zsh

Чтобы добавить автодополнение клавишей TAB для .NET CLI в zsh, добавьте в свой файл .zshrc представленный ниже код: To add tab completion to your zsh shell for the .NET CLI, add the following code to your .zshrc file:

How does bash tab completion work?

I have been spending a lot of time in the shell lately and I’m wondering how the tab autocomplete works. What’s the mechanism behind it? How does the bash know the contents of every directory?

2 Answers 2

There are two parts to the autocompletion:

The readline library, as already mentioned by fixje, manages the command line editing, and calls back to bash when tab is pressed, to enable completion. Bash then gives (see next point) a list of possible completions, and readline inserts as much characters as are identified unambiguously by the characters already typed in. (You can configure the readline library quite much, see the section Command line editing of the Bash manual for details.)

Bash itself has the built-in complete to define a completion mechanism for individual commands. If for the current command nothing is defined, it used completion by file name (using opendir/readdir, as Ignacio said).

The part to define your own completions is described in the section Programmable Completion. In short, with complete «options» «command» you define the completion for some command. For example complete -u su says when completing an argument for the su command, search for users of the current system.

If this is more complicated than the normal options can cover (e.g. different completions depending on argument index, or depending on previous arguments), you can use -F function , which will then invoke a shell function to generate the list of possible completions. (This is used for example for the git completion, which is very complicated, depending on subcommand and sometimes on options given, and using sometimes names of branches (which are nothing bash knows about).

You can list the existing completions defined in your current bash environment using simply complete , to have an impression on what is possible. If you have the bash-completion package installed (or however it is named on your system), completions for a lot of commands are installed, and as Wrikken said, /etc/bash_completion contains a bash script which is then often executed at shell startup to configure this. Additional custom completion scripts may be placed in /etc/bash_completion.d ; those are all sourced from /etc/bash_completion .

Использование bash completion в командной строке, собственных скриптах и приложениях. Часть 2

Про bash completion на хабре я уже писал тут, и даже конце пообещал рассказать про настройку автодополнения для собственных скриптов.

Однако, прошло уже полтора года, а лично у меня до продолжения руки так и не дошли. Зато эту почетную обязанность взял на себя хабраюзер infthi, опубликую от его имени.

Рассматривать я буду модельную задачу, близкую к той, на которой я постигал азы автодополнений. Суть такова:

Есть скрипт, у которого есть три подкоманды. Одна из этих команд — work — в примере не рассматривается, у оставшихся есть следующие подкоманды. history делает import или export, каждой из этих команд надо передать имя проекта и пару значений под флагами. help может рассказать про work, history и help.

Теперь о том, как, собственно, работает автодополнение. Для баша пишется функция, которой передаются уже введенные аргументы, и на основе их она генерирует возможные варианты дополнения. Эта функция (назовём её _my_command) регистрируется для конкретной команды (в данном случае — мы исполняем скрипт названный script, поэтому регистрация идет для script) волшебной командой complete:

complete -F _my_command script

Теперь самое интересное — написание этой функции, обрабатывающей аргументы, и выдающей список доступных параметров.
Для начала, из man bash можно узнать о существовании специальных переменных для работы с автодополнением. Мы будем использовать следующие:

COMPREPLY
Это массив, из которого bash получает возможные дополнения.

COMP_WORDS
Это массив, содержащий уже введённые аргументы. Анализируя их, мы можем понять, какие варианты дополнения надо предлагать.

COMP_CWORD
Это — индекс в предыдущем массиве, который показывает позицию в нем аргумента, редактируемого в данный момент.

Теперь попробуем на основе этих переменных проанализировать ввод, и если вводится первый аргумент — попробовать его дополнить

если теперь мы запишем эту функцию вместе с приведенным выше вызовом complete в какой-нибудь скрипт, например ./complete.sh, выполним его в текущей консоли (лучше, конечно, для экспериментов запускать новый баш, а потом его убивать) как. ./complete sh, и, введя «script », нажмем Tab 2 раза, bash предложит нам варианты дополнения:

Соответственно, если начать вводить какую-то подкоманду, например wo и нажать Tab, то произойдёт автодополнение.

Однако я ещё не объяснил, как именно работает использованная в скрипте магия, а именно

Тут мы заполняем список возвращаемых вариантов с помощью встроенной утилиты bash compgen.

Данная утилита принимает на вход список всех возможных значений аргумента, а так же текущую введенную часть аргумента, и выбирает те значения, до которых введенную часть можно дополнить. Введенная часть аргумента передается после —, а со списком возможных значений всё интереснее. В приведенном случае, возможные значения берутся (как указывает флаг -W) и данного скрипту списка слов (т.е. в приведенном выше примере — из subcommands_1=«work history help»). Однако там можно указывать и другие флаги — например -d — и тогда compgen будет дополнять исходя из существующих на машине директорий, или -f — тогда он будет дополнять до файлов.

Можно посмотреть, что он выдаёт:

Соответственно можно генерировать различные списки кандидатов на автодополнение. Например, для решаемой задачи, нам (для импорта и экспорта истории) нужен список возможных проектов. В моём случае, каждому проекту соответствует директория в «$/projects», соответственно кандидатов можно подбирать как
COMPREPLY=($(compgen -W «`ls $/projects`» — $))

Таким образом, автодополнение работает просто: смотрим на аргументы, введённые до текущего, и исходя из соображений синтаксиса вызова нужной команды генерируем список возможных значений текущего аргумента. После чего список претендентов фильтруется по уже введенной части аргумента, и передается башу. Если претендент один, то баш его и подставляет. Всё просто.

В завершение — моя топорная реализация автодополнения для модели, указанной в начале:

Использование bash completion в командной строке, собственных скриптах и приложениях. Часть 1

Системный администратор — человек ленивый. Обычно он старается сделать максимум работы, приложив минимум усилий, а для этого зачастую требуется автоматизировать многие рутинные процедуры. Например — набор полных имен хостов при создании ssh-соединения, или же длинных аргументов некоторых команд 🙂

Сегодня я попробую рассказать про использование такого функционала шелла как bash completion.

Итак, почти любая оболочка по умолчанию умеет добавлять пути к файлам и директориям:

# mkdir very_long_dir_name
root@mould:

# cd ve[Tab]
root@mould:

bash (в моем случае) после нажатия клавиши Tab допишет имя диркетории (если его можно определить однозначно по первым набранным символам), или покажет варианты:

# ls .s[Tab]
.ssh/ .subversion/

Но при этом некоторые шеллы умеют дополнять не только пути, но и аргументы для ряда команд. Например:

# apt-get up[Tab]
update upgrade

Или даже более сложные конструкции:

# apt-get install bash-[Tab]
bash-builtins bash-completion bash-doc bash-minimal bash-static

За данный функционал в debain-based дистрибутивах (не могу ничего сказать про остальные) отвечает содержимое пакета bash-completion.
Для того, чтобы активировать возможности completion достаточно сделать следующее:

Или добавить такой вызов в ваш .bashrc файл, после чего перелогиниться:

if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi

Скорее всего это у вас уже написано, но закомментировано.
Попробуем начать использовать одно из самых часто требующихся комплишенов — дополнение имен хостов при доступе к ним по ssh.
Для начала потребуется отключить хеширование имен хостов в

/.ssh/known_hosts. При «коробочных» настройках строка в этом файле выглядит примерно так:

|1|yVV33HmBny6RPYWkUB5aW+TksqQ=|f11ZL/FI9/Krfw2bqN0tBJeeq4w= ssh-rsa AAAAB3Nz__много-много-символов__2bYw== ,

что нас не устроит.
После выставления значения HashKnownHosts No в конфиг-файле ssh-клиента (/etc/ssh/ssh_config или

/.ssh/config), и очистки .ssh/known_hosts (иначе в него будут добавляться правильный строки только для новых хостов) мы получим удобочитаемый вариант записи в known_hosts после первой попытки залогинтся на хост:

mould,11.22.33.44 ssh-rsa AAAAB3NzaC1y__много-много-символов__c2EAANq6/Ww== .

А это, в свою очередь, позволит использовать комплишен имен при установке ssh-соединения:

$ ssh mould[Tab]
mould mould01e

Если в вашем «подчинении» более 5-10 машин это будет весьма удобно.
И, кстати, дополнение заработает не только для ssh, а еще для ряда других программ: ping, traceroute, telnet, etc. И не только по hostname, а еще и по ip-адресу.

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

# my_test_script —[Tab]
—help —kill-all-humans —conquer-the-world

Читайте также:  Завершение работы windows кнопками
Оцените статью