web-dev-qa-db-ja.com

Zsh、ディレクトリタブ-プレフィックス付きの補完

すべてのプロジェクトを配置するディレクトリがあります。たとえば、~/projectsとしましょう。 sというコマンドを作成しました。このコマンドは、1つの引数を取り、そのディレクトリに移動します。例:s fooは私を~/projects/fooに移動します。

私が欲しいのは、cdのように機能する、ある種の完了コマンドを用意して、ヒットし続けることができるようにすることです。 tab さらに~/projects/...ディレクトリに移動します。

基本的に、cdには常に存在するプレフィックスが付いています。

man zshcompsysでzstyleの補完を調べましたが、正しく理解するのに十分な知識がないことに気づきました。

9
nifty

これが 私自身の.zshrc の例で、コピー/貼り付けスニペットとして保持しています。

# Try using the below template to set up zsh functions that act
# as aliases to cd and allow you to get autocomplete nicely.

project() { cd /path/to/project/$1; }
compctl -W /path/to/project/ -/ project

上記の両方の行の/path/to/projectセクションを編集するだけで、準備は完了です。

11

同様の効果を実現する別の方法は、ディレクトリのエイリアスを定義することです。

setopt auto_cd
alias -d s=~/projects

タイプ~s/ Tab~/projectsのサブディレクトリに変更します。コマンド引数で~sを使用することもできます。

名前付きディレクトリハッシュテーブルにエントリを直接追加できます。

hash -d s="${HOME}/projects"

これで、~sを使用してディレクトリを参照でき、cdコマンドでタブ補完を使用できます。cd〜s /Tab

Zshのautocdオプションが設定されている場合は、cdを省略できます。

1
wjv

CDPATHを変更できます。

export CDPATH="$CDPATH:$HOME/Repositories:$HOME/Repositories/jc/Projects"

これで、指定したディレクトリ内のすべてのサブディレクトリに、他のすべてのディレクトリから、現在のディレクトリのサブディレクトリであるかのようにアクセスできます。

➜  ~ /tmp
➜  /tmp pwd
/tmp
➜  /tmp MyAwesomeProject 
~/Repositories/jc/Projects/MyAwesomeProject
➜  MyAwesomeProject git:(master) pwd
/Users/rafael/Repositories/jc/Projects/MyAwesomeProject
➜  MyAwesomeProject git:(master)
0