制表符完成前缀的外壳?

Nat*_*ver 5 bash zsh autocomplete fish readline

我希望当光标位于单词的开头和光标位于单词的末尾时,制表符完成的行为有所不同。

我只见过用制表符完成后缀的 shell,如下所示:

$ tiff2?
tiff2bw    tiff2pdf   tiff2ps    tiff2rgba
Run Code Online (Sandbox Code Playgroud)

但是,有时我还想在插入符号位于单词开头时对前缀进行制表符补全。也就是说,2tiff 如果光标位于单词的开头,我想扩展到所有以 结尾的命令2tiff,如下所示:

$ ?2tiff
raw2tiff gif2tiff bmp2tiff ppm2tiff pnmtotiff ras2tiff e2mtiff fax2tiff
Run Code Online (Sandbox Code Playgroud)

Fish在某些情况下会这样做:

~> ?2tiff
bmp2tiff  (Executable, 17kB)  ppm2tiff  (Executable, 14kB)
fax2tiff  (Executable, 18kB)  ras2tiff  (Executable, 14kB)
gif2tiff  (Executable, 18kB)  raw2tiff  (Executable, 17kB)
Run Code Online (Sandbox Code Playgroud)

这也有将光标移动到单词末尾的副作用,并且仅在没有有效的后缀完成时才有效:

~> ?tiff
tiff2bw                    (Convert a color TIFF image to greyscale)
tiff2pdf                    (Convert a TIFF image to a PDF document)
tiff2ps                                    (Convert a TIFF image to)
tiff2rgba                 (Convert a TIFF image to RGBA color space)
…and 10 more rows
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,我都找不到制作bashzsh执行前缀制表符补全的方法。

Gil*_*il' 5

只要您启用“新型完成系统”并打开complete_in_word选项Zsh 就会执行此操作。

autoload -U compinit; compinit
setopt complete_in_word
Run Code Online (Sandbox Code Playgroud)

之后,您可以按Tab单词的任何位置,包括开头,您将获得单词中间的完成建议(对于开头,如果光标位于单词的开头)。(使用一些更高级的设置,完成也可能会在单词的其他地方插入内容。)

zsh 中的另一个选项是使用setopt glob_complete. 例如,键入*2tiff并按Tab(光标在词尾)以在词首完成。

在默认配置中存在一个限制,在Tab命令行的开头按下会插入一个制表符而不是完成。我认为这个限制在expand-or-complete; 如果您绑定Tabmenu-completecomplete-word那么它也会在命令行的开头完成。使用expand-or-complete,您可以在单词的开头获得补全,前提是它不是命令行上的第一个非空白内容,例如 in=2tiff;2tiff