有一个 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