繁盛的ctags错误地标记了python多行类定义

2024-04-29 07:16:54 发布

您现在位置:Python中文网/ 问答频道 /正文

当python类定义跨越多行时,大量的ctag生成错误的标记,只有最后一行指向搜索模式:

考虑文件test.py

class FirstSubclass(
    LongLineBaseClass, AnotherLongClassName,
    MoreBaseClassWithVeryLongName
):
    pass


class SecondSubclass(
    LongLineBaseClass, AnotherLongClassName,
    MoreBaseClassWithVeryLongName
):
    pass


class OneLineClass(LongLineBaseClass):
    pass

以及为ctags test.py生成的tags文件(添加了注释):

FirstSubclass   test.py /^):$/;"    c !PROBLEM
OneLineClass    test.py /^class OneLineClass(LongLineBaseClass):$/;"    c !OK
SecondSubclass  test.py /^):$/;"    c !PROBLEM

FirstSubclassSecondSubclass都接收到相同的搜索模式(ex命令):/^):$,即每个类定义的最后一行只有两个字符。这使得在vim中导航的标签不可用

丰富的ctags版本和信息:

Exuberant Ctags 5.9~svn20110310, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Oct  7 2014, 13:52:37
  Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net
  Optional compiled features: +wildcards, +regex

我尝试过的:我使用了ctag,有参数和没有参数


有什么想法吗? 提前谢谢


Tags: 文件pytest定义模式passclassctags
1条回答
网友
1楼 · 发布于 2024-04-29 07:16:54

通用ctag(https://ctags.io)是一个非正式的exuebrant ctag分支,可以预期地提取模式:

[yamato@slave]~% cat /tmp/foo.py 
cat /tmp/foo.py 
class FirstSubclass(
    LongLineBaseClass, AnotherLongClassName,
    MoreBaseClassWithVeryLongName
):
    pass


class SecondSubclass(
    LongLineBaseClass, AnotherLongClassName,
    MoreBaseClassWithVeryLongName
):
    pass


class OneLineClass(LongLineBaseClass):
    pass

[yamato@slave]~% u-ctags -o - /tmp/foo.py
u-ctags -o - /tmp/foo.py
FirstSubclass   /tmp/foo.py /^class FirstSubclass($/;"  c
OneLineClass    /tmp/foo.py /^class OneLineClass(LongLineBaseClass):$/;"    c
SecondSubclass  /tmp/foo.py /^class SecondSubclass($/;" c

此外,它还可以填充继承字段:

[yamato@slave]~% u-ctags  fields=+i -o - /tmp/foo.py
u-ctags  fields=+i -o - /tmp/foo.py
FirstSubclass   /tmp/foo.py /^class FirstSubclass($/;"  c   inherits:LongLineBaseClass, AnotherLongClassName, MoreBaseClassWithVeryLongName 
OneLineClass    /tmp/foo.py /^class OneLineClass(LongLineBaseClass):$/;"    c   inherits:LongLineBaseClass
SecondSubclass  /tmp/foo.py /^class SecondSubclass($/;" c   inherits:LongLineBaseClass, AnotherLongClassName, MoreBaseClassWithVeryLongName 

相关问题 更多 >