如何使用git如何将当前提交中的文件列表加载到Quickfix窗口中?

代码审查未通过,我想一个一个地修复它们。

#1 楼

您可以使用以下函数,该函数的优点是不更改本地git repo的状态:

function! CommitQF(...)
    " Get the commit hash if it was specified
    let commit = a:0 == 0 ? '' : a:1

    " Get the result of git show in a list
    let flist = system('git show --name-only ' . commit . ' | tail -n +7')
    let flist = split(flist, '\n')

    " Create the dictionnaries used to populate the quickfix list
    let list = []
    for f in flist
        let dic = {'filename': f, "lnum": 1}
        call add(list, dic)
    endfor

    " Populate the qf list
    call setqflist(list)
endfunction


您可以不带参数或使用提交哈希将其调用为参数(如果未指定任何参数,则使用最后一次提交):

call CommitQF("cc5b6a976fde8c9ee66387c91765feb202ba0124")
call CommitQF()


它将使用带有git show参数的--name-only命令来获取文件名。在提交中。 tail -n +7命令删除git show输出中不是文件名的行。然后,它将创建用于填充快速修复列表的词典列表(有关此内容的更多详细信息,请参阅:h setqflist())。

调用该函数后,您将需要使用:copen打开快速列表(或者您可以将其添加到该函数中)。


编辑另一种可能的方法(和仅使用内置功能可能是一种更好的方法:使用以下设置:指定提交)。

然后,快速修复窗口将包含文件列表,您将能够导航到它们。

(当然,您可能要创建在通常的:make和此:make fff93a09之间切换的某种事物的映射)

您可以查看以下帮助主题:


makeprg
:h errorformat


第二编辑@PeterRin cker和@LucHermitte在评论中提出了一些非常好的建议,非常感谢。

您可以使用以下一种衬纸:

set makeprg=git\ show\ --name-only\ $*\ \\|\ tail\ -n\ +7
set efm+=%f


要创建命令:h 'makeprg',它将提交哈希作为选项参数并填充快速修复列表。

评论


也可以使用git show --pretty =''--name-only 删除提交消息信息并仅显示文件名

– Peter Rincker
17年8月31日在17:03

我本来会用map(copy(flist),'{“ filename”:v:val,“ lnum”:1}')而不是:for循环-它总是更快,但调试起来也很麻烦。

–卢克·赫米特(Luc Hermitte)
17年8月31日在17:10



有了@LucHermitte的建议,这很容易成为一个衬里:command -nargs =? -bar Gshow呼叫setqflist(map(systemlist(“ git show --pretty =''--name-only ”),'{“ filename”:v:val,“ lnum”:1}'))

– Peter Rincker
17年8月31日在20:46

谢谢你们的建议,它的确比我原来的回答有效得多。

–statox♦
17年9月1日在7:36

有没有这样做的插件?

– firedev
17年9月1日在15:05

#2 楼

这是两种相关的方法。两者都使用git-*脚本;如果将它们放在PATH上,则可以像调用git的子命令一样调用它们。

使用contrib脚本git-jump


git-jump脚本提供了一种便捷的方式,可将diff块,grep结果或空白错误加载到支持快速修复格式的编辑器中。

由于git jump diff将其参数转发给diff,并且由于您对上一次提交感兴趣,因此可以执行

git jump diff @^ @


使用我的git-ed脚本

我的git-ed脚本是在我了解git-jump之前编写的。那时我用了很多(现在少了)唯一的目的是在编辑器中打开更改的文件(当前,一次提交或一系列提交)。因此,只需调用

git ed @


并使用参数列表。

评论


安装说明:您不能将/ usr / share / doc / git / contrib / git-jump添加到路径中,因为git不会将git-jump作为可执行文件提供。您必须将git-jump复制到自己的bin目录中。

– idbrii
20年5月12日在8:45

@idbrii对我来说,路径是/ usr / local / share / git-core / contrib / git-jump,它确实提供了可执行文件(或者至少对我来说是可执行的)。如果您使用的是doc,则可能没有正确的路径?存储库中的脚本具有可执行权限,因此,除非您用来安装git的脚本将其删除,否则应保留它们

– D. Ben Knoble♦
20年5月12日在12:46



#3 楼

唯一想到的是

git reset --soft head~1


“取消提交”文件,然后使用vim-fugitive :Gtatus命令在“预览”窗口中浏览它们。 Quickfix并不完全正确,但是它可读性强,可以存储您的位置,并且您可以从那里上台/下台。

#4 楼

将此添加到您的.vimrc文件中,就一切就绪。这会将文件从git diff添加到quick fix列表中:

let s:git_status_dictionary = {
            \ "A": "Added",
            \ "B": "Broken",
            \ "C": "Copied",
            \ "D": "Deleted",
            \ "M": "Modified",
            \ "R": "Renamed",
            \ "T": "Changed",
            \ "U": "Unmerged",
            \ "X": "Unknown"
            \ }
function! s:get_diff_files()
  let list = map(split(system(
              \ 'git diff --name-status HEAD'), '\n'),
              \ '{"filename":matchstr(v:val, "\S\+$"),"text":s:git_status_dictionary[matchstr(v:val, "^\w")]}'
              \ )
  call setqflist(list)
  copen
endfunction

command! -nargs=0 DiffRev call s:get_diff_files()


信用:稍作编辑

#5 楼

Plugin Fugitive v3.2(2020年1月)

vim-fugitive添加了新命令,因为OP提出了这个问题,它可以完全执行OP的要求。

现在您可以调用

:Git difftool


或缩写版本

:G difft[tab complete]


,这会将所有变更集加载到快速修复列表中。如果文件有多个更改,它们将在quickfix列表中出现几次。我喜欢这个。但是,如果您只希望每个文件只有一次,请运行

 :G difftool --name-only


#6 楼

将diff块添加到quickfix的最快方法

Quickfix非常方便。它甚至具有自己的格式定义,但扩展起来并不容易。我发现更容易将diff重新格式化为编译错误的格式:“ $ file:$ line:$ message”。重新格式化可作为独立的过滤器功能。它与vim选项-q结合使用,非常易于使用和重用,无需其他安装和配置:

这是我最短的解决方案。

diff_to_quickfix()
{
     perl -ne '/^\+\+\+ (.+)/ && { $f=""};/@@.*\+(\d+)/ && print "$f::$_\n"'
}

vim -q <(git show -U0 --no-prefix | diff_to_quickfix)


vim -q <(git diff -U0 --no-prefix | diff_to_quickfix)