我有这样的功能:
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)
希望有人可以帮忙!:-)
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) 我在arch linux上安装了zsh-completions.VBoxManage命令的完成似乎工作正常,但vboxmanage没有(即只是简单完成本地目录中的文件).这两个VBoxManage和vboxmanage是符号链接到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)
这看起来很啰嗦,有一个指定模式的选项,但是这样命名别名的正确方法是什么?
我最近开始在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) 问题:
有时,当我尝试在 zsh 中执行操作时,它不会完成我想要的文件名,因为它们不适用于当前上下文。两个例子:
git diff比较硬盘上的两个任意文件。这些文件不驻留在任何存储库中,但谁在乎?!git diff --no-index是区分任意两个文件的好方法。但是因为它们不在 repo 中,所以 zsh 不会完成它们。建议的解决方案:
我可以简单地编辑源代码控制上下文来完成所有文件名,而不管它们的源代码控制状态如何。但是有几个限制:
所以,我决定改为绑定一个快捷键来强制正常的、上下文无关的文件完成。
到目前为止我所拥有的:
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 一起工作,或者是否有我可能会觉得满意的替代解决方案?
我试图弄清楚如何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:*' …
我在 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 使用不安全的目录是个好主意。我点文件回购托管 …
我想为具有虚拟文件树的工具创建 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) 随着_arguments我可以做_arguments {-h,--help}'[Show help]',但如何指定'Show help'的信息compadd参数?在文档中找不到
我正在使用 zsh 并打开完成功能。当我尝试制表符完成时,有时命令会挂起很长时间。几秒钟后,它完成并正确呈现我的选项。另一方面,如果我用 Ctrl-C 中断它,我会收到以下消息:
Killed by signal in _path_commands after 2s
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用制表符完成目录(例如在 中ls),它工作得很好,没有延迟。
请注意,我正在使用 WSL2 在 Windows 上运行,尽管我依稀记得它也发生在其他系统上。还没有回去确认,但是当我刚刚在我的服务器上测试时,我无法在那里重现它,所以这与环境有关。
zsh ×10
zsh-completion ×10
autocomplete ×2
oh-my-zsh ×2
bash ×1
linux ×1
terminal ×1
ubuntu ×1
zshrc ×1