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


10

好的,有一点背景知识:我使用的是Mac,并且在CLI中做了很多事情。

特别是,我经常弹出USB记忆棒cpmv文件,然后立即希望弹出(卸载和断开连接)它。通常,可以通过几次击键来完成操作,除了进行卸载外,这需要(在10.7中)进入一个空的桌面空间(通常至少两个空间),选择磁盘,然后按“ 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次击键。

Answers:


12
_files -W /Volumes

请参阅的文档_path_files


完善!我知道那是必须内置的。非常感谢!
马歇尔·尤班克斯

那么,如何获得自动加载此完成功能的信息?我尝试将compdef行放在_ejectfpath 中的文件中。我尝试了有没有自动加载线。我看了几本关于补全函数的指南,没有人讨论如何做一个像这样的真正简单的例子,并且我从他们的任何例子中都没有尝试过。
马歇尔·尤班克斯

@marshaul您需要#compdef eject将文件的第一行作为实际的代码。请参见手册中的“ 自动加载的文件 ”。如果最初没有添加该行,则可能需要删除其中的缓存~/.zcompdump并重新启动zsh。
吉尔斯(Gillles)“所以别再邪恶了”

啊!删除~/.zcompdump就可以了。再次感谢!
马歇尔·尤班克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.