【发布时间】:2015-12-16 10:07:06
【问题描述】:
我正在尝试弄清楚如何在一组字符之后使文件完成在命令行上的任何word 位置工作。如 shell 中所列,这些字符将是 [ =+-\'\"()](空格是制表符和空格)。 Zsh 会这样做,但只能在反引号字符、'`' 或 $( 之后。 mksh 会这样做,除非不在字符 [+-] 之后。
按命令行上的单词位置,我指的是您输入的每组字符,它们由空格和其他几个字符分隔。例如,
print Hello World,
在位置 1-3 有三个 words。在位置 1,当您第一次输入内容时,完成非常完美。在我提到的所有字符之后,文件完成工作。在第一个word 之后,完成系统变得更加智能,因为它很智能。这对命令很有用,但限制文件完成的位置并不是特别有用。
以下是一些文件完成对我不起作用但在我看来应该适用的示例:
: ${a:=/...}
echo "${a:-/...}"
make LDFLAGS+='-nostdlib /.../crt1.o /.../crti.o ...'
env a=/... b=/... ...
我查看了使用 Zsh 附带的少数不同的完成小部件重新绑定 '^I'(选项卡)并更改了我的 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
为了使用它,我将它添加到我的 zshrc 中 ':completion:*' completer ... 行的末尾,以便它适用于 $path 中的每个程序。基本上,您输入的任何word 都被视为第一个word,因此命令完成在命令行上的每个word 位置都有效。
我正在尝试找出一种方法来完成文件完成,但乍一看它看起来有点复杂。我真的不知道该怎么做,所以我希望得到一些帮助。
【问题讨论】:
标签: zsh zshrc zsh-completion