zsh中的多点路径,如`cd ....`

时间:2014-05-04 13:33:30

标签: zsh zsh-completion zsh-zle

所有shell都理解这些命令:

$ cd .
$ cd ..

zsh也会理解:

$ cd ...
$ cd ....

如果你说:

$ alias -g ...='../..'
$ alias -g ....='../../..'

现在,当我开始输入cd ..../<TAB>时,如何让它完成正确的制表工作?我记得它是在oh-my-zsh中实现的,但我现在已经停止使用了它。

如果它不仅适用于cd,我想要执行cat ..../a/b/..../c/d | less,我们将不胜感激。

4 个答案:

答案 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,它会将...扩展为../..等,但会智能地执行此操作。请参阅上面的链接以获取更多详细信息,但请简要说明:

  • 它允许您使用单个 Backspace 恢复扩展(如果它是您键入的最后一个内容)。
    • 但它不会明确还原 键入../..
  • 您可以内联使用,例如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 _ignoredcompleter的默认设置,您可以将其设置为_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

等整个路径的一部分进行扩展