我正在尝试编写自己的完整命令。完成需要使用键入命令的一部分来进行路径搜索。
我试图获得以下行为
当我my_commad -ws my_ws -t[TAB]
在 my_ws/tests 下编写文件夹列表时,它显示为完成列表,我不知道如何打破它
我尝试了以下操作,但由于引号问题而失败,我猜
complete my_command 'n@-t@`echo $COMMAND_LINE | perl -ne '/-ws (\w+)/; print $1'`@'
我正在尝试编写自己的完整命令。完成需要使用键入命令的一部分来进行路径搜索。
我试图获得以下行为
当我my_commad -ws my_ws -t[TAB]
在 my_ws/tests 下编写文件夹列表时,它显示为完成列表,我不知道如何打破它
我尝试了以下操作,但由于引号问题而失败,我猜
complete my_command 'n@-t@`echo $COMMAND_LINE | perl -ne '/-ws (\w+)/; print $1'`@'
我正在尝试为将gs
SSH 主机名作为其第一个参数并将任意字符串作为第二个参数的命令(称为)编写完成。
我从默认的 SSH 完成中窃取了这个:
# Load completions shared by various ssh tools like ssh, scp and sftp.
__fish_complete_ssh ssh
# Also retrieve `user@host` entries from history
function __ssh_history_completions
history --prefix ssh --max=100 | string replace -rf '.* ([A-Za-z0-9._:-]+@[A-Za-z0-9._:-]+).*' '$1'
end
我用它来完成gs
命令的参数:
complete -c gs -d Remote -xa "(__fish_complete_user_at_hosts)"
complete -c gs -d Remote -ka '(__ssh_history_completions)'
这有效,但它完成了两个参数的 SSH 主机名:
gs <tab>
,fish 会正确完成 SSH 主机名,gs somehost <tab>
,fish 会再次错误地完成 SSH 主机名(这个参数不应该完成,它是一个任意字符串)。我怎样才能使这个完成只影响我命令的第一个位置参数?
我按照这个答案配置了我的 zsh 。然后我发现完成现在包括.
and ..
。如何删除它们?
我有一个 git 存储库,在其中保存了一些静态链接的二进制文件以及相关的 man 文件和 bash 完成文件,这些文件都是使用GNU Stow进行“安装”来制作符号链接的。
我之前已经将 bash 完成文件的符号链接放入/etc/bash_completion.d
没有问题,但最近我开始将它们放入/usr/share/bash-completion/completions
,因为我认为这对它们来说是一个更正确的位置,因为二进制文件正在进入/usr/local/bin
并且 man 文件在/usr/local/share/man
.
除了四个特定的 bash 完成文件之外,一切都像以前一样工作,这些文件在放置在这个新位置时不再工作。这些是:
这两个用于 fzf:
我还有 20 个其他 bash 完成文件可以正常工作。这些特定的 bash 完成文件是什么让它们在/etc/bash_completion.d
没有问题但没有问题的情况下工作/usr/share/bash-completion/completions
?
编辑:
它们也不起作用~/.local/share/bash-completion/completions
。
这些文件来自标准的 Debian/Ubuntu.bashrc
行:
# Enable programmable completion features
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
在这两个位置中,不是目录上的内容被获取,而是这两个文件:
/usr/share/bash-completion/bash_completion
如果 NOT ,第二个文件只是指向第一个文件shopt -oq posix
。在我的设置中:
$ if ! shopt -oq posix; then echo "not posix"; fi
not posix
我认为答案必须在/usr/share/bash-completion/bash_completion中。
我尝试用bash_completion
最新版本替换,但这也不起作用。
https://github.com/scop/bash-completion
这些文件在放入其中任何一个时都不起作用~/.local/share/bash-completion/completions
。
我OS X
在zsh
shell中体验过这个,打开的手册页。
$ type open
open is /usr/bin/open
$ man open
OPEN(1) General Commands
Manual OPEN(1)
NAME
open – open files and directories
当我键入open
并键入选项卡时,我看到以下输出:
$ open
file: ftp:// gopher:// http:// https://
我从不尝试打开任何file:
, ftp://
, gopher://
, http://
, https://
,因此我只想压制它们。是否可以抑制它们并且只看到文件/文件夹名称。
我有一堆带空格的文件名:
[~/music]% ls
Acid Eater - Black Fuzz On Wheels.ogg Angel'in Heavy Syrup 4.mp3
Akalé Wubé - Akalé Wubé.opus Astor Piazzolla & Gary Burton - The New Tango.mp3
Allen Toussaint - The Bright Mississippi.mp3 B.B. King - Live at the Regal.mp3
Angel'in Heavy Syrup 1.opus Bar Kokhba Sextet - Lucifer.opus
Angel'in Heavy Syrup 2.opus Billy Bang - Vietnam the Aftermath.mp3
Angel'in Heavy Syrup 3.mp3
完成为空格插入转义字符(这也意味着没有足够的空间在两列中显示它):
[~/music]% mpv <Tab>
Acid\ Eater\ -\ Black\ Fuzz\ On\ Wheels.ogg
Akalé\ Wubé\ -\ Akalé\ Wubé.opus
Allen\ Toussaint\ -\ The\ Bright\ Mississippi.mp3
Angel\'in\ Heavy\ Syrup\ 1.opus
Angel\'in\ Heavy\ Syrup\ 2.opus
Angel\'in\ Heavy\ Syrup\ 3.mp3
Angel\'in\ Heavy\ Syrup\ 4.mp3
Astor\ Piazzolla\ \&\ Gary\ Burton\ -\ The\ New\ Tango.mp3
B.B.\ King\ -\ Live\ at\ the\ Regal.mp3
Bar\ Kokhba\ Sextet\ -\ Lucifer.opus
Billy\ Bang\ -\ Vietnam\ the\ Aftermath.mp3
这是有道理的,但也很难阅读;我想:
[~/music]% mpv <Tab>
Acid Eater - Black Fuzz On Wheels.ogg Angel'in Heavy Syrup 4.mp3
Akalé Wubé - Akalé Wubé.opus Astor Piazzolla & Gary Burton - The New Tango.mp3
Allen Toussaint - The Bright Mississippi.mp3 B.B. King - Live at the Regal.mp3
Angel'in Heavy Syrup 1.opus Bar Kokhba Sextet - Lucifer.opus
Angel'in Heavy Syrup 2.opus Billy Bang - Vietnam the Aftermath.mp3
Angel'in Heavy Syrup 3.mp3
[~/music]% mpv Acid<Tab>
# Completes to:
[~/music]% mpv Acid\ Eater\ -\ Black\ Fuzz\ On\ Wheels.ogg
# It's okay to type escapes on the cmdline; it's just the display.
[~/music]% mpv Angel\'in\ H<Tab>
Angel'in Heavy Syrup 1.opus Angel'in Heavy Syrup 3.mp3
Angel'in Heavy Syrup 2.opus Angel'in Heavy Syrup 4.mp3
我花了一些时间阅读 zshcompsys(1),但我真的看不出有办法做到这一点。
我正在使用 Bash 4.4。
[root@192 ~]# bash --version
GNU bash, version 4.4.19(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@192 ~]#
我想知道是否有任何方法可以使选项名称自动完成。例如,如果我键入realpath --re
并后跟一个Tab,它可以帮助我填写选项名称的缺失部分,然后我得到realpath --relative-to=
.
我有自定义脚本的 zsh 完成文件foo
。
它应该在以下位置完成常规文件$HOME/foo
:
#compdef foo
_arguments -S : \
'-i' \
'1:thing:_path_files -W $HOME/foo -g "*(.)"'
我需要修改完成如下:
添加可选参数--dir
。
当我键入foo --dir<TAB>
时,它应该为目录提供补全$HOME/foo
foo --dir=<TAB>
此外,文件完成路径($HOME/foo
默认情况下)应更改为$HOME/foo/my_dir
,其中my_dir
提供的名称为--dir=my_dir
.
基本上,完成规则应该有两种操作模式:
foo -<TAB>
,它应该为我提供可选参数 ( -d
-w
-l
-i
)。然后,根据选择的可选参数:1a)foo -d <TAB>
仅完成路径中的目录
1b)foo -w / -l / -i <TAB>
完成路径中的常规文件
这可以按需要工作。
foo <TAB>
,完成规则应该在路径中提供常规文件。目前,这不能按预期工作。它仍然为我提供了可选参数,我必须选择一个,然后才能完成目录/文件。当我键入foo <TAB>
(不带-
)时,它只为我提供选项参数。只有在我选择了一个可选参数之后,我的完成规则才会在路径中提供目录/文件。
如何修复我的脚本,使其在没有任何可选参数的情况下工作,并且在这种情况下只需完成路径中的常规文件?
这是完成规则:
#compdef foo
local -A opt_args
_arguments -S -C \
'-i[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
'-l[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
'-w[select file]:thing_file:_path_files -W $HOME/manuals/${opt_args[-d]} -g "*(.)"' \
'-d[select directory]:directory_file:_path_files -/ -W $HOME/manuals' \
&& return 0
最后一个小问题。完成规则只需要(完成)一个可选参数。
当我键入foo -i -<TAB>
时,它不提供其他剩余的可选参数。这些参数不应相互排斥。应该可以使用:
foo -i -l -w <TAB>
我正在使用我的 zsh 版本(debian 10)附带的默认_gpg
完成文件。我已将文件粘贴在这里:https ://ctxt.io/2/AABg86pPFQzsh
5.7.1-1
当我这样做时gpg <TAB>
,zsh 会完成当前目录中的文件和目录。我想改变它,以便:
a) 如果我使用 gpg 没有进一步的参数(这意味着-d
),那么只有当前目录中的 *.gpg 文件完成(不是目录)
b)如果我使用-e
或-c
(暗示加密),则仅完成当前目录中的非 gpg 文件(不是目录)
c)对于其余的,我猜默认行为是好的
我已将以下内容添加到我的.zshrc
:
zstyle ':completion::complete:gpg:*' file-patterns '*.(gpg|sig)(.)'
但这应该只是案例a的规则)
我怎样才能实现上述行为?
我有能够为 bash、zsh 和 fish 创建完成文件的工具。我通常使用 zsh,但我无法让这个完成文件在 zsh 上工作。所以作为一个测试,我安装了fish并为fish创建了完成文件。还有一个我无法上班。所有其他完成在 zsh 和 fish 中都可以正常工作,所以我怀疑该工具会创建一个损坏的完成文件。有没有办法检查完成文件的语法是否有错误?