我在zshrc中有一个别名,以便我可以编辑它.zshrc
,然后在vim中编辑后立即将其来源alias zshrc='vi ~/.zshrc && source ~/.zshrc
,但是即使我什么都没做,它也可以加载文件。我希望它仅在使用过后才加载文件,:w
或者:wq
如果我决定不更改任何内容,则它不会不必要地重新加载文件。
vim ~/.zshrc
退出状态为0
成功,否则为非零。显然,不同类型的故障会产生不同的非零收益。例如,如果我在vsvi中使用:q!
vs :wq
,vim等效的退出状态将是什么。也许我可以将bashif
语句的重点放在返回的退出状态(如)上if [ $? = 113 ]; then source ~/.zshrc; fi
。我的第一个想法是,它将0
在任何成功打开vim时返回,但是终端必须有某种方式来查看在vim中执行了什么vim命令。是否可以使用like的条件语句if [ -exec $(vim ~/.zshrc) = ":wq" ]; then source ~/.zshrc; fi
。如果条件有效,那显然不是真实的,但是有什么办法可以完成这样的事情吗?
例如,如果我正在处理一个.c
文件,并且想查看它是否在保存并退出vim之后立即编译,这也可能很有用if [ -exec $(vim main.c) = ":wq" ]; then gcc main.c -o main && ./main; fi
。
Vi(m)会以状态0退出,除非它无法启动或正在运行一个脚本,该脚本以非零状态强制退出(而且我不确定那是否有可能退出),否则它会被信号杀死。你无法区分:q!
并:wq
通过出口状态。
您可以在启动编辑器和退出编辑器之间检查文件是否已更改。您无法确定文件在此编辑器会话中是否已更改,但是我认为这无关紧要。严格来说,如果没有打开文件就无法检查文件是否已更改,但是检查相同文件名的inode更改时间已经足够了。
zmodload -F zsh/stat b:zstat
edit-and-source-if-changed () {
local filename=$@[$#]
local original_ctime="$(zstat +ctime -- $filename)" 2>/dev/null
vim "$@" || return
[[ -n $original_ctime ]] || return
if [[ $original_ctime != "$(zstat +ctime -- $filename 2>/dev/null)" ]]; then
echo source $filename
fi
}
您可以在Vim退出时运行命令,也可以在保存文件后运行命令。因此,从Vim内部,可以在保存文件时设置一个变量,然后在退出代码中(如果设置了该变量)运行一些命令来创建具有固定名称的文件。在调用Vim的代码中,检查该文件是否存在。那会更精确,但是比上面的纯壳端解决方案复杂得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句