0

问题:

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

This is a commit msg.

进一步假设我有一个位于~/my_repo.

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

:'<,'>Commit ~/my_repo

它还将在其 repo 参数上自动完成。

尝试的解决方案:

首先,自动完成功能(AFAIK,我认为这可以吗?):

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

接下来是实际的 git commit 函数,不完整:

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>)

我是如此接近。我该如何完成这件事?:)

4

1 回答 1

1
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

于 2016-05-12T07:35:46.897 回答