在vim中为diff / patch文件写ctags支持

时间:2016-12-30 10:07:45

标签: diff patch ctags

我经常在我的项目中使用它来查看更改:

git diff 5b80e3be314143f  3b34d24a55ab -- include/* src/* | vim -

所有以更改文件开头的行都是这样写的:

diff --git a/include/behaviors/mechanical/crystal_behavior.h b/include/behaviors/mechanical/crystal_behavior.h

我希望能够使用标签栏轻松导航文件,标签栏使用ctags,并获取文件名,例如crystal_behavior.h。 所以,我知道我可以在.ctags文件中使用这样的东西:

--langdef=diff
--langmap=diff:.diff
--regex-diff=/^diff --git .*b\/(.*)(\/(.*))+$/\.\. \2/d,file/

与我的.vimrc

一起使用
let g:tagbar_type_diff = {
  \ 'ctagstype' : 'diff',
  \ 'kinds'     : [
    \ 'd:Files',
    \ ],
    \ 'sort'    : 0,
\ }

我的问题是,我可以在这里--regex-diff=*放入什么来获取有意义的文件名? (我或多或少) 是否有可能更进一步,并在每个文件中标记帅哥?这是我无法得到的最棘手的部分。

谢谢

  • 奖金问题:如果我直接从缓冲区读取差异,标签栏不会生成标签...而我是git diff ......> patch.diff,然后是vim patch.diff,它可以工作。

1 个答案:

答案 0 :(得分:1)

Universal-ctags(https://ctags.io)有一个内置的解析器,用于从geany导入的diff:

[jet@localhost tmp]$ cat foo.diff 
diff --git a/source.mak b/source.mak
index 2550028..eaa9154 100644
--- a/source.mak
+++ b/source.mak
@@ -44,6 +44,7 @@ PARSER_SOURCES =              \
    $(PARSER_DIR)/clojure.c         \
    $(PARSER_DIR)/css.c         \
    $(PARSER_DIR)/cobol.c           \
+   $(PARSER_DIR)/diff.c            \
    $(PARSER_DIR)/dosbatch.c        \
    $(PARSER_DIR)/eiffel.c          \
    $(PARSER_DIR)/erlang.c          \
[jet@localhost tmp]$ ~/var/ctags/ctags --fields=+K --sort=no -o - foo.diff 
a/source.mak    foo.diff    /^--- a\/source.mak$/;" modifiedFile
-44,6 +44,7 foo.diff    /^@@ -44,6 +44,7 @@ PARSER_SOURCES =                \\$/;"  hunk    modifiedFile:a/source.mak