我试图弄清楚如何word
在一组字符之后让文件完成在命令行的任何位置工作。如 shell 中所列,这些字符将是[ =+-\'\"()]
(空格是制表符和空格)。Zsh 会这样做,但只能在反引号字符 '`' 或$(
. mksh 执行此操作,除非不在 characters 之后[+-]
。
通过命令行上的单词位置,我说的是您输入的每组字符,这些字符由空格和一些其他字符分隔。例如,
print Hello World
,
words
在位置 1-3有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
为了使用它,我将它添加到':completion:*' completer ...
我的 zshrc 中的行尾,以便它适用于$path
. 基本上word
,您输入的任何内容都被视为 first word
,因此命令完成在word
命令行的每个位置都有效。
我试图找出一种方法来完成文件完成,但乍一看它看起来有点复杂。我真的不知道该去哪里,所以我希望得到一些帮助。