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

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.

Fra*_*sco 6

我为处理同样的问题所做的就是让 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您显然可以删除该检查。


Pau*_*ane 5

我对其他答案不满意,所以我花了一些时间让自己更喜欢。当您按下?(返回)或?(制表符)时,以下内容将扩大点,而不是您键入点时。

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)


Spa*_*awk 5

一个不错的选择是manydots-magic,它扩展...../.., etc. 但它很聪明。有关更多详细信息,请参阅上面的链接,但简要说明:

  • 它允许您使用单个恢复扩展Backspace(如果它是您输入的最后一件事)。
    • 但它不会恢复显式输入../..
  • 您可以内联使用它,例如cd a/b/..../y/z
  • 然而,当它没有意义时它不会扩展,例如 git log branch...
  • 在可能有意义时扩展,但在您输入更多时恢复。例如
    • git diff ... -> git diff ../..
    • git diff ...b-> git diff ...b(对于git diff ...branch


Ada*_*hon 2

你必须使用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