Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Better shell completion

オープン
#90 コメント 1 件 リアクション 1 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
3/5
見積もり時間
1〜2日
初心者へのやさしさ
35/100
issue の種類
機能追加
明瞭さ
おおむね明確
活発さ
停滞
技術スタック
bash, dart, zsh
領域
cli

調査の方向性

Start in lib/src/installer/shell_completion_configuration.dart, especially the existing zsh completion generation linked in the issue, and compare it with the proposed standard script. The completed change should generate zsh completion files with the program directive and first-run behavior described, while preserving the existing completion command integration.

索引モデルが issue の本文から書いたものです。

説明

feature p3
Intro

In this issue I will explain how to automatically provide your CLI app's shell completions to your users in a seamless way.

I've been recently investigating how shell completion works, and various approaches to it. I decided to write my findings down to share knowledge with others, and to (hopefully) improve this package's documentation and functionality so that we can improve how shell completions are distributed for Dart CLI apps.

Intended audience: authors of CLI tools written in Dart that depend on cli_completion package

Description

That's how the original zsh completion script provided by this package looks like this. Let's assume our CLI app name is foobar and that we called foobar install-completion-files, which generates the following zsh shell completion script in ~/.config/.dart-cli-completion/foobar.zsh:

Original zsh completion file for "foobar"
if type compdef &>/dev/null; then
  _foobar_completion () {
    local reply
    local si=$IFS

    IFS=$'
' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" foobar completion -- "${words[@]}"))
    IFS=$si

    if [[ -z "$reply" ]]; then
        _path_files
    else
        _describe 'values' reply
    fi
  }
  compdef _foobar_completion foobar
fi

I modified the script above a bit to be a "standard" zsh completion script, that is:

  • it has #compdef <program_name> at the top -> #compdef foobar
  • it is named _<program_name> -> _foobar
  • it works well on "first run" (you don't have to click TAB twice to initalize it on first run, like it is now) (another description of this issue)
Modified zsh completion file for "foobar"
#compdef foobar

local reply
local si=$IFS

IFS=$'
'
reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" foobar completion -- "${words[@]}"))
IFS=$si

if [[ -z "$reply" ]]; then
    _path_files
else
    _describe 'values' reply
fi

Now I put that script to zsh's conventional location for shell completion scripts - in case of my macOS, it's /opt/homebrew/share/zsh/site-functions:

cp _foobar /opt/homebrew/share/zsh/site-functions

Restart zsh by running exec zsh and voilà, the completion for foobar should work now!

If it does not, make sure you're adding opt/homebrew/share/zsh/site-function to your $FPATH - see relevant docs.

Distribution

With the above in mind, I can easily write e.g. a Homebrew formula for my CLI tool, and inside that formula put shell completion installation files:

# excerpt from a hypothetical foobar.rb Formula

def install
  bin.install "foobar"
  bash_completion.install "autocomplete/bash_autocomplete" => "foobar"
  zsh_completion.install "autocomplete/zsh_autocomplete" => "_foobar"
end

Note that this automatic setup of completion files is only possible when your CLI app is installed through a proper package manager, like Homebrew or Pacman. If it is installed with dart pub global activate, the approach I described here won't work, because dart pub global activate only compiles the Dart source code to a JIT executable, and doesn't have any way of also copying files – which is required for automatical installation of shell completion.

But even if you prefer to install your Dart CLI app with dart pub global activate, you can distribute the completion scripts in different way – e.g. as an oh-my-zsh plugin – or you can just provide the completion script and tell your users "hey, install it at this-and-that path". I think it's much better than appending some code to ~/.zshrc or ~/.bashrc.

主要言語
Dart
スター
54
フォーク
6
平均マージ
6日 17時間
マージ済み PR(30日)
1

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

VeryGoodOpenSource/cli_completion のほかの issue

VeryGoodOpenSource/cli_completion の issue をすべて見る

似ている issue

Dart の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。