🛠️

[Rust][bash][Ubuntu] Cargoのtab補完を設定する

に公開

Rust[1]cargoコマンド[2](とついでにrustupコマンド[3])のtab補完ができるようにする設定方法について説明します。
この方法はRustのWebドキュメントに直接記載はされていないので、公式情報のみでやり方を導出する方法もあわせて説明します。

なお、本ページでは「Ubuntu 24.04 LTS x bash」の環境を例に説明します。

まとめ

  • tab補完の設定

    mkdir -p ~/.local/share/bash-completion/completions/
    
    # rustup completion
    rustup completions bash > ~/.local/share/bash-completion/completions/rustup
    
    # cargo completion
    rustup completions bash cargo > ~/.local/share/bash-completion/completions/cargo
    
  • help

    rustup help completions
    # rustup completions --help # こちらでも同じ
    

【予備知識】rustupにtab補完スクリプト生成コマンドがある

Rustのツールチェインを管理するrustupコマンドには、rustupcargoそれぞれのtab補完(completion)スクリプトを生成するコマンドがあります:

rustup completions <SHELL> [COMMAND]

このコマンドを実行すると、tab補完のためのシェルスクリプト(コード文字列)が出力されます。

コマンドを実行しつつ出力をリダイレクトして、適切な場所にtab補完スクリプトファイルを作成する、という使い方をします。

コマンド詳細

<SHELL>に指定できるシェルは次のとおりです:

  • bash
  • elvish
  • fish
  • powershell
  • zsh

[COMMAND](省略可)に指定できるコマンドは次のとおりです:

  • rustup[COMMAND]を省略した場合のデフォルト値)
  • cargo

これらコマンド詳細は、以下のどちらかで確認できます:

  • helpサブコマンド:

    rustup help completions
    
  • completionsサブコマンドの--helpオプション

    rustup completions --help
    

【手順】tab補完を設定する

実際にrustupコマンドとcargoコマンドのtab補完を設定する手順を説明します。

bash-completionをインストールする

bash-completion[4]を導入していない場合は、インストールします。

bash-completionがインストール済みかどうかをdpkgコマンドで確認する

bash-completionがインストールされているかどうかをdpkgコマンドで確認します:

dpkg -l bash-completion

以下の出力例のように、「bash-completion」と書かれた行の左から2文字が「ii になっていれば、すでにbash-completionがインストールされています:

出力例(bash-completionインストール済み)
$ dpkg -l bash-completion
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name            Version      Architecture Description
+++-===============-============-============-==========================================
ii  bash-completion 1:2.11-8     all          programmable completion for the bash shell

もしインストール済みの場合は、次項は飛ばして「tab補完スクリプト配置用のディレクトリを作成する」項に進んでください。

bash-completionをaptコマンドでインストールする

bash-completionは、aptコマンドでインストールできます[5:1]

sudo apt update -y # リポジトリ情報の更新
sudo apt install -y bash-completion # bash-completionのインストール

aptによるインストールが完了したら、念のため前項「bash-completionがインストール済みかどうかをdpkgコマンドで確認する」の方法でインストール確認をしてください。

次に、bashログイン時に読み込まれる~/.bashrcファイルに、以下のbash-completionを有効にする設定[6]を、なければ追記してください:

~/.bashrc
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

最後に、bashからログアウト→再ログインして、~/.bashrcを読み込んでください。

bash-completionが有効になっていれば、例えば「apt h」と入力してtabキーを押すと、apt helpに補完されるはずです。

tab補完スクリプト配置用のディレクトリを作成する

このあとrustupcargoのtab補完スクリプトを作成しますが、これらスクリプトファイルを配置するディレクトリをあらかじめ作成しておきます:

mkdir -p ~/.local/share/bash-completion/completions/

なお、このディレクトリのパス「~/.local/share/bash-completion/completions/」については、「【補足】tab補完スクリプトファイルの配置ディレクトリの確認方法」項で説明しています。

tab補完スクリプトを作成する

rustupコマンドのtab補完スクリプトの作成

rustup completions bash > ~/.local/share/bash-completion/completions/rustup

# オプション[COMMAND]を明示した場合(挙動は同じ)
# rustup completions bash rustup > ~/.local/share/bash-completion/completions/rustup

cargoコマンドのtab補完スクリプトの作成

rustup completions bash cargo > ~/.local/share/bash-completion/completions/cargo

以上で完了です。

【補足】tab補完スクリプト生成コマンドの導き方

ここでは、そもそも「【予備知識】rustupにtab補完スクリプト生成コマンドがある」項の内容をどのように知る(辿り着く)のかについて説明します。

rustupの公式ドキュメント初っ端の「Installation」ページを見ると、末尾に「Enable tab completion for Bash, Fish, Zsh, or PowerShell」という項目があります:

https://rust-lang.github.io/rustup/installation/index.html#enable-tab-completion-for-bash-fish-zsh-or-powershell

ここで説明されているのは rustupコマンドのtab補完の設定方法であり、cargoのtab補完の設定方法は記載されていませんが、

See rustup help completions for full details, ...

の記載に従ってrustup help completionsコマンドを実行すると、以下のように「rustup completionsコマンドで、rustupコマンドとcargoコマンドのtab補完スクリプトが生成できる」ことがわかります:

出力例
$ rustup help completions
Generate tab-completion scripts for your shell

Usage: rustup[EXE] completions <SHELL> [COMMAND]

Arguments:
  <SHELL>    [possible values: bash, elvish, fish, powershell, zsh]
  [COMMAND]  [default: rustup] [possible values: rustup, cargo]

Options:
  -h, --help  Print help

Discussion:
...(中略)

    Cargo:

    Rustup can also generate a completion script for `cargo`. The script output
    by `rustup` will source the completion script distributed with your default
    toolchain. Not all shells are currently supported. Here are examples for
    the currently supported shells.

    Bash:

        $ rustup completions bash cargo >> ~/.local/share/bash-completion/completions/cargo

    Zsh:

        $ rustup completions zsh cargo > ~/.zfunc/_cargo

【補足】tab補完スクリプトファイルの配置ディレクトリの確認方法

tab補完スクリプトは、特定のディレクトリの中に、コマンド名と同じ名前のファイルとして設置することで効果を発揮する(=そのコマンドのtab補完が効く)ようになります。この「特定のディレクトリ」の場所の確認方法を説明します。

公式ドキュメントの案内に基づいた確認方法と、セットアップの動作内容を追っての確認方法の、2種類の方法を紹介します。

bash-completionのREADME.mdで確認する

bash-completionのREADME.md:

https://github.com/scop/bash-completion?tab=readme-ov-file#faq

には、以下の記載があります:

Q. Where should I install my own local completions?

A. Put them in the completions subdir of $BASH_COMPLETION_USER_DIR (defaults to $XDG_DATA_HOME/bash-completion or ~/.local/share/bash-completion if $XDG_DATA_HOME is not set) to have them loaded automatically on demand when the respective command is being completed. See also the next question's answer for considerations for these files' names, they apply here as well. Alternatively, you can write them directly in ~/.bash_completion which is loaded eagerly by our main script.

この記載と、rustupの公式ドキュメント「Installation」ページの「Enable tab completion for Bash, Fish, Zsh, or PowerShell」:

https://rust-lang.github.io/rustup/installation/index.html#enable-tab-completion-for-bash-fish-zsh-or-powershell

の、bash向けのrustupコマンドのtab補完スクリプトの作成方法:

# Bash
$ rustup completions bash > ~/.local/share/bash-completion/completions/rustup

をあわせて、「今回のtab補完スクリプトの配置ディレクトリは、『~/.local/share/bash-completion/completions/』でよいな」と結論付けます。

シェルにログイン時のセットアップスクリプトの内容を追って確認する

「Ubuntu 24.04 x bash」の場合、シェルにログインしたユーザー用のtab補完スクリプトの読み込み設定は、ファイル「~.bashrc」に記載されています:

~/.bashrc
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

上記より、ファイル「/usr/share/bash-completion/bash_completion」あるいはファイル「/etc/bash_completion」が参照されることがわかります。

次に、ファイル「/usr/share/bash-completion/bash_completion」の中身を見ると、2300行近くある中の最後の方(2200行辺り~)に、__load_completion()という関数定義があります:

/usr/share/bash-completion/bash_completion(該当部分のみ抽出)
# ...(中略)

__load_completion()
{
    local -a dirs=(${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions)
# ...(中略)

この行とその後のプログラムにて、「環境変数$XDG_DATA_HOMEがセットされていない場合は、『~/.local/share/bash-completion/completions/』ディレクトリ内のtab補完スクリプトファイルが参照される」という挙動であることがわかります。

bash-completionのREADME.mdの記載

これは、「bash-completionのREADME.mdで確認する」項にて引用・説明したように、bash-completionの公式ドキュメントにまさにそのまま記載があります:

Q. Where should I install my own local completions?

A. Put them in the completions subdir of $BASH_COMPLETION_USER_DIR (defaults to $XDG_DATA_HOME/bash-completion or ~/.local/share/bash-completion if $XDG_DATA_HOME is not set) to have them loaded automatically on demand when the respective command is being completed.(以下略)

したがって、「今回のtab補完スクリプトの配置ディレクトリは、『~/.local/share/bash-completion/completions/』でよいな」ということがわかります。

脚注
  1. https://www.rust-lang.org/ ↩︎

  2. The Cargo Book
    https://doc.rust-lang.org/cargo/ ↩︎

  3. rustup
    https://rustup.rs/ ↩︎

  4. scop/bash-completion(GitHub)
    https://github.com/scop/bash-completion ↩︎

  5. Versions for bash-completion(Repology.org)
    https://repology.org/project/bash-completion/versions ↩︎ ↩︎

  6. ↩︎

Discussion