2013-03-22 53 views
3

從技術上講,我在vim中使用Tagbar來查看文件的標籤,但這個問題通常適用於繁瑣的ctags,v5.8。我可以將範圍信息添加到用`--regex-<LANG>`在生成的ctags中生成的標籤嗎?

想我已經得到了下面的Python文件,把它foo.py

class foo: 
    def bar(baz): 
     print(baz) 

讓我們在其上運行ctagsctags foo.py。得到的tags文件是這樣的:

!_ some ctags version/formatting stuff not worth pasting 
bar foo.py /^ def bar(baz):$/;" m class:foo 
foo foo.py /^class foo:$/;" c 

我感興趣的位是第二線,class:foo的最後一個字段。這是bar()函數的範圍。如果我在vim中使用tagbar,它會相應地在該類中嵌套函數。

現在假設我在~/.ctags中添加了對新語言的支持。其實,我加入支持這一傀儡文件:

class foo { 
    include bar 
} 

假設我用下面~/.ctags參數。 「導入」正則表達式是醜陋(errr ...醜陋的人,正則表達式),但它得到足夠的做了這個例子的工作:

--langdef=puppet 
--langmap=puppet:.pp 
--regex-puppet=/^class[ \t]*([:a-zA-Z0-9_\-]+)[ \t]*/\1/c,class,classes/ 
--regex-puppet=/^\ \ \ \ include[ \t]*([:a-zA-Z0-9_\-]+)/\1/i,include,includes/ 

,在我tags文件中生成以下標籤:

bar foo.pp /^ include bar$/;" i 
foo foo.pp /^class foo {$/;" c 

注意這兩行都沒有包含範圍信息。我的問題是:無論如何,我一般會構建--regex-puppet參數或--regex-<LANG>行來收集有關標籤範圍的信息?或許宣稱符合標準A的標籤總是要符合標準B的標籤的範圍 - 父母?

man ctags表明沒有明確的方式來添加任意範圍的信息,但我可能俯瞰另一種解決方案(爲了強調稍微剪斷):

--regex-<LANG>=/regexp/replacement/[kind-spec/][flags] 

     Unless modified by flags, regexp is interpreted as a Posix extended regular expression. The replacement should expand for all matching lines to a non-empty string of 
     characters, or a warning message will be reported. An optional kind specifier for tags matching regexp may follow replacement, which will determine what kind of tag is 
     reported in the "kind" extension field (see TAG FILE FORMAT, below). The full form of kind-spec is in the form of a single letter, a comma, a name (without spaces), a 
     comma, a description, followed by a separator, which specify the short and long forms of the kind value and its textual description (displayed using --list-kinds). Either 
     the kind name and/or the description may be omitted. If kind-spec is omitted, it defaults to "r,regex". Finally, flags are one or more single-letter characters having the 
     following effect upon the interpretation of regexp: 

      b The pattern is interpreted as a Posix basic regular expression. 

      e The pattern is interpreted as a Posix extended regular expression (default). 

      i The regular expression is to be applied in a case-insensitive manner. 

回答

2

沒有呢,可惜這是不可能與ctags的正則表達式模式支持。獲得ctags生成正確範圍的唯一方法是在C中編寫一個解析器作爲附加模塊。如果找到時間,我想增加對更好地處理ctags的新語言的支持,但到目前爲止還沒有解決問題,我也不確定最好的方法。如果你最感興趣的是Tagbar支持,還有另一種方法:Tagbar支持任意標籤生成程序,只要它們的輸出與ctags一致即可,所以你可以寫一個簡單的解析器,比如說, Python並配置Tagbar來使用它。看看:h tagbar-extend(特別是最後一小節「編寫你自己的標記生成程序」),如果這將是一個選項。

0

我正在通用ctags項目的這種功能: https://github.com/universal-ctags/ctags/pull/562

(不要期望太多;正則表達式解析器對於複雜語法是不夠的 新功能適用於語法簡單的語言。)

實施例1 ::

$ cat /tmp/input.foo 
class foo: 
def bar(baz): 
    print(baz) 
class goo: 
def gar(gaz): 
    print(gaz) 

$ cat /tmp/foo.ctags 
--langdef=foo 
    --map-foo=+.foo 
    --regex-foo=/^class[[:blank:]]+([[:alpha:]]+):/\1/c,class/{scope=set} 
    --regex-foo=/^[[:blank:]]+def[[:blank:]]+([[:alpha:]]+).*:/\1/d,definition/{scope=ref} 

$ ~/var/ctags/ctags --options=/tmp/foo.ctags -o - /tmp/input.foo 
bar /tmp/input.foo /^ def bar(baz):$/;" d class:foo 
foo /tmp/input.foo /^class foo:$/;" c 
gar /tmp/input.foo /^ def gar(gaz):$/;" d class:goo 
goo /tmp/input.foo /^class goo:$/;" c 

實施例2 ::

$ cat /tmp/input.pp 
class foo { 
include bar 
} 

$ cat /tmp/pp.ctags 
--langdef=pp 
    --map-pp=+.pp 
    --regex-pp=/^class[[:blank:]]*([[:alnum:]]+)[[[:blank:]]]*\{/\1/c,class,classes/{scope=push} 
    --regex-pp=/^[[:blank:]]*include[[:blank:]]*([[:alnum:]]+).*/\1/i,include,includes/{scope=ref} 
    --regex-pp=/^[[:blank:]]*\}.*//{scope=pop}{exclusive} 

$ ~/var/ctags/ctags --options=/tmp/pp.ctags -o - /tmp/input.pp 
bar /tmp/input.pp /^ include bar$/;" i class:foo 
foo /tmp/input.pp /^class foo {$/;" c 
相關問題