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

2q5ifsrm  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(109)

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

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

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

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

我希望能够使用tagbar轻松地浏览文件,它使用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=*中放入什么来获得文件名?(我得到了或多或少)是否可以进一步标记每个文件中的块?这是我不能得到的最棘手的部分。
谢谢

  • 附加问题:如果我直接从buffer中读取diff,tagbar不会生成标签,但是如果我先执行git diff ...... > patch.diff,然后执行vim patch.diff,tagbar就可以工作了。
hgc7kmma

hgc7kmma1#

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

[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

相关问题