调试 zsh 竞争函数的最佳方式
optimal way to debug zsh competion functions
当我们运行compinit
时,它重新定义了所有执行补全的widget。
如果我正在处理一个完成函数,我可以使用 rm -f ~/.zcompdump; compinit
来查看我的新完成函数是如何工作的。
不过,我认为有一种更有效的方法。
假设我从zsh-completions
写了下面的完成函数
#compdef cmd
local -a subcmds
subcmds=('c:description for c command' 'd:description for d command')
_describe 'command' subcmds
如何快速修改函数的一小部分并查看函数的运行情况。
永远不需要重新运行 compinit
。您可以使用 compdef
来定义新的完成函数,前提是它可以在 $fpath
中找到,例如:
compdef -a _cmd cmd
-a
标记 _cmd
用于自动加载。
我倾向于在临时目录或本地 git checkout 中工作,因此定义以下别名以快速将当前目录添加到 $fpath
的开头:
alias -- +fpath='fpath=( ~+ $fpath)'
修改后重新加载可自动加载的函数也很有用。为此,我有以下函数,它还删除了函数中定义的函数:
freload() {
local func
for func; do
unfunction ${(k)functions_source[(R)${functions_source[$func]:-X(#s)}]:-$func};
autoload -U $func;
done
}
我做的另一件事是我已经在我的 .zshrc
中定义了 compdef _foo foo
,这使得通过直接在command-line.
当我们运行compinit
时,它重新定义了所有执行补全的widget。
如果我正在处理一个完成函数,我可以使用 rm -f ~/.zcompdump; compinit
来查看我的新完成函数是如何工作的。
不过,我认为有一种更有效的方法。
假设我从zsh-completions
写了下面的完成函数#compdef cmd
local -a subcmds
subcmds=('c:description for c command' 'd:description for d command')
_describe 'command' subcmds
如何快速修改函数的一小部分并查看函数的运行情况。
永远不需要重新运行 compinit
。您可以使用 compdef
来定义新的完成函数,前提是它可以在 $fpath
中找到,例如:
compdef -a _cmd cmd
-a
标记 _cmd
用于自动加载。
我倾向于在临时目录或本地 git checkout 中工作,因此定义以下别名以快速将当前目录添加到 $fpath
的开头:
alias -- +fpath='fpath=( ~+ $fpath)'
修改后重新加载可自动加载的函数也很有用。为此,我有以下函数,它还删除了函数中定义的函数:
freload() {
local func
for func; do
unfunction ${(k)functions_source[(R)${functions_source[$func]:-X(#s)}]:-$func};
autoload -U $func;
done
}
我做的另一件事是我已经在我的 .zshrc
中定义了 compdef _foo foo
,这使得通过直接在command-line.