调试 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.