Shell zsh-调用结束时没有空格的别名
我想要一个别名,如:Shell zsh-调用结束时没有空格的别名,shell,alias,zsh,Shell,Alias,Zsh,我想要一个别名,如: alias gra-bitbucket="gra origin https://gismoranas@bitbucket.org/gismoranas" 这样我就可以像这样使用它: gra-bitbucket/some-repo.git 将新源添加到git存储库(gra是别名) 我的问题是我不想每次都写整个url。它不能是别名,但最好是一行设置。请注意,这是针对原始问题编写的,这并没有消除它是否指定了别名调用的“末尾没有空格”,或者在调用的命令中别名定义的代码和用户提供
alias gra-bitbucket="gra origin https://gismoranas@bitbucket.org/gismoranas"
这样我就可以像这样使用它:
gra-bitbucket/some-repo.git
将新源添加到git存储库(gra是别名)
我的问题是我不想每次都写整个url。它不能是别名,但最好是一行设置。请注意,这是针对原始问题编写的,这并没有消除它是否指定了别名调用的“末尾没有空格”,或者在调用的命令中别名定义的代码和用户提供的代码之间没有空格的歧义
不要使用别名;函数是更好的工具
gra-bitbucket() { gra origin https://gismoranas@bitbucket.org/gismoranas"$@"; }
如果您的shell是(较旧版本的)bash而不是zsh,则可能需要使用function
关键字来定义名称中带有破折号的函数(根据POSIX规则,这是不允许的)。因此:
…或者,如果您希望与任何POSIX shell兼容,请从名称中删除-
(在本例中,替换为\u
):
在所有这些情况下,如果别名可能的话,用法(但POSIX表单中的名称更改)与所需别名的用法相同:
gra-bitbucket /some-repo.git
…将参考https://gismoranas@bitbucket.org/gismoranas/some repo.git
来源:
将以下内容放入.zshrc中:
# blank aliases
typeset -a baliases
baliases=()
balias() {
alias $@
args="$@"
args=${args%%\=*}
baliases+=(${args##* })
}
# ignored aliases
typeset -a ialiases
ialiases=()
ialias() {
alias $@
args="$@"
args=${args%%\=*}
ialiases+=(${args##* })
}
# functionality
expand-alias-space() {
[[ $LBUFFER =~ "\<(${(j:|:)baliases})\$" ]]; insertBlank=$?
if [[ ! $LBUFFER =~ "\<(${(j:|:)ialiases})\$" ]]; then
zle _expand_alias
fi
zle self-insert
if [[ "$insertBlank" = "0" ]]; then
zle backward-delete-char
fi
}
zle -N expand-alias-space
bindkey " " expand-alias-space
bindkey -M isearch " " magic-space
具体来说,对于您的问题,您需要上面定义的
balias
函数:
犯错误韦塔米努特。当你说“结尾没有空格”时,你的意思是在调用中没有空格?这比在生成的命令中alias生成的内容之后不插入空格要困难得多;它通常需要使用shell的命令not found hook,当一个命令被限定(包含“/”时,这通常是不可能的)…如果您想一想,应该很清楚为什么会这样(从高效实现shell的角度来看):当您的别名保证是它自己的单词时,标记器不需要查看别名列表;相反,它生成的任何单词都可以简单地根据别名哈希表、函数哈希表等进行评估——如果做得好,每一个都是一个摊销的常量时间查找……然而,当任何前导子字符串都可能是别名时,模式匹配的成本就要高得多。我们可以使用regex-y工具将其最小化,但这仍然是一个相当多的额外工作。这个答案中有太多额外的功能,以至于我不知道它在哪里/如何/是否真正回答了OP提出的问题。因此,有人问“我如何做X?”,你回答“这是一个可以构建东西的库”?如果您没有演示如何使用该库来执行X,那么这根本不是对特定问题的回答。@CharlesDuffy具体来说,只需使用balias而不是alias来执行X。这就是我鼓励您明确地将其包含在答案正文中的内容。
gra-bitbucket /some-repo.git
# blank aliases
typeset -a baliases
baliases=()
balias() {
alias $@
args="$@"
args=${args%%\=*}
baliases+=(${args##* })
}
# ignored aliases
typeset -a ialiases
ialiases=()
ialias() {
alias $@
args="$@"
args=${args%%\=*}
ialiases+=(${args##* })
}
# functionality
expand-alias-space() {
[[ $LBUFFER =~ "\<(${(j:|:)baliases})\$" ]]; insertBlank=$?
if [[ ! $LBUFFER =~ "\<(${(j:|:)ialiases})\$" ]]; then
zle _expand_alias
fi
zle self-insert
if [[ "$insertBlank" = "0" ]]; then
zle backward-delete-char
fi
}
zle -N expand-alias-space
bindkey " " expand-alias-space
bindkey -M isearch " " magic-space
# command aliases
alias jj='java -jar'
alias mcp='mvn clean package'
...
# blank aliases, without trailing whitespace
balias clh='curl localhost:'
...
# "ignored" aliases, not expanded
ialias l='exa -al'
ialias curl='curl --silent --show-error'
...
# global aliases
alias -g L='| less'
alias -g G='| grep'
ialias -g grep='grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn}'
balias gra-bitbucket="gra origin https://gismoranas@bitbucket.org/gismoranas"