Vim 将突出显示的文本发送到 Git 提交的函数

Vim Function to Send Highlighted Text to a Git Commit

问题:

假设我的 vim 缓冲区中有以下文本:

This is a commit msg.

进一步假设我有一个 git 存储库位于 ~/my_repo

目标: 制作一个 vim 脚本,以便我可以突出显示上面的文本,并将其作为 git 提交消息发送到 ~/my_repo。它看起来像

:'<,'>Commit ~/my_repo

它的 repo 参数也会自动完成。

尝试的解决方案:

首先,自动完成功能(据我所知,我觉得这样可以吗?):

function! GitLocations()
  return find $HOME -name '.git' -printf '%h\n' "generates a list of all folders which contain a .git dir
endfunction 

接下来,实际的 git 提交函数,它是不完整的:

function! CommitTextGitRepo(l1, l2, loc)
  let s:msg = ??? " how do I make this the highlighted text from line l1 to line l2?
  execute '!cd ' . a:loc . '&& git commit --allow-empty -m \"' . s:msg '\"'
endfunction

假设我能弄清楚如何让 CommitTextGitRepo() 在上面工作,我最后需要的是这个(我认为):

command! -nargs=* -complete=custom,GitLocations -range Commit call CommitToGitRepo(<line1>, <line2>, <q-args>)

我很亲近。我该如何完成呢? :)

join(getline(a:l1, a:l2),"\n")

应该可以解决问题 我宁愿使用一个局部变量,你可能想对消息进行 shellescape,使函数接近这个

function! CommitTextGitRepo(l1, l2, loc)
  let l:msg = join(getline(a:l1,a:l2), "\n")
  execute '!cd ' . a:loc . '&& git commit --allow-empty -m ' . shellescape(l:msg)
endfunction

http://vimhelp.appspot.com/eval.txt.html#shellescape%28%29