我想为该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 "$*"
}