小编bde*_*ham的帖子

如何检查 zsh 数组是否包含给定值?

假设我有一个非关联数组,其定义如下

my_array=(foo bar baz)
Run Code Online (Sandbox Code Playgroud)

如何检查数组是否包含给定的字符串?我更喜欢可以在if块的条件内使用的解决方案(例如if contains $my_array "something"; then ...)。

zsh

20
推荐指数
2
解决办法
5649
查看次数

将 zsh 的 tab 补全与不区分大小写相结合

我已将 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”的同时获得完成菜单?

zsh autocomplete

12
推荐指数
1
解决办法
8179
查看次数

使 zsh 文件名完成在任何地方都不区分大小写

我的 zshrc 中有以下行以使文件名完成不区分大小写:

\n
zstyle ':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 就是答案,那么这些声明应该是什么样子?)

\n

配置

\n

我能够使用 macOS 12.4、Zsh 5.8.1、以下 zshenv 文件重现上述行为:

\n
setopt NO_GLOBAL_RCS\n
Run Code Online (Sandbox Code Playgroud)\n

以及以下 zshrc 文件:

\n
zstyle ':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

zsh git autocomplete

6
推荐指数
0
解决办法
3039
查看次数

将命令视为其他命令以完成目的

我的 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

zsh autocomplete

6
推荐指数
2
解决办法
872
查看次数

“#”在参数扩展模式中有什么特殊含义?

假设我已经定义了一个变量

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 wildcards

5
推荐指数
1
解决办法
226
查看次数

在数组的每个元素前面添加一些文本

在 中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)

zsh

3
推荐指数
1
解决办法
1079
查看次数

标签 统计

zsh ×6

autocomplete ×3

git ×1

wildcards ×1