Переопределяемые функции в Zsh

Рассмотрим следующие две функции:

function slow_git_prompt_info() { if [[ "$(command git config --get oh-my-zsh.hide-status 2>/dev/null)" != "1" ]]; then ref=$(command git symbolic-ref HEAD 2> /dev/null) || \ ref=$(command git rev-parse --short HEAD 2> /dev/null) || return 0 echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_SUFFIX" fi } 

а также:

 function branch_name_only_git_prompt_info() { ref=$(git symbolic-ref HEAD 2> /dev/null) || return echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$ZSH_THEME_GIT_PROMPT_SUFFIX" } 

Я хотел бы определить еще одну третью функцию, которая при вызове переопределяет / определяет функцию git_prompt_info() в основном «пространстве имен», чтобы сделать ее «точкой» для fast_git_prompt_info

Например, что-то вроде:

 # Pseudo-code: function redefine_git_prompt_info() { git_prompt_info = branch_name_only_git_prompt_info } 

Возможно ли это с Zsh? Если да, то как?

Вы можете определить функцию в любом месте. Чтобы связать другую функцию, просто вызовите ее с теми же параметрами.

 redefine_git_prompt_info () { git_prompt_info () { branch_name_only_git_prompt_info "$@"; } } 

Если branch_name_only_git_prompt_info позже переопределяется, вызов redefine_git_prompt_info вызовет новое определение. Если вы хотите скопировать текущее определение, в zsh, вы можете сделать это легко благодаря массиву functions .

 redefine_git_prompt_info () { functions[git_prompt_info]=$functions[branch_name_only_git_prompt_info] }