커밋 메시지를 위한 "쉘 내" 편집기를 작성할 수 있나요?

커밋 메시지를 위한 "쉘 내" 편집기를 작성할 수 있나요?

git commit이 명령에 대한 bash 별칭을 작성하고 싶습니다 . 나는 보통 다음과 같이 사용하므로 git commit -m "my message here"다음과 같은 별칭을 작성했습니다.

alias commit='git commit'

이를 통해 다음을 수행할 수 있습니다.

$ commit -m "My message"

하지만 별칭을 업데이트하여 해당 -m옵션을 제거할 수도 있다고 생각했습니다.

$ commit "my message"

그 다음에"아직도 따옴표를 입력해야 하나요?"라고 생각했습니다. 제가 구상한 내용은 다음과 같습니다.

$ commit
> My message here

>따옴표 붙은 문자열에 Enter를 입력하면 나타나는 따옴표는 계속해서 다음 위치를 나타냅니다.

$ git commit -m "I am about to hit the enter key
> 

Enter 키를 누르면 명령이 완료됩니다.

Bash에서 이 동작을 스크립트로 작성할 수 있는 방법이 있나요?

Ctrl보너스: +를 클릭하면 명령이 중단됩니다 c.

답변1

bash'를 사용하는 함수를 작성할 수 있습니다 read -e.

commit() {
  local commitlog
  IFS= read -rep '> ' commitlog &&
     git commit -m "$commitlog" "$@"
}

read -e를 눌러 개행을 삽입할 수 있지만 한 줄만 읽혀지기 Ctrl+VCtrl+J때문에 첫 번째 개행 이후의 모든 내용은 삭제됩니다.read

-d $'\r'옵션을 추가하여 이 문제를 해결할 수 있지만 read,Enter적어도 버전 5.0.7 및 4.4.19에서는 프롬프트 이후의 후속 처리가 엉망이라는 것을 발견했습니다..

어쨌든 더 쉽습니다 zsh.

commit() {
  local commitlog=
  vared -ep '> ' commitlog &&
    git commit -m "$commitlog" "$@"
}

개행 문자를 입력하려면 Ctrl+VCtrl+Jlike in 또는 with를 사용할 수 있습니다.bashAlt+Enter

또는 기록(중복을 피하기 위해 여기에 공유됨):

commit() {
  emulate -L zsh
  setopt sharehistory histignorealldups histsavenodups
  local commitlog=
  fc -ap ~/.zcommit-history 500
  vared -ehp '> ' commitlog || return
  print -rs -- "$commitlog"
  git commit -m "$commitlog" "$@"
}

답변2

이 기능을 원하는지 궁금합니다.

commit() {
    if (( $# == 0 )); then
        command git commit  # no `-m`: invoke an editor
    else
        command git commit -m "$*"
    fi
}

편집기를 열고 싶지 않기 때문에 아마도 다음과 같습니다.

commit() {
    [[ $# -eq 0 ]] && set -- A default commit message here.
    command git commit -m "$*"
}

관련 정보