我可以为提交消息编写一个“in-shell”编辑器吗?

我可以为提交消息编写一个“in-shell”编辑器吗?

我想为该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
> 

当我按回车键时它就完成了命令。

有什么办法可以在 bash 中编写此行为的脚本吗?

Ctrl奖励:当我点击+时,命令会中止c

答案1

bash您可以编写一个使用's 的函数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 inbash或 with输入换行符Alt+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 "$*"
}

相关内容