web-dev-qa-db-ja.com

zshの完了:特定のディレクトリからファイル名を取得する

OK、少し背景があります。私はMacを使用しており、CLIで可能な限り多くのことを行っています。

特に、私は頻繁にUSBスティック、ファイルをcpまたはmvでポップし、すぐにそれを取り出します(アンマウントして切断します)。これは通常、数回のキーストロークで実行できます。ただし、マウントを解除するには、(10.7では)空のデスクトップスペース(通常は少なくとも2スペース離れた場所)に移動し、ディスクを選択して、「command-e」を押す必要があります。率直に言って、このアンマウント手順は、数桁、プロセスの中で最も時間と手間がかかる部分です。

次のように入力するだけの方がはるかに自然で効率的です。

ej<tab> J<tab>

USBスティックが/ Volumes/Jeffersonにマウントされているとしましょう。 6回のキーストロークから得られると期待するものは次のとおりです。

eject /Volumes/Jefferson

これにより、次のコマンドが実行されます。

diskutil unmount /Volumes/Jefferson

だから、私は素敵な小さな関数を書きました:

eject() {
    diskutil unmount /Volumes/$1
}

そしてそれに伴う完了関数:

compdef '_files -g "/Volumes/*"' eject  

ただし、これには問題があります。 _files関数は完全なパスを生成します。これで、「eject」関数の行をdiskutil unmount $1に変更でき、問題はありませんが、パスが/ Volumes /で始まるため、マウントポイント名の最初の文字を入力できません。 。たとえば、J<tabと入力すると、PWD内のファイルのオートコンプリートが取得されます。目的の補完を取得するには、/Volumes/J<tab>と入力する必要があります。

それで、完全なパスを生成するのではなく、事前定義された特定の場所からファイル名を取得する完了関数はありますか?

これを6回のキーストロークに減らしたいと思います。

10
_files -W /Volumes

_path_files のドキュメントを参照してください。