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。