标签: zsh-completion

Zsh自动完成功能基于2个参数

我有这样的功能:

p() { cd ~/Clients/$1/Projects/$2; }
Run Code Online (Sandbox Code Playgroud)

然后我可以输入:

p "Client here" "Project here"
Run Code Online (Sandbox Code Playgroud)

它需要我:

~/Clients/Client here/Projects/Project here
Run Code Online (Sandbox Code Playgroud)

这里没什么特别的.但是如何为此功能实现自动完成?我设法为第一个参数(客户端)获得自动完成工作:

_p() { _files -W ~/Clients -/; }
compdef _p p
Run Code Online (Sandbox Code Playgroud)

但是如何自动完成第二个参数(项目)呢?它需要从基于客户端的文件夹中自动完成:

~/Clients/$1/Projects
Run Code Online (Sandbox Code Playgroud)

希望有人可以帮忙!:-)

terminal zsh zsh-completion

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

在zsh中使用bash complete -C

zsh bash完成支持complete -C 'custom command for completion' command吗?


我以前在脚本中编写了一个bash完成函数,我启用了它

complete -C 'tu --get-bash-completion' tu
Run Code Online (Sandbox Code Playgroud)

我希望使用zsh的同事能够使用完成,所以我尝试使用这样的.zshrc文件测试bash完成兼容性:

autoload compinit
compinit
autoload bashcompinit
bashcompinit
complete -C 'tu --get-bash-completion' tu
Run Code Online (Sandbox Code Playgroud)

当我尝试使用此完成时,看起来zsh正在调用完成脚本而没有bash调用它的参数(firstword,current_word,previous_word).

tom-mba:~ tomb$ zsh
tom-mba% tu Traceback (most recent call last):
  File "/usr/local/bin/tu", line 7, in <module>
    execfile(__file__)
  File "/Users/tomb/Dropbox/code/TrelloCardUpdate/bin/tu", line 3, in <module>
    cli.CLI()
  File "/Users/tomb/Dropbox/code/TrelloCardUpdate/trellocardupdate/cli.py", line 156, in CLI
    getcompletion(sys.argv[i+1:i+4])
  File "/Users/tomb/Dropbox/code/TrelloCardUpdate/trellocardupdate/cli.py", line 86, in getcompletion
    assert len(args) == 3, [args, sys.argv]
AssertionError: [[], ['/usr/local/bin/tu', '--get-bash-completion']]
Run Code Online (Sandbox Code Playgroud)

我在mac上使用自制软件安装的zsh:

tom-mba:~ tomb$ zsh …
Run Code Online (Sandbox Code Playgroud)

bash zsh zsh-completion

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

为什么zsh完成适用于VBoxManage但不适用于vboxmanage?

我在arch linux上安装了zsh-completions.VBoxManage命令的完成似乎工作正常,但vboxmanage没有(即只是简单完成本地目录中的文件).这两个VBoxManagevboxmanage是符号链接到VBox可执行文件.

我的_virtualbox完成定义似乎有第一行

#compdef VBoxManage=vboxmanage VBoxHeadless=vboxheadless
Run Code Online (Sandbox Code Playgroud)

看起来像某种别名?但它不起作用.

我有一个修复方法是将上面的行更改为

#compdef VBoxManage=vboxmanage vboxmanage=vboxmanage VBoxHeadless=vboxheadless vboxheadless=vboxheadless
Run Code Online (Sandbox Code Playgroud)

这看起来很啰嗦,有一个指定模式的选项,但是这样命名别名的正确方法是什么?

zsh zsh-completion

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

ubuntu 14.04 apt/aptitude autocompletion与oh-my-zsh无法正常工作

我最近开始在Ubuntu 14.04服务器中使用zsh和oh-my-zsh.问题是debian插件的自动完成不起作用,即

ai something<TAB>
Run Code Online (Sandbox Code Playgroud)

不自动完成.当然

aptitude install somethi<TAB>
apt-get install somethi<TAB>
Run Code Online (Sandbox Code Playgroud)

做得对.oh-my-zsh的git插件也没有任何问题.

所以我开始怀疑是否有人能解决这个问题.

如果有人需要更多信息,这里有一些相关的包:

?  aps zsh completion
p   bash-completion                                           - programmable completion for the bash shell
v   bash-completion:i386                                      -
p   fatrat-czshare                                            - fatrat plugin allowing download and upload to czshare
p   fatrat-czshare:i386                                       - fatrat plugin allowing download and upload to czshare
p   fizsh                                                     - Friendly Interactive ZSHell
v   git-completion                                            -
v   git-completion:i386                                       -
v   ncmpcpp-completion                                        -
v   ncmpcpp-completion:i386                                   -
i   zsh                                                       - shell with lots of features
p   zsh:i386 …
Run Code Online (Sandbox Code Playgroud)

ubuntu zsh autocomplete zsh-completion oh-my-zsh

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

如何在 oh-my-zsh 下强制完成文件名?

问题:

有时,当我尝试在 zsh 中执行操作时,它不会完成我想要的文件名,因为它们不适用于当前上下文。两个例子:

  1. 我想强制添加一个当前在 hg 或 git 中被忽略的文件。oh-my-zsh 试图通过仅完成未被忽略的文件来帮助我,但在这种情况下,这是一个障碍。我被迫手动输入文件的完整路径。
  2. 我想用来git diff比较硬盘上的两个任意文件。这些文件不驻留在任何存储库中,但谁在乎?!git diff --no-index是区分任意两个文件的好方法。但是因为它们不在 repo 中,所以 zsh 不会完成它们。

建议的解决方案:

可以简单地编辑源代码控制上下文来完成所有文件名,而不管它们的源代码控制状态如何。但是有几个限制:

  1. 我不知道该怎么做。
  2. 有一个“逃生舱口”可能会很好,无论上下文如何,我都可以强制完成文件。

所以,我决定改为绑定一个快捷键来强制正常的、上下文无关的文件完成。

到目前为止我所拥有的:

Zsh 显然有一种简单的方法可以做到这一点,如本问题所述。所以我在我的中添加了以下几行.zshrc

zle -C complete complete-word complete-files
bindkey '^[[Z' complete
complete-files () { compadd - $PREFIX* }
Run Code Online (Sandbox Code Playgroud)

这会导致shift-tab启动文件完成。它在标准 zsh 中运行良好!但是嘘,由于某种原因,当我获取 oh-my-zsh 时它不起作用。:-(

那么有没有办法让它与 oh-my-zsh 一起工作,或者是否有我可能会觉得满意的替代解决方案?

zsh autocomplete zsh-completion oh-my-zsh

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

Zsh:如何在一组字符后强制在所有位置完成文件?

我试图弄清楚如何word在一组字符之后使文件完成在命令行上的任何位置都能工作。如外壳中所列,这些字符将是[ =+-\'\"()](空格是制表符和空格)。Zsh会执行此操作,但仅在反引号'`'或之后$(。mksh会执行此操作,除非不在字符后面[+-]

通过命令行中的单词位置,我说的是您键入的每组字符,这些字符由空格和其他几个字符分隔。例如,

print Hello World

有三个words在1-3位。在位置1,当您第一次输入内容时,补全非常完美。我提到的所有字符都可以完成文件补全。在第一个之后word,完成系统由于具有智能性而受到更大的限制。这对命令很有用,但是限制可以完成文件的位置并不是特别有用。

以下是一些文件补全对我不起作用,但我认为应该这样做的示例:

: ${a:=/...}

echo "${a:-/...}"

make LDFLAGS+='-nostdlib /.../crt1.o /.../crti.o ...'

env a=/... b=/... ...

我已经看过'^I'Zsh随附的少数不同补全小部件和更改zstyle ':completion:*'行的重新绑定(选项卡)。到目前为止,没有任何事情可以更改此默认的Zsh行为。我在想我需要创建一个完成函数,可以将其添加到zstyle ':completion:*' completer ...行尾作为最后的完成。

在完成功能中,一种方法是切出word我要完成的电流,完成它,然后在可能的情况下将完成重新插入到行中。也可能更像_precommand是将第二个word转换为第一个,word以便正常的命令完成工作。

我能够进行修改,_precommand以便您可以在任何word位置完成命令。这是新文件,我_commando为其命名并将其目录添加到我的fpath中:

#compdef -                                                              

# precommands is made local in _main_complete
precommands+=($words[1,$(( CURRENT -1 ))])

shift words
CURRENT=1

_normal
Run Code Online (Sandbox Code Playgroud)

要使用它,我将其添加到':completion:*' …

zsh zshrc zsh-completion

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

zsh compinit:不安全的目录。Compaudit 显示 /tmp 目录

我在 Raspberry Pi 2(Raspbian Jessie)上运行 zsh。zshcompinit抱怨/tmp目录不安全。所以,我检查了目录的权限:

$ compaudit
There are insecure directories:
/tmp
$ ls -ld /tmp
drwxrwxrwt 13 root root 16384 Apr 10 11:17 /tmp
Run Code Online (Sandbox Code Playgroud)

显然任何人都可以在 /tmp 目录中做任何事情。鉴于它的目的,这是有道理的。所以我尝试了关于这个 stackoverflow question的建议。我也在其他网站上尝试过类似的建议。具体来说,它建议关闭对该目录的组写入权限。由于权限如何根据ls -ld,我还必须关闭“所有”写入权限。所以:

$ sudo su
% chmod g-w /tmp
% chmod a-w /tmp
% exit
$ compaudit
# nothing shows up, zsh is happy
Run Code Online (Sandbox Code Playgroud)

这让 zsh 闭嘴。然而,其他程序开始崩溃。例如,每当我输入字母“l”时,gnome-terminal 就会崩溃。因此,我不得不重新打开写权限,然后compinit -u在我的.zshrc.

我想知道的有没有更好的方法来解决这个问题?我不确定让 compinit 使用不安全的目录是个好主意。我点文件回购托管 …

linux zsh zsh-completion

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

zsh 完成虚拟路径

我想为具有虚拟文件树的工具创建 zsh 完成。例如,我的文件树如下所示:

/
|- foo/
|  |- bar
|  |- baz/
|     |- qux
|- foobar
Run Code Online (Sandbox Code Playgroud)

我的工具mycmd有一个用于列出当前目录的子命令:

$ mycmd ls
foo/
foobar
$ mycmd ls foo/
bar
baz/
Run Code Online (Sandbox Code Playgroud)

我实际的 zsh 完成看起来是这样的:

_mycmd_ls() {
    if [ ! -z "$words[-1]" ]; then
        dir=$(dirname /$words[-1])
        lastpart=$(basename $words[-1])
        items=$(mycmd ls $dir | grep "^$lastpart")
    else
        items=$(mycmd ls)
    fi
    _values -s ' ' 'items' ${(uozf)items}
}


_mycmd() {
    local -a commands

    commands=(
        'ls:list items in directory'
    )

    _arguments -C -s -S -n …
Run Code Online (Sandbox Code Playgroud)

zsh zsh-completion

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

zsh compadd - 如何指定参数的描述?

随着_arguments我可以做_arguments {-h,--help}'[Show help]',但如何指定'Show help'的信息compadd参数?在文档中找不到

zsh zsh-completion

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

为什么我的 zsh tab 在命令上完成速度很慢,但在目录上却没有?

我正在使用 zsh 并打开完成功能。当我尝试制表符完成时,有时命令会挂起很长时间。几秒钟后,它完成并正确呈现我的选项。另一方面,如果我用 Ctrl-C 中断它,我会收到以下消息:

Killed by signal in _path_commands after 2s
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用制表符完成目录(例如在 中ls),它工作得很好,没有延迟。

请注意,我正在使用 WSL2 在 Windows 上运行,尽管我依稀记得它也发生在其他系统上。还没有回去确认,但是当我刚刚在我的服务器上测试时,我无法在那里重现它,所以这与环境有关。

zsh zsh-completion

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

标签 统计

zsh ×10

zsh-completion ×10

autocomplete ×2

oh-my-zsh ×2

bash ×1

linux ×1

terminal ×1

ubuntu ×1

zshrc ×1