zsh 完成:从特定目录获取文件名

Mar*_*nks 12 osx zsh autocomplete

好的,一点背景知识:我使用 Mac,并且我尽可能在 CLI 中进行操作。

特别是,我经常弹出 U 盘cpmv文件,然后立即想弹出(卸载和断开连接)它。这通常可以通过几次按键来完成,除了卸载它,这需要(在 10.7 中)进入一个空的桌面空间(通常至少有两个空间),选择磁盘,然后按“command-e”。坦率地说,这个卸载过程是该过程中最耗时和最乏味的几个数量级。

简单地键入会更自然和有效,例如:

ej<tab> J<tab>
Run Code Online (Sandbox Code Playgroud)

假设我的 U 盘安装在 /Volumes/Jefferson。我希望从我的 6 次击键中得到以下信息:

eject /Volumes/Jefferson
Run Code Online (Sandbox Code Playgroud)

这应该运行命令:

diskutil unmount /Volumes/Jefferson
Run Code Online (Sandbox Code Playgroud)

所以,我写了一个不错的小函数:

eject() {
    diskutil unmount /Volumes/$1
}
Run Code Online (Sandbox Code Playgroud)

以及与之配套的完成功能:

compdef '_files -g "/Volumes/*"' eject  
Run Code Online (Sandbox Code Playgroud)

然而,这有一个问题。该_files函数生成完整路径。现在,我可以将“eject”函数中的行更改为diskutil unmount $1,然后一切正常,但是我无法键入挂载点名称的第一个字母,因为路径以 /Volumes/ 开头。例如,如果我输入J<tab,我将自动完成 PWD 中的文件。我将不得不键入/Volumes/J<tab>以获得所需的完成。

那么,是否有一个完成功能可以从预定义的特定位置获取文件名,而不是生成完整路径?

我真的很想把它减少到 6 次击键。

Gil*_*il' 15

_files -W /Volumes
Run Code Online (Sandbox Code Playgroud)

请参阅 的文档_path_files