zsh - 调用时没有空格的别名

5

我希望有一个类似于别名的东西:

alias gra-bitbucket="gra origin https://gismoranas@bitbucket.org/gismoranas"

这样我就可以像这样使用它:

gra-bitbucket/some-repo.git

向Git仓库添加新的源(gra是oh-my-zsh!别名)。

我的问题是我不想每次都写整个URL。它不能是别名,但设置一个一行命令会很好。


1
错误。等一下。当你说“结尾没有空格”时,你是指在调用中没有空格吗?这比仅仅不在生成的命令中插入别名生成内容后面不插入空格要困难得多;通常需要使用您的shell的命令未找到钩子,而当命令有资格(包含'/')时,这通常甚至不可能。 - Charles Duffy
1
如果你花一分钟思考一下,就应该明白为什么这样做是明智的(从高效实现shell的角度来看):当你的别名保证是它自己的单词时,分词器不需要查看别名列表;相反,无论生成什么单词,都可以针对你的别名哈希表、函数哈希表等进行评估——如果做得好,每个哈希表都是一个摊销常数时间的查找。 - Charles Duffy
1
然而,当任何前导子字符串都可能是别名时,模式匹配的成本就会更高。可以使用类似正则表达式的工具来将其最小化,但这仍然需要相当多的额外工作。 - Charles Duffy
2个回答

9
请注意,这篇文章是针对原问题写的,原问题没有明确指定别名调用时是否在末尾加空格,或者别名定义的代码和用户提供的代码在调用命令时是否需要有空格。
不要使用别名来实现此功能,函数是更好的工具。
gra-bitbucket() { gra origin https://gismoranas@bitbucket.org/gismoranas"$@"; }

如果你的shell是(旧版本的)bash而不是zsh,你可能需要使用function关键字来定义一个带有破折号名称的函数(这在POSIX规则下是不允许的)。 因此:

# this version works with bash as well (but not POSIX sh)
function gra-bitbucket { gra origin https://gismoranas@bitbucket.org/gismoranas"$@"; }

...或者,如果你想符合任何POSIX shell的要求,从名称中删除-(在这种情况下,用_替换):

# this version works with all POSIX shells
gra_bitbucket() { gra origin https://gismoranas@bitbucket.org/gismoranas"$@"; }

在所有这些情况下,使用方式(除了POSIX表单中的名称更改)与如果该别名可能存在的话,您所期望的别名完全相同:
gra-bitbucket /some-repo.git

...将引用https://gismoranas@bitbucket.org/gismoranas/some-repo.git

这段文字涉及IT技术相关内容。

1

来源:https://blog.sebastian-daschner.com/entries/zsh-aliases

将以下内容放入您的 .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

现在你可以做:

# 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函数就是您需要的:

balias gra-bitbucket="gra origin https://gismoranas@bitbucket.org/gismoranas"

2
这个答案中有太多额外的功能,我无法确定它是否真正回答了OP提出的问题,也不知道它是如何回答的。 - Charles Duffy
所以,有人问“我怎么做X?”,你回答“这是一个库,你可以在上面构建东西”?如果你不展示如何使用该库来完成X,那么这根本不是对特定问题的回答。 - Charles Duffy
@CharlesDuffy 具体来说,只需使用balias而不是alias来执行X。 - HappyFace
这就是我鼓励你在答案正文中明确地包含的内容。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接