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


10

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

特に、USBスティックcpmvファイルを頻繁に差し込み、すぐに取り出し(アンマウントして切断)したいと思っています。これは通常、いくつかのキーストロークで実行できますが、マウントを解除するには(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回のキーストロークまで下げたいと思っています。

回答:


12
_files -W /Volumes

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


パーフェクト!それが組み込まれている必要があることはわかっていました。どうもありがとうございます。
マーシャルユーバンクス2013

それで、この完了関数をオートロードするにはどうすればよいですか?fpath compdefにあるファイル_ejectに行を入れてみました。オートロード行ありとなしで試してみました。私は補完関数に関するいくつかのガイドを見ましたが、誰もこのような実際の単純な例を実行する方法をカバーしていませんでした。
マーシャルユーバンクス2013

@marshaul #compdef ejectファイルの最初の行に、次に実際のコードを含める必要があります。マニュアルのオートロードされたファイルの下を参照してください。最初に行を追加しなかった場合は、キャッシュを削除して~/.zcompdumpzshを再起動する必要がある場合があります。
Gilles 'SO-悪をやめる'

ああ!削除~/.zcompdumpはトリックをしました。再度、感謝します!
マーシャルユーバンクス2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.