我已经阅读了一些关于zsh完成的指南,但我仍然感到困惑.在我们的开发环境中,我们有一个名为的自定义Git命令git new-branch.我想zsh在输入just git ne和a 之后为我自动完成它Tab.我怎样才能做到这一点?
我试图编写一个将其他Shell实用程序包装到单个CLI中的Shell脚本实用程序,并试图使Shell完成在zsh和bash中工作。
例如,假设CLI名为util:
util aws [...args] #=> runs aws
util docker [...args] #=> runs docker
util terraform [...args] #=> runs terraform
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要的是zsh和bash补全中的一种方式,它能够独立于包装脚本的补全实现说“像其他命令Y一样完成此子命令X”。
就像是:
compdef 'util aws'='aws'
compdef 'util docker'='docker'
compdef 'util terraform'='terraform'
Run Code Online (Sandbox Code Playgroud)
扩展目标将是允许对另一个二进制文件中的子命令完成任意子命令:
util aws [...args] #=> completes against `aws`
util ecr [...args] #=> completes against `aws ecr`
Run Code Online (Sandbox Code Playgroud)
有可能吗?我一直在尝试模拟单个二进制文件的完成脚本,但是在编写其他完成脚本的方式上有很大的不同。
在 MacOS Big Sur 11.3 上,这是我的.zshrc. 我想获取最新的修改或创建靠近提示的文件和目录(从最新到最旧的排序)。这是我当前的配置~/.zshrc:
# ZSH completion
autoload -Uz compinit
compinit
# Colorize completions using default `ls` colors.
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
# Zsh reverse auto-completion
zmodload zsh/complist
bindkey '^[[Z' reverse-menu-complete
# To get new binaries into PATH
zstyle ':completion:*' rehash true
zstyle ':completion:*:complete:(ls):*' file-sort date reverse
zstyle ':completion:*:complete:(cd):*' file-sort date reverse
zstyle ':completion:*:complete:(cp):*' file-sort date reverse
zstyle ':completion:*:complete:(mv):*' file-sort date reverse
# Variables not very well known
# Disable prompt disappearing on …Run Code Online (Sandbox Code Playgroud) 我目前配置我的zsh选项卡完成:
autoload -U compinit && compinit
zstyle ':completion:*:default' menu select=0
zstyle ':completion:*:default' select-scroll 0
Run Code Online (Sandbox Code Playgroud)
我喜欢这个是:
我不喜欢的:
所以我想将行为改为:
一个关键的方面是在第一个插入提示之前显示歧义列表.否则我已经可以使用了
zstyle ':completion:*:default' menu select=0 yes=0
Run Code Online (Sandbox Code Playgroud) 我有一个 Git 别名update,我想为其配备分支名称完成功能。别名定义如下:
[alias]
update = "!f() { git push . origin/$1:$1; }; f"
Run Code Online (Sandbox Code Playgroud)
(它使用其上游版本更新本地跟踪分支,而无需检查该分支。不过,对于特定问题并不重要。)
我希望该命令为其$1参数补全现有的分支名称。我知道我可以定义一个调用_git-update来控制完成的函数,但是我缺少一些使其工作的部分:
_git-update ()
{
***some-function-here*** "$(__git_branch_names)"
}
Run Code Online (Sandbox Code Playgroud)
我正在使用安装在 OS X 上的完成brew install zsh-completions,这是在https://github.com/zsh-users/zsh-completions设置的。
(这个问题直接类似于/sf/answers/2891556601/,但针对 Zsh 而不是 Bash。)
我使用oh-my-zsh和git自动完成.
如果我输入git checkout org并点击TAB,我会得到以下结果:
Run Code Online (Sandbox Code Playgroud)ORIG_HEAD origin/HEAD origin/mybranch
如何使自动完成忽略ORIG_HEAD?
安装cheat(命令行中的命令备忘单)后,我尝试使用提供的 zsh 脚本启用自动完成功能。但是,我似乎没有找到脚本的正确位置。
cheat.zsh;~/.oh-my-zsh/custom/plugins/cheat/_cheat.zsh;plugins我的数组中~/.zshrc;键入时不会自动完成cheat d<TAB>。
那么在Linux上在哪里放置zsh自动完成脚本?
zsh很棒,但它的完成系统非常多样化.文档缺乏很好的例子.是否有用于完成特定应用程序的模板.完成将从文件中获取其匹配数据,由换行符分隔?
我尝试修改我的旧示例,将匹配数据"生效":
~ % cat .zsh/completers/_jazzup
#compdef jazz_up
_arguments "2: :(`mpc lsplaylists|sed -e 's# #\\\\ #g'`)"
Run Code Online (Sandbox Code Playgroud)
我可以cat my_file在那里提供而不是mpc调用等等但是有没有更优雅的方式来完成这个简单的任务?并且该完成具有特定于位置:您是否可以提供一个示例,其中zsh将在识别程序名称后的任何时刻尝试完成?
匹配数据将具有空格等等,完成应该逃避WS.例子:
Foo bar
Barbaric
Get it (42)
Run Code Online (Sandbox Code Playgroud)
现在,如果为命令配置完成Say,我们应该从以下方面获得这种行为zsh:
$ Say Fo<TAB>
$ Say Foo\ bar
$ Say Ge<TAB>
$ Say Get\ it\ \(42\)
Run Code Online (Sandbox Code Playgroud) 我已将 git 更新到其最新版本 (2.29.0) 并使用 ZSH 5.8。
我曾经在分支之间切换,git checkout remote_br<tab>以在分支之间快速切换,即使分支只是远程一个atm。我见过的git已经取得了很多关于开关/结账的变化最近,事情是我对远程分支机构的自动完成不工作了(与结账或交换机)。
我已经尝试将最新版本添加contrib/completion/git-completion.zsh到我的 zsh,但我仍然有我的问题。我在这里错过了什么吗?
我已经在网上搜索了很多小时,通宵达旦,因为我在这个兔子洞中迷失了:D,但我很难找到工作代码的示例。
我有一个 bash 脚本,其调用方式如下例所示:
foo-tools.sh switch <version number>
foo-tools.sh start
foo-tools.sh open-ports on
foo-tools.sh kube get logs
foo-tools.sh kube edit ing default-ingress -oyaml
Run Code Online (Sandbox Code Playgroud)
我使用 zsh 和 oh-my-zsh 作为我的 shell。
我希望能够输入“foo-tools.sh”来列出所有可用选项,并且我希望能够使用“foo-tools.sh k”自动完成选项,这意味着它应该列出以“foo”开头的所有可用选项-tools.sh k*" 或者如果只有一个选项自动完成命令。
我在一些 stackoverflow 线程上找到了这段代码,这是我让它完全工作的结束:
#compdef foo-tools.sh
_foo_tools_sh() {
typeset -A opt_args
local alternatives
alternatives=(
'args:rv options:_foo_tools_sh_options'
)
_alternative $alternatives && return 0
return 1
}
_foo_tools_sh_options() {
local -a arguments=(
'start:Start VP'
'stop:Stop VP]'
'kube:Kube CMD'
'kube logs:Kube logs'
'info:Display info'
'get:Get CMD'
)
_sequence _describe 'cmds' arguments …Run Code Online (Sandbox Code Playgroud)