выгрузка исходного кода для анонимной функции - PullRequest
4 голосов
/ 13 апреля 2010

оригинал (обновление следует)

Я работаю с большим количеством анонимных функций, то есть функций, объявленных как часть словаря, так называемых «методов». Отладка становится довольно болезненной, потому что я не могу сказать, в какой функции происходят ошибки.

Следы Вима выглядят так:

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.

Ответы [ 2 ]

1 голос
/ 30 июня 2010

Команда :function пытается помешать вам указать пронумерованные функции (их имя - просто число), но вы можете обмануть его, используя функцию динамического имени функции {...}, добавив :verbose победитель:

:verbose function {43}
  function 43()
      Last set from /home/peter/test.vim
1   throw "I am an exception"
  endfunction

Это не было очевидно в справочных документах.

0 голосов
/ 14 апреля 2010

Я использую следующий обходной путь: у меня есть один плагин, который выполняет некоторые вещи, такие как создание команд, глобальные функции для других плагинов. Он также регистрирует все плагины, поэтому у меня есть большой словарь с большим количеством вещей, связанных с плагинами. Если я вижу ошибку, я ищу функцию, которая ее производит, используя функцию findnr:

"{{{3 stuf.findf:
function s:F.stuf.findf(nr, pos, d)
    if type(a:d)==2 && string(a:d)=~#"'".a:nr."'"
        return a:pos
    elseif type(a:d)==type({})
        for [key, Value] in items(a:d)
            let pos=s:F.stuf.findf(a:nr, a:pos."/".key, Value)
            unlet Value
            if type(pos)==type("")
                return pos
            endif
        endfor
    endif
    return 0
endfunction
"{{{3 stuf.findr:
function s:F.stuf.findnr(nr)
    for [key, value] in items(s:g.reg.registered)+[["load", {"F": s:F}]]
        let pos=s:F.stuf.findf(a:nr, "/".key, value.F)
        if type(pos)==type("")
            return pos
        endif
    endfor
    return 0
endfunction

Здесь у меня есть этот плагин функции в словарях s: F. {Key} и других плагинов в словаре s: g.reg.registered [plugname] .F.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...