我最近编写了一个方便的Zsh函数,它创建了一个没有参数的新tmux会话.如果提供了参数并且会话已经存在,则会附加它.否则,将使用提供的名称创建新会话.
# If the session is in the list of current tmux sessions, it is attached. Otherwise, a new session
# is created and attached with the argument as its name.
ta() {
# create the session if it doesn't already exist
tmux has-session -t $1 2>/dev/null
if [[ $? != 0 ]]; then
tmux new-session -d -s $1
fi
# if a tmux session is already attached, switch to the new session; otherwise, attach the new
# session
if …
Run Code Online (Sandbox Code Playgroud) 如何根据现有的完成定义和默认参数设置函数的完成.
一个简化的例子(可以重写为别名):
gpl() {
git pull origin $@
}
Run Code Online (Sandbox Code Playgroud)
这应该与之后完成相同git pull origin
.
很多时候我最终会围绕现有函数编写包装函数,例如:
function gl {
some_computed_stuff=...
git --no-pager log --reverse $some_computed_stuff "$@"
}
function m {
make "$@" && notify-send success || notify-send failed
}
Run Code Online (Sandbox Code Playgroud)
我知道别名保持自动完成,但有时需要函数,在这种情况下自动完成会丢失.例如,我想继续git log
完成我的功能gl
或make
完成m
.
我试图添加,compctl -K _git gl
但没有提出任何建议.它无论如何都行不通,因为我必须以某种方式找到如何log
为_git
自动完成脚本提供参数,所以我的问题是:
有没有办法让ZSH(还有bash)明白打字gl
是完全相同的git log
?像(仅适用于ZSH):
compctl 'git log' gl
compctl 'make' m
Run Code Online (Sandbox Code Playgroud) 我有一个名为的 ZSH 完成脚本
#compdef kubens
_arguments "1: :(- $(kubectl get namespaces -o=jsonpath='{range .items[*].metadata.name}{@}{"\n"}{end}'))"
Run Code Online (Sandbox Code Playgroud)
这提供了kubens
命令的完成。但是,如果用户提供特定的安装参数,则该程序将与kns
名称链接,因此我尝试使用相同的#compdef
.
我该如何实现这一目标?
我想在所选完成的开头和结尾添加电力线字符,如下所示:
c
并按下键启动完成菜单TAB
。有什么方法可以让 zsh 看起来/行为像图片中那样吗?
在创建列以保持对齐正确时,应以某种方式考虑在开头添加的电力线三角形 + 空白字符和末尾的空白字符 + 电力线三角形。
在列表中每个补全内容的开头添加 2 个空格,这样当选择补全内容时,文本看起来就不会移到右侧。
(这个问题可以通过比较有选择和没有选择的完成情况来看出。)
如果不更改 zsh 源代码就无法实现先前解释的行为,是否至少可以仅在所选完成的末尾添加电力线三角形?
lc
、rc
和变量,但这没有帮助:
ec
list-colors
ma
变量,但无法在开头正确插入字符:
我有一个名为 的脚本,
,它需要一组有限的子命令。假设这个集合是(foo bar qux)
. 因此,以下是该脚本可接受的 CLI 调用:
, foo
, bar
, qux
(以上每一项都可以在右侧添加更多可选参数)。
该脚本在 macOS 上运行的最小zsh 完成代码是什么?这样,当我输入,
后跟时<TAB>
,shell 将使用这三个选项自动完成:foo、bar 和 qux。
谁能告诉我如何在 ZSH 中移回一个单词?Ctrl+b将向后移动一个字符而不是整个单词。
例如像这样的日志命令:
knife zero bootstrap mbigglesworth@10.10.1.108 --sudo-preserve-home --ssh-user mbigglesworth --sudo --policy-name linux_mint_wkstn -N linuxmint-vm -VV
Run Code Online (Sandbox Code Playgroud)
......到达中间很痛苦!
通常,当我对未定义完成的程序使用制表符完成时,它将默认完成文件。但是,使用该bat
命令我得到如下所示的内容:
1010 \xe2\xae\x9a bat (eval):1: command not found: _bat\n(eval):1: command not found: _bat\n(eval):1: command not found: _bat\n(eval):1: command not found: _bat\nbat\n
Run Code Online (Sandbox Code Playgroud)\n\n我怎样才能像其他程序一样完成文件?
\n\n我的 zsh 配置的相关部分:
\n\nzstyle \':completion:*\' completer _expand _complete _ignored\nzstyle \':completion:*\' format \'%F{blue}%d%f\'\nzstyle \':completion:*:descriptions\' format \'%U%F{cyan}%d%f%u\'\nzstyle \':completion:*\' menu select yes interactive\nzstyle \':completion:*\' select-prompt %SAt %p%s\nzstyle \':completion:*\' group-name \'\'\nzstyle \':completion:*\' use-cache on\nzstyle \':completion:*\' cache-path ~/.cache/zsh\neval "$(dircolors -b)"\nzstyle \':completion:*:default\' list-colors ${(s.:.)LS_COLORS}\nzstyle \':completion:*\' list-colors\nzstyle \':completion:*\' matcher-list \'\' \'m:{[:lower:]}={[:upper:]}\' \'r:|[._-]=* r:|=*\' \'l:|=* r:|=*\'\nzstyle \':completion:*\' max-errors 2 numeric\nzstyle …
Run Code Online (Sandbox Code Playgroud) 我正在为我编写的 shell 脚本/程序编写 zsh 补全函数。在完成过程中的某个时刻,我想使用另一个命令的完成功能来处理完成的其余部分。
如何找出特定命令的完成函数的调用方式?如何查找compdef
shell 中现有的分配?
我的程序换行nvim
,并且我的 shell 中没有_nvim
我猜想的函数是完成函数。所以我假设使用的完成函数nvim
实际上是_vim
,但这个问题更一般,以便学习。
目前我的~/.zshrc
:
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
Run Code Online (Sandbox Code Playgroud)
AFAIU'm:{a-z}={A-Za-z}'
意味着我将获得不区分大小写的制表符完成,例如foo
将制表符完成到Foobar
(如果存在)。并且'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
意味着我将获得单词后面部分的匹配项,例如bar
将制表符补全到foobar
(如果存在)。但这些部分匹配并非不区分大小写。因此,例如bar
,不会使用制表符完成FooBar
(再次,如果存在的话)。
有办法让它发挥作用吗?
我目前正在从 csh 切换到 zsh,我正在编写一个 .zshrc 试图获取我在这个新 shell 中习惯的所有选项。
我使用 autocd (进入一个目录,只需输入其名称(无需 cd 命令),我想知道我的第一个是否可能建议当前目录中存在的所有文件(就像它在 csh 中工作一样)。
我非常习惯这种方式,在输入我的命令之前,先按一下我可以打开的文件或我可以“autocd”进入的目录的概述,而无需在命令行中编写任何内容。
现在,当我第一次按下它时,它不会触发任何完成机制,但它只是写入一个实际的表格。
我还没有找到任何解决方案,如果有人有任何神奇的选择来获得这个结果,请随时启发我!
谢谢
在使用 zsh 的 Mac 中通过 homebrew 安装 kubernetes-cli 后,kubernetes 自动完成功能无法完全或完全运行。只有第一个选项卡有效,第二个选项卡之后的选项卡无效。例如,如果我输入kubectl [TAB]
,它会显示 的子命令kubectl
,现在如果我选择一个子命令并按 [TAB],例如kubectl get [TAB]
,它会冻结很长时间,之后什么也不会发生。
我尝试了以下方法
source <(kubectl completion zsh)
autoload -Uz compinit
compinit
Run Code Online (Sandbox Code Playgroud)
zsh-completion ×12
zsh ×11
oh-my-zsh ×3
zshrc ×2
autocomplete ×1
completion ×1
kubectl ×1
macos ×1
shell ×1