vim에 파일을 저장한 후 bash/zsh 명령을 실행하는 방법은 무엇입니까?

vim에 파일을 저장한 후 bash/zsh 명령을 실행하는 방법은 무엇입니까?

.zshrcvim에서 편집한 후 바로 편집하고 가져올 수 있도록 zshrc에 별칭이 있지만 alias zshrc='vi ~/.zshrc && source ~/.zshrc아무것도 변경하지 않았는데도 파일이 로드됩니다. 나는 그것을 사용한 경우에만 파일을 로드하고 싶고 :w, :wq아무것도 변경하지 않기로 결정한 경우 불필요하게 다시 로드하지 않기를 원합니다.

vim ~/.zshrc성공하면 종료 상태가 0이 아니고 실패하면 0이 아닙니다 0. 분명히, 다양한 유형의 실패에는 서로 다른 0이 아닌 보상이 있습니다. 예를 들어 vim에서 vs를 사용하는 경우 :q!vim의 종료 상태는 무엇입니까? 아마도 반환된 종료 상태(예: )에 :wqbash 문을 집중할 수 있을 것입니다 . 처음에는 vim을 성공적으로 열면 반환될 것이라고 생각했지만 터미널에는 vim 내에서 어떤 vim 명령이 실행되었는지 확인할 수 있는 방법이 있어야 합니다. 예를 들어 사용할 수 있는 조건문이 있습니까 ? 이것은 분명히 유효한 if 조건이 아니지만 이와 같은 것을 수행할 수 있는 방법이 있습니까?ifif [ $? = 113 ]; then source ~/.zshrc; fi0if [ -exec $(vim ~/.zshrc) = ":wq" ]; then source ~/.zshrc; fi

예를 들어 파일 작업을 .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을 호출하는 코드에서 파일이 존재하는지 확인하세요. 이는 위의 순수한 셸 측 솔루션보다 더 정확하지만 훨씬 더 복잡합니다.

관련 정보