我最终想要写一个vim宏(不是我知道怎么做),因为我确信我可以在vim中做到这一点,但我还不知道基础知识。
我想从git commit消息中获取分支名称(或者它的一部分 - 正则表达式的那部分应该是直截了当的),然后用冒号将其粘贴到文件的顶部,并希望离开光标在那一端。
所以当我开始时文件看起来有点像这样:
$ <-- cursor here
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch JIRA-1234-some-description-here
# Your branch is up to date with ...
我想捕获/On branch \([A-Z]*-[0-9]*\)/
,向上移动到顶部,粘贴它和冒号,将光标留在冒号后面,例如:
JIRA-1234: $ <-- cursor here
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch JIRA-1234-some-description-here
# Your branch is up to date with ...
理想情况下,还要让我处于插入模式。
答案 0 :(得分:1)
假设您使用fugitive.vim,可以使用fugitive#head()
获取当前分支名称。您可以执行以下操作(放入vimrc
文件):
augroup MyCommit
autocmd!
autocmd FileType gitcommit call setline(1, substitute(fugitive#head(), '^\([A-Z]\+-[0-9]\+\).*', '\1: ', ''))
augroup END
注意:我还没有测试过这个。
答案 1 :(得分:1)
您可以使用此功能:
function! MyFunction()
g/On branch \([A-Z]*-[0-9]*\)/exe "co0 | 1s/.* \\(.*-\\d\\+\\).*/\\1:/g"
normal $
endfunction
然后映射它:
nmap <leader>f :call MyFunction()<cr>
函数说明:全局命令g/{pat}/[cmd]
在模式[cmd]
匹配的行上执行命令{pat}
。您已在问题中提供了{pat}
。然后,为了执行多个命令,我建议使用exe
。此处exe
将匹配的行复制到第一行(co0
)并执行替换(1s/.../\\1:/g
)。