假设我有一个非关联数组,其定义如下
my_array=(foo bar baz)
Run Code Online (Sandbox Code Playgroud)
如何检查数组是否包含给定的字符串?我更喜欢可以在if
块的条件内使用的解决方案(例如if contains $my_array "something"; then ...
)。
我已将 zsh 5.0.7 配置为使用不区分大小写的选项卡完成
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是这种不区分大小写的做法常常导致我需要多按Tab一次。例如,我的主目录包含文件夹“桌面”、“文档”和“下载”。如果我在我的主文件夹中并输入
cd D
Run Code Online (Sandbox Code Playgroud)
然后按Tab,我会看到为我列出的三种可能性。另一方面,如果我输入
cd d
Run Code Online (Sandbox Code Playgroud)
然后按Tab然后“d”变为“D”但我没有看到完成菜单;我需要Tab再次按下才能发生这种情况。有没有办法在将“d”更改为“D”的同时获得完成菜单?
我的 zshrc 中有以下行以使文件名完成不区分大小写:
\nzstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'\n
Run Code Online (Sandbox Code Playgroud)\n这在大多数情况下都有效,但我\xe2\x80\x99注意到,如果我输入\xe2\x80\x9cgit add\xc2\xa0\xe2\x80\x9d,然后按,那么Tab我得到的补全是区分大小写的。
\n我应该使用不同的命令来使文件名完成不区分大小写吗?或者我是否需要开始zstyle
为各个命令添加声明?(如果 \xe2\x80\x99 就是答案,那么这些声明应该是什么样子?)
我能够使用 macOS 12.4、Zsh 5.8.1、以下 zshenv 文件重现上述行为:
\nsetopt NO_GLOBAL_RCS\n
Run Code Online (Sandbox Code Playgroud)\n以及以下 zshrc 文件:
\nzstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'\nzstyle ':completion:*' cache-path /var/tmp/zcompcache\nautoload -U compinit && compinit -d /var/tmp/zcompdump\n
Run Code Online (Sandbox Code Playgroud)\n 我的 zshrc 包含以下函数来创建目录然后进入它:
function mcd () {
mkdir -p "$*" && cd "$*"
}
Run Code Online (Sandbox Code Playgroud)
该函数本身工作正常,但完成后我得到了奇怪的行为。如果我开始输入 例如mcd ~/
然后按Tab,则会显示消息
_mtools_drives:3: command not found: mtoolstest
Run Code Online (Sandbox Code Playgroud)
被插入到插入点,什么也没完成。我想要的是命令的完成就像这样mkdir
:zsh 应该为我提供现有目录的名称。
我如何告诉 zsh 为了完成目的,它应该视为mcd
相同mkdir
?
假设我已经定义了一个变量
number=123#456
Run Code Online (Sandbox Code Playgroud)
我想在没有前导“123#”的情况下打印它。(当您使用 10 以外的基数处理数字时,zsh 中会发生这种情况。)手册的“参数扩展”部分说,
${name#pattern}
${name##pattern}
如果模式的值的开头相匹配的名字,则替换的值名称与所匹配的部分删除; 否则,只需替换name的值。在第一种形式中,最小的匹配模式是首选;在第二种形式中,最大的匹配模式是首选。
这向我表明我应该能够说
print ${number#123#}
Run Code Online (Sandbox Code Playgroud)
摆脱“123#”,但这实际上输出“3#456”。我发现如果我转义我试图删除的“#”,我可以获得预期的效果:
print ${number#123\#} # prints "456"
Run Code Online (Sandbox Code Playgroud)
“#”在我转义之前有什么特殊含义?
在 中zsh
,通过全局扩展,我们可以使用该P
标志在每个匹配项前面添加一些文本:
$ ls -1
bar
baz
foo
$ print -- *(P:--file:)
--file bar --file baz --file foo
Run Code Online (Sandbox Code Playgroud)
数组参数有类似的东西吗?如果我写
items=(foo bar baz)
Run Code Online (Sandbox Code Playgroud)
我可以使用一些标志来获得这样的行为吗?
$ print -- ${(...)items}
--file foo --file bar --file baz
Run Code Online (Sandbox Code Playgroud)