![在 vim 中保存文件后如何执行 bash/zsh 命令?](https://linux22.com/image/173465/%E5%9C%A8%20vim%20%E4%B8%AD%E4%BF%9D%E5%AD%98%E6%96%87%E4%BB%B6%E5%90%8E%E5%A6%82%E4%BD%95%E6%89%A7%E8%A1%8C%20bash%2Fzsh%20%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我的 zshrc 中有一个别名,以便我可以编辑.zshrc
,然后在 vim 中编辑后立即获取它,alias zshrc='vi ~/.zshrc && source ~/.zshrc
但即使我没有更改任何内容,它也会加载该文件。我希望它仅在我使用过时才加载文件:w
,或者:wq
这样,如果我决定不更改任何内容,它就不会不必要地重新加载它。
vim ~/.zshrc
如果成功则退出状态为非零,如果失败则退出状态为0
非零。显然,不同类型的故障有不同的非零回报。例如,如果我在 vim 中使用:q!
vs ,vim 等效退出状态是什么。:wq
也许我可以将 bashif
语句集中在返回的退出状态上,例如if [ $? = 113 ]; then source ~/.zshrc; fi
.我的第一个想法是,它会0
在任何成功打开 vim 时返回,但终端必须有某种方式来查看 vim 内部执行了哪些 vim 命令。有没有我可以使用的条件语句,例如if [ -exec $(vim ~/.zshrc) = ":wq" ]; then source ~/.zshrc; fi
.这显然不是一个真正有效的 if 条件,但是有没有办法完成这样的事情呢?
例如,如果我正在处理一个.c
文件,并且想看看它是否在保存并退出 vim 后立即编译,这也可能很有用if [ -exec $(vim main.c) = ":wq" ]; then gcc main.c -o main && ./main; fi
。
答案1
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 的代码中,检查该文件是否存在。这会更精确,但比上面的纯壳端解决方案复杂得多。