重命名自定义函数

重命名自定义函数

有一个 precmd() 可以做很多事情,例如检查 VCS 信息,我想在缓慢安装的网络驱动器上导航时禁用它。

我想到了以下内容,slow在切换到慢速驱动器并将fast其改回来之前我可以说一下,我想知道是否还有更简单的方法?

precmd_slow() {
    not_much
}
precmd_fast() {
    precmd_slow
    somemore1
    somemore2
}

precmd() {
    precmd_fast
}

slow() {
    precmd() {
        precmd_slow
    }
}

fast() {
    precmd() {
        precmd_fast
    }
}

答案1

这不是最完美的解决方案,但我会在函数中使用一个简单的条件来precmd检查当前目录是否已挂载。现在,这取决于挂载的类型。如果目录已知,那么类似这样的方法应该可行。

slowdirs="/home/joe/slowdir1:/home/joe/slowdir2:/mnt/slowdir3"
precmd() {
  isslow=0
  echo $slowdirs | tr \: \\n |
    while read line; do
      if [[ $PWD == $line* ]]; then
        isslow=1
        break
      fi
    done
  if [[ $isslow == 0 ]] ; then
     # do slow stuff

  fi
  # do non slow stuff

}

这样做的目的是测试当前目录是否以变量中列出的目录开头(在目录中),或者是其中之一slowdirs。如果它不是“慢速”目录之一,则运行“慢速命令”,否则跳过它们。

答案2

我喜欢此解决方案chepner 在 StackOverflow 上给出了以下信息,我将直接引用:

除了 precmd 函数之外,还有一个名为 precmd 的数组,其中包含要同时调用的函数列表。您可以自己操作它,但 zshcontrib 有一个函数 add-zsh-hook 可以简化操作。

代码:

# precmd_slow and precmd_fast defined as before

autoload add-zsh-hook
add-zsh-hook precmd precmd_fast

fast () {
    add-zsh-hook -d precmd precmd_slow
    add-zsh-hook precmd precmd_fast
}

slow () {
    add-zsh-hook -d precmd precmd_fast
    add-zsh-hook precmd precmd_slow
}

答案3

您可以使用whence -f输入一个函数,替换其名称,然后评估生成的函数定义:

rename_func() {
    if (( $# != 2 )); then
        echo "Usage: rename_func <oldname> <newname>" >&2
        return 1
    fi
    oldname=$1
    newname=$2
    local code=$(echo "$newname () {"; whence -f $oldname | tail -n +2)
    unset -f $oldname
    eval "$code"
}

替换第一行将起作用,因为whence始终将可预测的格式应用于函数:

$ test() { true }
$ whence -f test
test () {
        true
}

答案4

Zsh 函数可以用 复制functions -c并用 删除unfunction,因此要重命名:

functions -c oldfn newfn
unfunction oldfn

相关内容