【原创】compspec for cd

【原创】compspec for cd

cd 这个命令大家肯定都很熟悉了, 有时候进入到一个很深的目录中, 然后想回到他的第 N 级父目录时, 总是要敲好多 ../../../.. , 很是烦人, 为此, 俺写了一个 compspec, 如果你要向上跳 N 级目录, 只需要输入 N+1 个点 (`.'), 然后按一下 TAB 键, 这些点点就会自动换成响应的 ../../../.. , 方便了许多
复制内容到剪贴板
代码:
#! /bin/bash
#
# File: compspec.cd
#

_cd()
{
    local CMD=$1
    local CUR=$2
    local PRE=$3

    local len=${#CUR}
    if [ $len -lt 3 -o "${CUR/.../}" = "$CUR" ]; then
        return
    fi

    local i nDots newCur next
    for ((i = 0, nDots = 0; i < len; ++i)); do
        next=${CUR:i:1}
        if [ "$next" != . ]; then
            newCur="$newCur$next"
            nDots=0
        else
            if ((++nDots > 2)); then
                newCur="$newCur/.."
            else
                newCur="$newCur."
            fi
        fi
    done
    COMPREPLY[0]="$newCur"
    COMPREPLY[1]="$newCur/dummy"
}

complete -d -F _cd cd


      
不清楚如何使用
我是 source 了。。。      
用法示例:
引用:
-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[17832 0] ; source compspec.cd
-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[17832 0] ; complete -p cd
complete -d -F _cd cd
-(dearvoid@LinuxEden:tty3)-(~/tmp)-
[17832 0] ; cd openldap-2.3.32/doc/man/man3/
# 接下来我想进入 openldap-2.3.32/ 下的其它目录
-(dearvoid@LinuxEden:tty3)-(~/tmp/openldap-2.3.32/doc/man/man3)-
[17832 0] ; cd ....  # 此时按 TAB 键
-(dearvoid@LinuxEden:tty3)-(~/tmp/openldap-2.3.32/doc/man/man3)-
[17832 1] ; cd ../../..  # 再按几次 TAB 键
-(dearvoid@LinuxEden:tty3)-(~/tmp/openldap-2.3.32/doc/man/man3)-
[17832 0] ; cd ../../../
build/     clients/   contrib/   doc/       include/   libraries/ servers/   tests/
-(dearvoid@LinuxEden:tty3)-(~/tmp/openldap-2.3.32/doc/man/man3)-
[17832 0] ; cd ../../../clients/
-(dearvoid@LinuxEden:tty3)-(~/tmp/openldap-2.3.32/clients)-
[17832 0] ; o

另注: 只要你的输入中含有连续两个以上的点点, 这个 compspec 就起作用