LINUX.ORG.RU

Кому нужен find source для tcl?

 


0

1

Идея такая:

Заводим команду «загрузить файл с записью положения исходных текстов». Она принимает имя файла.

Внутри этой команды временно перекрываем proc так, чтобы она запоминала позицию файла, в которой мы находимся. Эту информацию запоминаем в словарь вместе с именем процедуры и именем файла.

Таким образом, у нас получается карта, где каждой загруженной в исходник процедуре соответствует место, где она определена.

Далее в среде делаем команду, которая по имени процедуры открывает это место. Получается SLIME для tcl.

Вопросы: 1. Кто-нибудь заинтересован в этом?

2. Кто-нибудь заинтересован сделать примитивы для этого и прислать мне? Тогда я включу это в clcon. clcon вообще-то не является средой для разработки в tcl, но можно двигаться в этом направлении. Во всяком случае, я бы не отказался от такой команды, хотя пока пользуюсь грепом.

★★★★★

Разве ctags не делает то что ты хочешь?

ctags parses source code and produces a sort of index mapping the names of significant entities (e.g. functions, classes, variables) to the location where that entity is defined. This index is used by editors like vi and emacsen to allow moving to the definition of a user-specified entity

anonymous
()
Ответ на: комментарий от anonymous

А как там с поддержкой tcl? Я что-то у себя в debian 8 не нашёл. Ну и у меня кроссплатформенная IDE под пермиссивной лицензией. Если я вложу в дистрибутив ctags.zip, не повлечёт ли это лицензионных проблем для меня?

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

apt-cache show exuberant-ctags

 Exuberant Ctags supports all possible C language constructions
 and multiple other languages such as assembler, AWK, ASP, BETA,
 Bourne/Korn/Z shell, C++, COBOL, Eiffel, Fortran, Java, Lisp,
 Lua, Makefile, Pascal, Perl, PHP, Python, REXX, Ruby, S-Lang,
 Scheme, Tcl, Verilog, Vim and YACC.

Homepage: http://ctags.sourceforge.net/
anonymous
()
Ответ на: комментарий от den73

не повлечёт ли это лицензионных проблем для меня?

ctags под GPL, это независимый продукт, код которого ты не меняешь.

Не вижу проблем.

anonymous
()
Ответ на: комментарий от anonymous

Ааа, значит в дебиане более старая версия. Ибо в хелпе там tcl не указан.

В общем-то это вариант, хотя для tcl решение выглядит несколько тяжеловесным. Я бы предпочёл навелосипедить что-то чисто tcl-ное. Для этого мне нужен аналог того, что в C именуется #line и #file (емнип).

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Я вот пользуюсь простым велосипедом (для Vim), мне хватает:

proc getAllTags {tags sourcefile} {
set infile [open $sourcefile]
while {[gets $infile line] >= 0} {
   if {[regexp {^proc\s(\S+)} $line fullpatt fullname] } {
      regexp {[^:]+$} $fullname name
      lappend tags "$name\t$sourcefile\t/^$fullpatt /"
      }
   if {[regexp {^method\s(\S+)} $line fullpatt fullname] } {
      regexp {[^:]+$} $fullname name
      lappend tags "$name\t$sourcefile\t/^$fullpatt /"
      }
   }
close $infile
return $tags
}

set tags ""
foreach f [glob -nocomplain "*.tcl"] {
    set tags [getAllTags $tags $f]
    }

# The tags facility expects the tags to be sorted ...
set tags [lsort $tags]
set ftags [open tags w]
foreach line $tags {puts $ftags $line}
close $ftags
loruser
()
Ответ на: комментарий от anonymous

Это всё же не совсем то. Это показывает, какие процедуры определены в файлах. Но мы так не узнаем, какие из них находятся в текущем образе, а какие - нет. Потому что не все файлы из текущего каталога обязательно будут загружены в среду. И наоборот, не все загруженные в образ процедуры относятся к текущему каталогу. Tcl - динамическая среда. Мне кажется, ему должно быть по силам собирать теги прямо по ходу загрузки, как это делает Common Lisp. В этом случае, получится гораздо более высокая точность информации. Я бы сделал это, но мне нужно для этого иметь аналог #line и #file из C. Есть таковые?

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

В общем, похоже на то, что я это сделал (для процедур).

Работает без сбоев, проверил на нескольких своих и нескольких чужих функциях. Исходник здесь:

https://bitbucket.org/budden/clcon/src/default/record_definition.tcl

Если место определения записано, то открывается файл. Если не записано, открывается исходник процедуры в окошке, не привязанном к файлу (это умеет tkcon, предок clcon). Если процедуры нет, то выскакивает ошибка. Пока не интегрирована эта фича с просмотровщиком стека при ошибке, но это дело случая.

Теперь я могу без всяких грепов скакнуть не только на исходник любой своей функции, но и полазить по внутренностям snit и tablelist.

den73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.