оригинал (обновление следует)
Я работаю с большим количеством анонимных функций, то есть функций, объявленных как часть словаря, так называемых «методов». Отладка становится довольно болезненной, потому что я не могу сказать, в какой функции происходят ошибки.
Следы Вима выглядят так:
Error detected while processing function NamedFunction..2111..2105:
line 1:
E730: using List as a String
Эта трассировка показывает, что ошибка произошла на третьем уровне стека, в первой строке анонимной функции # 2105. IE NamedFunction вызвала анонимную функцию # 2111, которая вызвала анонимную функцию # 2105. NamedFunction объявлена в обычном синтаксисе function NamedFunction() ... endfunction
; остальные были объявлены с использованием кода вроде function dict.func() ... endfunction
.
Итак, я бы хотел выяснить, какая функция имеет номер 2105.
Предполагая, что он все еще находится в области видимости, можно выяснить, какая запись в Словаре ссылается на него, путем сброса всех переменных словаря, которые могут содержать эту ссылку. Это немного неловко, и с этим трудно систематизировать, хотя я думаю, я мог бы написать функцию для поиска во всех загруженных словарях ссылок на эту функцию, отслеживая циклические ссылки. Хотя, чтобы быть по-настоящему тщательным, он должен искать не только локальные и глобальные словари сценариев, но и локальные словари буферов; Есть ли способ получить доступ к локальным переменным другого буфера?
В любом случае, мне интересно, можно ли вместо этого сбросить исходный код для анонимной функции. Это было бы намного проще и, вероятно, более надежно.
обновление
В итоге я спросил об этом некоторое время назад в списке рассылки vim_use. Брэм Муленар, aka vim BDFL , ответил, что «Вы не должны использовать номер функции». Однако подходящей альтернативы для этой функции не было предложено в начале сентября 2010 года. Также не было явно упомянуто, будет ли эта функция продолжать работать в последующих выпусках vim. Я не пытался сделать это (или что-нибудь еще, в этом отношении) в недавно выпущенном vim 7.3.