vim:通过正则表达式复制并粘贴

时间:2018-03-16 16:58:16

标签: vim

我最终想要写一个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 ...

理想情况下,还要让我处于插入模式。

2 个答案:

答案 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)。