在工作中,我们以冗长的方式命名我们的 Git 分支,例如“feature/PROJ-123-frobnicate-blob”。为了使用像这样的名称的 Zsh 自动补全,我最终一遍又一遍地键入“feature/PROJ-”样板。我希望能够打字
git 开关 123Tab
并将“123”替换为整个分支名称。
更一般地说,不是自动完成假设我输入的是分支名称的开头,它应该假设我只是给它一个子字符串。
如何配置 Zsh 以这种方式完成 Git 分支名称?
在工作中,我们以冗长的方式命名我们的 Git 分支,例如“feature/PROJ-123-frobnicate-blob”。为了使用像这样的名称的 Zsh 自动补全,我最终一遍又一遍地键入“feature/PROJ-”样板。我希望能够打字
git 开关 123Tab
并将“123”替换为整个分支名称。
更一般地说,不是自动完成假设我输入的是分支名称的开头,它应该假设我只是给它一个子字符串。
如何配置 Zsh 以这种方式完成 Git 分支名称?
curl
和命令的默认补全open
尝试填写 URL。例如,打字curl <TAB>
给出
file: ftp:// gopher:// http:// https://
与当前目录中的任何文件一起。
我从不想自动完成 URL,所以这些建议只是与我真正感兴趣的文件名等混合在一起的视觉噪音。如何防止 zsh 为特定命令提供 URL 完成?我怎样才能防止它为任何命令提供这个?
在zsh
中,通过 glob 扩展,我们可以使用P
标志在每个匹配项前添加一些文本:
$ ls -1
bar
baz
foo
$ print -- *(P:--file:)
--file bar --file baz --file foo
数组参数有类似的东西吗?如果我写
items=(foo bar baz)
是否有一些标志可以用来获得这样的行为?
$ print -- ${(...)items}
--file foo --file bar --file baz
我的 zshrc 包含以下函数来创建一个目录,然后进入它:
function mcd () {
mkdir -p "$*" && cd "$*"
}
该函数本身工作正常,但完成后我得到奇怪的行为。如果我开始输入 egmcd ~/
然后按Tab,消息
_mtools_drives:3: command not found: mtoolstest
在插入点插入,没有完成。我想要的是像完成命令一样完成命令mkdir
:zsh 应该为我提供现有目录的名称。
我如何告诉 zsh 出于完成目的,它应该mcd
与mkdir
?
假设我已经定义了一个变量
number=123#456
我想在没有前导“123#”的情况下打印它。(当您使用 10 以外的基数时,在 zsh 中会发生这种情况。)手册的“参数扩展”部分说,
${name#pattern}
${name##pattern}
如果模式匹配name值的开头,则用删除的匹配部分替换name的值;否则,只需替换name的值。在第一种形式中,最小的匹配模式是优选的;在第二种形式中,最大匹配模式是首选。
这表明我应该能够说
print ${number#123#}
摆脱“123#”,但这实际上输出“3#456”。我发现如果我逃避我试图删除的“#”,我可以获得预期的效果:
print ${number#123\#} # prints "456"
“#”在我逃脱之前有什么特殊含义?
我正在尝试从 /dev/urandom 中读取一些字节,只保留我可以轻松输入的字节,并将结果修剪为 30 个字符。但是,当数据来自管道时,我无法弄清楚如何获得“仅 30 个字符”的行为。我试过了
cat /dev/urandom | tr -cd 'A-Za-z0-9' | cut -c -30
和
cut -c -30 /dev/urandom | tr -cd 'A-Za-z0-9' | cut -c -30
但这些挂起而不显示任何内容。另一方面,
cut -c -30 /dev/urandom | tr -cd 'A-Za-z0-9'
无休止地输出数据(尽管它显然已被处理,tr
因为只有指定的字符出现在输出中)。
一般来说,如何从管道中读取一定数量的字符(或字节)然后关闭管道?
假设我有一个非关联数组,其定义如下
my_array=(foo bar baz)
如何检查数组是否包含给定的字符串?我更喜欢可以在if
块的条件内使用的解决方案(例如if contains $my_array "something"; then ...
)。