在不关闭 shell window 的情况下自动重新加载别名

Reload aliases on change automatically without closing the shell window

我的别名存储在 ~/.zsh_aliases 中,来源是 ~/.zshrc:

# Access custom aliases in the shell
[ -e "${HOME}/.zsh_aliases" ] && source "${HOME}/.zsh_aliases"

但是,当更改别名时,我必须始终关闭当前的 shell window 并打开一个新的才能使更改生效。

Zsh 能否在更改时自动重新加载别名以使它们可用而无需关闭 shell window?

您实际上不需要为此关闭并重新打开您的终端,只需 运行 source ~/.zsh_aliases(加载新的和更改的别名)或者 exec zsh(替换当前的 shell 用一个新的)也可以。

如果您真的想在修改 ~/.zsh_aliases 时重新获取资源,我建议您将以下内容添加到您的 ~/.zshrc:

# File containing aliases; 
ALIAS_FILE="${HOME}/.zsh_aliases

reload_aliases () {
    # do nothing if there is no $ALIAS_FILE
    [[ -e ALIAS_FILE ]] || return 1
    # check if $ALIAS_FILE has been modified since last reload
    # the modifier `(:A)` resolves any symbolic links
    if [[ $LAST_ALIAS_RELOAD < $(stat -c %Y ${ALIAS_FILE}(:A)) ]]; then
        # remove all aliases; optional!
        # only do this if all of your aliases are defined in $ALIAS_FILE
        # also affects aliases defined on the command line
        unalias -m '*'
        # load aliases
        source $ALIAS_FILE
        # update date of last reload
        LAST_ALIAS_RELOAD=$(date +%s)
    fi
}

# make reload_aliases to be run before each prompt
autoload -Uz add-zsh-hook
add-zsh-hook precmd reload_aliases

请注意,任何更改仅在出现新提示时可用。这意味着,如果您修改 ~/.zsh_aliases,您需要在所有终端中至少按一次 Enter 才能使更改生效。

我使用别名,因此:-

alias vialias='vi ~/.oh-my-zsh/custom/alias.zsh ; source ~/.oh-my-zsh/custom/alias.zsh'

当我 运行 vialias 时,我编辑我的别名,然后当我离开 vi 时,更改生效。

为了简化已接受的答案添加:

source ~/.zsh_aliases

plugins 部分下面的 ~/.zshrc 中。

然后~/.zsh_aliases中添加一个别名,如下所示:

alias f="exec zsh"

要刷新 zsh 和别名类型 f