web-dev-qa-db-ja.com

vimにファイルを保存した後にbash / zshコマンドを実行するにはどうすればよいですか?

Zshrcにエイリアスがあるので_.zshrc_を編集し、vim _alias zshrc='vi ~/.zshrc && source ~/.zshrc_で編集した後すぐにソースを取得できますが、何も変更していなくてもファイルが読み込まれます。 _:w_または_:wq_を使用した場合にのみファイルをロードして、何も変更しないことにしたときに不必要に再ロードされないようにします。

_vim ~/.zshrc_終了ステータスは、成功した場合は_0_になり、失敗した場合はゼロ以外になります。どうやら、さまざまなタイプの障害からさまざまなゼロ以外のリターンがあります。たとえば、vimで_:q!_と_:wq_を使用した場合、vimの同等の終了ステータスはどうなりますか?たぶん、bash ifステートメントを_if [ $? = 113 ]; then source ~/.zshrc; fi_のような返された終了ステータスに集中させることができます。私が最初に考えたのは、vimを正常に開くと_0_が返されるということでしたが、ターミナルがvim内で実行されるvimコマンドを確認するための何らかの方法が必要です。 if [ -exec $(vim ~/.zshrc) = ":wq" ]; then source ~/.zshrc; fiのように使用できる条件ステートメントはありますか?それが機能するif条件は明らかに現実的ではありませんが、このようなことを達成する方法はありますか?

これは、たとえば_.c_ファイルで作業していて、if [ -exec $(vim main.c) = ":wq" ]; then gcc main.c -o main && ./main; fiのようにvimを保存して終了した直後にコンパイルされるかどうかを確認する場合にも役立ちます。

2
ntruter42

Vi(m)は、起動に失敗するか、ゼロ以外のステータスで強制的に終了するスクリプトを実行している場合(および、それが可能かどうかはわかりません)、またはシグナルによって強制終了されない限り、ステータス0で終了します。終了ステータスでは、:q!:wqを区別できません。

エディタを起動してから終了するまでの間にファイルが変更されたかどうかを確認できます。ファイルが変更されたかどうかはわかりませんこのエディターセッションでですが、これは重要ではないと思います。厳密に言えば、ファイルを開いたままにせずにファイルが変更されたかどうかを確認する方法はありませんが、同じファイル名のiノード変更時間を確認することは十分に近いです。

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を呼び出すコードで、そのファイルが存在するかどうかを確認します。これはより正確ですが、上記の純粋なシェル側のソリューションよりもはるかに複雑です。