Tar*_*sch 6 zsh zsh-completion zsh-zle
所有shell都理解这些命令:
$ cd .
$ cd ..
Run Code Online (Sandbox Code Playgroud)
zsh也会理解:
$ cd ...
$ cd ....
Run Code Online (Sandbox Code Playgroud)
如果你说:
$ alias -g ...='../..'
$ alias -g ....='../../..'
Run Code Online (Sandbox Code Playgroud)
现在,当我开始输入时,如何才能使其完成正确的制表工作cd ..../<TAB>?我记得它是在oh-my-zsh中实现的,但我现在已经停止使用了.
如果它不仅可以用于cd我想要执行,那么也将不胜感激cat ..../a/b/..../c/d | less.
我为处理同样的问题所做的就是让 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
Run Code Online (Sandbox Code Playgroud)
我也有一个别名...,但它不是全局的。
请注意,我检查命令行是否以p4(Perforce 命令行工具)开头,并且在这种情况下不要乱用它,因为 Perforce 参数通常涉及literal ...。如果您不使用,p4您显然可以删除该检查。
我对其他答案不满意,所以我花了一些时间让自己更喜欢。当您按下?(返回)或?(制表符)时,以下内容将扩大点,而不是您键入点时。
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
Run Code Online (Sandbox Code Playgroud)
一个不错的选择是manydots-magic,它扩展...为../.., etc. 但它很聪明。有关更多详细信息,请参阅上面的链接,但简要说明:
../..cd a/b/..../y/z。git log branch...git diff ... -> git diff ../..git diff ...b-> git diff ...b(对于git diff ...branch)你必须使用compinit并_expand_alias作为完成者使用。这是一个例子:
zstyle ':completion:*' completer _complete _ignored _expand_alias
autoload -Uz compinit
compinit
Run Code Online (Sandbox Code Playgroud)
_complete _ignored是 的默认设置completer,您可以将其设置为 only _expand_alias,但补全仅适用于别名。
如果compinit您的 中已经配置了~/.zshrc,那么您只需添加_expand_alias到 的列表中completer,例如:
zstyle ':completion:*' completer _expand _complete _ignored _approximate _expand_alias
Run Code Online (Sandbox Code Playgroud)
默认情况下_expand_alias扩展全局和常规别名,如果您不想扩展常规别名,请设置:
zstyle ':completion:*' regular false
Run Code Online (Sandbox Code Playgroud)
注意:这当然仅适用于全局别名可用的情况。因此它们不会像这样作为整个路径的一部分进行扩展a/b/..../c/d