Отладка плагинов Vim со следами вызовов

Какой предпочтительный общий метод отладки/трассировки плагинов vim? Предположим, у меня есть довольно сложный плагин Foo, который на нажатой клавише F9 открывает новое окно с файловым браузером и дает возможность выбрать файл, после чего имя файла копируется в главное окно. Я хотел бы видеть, что вызывается, когда я нажимаю клавишу F9, какую-то трассировку вызова.

Ответы

Ответ 1

Лучший способ, который я нашел, - использовать флаг -V при запуске (g) vim. Вы можете указать уровень трассировки N и имя файла для записанного журнала:

$ vim -V[N]{filename}

Затем будут передаваться сообщения о трассировке для каждого файла, который получен. (Подробнее см. :help -V.)

Трафик через результирующий файл журнала может быть болезненным, но обычно он довольно информативен. Мне лучше всего просмотреть файл журнала до и после события триггера (нажав <F9> в вашем случае), чтобы получить представление о том, когда происходит.

Ответ 2

Если у вас уже открыт vim, попробуйте выполнить команду вручную в VIM, встроенном в отладчик.

1) Узнайте, что делает vim при нажатии клавиши

:map <F-9>

2) Запустите сопоставленную команду вручную в отладчике

:debug _mapped_command_

3) Теперь вы должны быть отправлены в отладчик, поэтому

set verbose=20

4) И, наконец, нажмите n и клавишу Enter, чтобы продолжить работу script

В этот момент на экране вы увидите целую кучу вывода. Вы можете нажать "Пробел" для прокрутки экрана, j/k для перемещения по строке.

Любой вывод, который начинается с "Line #:", это строка vim, выполняемая в это время.

Ответ 3

Для сложных плагинов обычно отладки или трассировки командной строки недостаточно.

Вы можете использовать BreakPts для визуального отладки внутри vim.

Он основан на удаленной отладке, поэтому вам нужно отладить экземпляр сервера vim.

В принципе:

Терминал 1:

$ vim --servername Foo
...
set breakpoint on any Foo function
do whatever operation which trigger Foo logic
...

Терминал 2:

$ vim
:BreakPts
:BPRemoteServ FOO
:BPDWhere locate (actual debug execution point)
:BPDNext or F12 (next execution line)
:BPDStep or F11 (step inside functions, dictionary functions)
:BPDEvaluate or F8 (if pressed on visual selection evaluates that)
:BPDCont or F5 (continue execution)

Смотрите, что некоторые плагины загружаются динамически, поэтому вам нужно работать с ними до установки контрольных точек.

После загрузки вы можете установить точки останова из подключенного vim с помощью:

:BPFunctions (Show debuggeable fuctions on RemoteServer)
:BPScripts (Show debuggeable scripts on RemoteServer)
:BPPoints (Show defined breakpoints on RemoteServer)

У меня есть исправление/настройка/разработка большого количества плагинов vim благодаря этому великолепному плагину.