标签: zsh-completion

编写ZSH自动完成功能

我最近编写了一个方便的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)

zsh zsh-completion oh-my-zsh

3
推荐指数
1
解决办法
1956
查看次数

基于默认参数的函数的自定义zsh完成

如何根据现有的完成定义和默认参数设置函数的完成.

一个简化的例子(可以重写为别名):

gpl() {
    git pull origin $@
}
Run Code Online (Sandbox Code Playgroud)

这应该与之后完成相同git pull origin.

zsh zsh-completion

3
推荐指数
1
解决办法
422
查看次数

Zsh功能:向前完成到子功能

很多时候我最终会围绕现有函数编写包装函数,例如:

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完成我的功能glmake完成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 autocomplete bash-completion zsh-completion

3
推荐指数
1
解决办法
312
查看次数

为多个命令定义 ZSH 补全函数 (compdef)

我有一个名为的 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.

我该如何实现这一目标?

zsh zsh-completion

3
推荐指数
1
解决办法
2126
查看次数

如何在 zsh 中自定义当前选定(突出显示)完成的外观?

主要问题

我想在所选完成的开头和结尾添加电力线字符,如下所示:

  1. 通过插入c并按下键启动完成菜单TAB
  2. 按向右箭头键在完成菜单中向右移动。
  3. 按向下箭头键在完成菜单中向下移动。

有什么方法可以让 zsh 看起来/行为像图片中那样吗?

笔记

在创建列以保持对齐正确时,应以某种方式考虑在开头添加的电力线三角形 + 空白字符和末尾的空白字符 + 电力线三角形。

奖金

在列表中每个补全内容的开头添加 2 个空格,这样当选择补全内容时,文本看起来就不会移到右侧。
(这个问题可以通过比较有选择和没有选择的完成情况来看出。)


另类问题

如果不更改 zsh 源代码就无法实现先前解释的行为,是否至少可以在所选完成的末尾添加电力线三角形?


我不成功的尝试

  • 我尝试过在样式中使用lcrc和变量,但这没有帮助: eclist-colors
    1. 完成列表排列不当,造成了各种视觉问题。
    2. 符号被插入到完成列表的所有元素中,而不仅仅是选定的元素中。
  • 我也尝试过使用该ma变量,但无法在开头正确插入字符:
    1. 该变量只需要一个代表颜色的数字,并且它可能包含在一些转义序列中,因此输出看起来不像预期的那样。

zsh zshrc zsh-completion

3
推荐指数
1
解决办法
976
查看次数

macOS zsh 子命令的补全

我有一个名为 的脚本,,它需要一组有限的子命令。假设这个集合是(foo bar qux). 因此,以下是该脚本可接受的 CLI 调用:

  • , foo
  • , bar
  • , qux

(以上每一项都可以在右侧添加更多可选参数)。

该脚本在 macOS 上运行的最小zsh 完成代码是什么?这样,当我输入, 后跟时<TAB>,shell 将使用这三个选项自动完成:foo、bar 和 qux。

macos shell zsh zsh-completion

3
推荐指数
1
解决办法
594
查看次数

使用 ZSH 进行键绑定

谁能告诉我如何在 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)

......到达中间很痛苦!

zsh zsh-completion oh-my-zsh

2
推荐指数
1
解决办法
5809
查看次数

zsh 中“bat”的制表符补全时出现“未找到命令”

通常,当我对未定义完成的程序使用制表符完成时,它将默认完成文件。但是,使用该bat命令我得到如下所示的内容:

\n\n
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\n
zstyle \':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)

zsh zsh-completion

2
推荐指数
1
解决办法
4471
查看次数

Zsh 补全:如何查找用于特定命令补全的函数?

我正在为我编写的 shell 脚本/程序编写 zsh 补全函数。在完成过程中的某个时刻,我想使用另一个命令的完成功能来处理完成的其余部分。

如何找出特定命令的完成函数的调用方式?如何查找compdefshell 中现有的分配?

背景

我的程序换行nvim,并且我的 shell 中没有_nvim我猜想的函数是完成函数。所以我假设使用的完成函数nvim实际上是_vim,但这个问题更一般,以便学习。

zsh zsh-completion

2
推荐指数
1
解决办法
703
查看次数

如何配置 zsh 来完成部分单词,但不区分大小写?

目前我的~/.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(再次,如果存在的话)。

有办法让它发挥作用吗?

zsh zshrc zsh-completion

2
推荐指数
1
解决办法
1418
查看次数

zsh - 使用 autocd 完成第一个选项卡

我目前正在从 csh 切换到 zsh,我正在编写一个 .zshrc 试图获取我在这个新 shell 中习惯的所有选项。

我使用 autocd (进入一个目录,只需输入其名称(无需 cd 命令),我想知道我的第一个是否可能建议当前目录中存在的所有文件(就像它在 csh 中工作一样)。

我非常习惯这种方式,在输入我的命令之前,先按一下我可以打开的文件或我可以“autocd”进入的目录的概述,而无需在命令行中编写任何内容。

现在,当我第一次按下它时,它不会触发任何完成机制,但它只是写入一个实际的表格。

我还没有找到任何解决方案,如果有人有任何神奇的选择来获得这个结果,请随时启发我!

谢谢

zsh tab-completion zsh-completion completion

1
推荐指数
1
解决办法
2917
查看次数

kubectl 插件选项卡自动完成功能不适用于 zsh

在使用 zsh 的 Mac 中通过 homebrew 安装 kubernetes-cli 后,kubernetes 自动完成功能无法完全或完全运行。只有第一个选项卡有效,第二个选项卡之后的选项卡无效。例如,如果我输入kubectl [TAB],它会显示 的子命令kubectl,现在如果我选择一个子命令并按 [TAB],例如kubectl get [TAB],它会冻结很长时间,之后什么也不会发生。

我尝试了以下方法

  1. 通过 homebrew 安装 kubectl-cli
  2. 启用 zsh 插件
  3. 还添加了以下代码
    source <(kubectl completion zsh)
    autoload -Uz compinit
    compinit
    
    Run Code Online (Sandbox Code Playgroud)

zsh-completion oh-my-zsh kubectl

1
推荐指数
1
解决办法
3339
查看次数