在 vim 中保存文件后如何执行 bash/zsh 命令?

在 vim 中保存文件后如何执行 bash/zsh 命令?

我的 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 的代码中,检查该文件是否存在。这会更精确,但比上面的纯壳端解决方案复杂得多。

相关内容