zsh alias将子目录列表作为参数

zsh alias将子目录列表作为参数,zsh,zsh-completion,zsh-alias,Zsh,Zsh Completion,Zsh Alias,我的目标是键入clientair选项卡,并完成我的~/clients目录中的客户列表 由于希望我的客户机列表会增长,我不想再硬编码alias命令,而是使用将处理cd/Users/pjammer/clients部分的客户机,然后使用zsh奇迹般地显示该目录的ls,从而允许我自动完成目录中的目录名并直接转到那里 想法?警告,这是[某种程度的]宣传 我开发了一个插件,它可能实现了您所寻找的目标 主要的概念是diraction,一个强大的目录书签。 它是一个别名,使您能够跳转到附加的目录中,或在其上下文

我的目标是键入clientair选项卡,并完成我的~/clients目录中的客户列表

由于希望我的客户机列表会增长,我不想再硬编码alias命令,而是使用将处理cd/Users/pjammer/clients部分的客户机,然后使用zsh奇迹般地显示该目录的ls,从而允许我自动完成目录中的目录名并直接转到那里

想法?

警告,这是[某种程度的]宣传

我开发了一个插件,它可能实现了您所寻找的目标

主要的概念是diraction,一个强大的目录书签。 它是一个别名,使您能够跳转到附加的目录中,或在其上下文中执行某些操作

看看github.com/AdrieanKhisbe/diractions,它是上下文完成别名dir子路径中的一些


它最初是一个shell函数,后来发展成一个插件,并在某个时候完成。您还可以免费使用一个环境变量来引用命令中任何位置的目录,以及一个命令套件和配置系统来设置书签

对于这样的导航需求,我使用了一种简单但可能更通用的解决方案:我使用模糊选择工具(例如pick:)设置别名,但还有许多其他工具-fzf,c.f:

巧妙的技巧是将find的内容传递给fuzzy选择器工具,例如:

cd $(find ~/path/to/clients/ -maxdepth 1 -type d | pick )
然后,您可以在您的.rc中使用别名。我喜欢使用2个助记符来表示这些别名:

2cli='cd $(find ~/path/toclients/ -maxdepth 1-type d | pick) 
键入“2cli”将从任何起始位置将您cd到您选择的客户机

这种方法改变了我在shell中的核心导航。它有效地概括了shell中流行的vim插件命令-T。例如,在git中工作时,我使用以下别名更改分支:

alias gb='git checkout $(git branch -a | pick)'
另一个例子是打开和编辑某个src文件,您不太记得它的名称,它位于目录的最深处,但您也不太记得:

alias pf="find . \( ! -regex '.*/\..*' \) -type f | pick "
vim $(pf) 
在这里,pf别名“pick file”在调用cmd的目录中快速构建一个文件集合,不包括隐藏目录,并允许模糊选择要发送到stdout的文件名。将此别名与vim之类的编辑器结合使用,可以使用一个别名查找和打开选定的文件—这结合了查找、刻录和一次性打开文件的命令操作


需要明确的是,模糊选择工具在这里并不新鲜,它们在Go、Haskell、python、ruby等中有很多实现,每个都有自己的优点。我只是传递我的工作流/移动别名,我相信这些别名可以解决您的特殊需求,并提供一种通用的方法

我不会发布答案,因为这纯粹是宣传,但我开发了一个插件,它可能会达到你想要的程度。看一看,这是一些在上下文中完成的别名子路径,如果你不发布答案,我将获得数百万张选票!让堆栈溢出,但我会选择它。谢谢兄弟。你制作这个插件是因为它本身做的很奇怪,还是因为它不容易做这些事情?我当时给出了一个较长的答案。我首先为bash制作了它,但在我跳转时将它改编为zsh。就在最近,我获得了对subdir的完成支持,但这大大节省了时间。我仍然需要改进命令的上下文完成,但这是另一个故事如果这对你来说不是太多的工作,我希望你解释一下实现的主要步骤。关于完成还是插件?全局架构或实现步骤?关于实现,这是一个关于如何完成这种形式的更技术性的回答。请查看_mycmd文件。这些是zsh调用的compdef函数。以下是我使用的文档: