所有shell都理解这些命令:
$ cd .
$ cd ..
zsh也会理解:
$ cd ...
$ cd ....
如果你说:
$ alias -g ...='../..'
$ alias -g ....='../../..'
现在,当我开始输入cd ..../<TAB>
时,如何让它完成正确的制表工作?我记得它是在oh-my-zsh中实现的,但我现在已经停止使用了它。
如果它不仅适用于cd
,我想要执行cat ..../a/b/..../c/d | less
,我们将不胜感激。
答案 0 :(得分:4)
我在处理同一问题时所做的就是在输入../..
时让zsh填入...
,以这种方式扩展它是有意义的。它可能适合你(或不适合:-P):
if is-at-least 5.0.0 && [[ ! $UID -eq 0 ]]; then
## http://www.zsh.org/mla/users/2010/msg00769.html
function rationalise-dot() {
local MATCH # keep the regex match from leaking to the environment
if [[ $LBUFFER =~ '(^|/| | |'$'\n''|\||;|&)\.\.$' && ! $LBUFFER = p4* ]]; then
#if [[ ! $LBUFFER = p4* && $LBUFFER = *.. ]]; then
LBUFFER+=/..
else
zle self-insert
fi
}
zle -N rationalise-dot
bindkey . rationalise-dot
bindkey -M isearch . self-insert
fi
我也有...
的别名,但它不是全局的。
注意我检查命令行是否以p4
(Perforce命令行工具)开头,并且在这种情况下不要弄乱它,因为Perforce参数通常涉及文字...
。如果您不使用p4
,您显然可以删除该支票。
答案 1 :(得分:4)
我对其他答案并不满意所以我花了一些时间来获得更多我想要的东西。当你点击↵(返回)或↹(制表符)时,以下内容会扩大点,而不是点击点。
function expand-dots() {
local MATCH
if [[ $LBUFFER =~ '\.\.\.+' ]]; then
LBUFFER=$LBUFFER:fs%\.\.\.%../..%
fi
}
function expand-dots-then-expand-or-complete() {
zle expand-dots
zle expand-or-complete
}
function expand-dots-then-accept-line() {
zle expand-dots
zle accept-line
}
zle -N expand-dots
zle -N expand-dots-then-expand-or-complete
zle -N expand-dots-then-accept-line
bindkey '^I' expand-dots-then-expand-or-complete
bindkey '^M' expand-dots-then-accept-line
答案 2 :(得分:3)
一个不错的选择是Incremental Builds,它会将...
扩展为../..
等,但会智能地执行此操作。请参阅上面的链接以获取更多详细信息,但请简要说明:
../..
cd a/b/..../y/z
。git log branch...
git diff ...
- &gt; git diff ../..
git diff ...b
- &gt; git diff ...b
(适用于git diff ...branch
)答案 3 :(得分:2)
您必须使用compinit
并使用_expand_alias
作为完成者。这是一个例子:
zstyle ':completion:*' completer _complete _ignored _expand_alias
autoload -Uz compinit
compinit
_complete _ignored
是completer
的默认设置,您可以将其设置为_expand_alias
,但完成后只能用于别名。
如果您compinit
中已配置~/.zshrc
,则只需将_expand_alias
添加到completer
的列表中,例如:
zstyle ':completion:*' completer _expand _complete _ignored _approximate _expand_alias
默认情况下_expand_alias
扩展全局和常规别名,如果您不想扩展常规别名,请设置:
zstyle ':completion:*' regular false
注意:这当然有效,全局别名可以使用。因此,它们不会作为a/b/..../c/d