Zsh 更改时自动重新加载别名,而无需关闭shell窗口

Zsh 更改时自动重新加载别名,而无需关闭shell窗口,zsh,Zsh,我的别名存储在~/.zsh_alias中,来源于~/.zshrc: # Access custom aliases in the shell [ -e "${HOME}/.zsh_aliases" ] && source "${HOME}/.zsh_aliases" # File containing aliases; ALIAS_FILE="${HOME}/.zsh_aliases reload_aliases () { # do nothing if there

我的别名存储在
~/.zsh_alias
中,来源于
~/.zshrc

# Access custom aliases in the shell
[ -e "${HOME}/.zsh_aliases" ] && source "${HOME}/.zsh_aliases"
# 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
但是,在更改别名名称时,我必须始终关闭当前shell窗口并打开一个新窗口,才能激活更改


Zsh是否可以在更改时自动重新加载别名以使其可用,而无需关闭shell窗口?

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

如果您真的想在修改
~/.zsh_别名时重新获取其源代码,我建议您在
~/.zshrc
中添加以下内容:

# Access custom aliases in the shell
[ -e "${HOME}/.zsh_aliases" ] && source "${HOME}/.zsh_aliases"
# 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
包含别名的文件; ALIAS_FILE=“${HOME}/.zsh_别名 重新加载别名(){ #如果没有$ALIAS\u文件,则不执行任何操作 [[-e ALIAS_FILE]]||返回1 #检查上次重新加载后$ALIAS_文件是否已被修改 #修饰符“(:A)”解析任何符号链接 如果[[$LAST_ALIAS_RELOAD<$(stat-c%Y${ALIAS_FILE}(:A))];则 #删除所有别名;可选! #只有在$ALIAS\u文件中定义了所有别名时,才执行此操作 #还影响在命令行上定义的别名 unalias-m'*' #加载别名 源$ALIAS\u文件 #上次重新加载的更新日期 上次\u别名\u重新加载=$(日期+%s) fi } #在每次提示之前运行reload_别名 自动加载-Uz添加zsh挂钩 添加zsh hook precmd reload_别名

请注意,任何更改仅在新提示下可用。这意味着,如果修改
~/.zsh_别名
,则需要在所有终端中至少按一次Enter键,更改才会生效。

我使用别名,因此:-

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

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

要简化接受的答案,请添加:

在插件部分下面的
~/.zshrc

然后在
~/.zsh_别名中添加别名,如下所示:

alias f="exec zsh"

要刷新zsh和别名,请键入
f

非常感谢@Adaephon!它还不能工作。它必须是
自动加载
?我收到一个
命令未找到
错误。将其更改为
自动加载
也不能工作。您当然是正确的,它需要是
自动加载
。除此之外,它应该可以工作,至少对我来说是这样。如果您使用旧配置启动一个zsh,然后将上面的代码复制到命令行上,会发生什么情况?(您可能需要删除注释或事先运行
setopt interactivecomments
)我试过了,但也不起作用。你能看看我的吗?我测试了你的
~/.zshrc
,一切看起来都很好。你使用的是哪个版本的zsh?你可以添加
打印“重新加载”
作为
重新加载别名()的第一行
只是为了查看函数是否实际运行。如果没有,那么如果您编写
precmd(){reload_aliases;}
而不是我的代码段中的最后两行,它是否有效?我不使用
fasd
(甚至
prezto
),所以我不能检查它。但是如果我不得不猜测的话,我会说可能是
unalias-m'*'
行引起的。如果没有该行,请尝试if。