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'
,它将提交哈希作为选项参数并填充快速修复列表。#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)
评论
也可以使用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
– Peter Rincker
17年8月31日在20:46
谢谢你们的建议,它的确比我原来的回答有效得多。
–statox♦
17年9月1日在7:36
有没有这样做的插件?
– firedev
17年9月1日在15:05