[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
コマンドには、rustup
とcargo
それぞれの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]を導入していない場合は、インストールします。
dpkg
コマンドで確認する
bash-completionがインストール済みかどうかをbash-completionがインストールされているかどうかをdpkg
コマンドで確認します:
dpkg -l bash-completion
以下の出力例のように、「bash-completion」と書かれた行の左から2文字が「ii
」 になっていれば、すでに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補完スクリプト配置用のディレクトリを作成する」項に進んでください。
apt
コマンドでインストールする
bash-completionを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]を、なければ追記してください:
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補完スクリプト配置用のディレクトリを作成する
このあとrustup
とcargo
の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」という項目があります:
ここで説明されているのは 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:
には、以下の記載があります:
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」:
の、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」に記載されています:
# 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()
という関数定義があります:
# ...(中略)
__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/』でよいな」ということがわかります。
-
The Cargo Book
https://doc.rust-lang.org/cargo/ ↩︎ -
rustup
https://rustup.rs/ ↩︎ -
scop/bash-completion(GitHub)
https://github.com/scop/bash-completion ↩︎ -
Versions for bash-completion(Repology.org)
https://repology.org/project/bash-completion/versions ↩︎ ↩︎ -
- root/Debian/skel.bashrc(git.launchpad.net)
https://git.launchpad.net/ubuntu/+source/bash/tree/debian/skel.bashrc?h=ubuntu/noble - Add Bash Completion(debian.org)
https://wiki.debian.org/Add Bash Completion
- root/Debian/skel.bashrc(git.launchpad.net)
Discussion