2013-03-22 5 views
3

기술적으로 파일의 태그를보기 위해 vim에서 Tagbar을 사용하고 있지만,이 질문은 일반적인 ctags 인 v5.8에 일반적으로 적용됩니다.무한한 ctags에서`--regex-<LANG>`으로 생성 된 태그에 범위 정보를 추가 할 수 있습니까?

한다고 가정 나는 다음과 같은 파이썬 파일을 가지고, 그것을 foo.py 전화 :

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

이의 그것에 ctags을 실행하자 : ctags 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 정규식에 대한 추한) 추한이지만이 예를 들어 충분히 수행 할 작업 가져옵니다

bar foo.pp /^ include bar$/;" i 
foo foo.pp /^class foo {$/;" c 
: 내 tags 파일에 다음과 같은 태그를 생성

--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/ 

두 줄 모두 범위 지정 정보가 없습니다. 제 질문은 이것입니다 : 어쨌든 --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와 호환되는 한 임의의 태그 생성 프로그램을 지원하므로 간단한 구문 분석기를 작성할 수 있습니다. 파이썬을 사용하고 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