Учебное пособие и обзор использования можно найти на веб-сайте Vimspector.
Подробное объяснение формата .vimspector.json
см. в справочном руководстве.
Плагин представляет собой графический отладчик Vim для нескольких языков. В основном он тестировался на C++, Python и TCL, но теоретически поддерживает любой язык, поддерживаемый Visual Studio Code (но см. предостережения).
На веб-сайте Vimspector представлен обзор пользовательского интерфейса, а также основные инструкции по настройке и настройке.
А пока вот (довольно старый) скриншот отладки Vim с помощью Vimspector:
И пара кратких демо:
<Plug>VimspectorBalloonEval
)В следующей таблице перечислены «встроенные» языки (вместе с их зависимостями во время выполнения). Они классифицируются по уровню поддержки:
Tested
: полностью поддерживается, регрессионные тесты Vimspector охватывают их.Supported
: полностью поддерживается, часто используется и тестируется вручную.Experimental
: работает, но используется нечасто и редко тестируется.Legacy
: больше не поддерживается, перенесите конфигурацию.Retired
: больше не включено и не поддерживается.Язык(и) | Статус | Переключить (для install_gadget.py ) | Адаптер (для :VimspectorInstall ) | Зависимости |
---|---|---|---|---|
C, C++, Rust, Jai и т. д. | Протестировано | --all или --enable-c (или cpp) | vscode-cpptools | одноядерный |
C, C++, Rust, Jai и т. д. | Протестировано | --enable-rust , --enable-c и т. д. | КодLLDB | никто |
Питон | Протестировано | --all или --enable-python | отладка | Питон 3 |
Идти | Протестировано | --enable-go | копаться | Перейти 1.16+ |
ТКЛ | Поддерживается | --all или --enable-tcl | tclpro | ТКЛ 8.5 |
Борн Шелл | Поддерживается | --all или --enable-bash | vscode-bash-debug | Баш в?? |
Луа | Протестировано | --all или --enable-lua | локальный-lua-отладчик-vscode | Узел >=12.13.0, Npm, интерпретатор Lua |
Node.js | Поддерживается | --force-enable-node | vscode-js-отладка | Узел >= 18 |
Javascript | Поддерживается | --force-enable-chrome | отладчик для Chrome | Хром |
Javascript | Поддерживается | --force-enable-firefox | vscode-firefox-debug | Firefox |
Ява | Поддерживается | --force-enable-java | vscode-java-debug | Совместимый плагин LSP (см. ниже) |
PHP | Экспериментальный | --force-enable-php | vscode-php-отладка | Узел, PHP, XDEBUG |
C# (ядро DotNet) | Протестировано | --force-enable-csharp | netcorebg | Ядро DotNet |
Фа#, ВБ и т. д. | Поддерживается | --force-enable-[fsharp,vbnet] | netcorebg | Ядро DotNet |
Иди (наследие) | Наследие | --enable-go | vscode-go | Узел, Go, Delve |
Питон 2 | Наследие | --force-enable-python2 | debugpy-python2 | Питон 2.7 |
Vimspector должен работать с любым адаптером отладки, работающим в Visual Studio Code.
Чтобы использовать Vimspector с языком, который не является «встроенным», посетите эту вики-страницу.
Существует 2 способа установки:
:help packages
.packadd! vimspector
в ваш .vimrc
.vimspector.json
или установите g:vimspector_configurations
) — см. справочное руководство.Проверьте зависимости
См. документацию менеджера плагинов и установите плагин. Для Vundle используйте:
Plugin ' puremourning/vimspector '
Установите несколько «гаджетов» (адаптеров отладки) — см. здесь команды установки и выберите гаджеты для установки.
Настройте профили отладки вашего проекта (создайте .vimspector.json
или установите g:vimspector_configurations
) — см. справочное руководство.
Следующие разделы расширяют приведенный выше краткий обзор.
Вимспектор требует:
Какие версии Linux? Я тестирую только Ubuntu 20.04 и новее и RHEL 7.
neovim не реализует воздушные шары при наведении мыши. Вместо этого существует сопоставление <Plug>VimspectorBalloonEval
. Для этого не существует сопоставления по умолчанию, поэтому я рекомендую что-то вроде этого, чтобы отображать переменные во всплывающем окне:
" mnemonic 'di' = 'debug inspect' (pick your own, if you prefer!)
" for normal mode - the word under the cursor
nmap <Leader> di <Plug> VimspectorBalloonEval
" for visual mode, the visually selected text
xmap <Leader> di <Plug> VimspectorBalloonEval
Следующие функции не реализованы для Windows:
Если вы просто хотите опробовать vimspector, не меняя конфигурацию vim, в разделе support/test
есть примеры проектов для ряда языков, в том числе:
Чтобы протестировать один из них, перейдите в каталог и запустите:
vim -Nu /path/to/vimspector/tests/vimrc --cmd "let g:vimspector_enable_mappings='HUMAN'"
Затем нажмите <F5>
.
Также есть проект C++ в tests/testdata/cpp/simple/
с Makefile
, который можно использовать для проверки того, что все работает. Это используется регрессионными тестами в CI, поэтому всегда должно работать и является хорошим способом проверить, является ли проблема вашей конфигурацией, а не ошибкой.
Существует множество менеджеров плагинов Vim, и я не собираюсь указывать конкретные предпочтения, поэтому, если вы решите использовать один из них, следуйте документации менеджера плагинов. Например, для Vundle используйте:
Plugin ' puremourning/vimspector '
Если вы еще не используете менеджер плагинов, установите vimspector как пакет Vim, клонировав этот репозиторий в путь к вашему пакету, например:
$ git clone https://github.com/puremourning/vimspector ~/.vim/pack/vimspector/opt/vimspector
.vimrc
, например, чтобы включить стандартные сопоставления: let g: vimspector_enable_mappings = ' HUMAN '
.vimrc
после настройки vimspector: packadd! vimspector
Минимальный пример см. в support/doc/example_vimrc.vim
.
Vimspector — это универсальный клиент для адаптеров отладки. Адаптеры отладки (называемые «гаджетами» или «адаптерами») — это то, что фактически выполняет работу по общению с настоящими отладчиками.
Чтобы Vimspector работал, вам необходимо установить несколько адаптеров.
Есть несколько способов сделать это:
:VimspectorInstall <adapter> <args...>
(используйте wildmenu
TAB, чтобы просмотреть параметры, также принимается любой параметр install_gadget.py
)python3 install_gadget.py <args>
(используйте --help
, чтобы просмотреть все параметры):VimspectorUpdate
для установки последних поддерживаемых версий гаджетов.Вот демонстрация некоторых установок и обновлений:
И install_gadget.py
, и :VimspectorInstall
выполняют один и тот же набор действий, хотя поведение по умолчанию немного отличается. Для поддерживаемых языков они будут:
gadgetDir
для платформы.Например, чтобы установить протестированный адаптер отладки для языка, выполните:
Чтобы установить | Скрипт | Команда |
---|---|---|
<adapter> | :VimspectorInstall <adapter> | |
<adapter1> , <adapter2> , ... | :VimspectorInstall <adapter1> <adapter2> ... | |
<language> | ./install_gadget.py --enable-<language> ... | :VimspectorInstall --enable-<language> ... |
Поддерживаемые адаптеры | ./install_gadget.py --all | :VimspectorInstall --all |
Поддерживаемые адаптеры, но не TCL | ./install_gadget.py --all --disable-tcl | :VimspectorInstall --all --disable-tcl |
Поддерживаемые и экспериментальные адаптеры | ./install_gadget.py --all --force-all | :VimspectorInstall --all |
Адаптер для конкретной конфигурации отладки | Предлагается Vimspector при запуске отладки. |
:VimspectorInstall
запускает install_gadget.py
в фоновом режиме с некоторыми параметрами по умолчанию.
:VimspectorUpdate
запускает install_gadget.py
для переустановки (т.е. обновления) любых гаджетов, уже установленных в вашем .gadgets.json
.
Вывод минимален, чтобы увидеть полный вывод, добавьте --verbose
к команде, как в :VimspectorInstall --verbose ...
или :VimspectorUpdate --verbose ...
.
Если установка прошла успешно, окно вывода закрывается (и вывод теряется навсегда). Используйте !
чтобы оставить его открытым (например :VimspectorInstall! --verbose --all
или :VimspectorUpdate!
(и т. д.).
Если вы заранее знаете, какие гаджеты вы хотите установить, например, чтобы воспроизвести свою конфигурацию из системы управления версиями, вы можете установить g:vimspector_install_gadgets
в список гаджетов. Это будет использоваться, когда:
:VimspectorInstall
без аргументов или:VimspectorUpdate
Например:
let g: vimspector_install_gadgets = [ ' debugpy ' , ' vscode-cpptools ' , ' CodeLLDB ' ]
По умолчанию install_gadget.py
перезапишет ваш .gadgets.json
набором только что установленных адаптеров, тогда как :VimspectorInstall
обновит его, перезаписав только недавно измененные или установленные адаптеры.
Если вы хотите просто добавить новый адаптер с помощью скрипта, не уничтожая существующие, добавьте --update-gadget-config
, например:
$ ./install_gadget.py --enable-tcl
$ ./install_gadget.py --enable-rust --update-gadget-config
$ ./install_gadget.py --enable-java --update-gadget-config
Если вы хотите поддерживать configurations
за пределами репозитория vimspector (это может быть полезно, если у вас есть пользовательские гаджеты или глобальные конфигурации), вы можете указать установщику использовать другой каталог, а затем установить g:vimspector_base_dir
, чтобы он указывал, например, на этот каталог. :
$ ./install_gadget.py --basedir $HOME /.vim/vimspector-config --all --force-all
Затем добавьте это в свой .vimrc
:
let g: vimspector_base_dir = expand ( ' $HOME/.vim/vimspector-config ' )
При использовании :VimspectorInstall
параметр g:vimspector_base_dir
учитывается, если --basedir
не добавлен вручную (не рекомендуется).
См. --help
для получения дополнительной информации о различных опциях.
Если язык, который вы хотите отладить, отсутствует в списке поддерживаемых выше, вы, вероятно, все равно сможете заставить его работать, но это потребует больше усилий.
По сути, вам нужно получить работающую установку адаптера отладки, узнать, как его запустить, и настроить это в записи adapters
либо в вашем .vimspector.json
, либо в .gadgets.json
, либо в g:vimspector_adapters
.
На практике самый простой способ — установить или запустить Visual Studio Code и использовать его менеджер расширений для установки соответствующего расширения. Затем вы можете настроить адаптер вручную в разделе adapters
вашего .vimspector.json
, либо в файле gadgets.json
, либо в g:vimspector_adapters
.
PR всегда могут добавить поддерживаемые языки (что примерно означает обновление python/vimspector/gadgets.py
и его тестирование).
По умолчанию Vimspector использует следующий каталог для поиска файла с именем .gadgets.json
: </path/to/vimspector>/gadgets/<os>
.
Этот путь представлен как переменная vimspector ${gadgetDir}
. Это полезно для настройки командных строк гаджета.
Где os является одним из:
macos
linux
windows
(хотя обратите внимание: Windows не поддерживается) Формат такой же, как у .vimspector.json
, но используется только ключ adapters
:
Пример:
{
"adapters" : {
"lldb-vscode" : {
"variables" : {
"LLVM" : {
"shell" : " brew --prefix llvm "
}
},
"attach" : {
"pidProperty" : " pid " ,
"pidSelect" : " ask "
},
"command" : [
" ${LLVM}/bin/lldb-vscode "
],
"env" : {
"LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY" : " YES "
},
"name" : " lldb "
},
"vscode-cpptools" : {
"attach" : {
"pidProperty" : " processId " ,
"pidSelect" : " ask "
},
"command" : [
" ${gadgetDir}/vscode-cpptools/debugAdapters/bin/OpenDebugAD7 "
],
"name" : " cppdbg "
}
}
}
Файл гаджета автоматически записывается с помощью install_gadget.py
(или :VimspectorInstall
).
Vimspector также загрузит все соответствующие файлы: </path/to/vimspector>/gadgets/<os>/.gadgets.d/*.json
. Они имеют тот же формат, что и .gadgets.json
, но не перезаписываются при запуске install_gadget.py
.
После обновления кода Vimspector (с помощью git pull
или любого другого менеджера пакетов) запустите :VimspectorUpdate
, чтобы обновить все уже установленные гаджеты.
Причина в том, что отладка в Vim — это довольно ужасный опыт, особенно если вы используете несколько языков. Поскольку pyclewn больше не существует, а встроенный плагин termdebug ограничен GDB, я захотел изучить варианты.
Хотя протокол языкового сервера хорошо известен, протокол адаптера отладки менее известен, но преследует аналогичную цель: независимый от языка API, абстрагирующий отладчики от клиентов.
Цель этого проекта — предоставить простой, но эффективный способ отладки в Vim для нескольких языков за счет использования адаптеров отладки, создаваемых для Visual Studio Code.
Возможность удаленной отладки обязательна. Это ключ к моему рабочему процессу, поэтому внедрение его в процесс отладки — главная цель проекта. Таким образом, vimspector имеет первоклассную поддержку удаленного выполнения программ и прикрепления к ним. Эта поддержка уникальна для vimspector и дополняет любую подобную поддержку в реальных адаптерах отладки (дополняет ее).
Vimspector — это пользовательский интерфейс vim поверх протокола адаптера отладки. Он предназначен для высокого уровня и удобен для повседневных задач отладки.
Вимспектор не является:
Vimspector находится в стадии разработки, и любые отзывы/вклады приветствуются.
Отставание можно просмотреть в Trello.
Плагин на данный момент находится в экспериментальном режиме . Это означает, что любая его часть может (и, вероятно, изменится), включая такие вещи, как:
Однако я обязуюсь делать это только в самых крайних случаях и заранее объявлять о таких изменениях в Gitter. Нет ничего более раздражающего, чем вещи, которые просто ломаются на тебе. Я понимаю это.
Сообщение от автора о мотивации создания этого плагина:
Многие среды разработки имеют встроенный отладчик. Я провожу слишком много времени в Vim. Я выполняю всю свою разработку в Vim и даже настроил рабочие процессы для создания кода, запуска тестов и т. д.
В течение многих лет я наблюдал за собой, друзьями и коллегами, которые писали операторы отладки
printf
,puts
,Я искренне верю, что интерактивные графические среды отладки — лучший способ понять и рассуждать как о незнакомом, так и о знакомом коде, и что отсутствие готового и простого доступа к отладчику — это огромная скрытая дыра в производительности для многих.
Не поймите меня неправильно, я знаю, что буквально миллионы разработчиков более чем компетентны в разработке без графического отладчика, но я утверждаю, что если бы у них была возможность просто нажать клавишу и перейти в отладчик, это было бы быстрее и приятнее, чем простое понимание мозгового кода.
Я создал Vimspector, потому что меня расстраивает смена инструментов.
gdb
для C++,pdb
для Python и т. д. Каждый из них имеет свой синтаксис. У каждого свой лексикон. У каждого свои слабости.Я разработал систему конфигурации таким образом, чтобы конфигурацию можно было передать в систему контроля версий, чтобы она работала для любого из ваших коллег, друзей, сотрудников или совершенно незнакомых людей.
Я сделал удаленную отладку первоклассной функцией, потому что это основной вариант ее использования в моей работе.
С Vimspector я могу просто нажать
<F5>
на всех языках, на которых я разрабатываю, и выполнить отладку локально или удаленно, используя один и тот же рабочий процесс, сопоставления и пользовательский интерфейс. Я интегрировал это с моим Vim таким образом, что могу нажать кнопку и запустить тест под курсором в Vimspector . Такая интеграция значительно улучшила мой рабочий процесс и производительность. Это даже сделало процесс изучения новой кодовой базы... увлекательным.- Бен Джексон, Создатель.
Апач 2.0
© 2018 Бен Джексон
Если вам настолько нравится Vimspector, что вы готовы расстаться со своими кровно заработанными деньгами, рассмотрите возможность сделать пожертвование в одну из следующих благотворительных организаций, которые важны для автора Vimspector (в порядке предпочтения):
По умолчанию vimspector не меняет никакие ваши сопоставления. Сопоставления очень индивидуальны, поэтому вам следует решить, что вам нравится, и использовать мощные функции сопоставления vim, чтобы установить свои собственные сопоставления. С этой целью Vimspector определяет следующие сопоставления <Plug>
:
Картирование | Функция | API |
---|---|---|
<Plug>VimspectorContinue | При отладке продолжайте. В противном случае начните отладку. | vimspector#Continue() |
<Plug>VimspectorStop | Прекратите отладку. | vimspector#Stop() |
<Plug>VimpectorRestart | Перезапустите отладку с той же конфигурацией. | vimspector#Restart() |
<Plug>VimspectorPause | Приостановить отладку. | vimspector#Pause() |
<Plug>VimspectorBreakpoints | Показать/скрыть окно точек останова | vimspector#ListBreakpoints() |
<Plug>VimspectorToggleBreakpoint | Переключить точку останова на текущей строке. | vimspector#ToggleBreakpoint() |
<Plug>VimspectorToggleConditionalBreakpoint | Переключить точку останова условной строки или точку журнала в текущей строке. | vimspector#ToggleBreakpoint( { trigger expr, hit count expr } ) |
<Plug>VimspectorAddFunctionBreakpoint | Добавьте точку останова функции для выражения под курсором. | vimspector#AddFunctionBreakpoint( '<cexpr>' ) |
<Plug>VimspectorGoToCurrentLine | Сбросить счетчик текущей программы на текущую строку | vimspector#GoToCurrentLine() |
<Plug>VimspectorRunToCursor | Бежать к курсору | vimspector#RunToCursor() |
<Plug>VimspectorStepOver | Перешагнуть | vimspector#StepOver() |
<Plug>VimspectorStepInto | Шаг в | vimspector#StepInto() |
<Plug>VimspectorStepOut | Выход за пределы текущей функции | vimspector#StepOut() |
<Plug>VimspectorDisassemble | Покажите разборку. Включить пошаговое выполнение инструкций | vimspector#ShowDisassembly() |
<Plug>VimspectorUpFrame | Переместить кадр вверх в текущем стеке вызовов | vimspector#UpFrame() |
<Plug>VimspectorDownFrame | Переместиться на кадр вниз в текущем стеке вызовов | vimspector#DownFrame() |
<Plug>VimspectorJumpToNextBreakpoint | Переместить курсор к следующей точке останова в текущем файле | vimspector#JumpToNextBreakpoint() |
<Plug>VimspectorJumpToPreviousBreakpoint | Переместить курсор к предыдущей точке останова в текущем файле | vimspector#JumpToPreviousBreakpoint() |
<Plug>VimspectorJumpToProgramCounter | Переместить курсор на счетчик программ в текущем кадре | vimspector#JumpToProgramCounter() |
<Plug>VimspectorBalloonEval | Оценить выражение под курсором (или визуальным элементом) во всплывающем окне | внутренний |
Они соответствуют примерно 1-1 функциям API, указанным ниже.
Например, если вы хотите, чтобы <F5>
запускал/продолжал отладку, добавьте это в какое-нибудь подходящее место, например, в ваш vimrc
(подсказка: run :e $MYVIMRC
).
nmap <F5> <Plug> VimspectorContinue
Кроме того, многие пользователи, вероятно, захотят включать только определенные сопоставления Vimspector во время активной отладки. Это также возможно, хотя и требует написания некоторого вимскипта.
Тем не менее, многие люди знакомы с конкретными отладчиками, поэтому следующие сопоставления можно включить, установив для g:vimspector_enable_mappings
указанное значение.
Чтобы использовать сопоставления, подобные Visual Studio, добавьте следующее в свой vimrc
перед загрузкой vimspector :
let g: vimspector_enable_mappings = ' VISUAL_STUDIO '
Ключ | Картирование | Функция |
---|---|---|
F5 | <Plug>VimspectorContinue | При отладке продолжайте. В противном случае начните отладку. |
Shift F5 | <Plug>VimspectorStop | Прекратите отладку. |
Ctrl Shift F5 | <Plug>VimspectorRestart | Перезапустите отладку с той же конфигурацией. |
F6 | <Plug>VimspectorPause | Приостановить отладку. |
F8 | <Plug>VimspectorJumpToNextBreakpoint | Перейти к следующей точке останова в текущем файле. |
Shift F8 | <Plug>VimspectorJumpToPreviousBreakpoint | Перейти к предыдущей точке останова в текущем файле. |
F9 | <Plug>VimspectorToggleBreakpoint | Переключить точку останова на текущей строке. |
Shift F9 | <Plug>VimspectorAddFunctionBreakpoint | Добавьте точку останова функции для выражения под курсором. |
F10 | <Plug>VimspectorStepOver | Перешагнуть |
Ctrl F10 | <Plug>VimspectorRunToCursor | Бежать к курсору* |
F11 | <Plug>VimspectorStepInto | Шаг в |
Shift F11 | <Plug>VimspectorStepOut | Выход за пределы текущей функции |
Alt 8 | <Plug>VimspectorDisassemble | Показать разборку |
ПРИМЕЧАНИЕ. Некоторые сопоставления, такие как клавиши Ctrl и F, могут не работать в зависимости от вашего терминала, клавиатуры, оконной системы и многих других вещей. См :help modifyOtherKeys
и другие источники. Если вы не можете справиться с этой задачей, просто используйте сопоставления «человеческого режима».
Если у вас, как и у меня, всего 2 руки и 10 пальцев, вам, вероятно, не нравятся клавиши Ctrl-Shift-F. Кроме того, если вы работаете в терминале, существует реальная вероятность того, что terminfo будет неверным для клавиш со сдвигом F, особенно если ваш TERM
— screen-256color
. Если эти проблемы (количество рук, переменные TERM
) не поддаются устранению, попробуйте следующие сопоставления, добавив перед загрузкой vimspector следующее:
let g: vimspector_enable_mappings = ' HUMAN '
Ключ | Картирование | Функция |
---|---|---|
F5 | <Plug>VimspectorContinue | При отладке продолжайте. В противном случае начните отладку. |
F3 | <Plug>VimspectorStop | Прекратите отладку. |
F4 | <Plug>VimspectorRestart | Перезапустите отладку с той же конфигурацией. |
F6 | <Plug>VimspectorPause | Приостановить отладку. |
F9 | <Plug>VimspectorToggleBreakpoint | Переключить точку останова на текущей строке. |
<leader>F9 | <Plug>VimspectorToggleConditionalBreakpoint | Переключить точку останова условной строки или точку журнала в текущей строке. |
F8 | <Plug>VimspectorAddFunctionBreakpoint | Добавьте точку останова функции для выражения под курсором. |
<leader>F8 | <Plug>VimspectorRunToCursor | Бежать к курсору |
F10 | <Plug>VimspectorStepOver | Перешагнуть |
F11 | <Plug>VimspectorStepInto | Шаг в |
F12 | <Plug>VimspectorStepOut | Выход за пределы текущей функции |
Кроме того, я рекомендую добавить отображение в <Plug>VimspectorBalloonEval
, в обычном и визуальном режимах, например:
" mnemonic 'di' = 'debug inspect' (pick your own, if you prefer!)
" for normal mode - the word under the cursor
nmap <Leader> di <Plug> VimspectorBalloonEval
" for visual mode, the visually selected text
xmap <Leader> di <Plug> VimspectorBalloonEval
Вы также можете добавить сопоставления для навигации вверх/вниз по стеку, переключения окна точек останова и отображения дизассемблирования, например:
nmap <LocalLeader> <F11> <Plug> VimspectorUpFrame
nmap <LocalLeader> <F12> <Plug> VimspectorDownFrame
nmap <LocalLeader> B <Plug> VimspectorBreakpoints
nmap <LocalLeader> D <Plug> VimspectorDisassemble
В этом разделе приведены подробные инструкции по использованию, сгруппированные по функциям. Для большинства пользователей раздел сопоставлений содержит наиболее распространенные команды и их использование по умолчанию. Этот раздел можно использовать в качестве справочника для создания собственных сопоставлений или пользовательского поведения.
Все приведенные ниже инструкции предполагают один сеанс отладки. Подробную информацию об одновременной отладке нескольких независимых приложений см. в разделе [несколько сеансов отладки][#multiple-debugging-sessions].
.vimspector.json
. См. ниже.:call vimspector#Launch()
и выберите конфигурацию.Запуск нового сеанса делает его активным [сеанс отладки][#multiple-debugging-sessions].
Если в конфигурации адаптера отладки используется pidProperty
и вы делаете запрос attach
, вам будет предложено ввести PID (идентификатор процесса) для подключения.
Чтобы упростить эту задачу, Vimspector предоставляет небольшую утилиту для вывода списка PID. Это очень простой клон ps
, но работает на всех поддерживаемых платформах. Инструкции по настройке см. в README.
Запустите go build
в каталоге support/vimspector_process_list
, чтобы настроить его.
Если Vimspector сможет найти это приложение, он по умолчанию попытается вывести список всех процессов, принадлежащих текущему пользователю.
В качестве альтернативы (предпочтительно) вы можете использовать специальную форму расширения переменных, называемую ${PickProcess("binaryName")}
. Версия этого вызова выведет список всех процессов текущего пользователя, соответствующих этому двоичному имени.
Например:
"Attach" : {
"adapter" : "CodeLLDB" ,
"configuration" : {
"request" : "attach" ,
"program" : "${workspaceRoot}/Jails" ,
"pid" : "${PickProcess("jails")}"
}
}
Здесь будут перечислены все соответствующие процессы, их родительский процесс, время запуска и рабочий каталог. Это выглядит примерно так:
PID PPID CWD START
52218 52217 (Python) /Users/ben/.vim/bundle/lsp-examples/jai/Jails 2023-05-22 16:02:24
Enter Process ID:
Затем вы вводите PID и нажимаете <CR>
.
Вы даже можете заменить средство выбора процессов своей собственной функцией. Если вы определите какую-то функцию и зададите g:vimspector_custom_process_picker_func
имя этой функции. Ему будут переданы любые аргументы, переданные функции расширения PickProcess
. Он также будет использоваться всякий раз, когда указывается pidProperty
, поэтому он также не должен обрабатывать аргументы (используйте ...
в качестве формальных аргументов функции, см :help ...
).
Например, чтобы использовать fzf
вместе с предоставленным vimspector_process_list
:
function ! CustomPickProcess ( ... ) abort
let ps = $HOME .. ' /.vim/bundle/vimspector/support/vimspector_process_list/vimspector_process_list '
" a:0 is number of args
" a:1 is the optional binary name
if a: 0 > 0
let ps .= ' ^ ' . a: 1 . ' $ '
endif
let line_selected = fzf#run ( {
' source ' : ps ,
' options ' : ' --header-lines=1 '
. ' --prompt="Select Process: " '
,
} )[ 0 ]
if empty ( line_selected)
return 0
endif
let pid = split ( line_selected )[ 0 ]
return str2nr ( pid )
endfunction
let g: vimspector_custom_process_picker_func = ' CustomPickProcess '
Или использовать fzf
с выводом ps
:
function ! CustomPickProcess ( ... ) abort
let ps = ' ps aux '
let line_selected = fzf#run ( {
' source ' : ps ,
' options ' : ' --header-lines=1 '
. ' --prompt="Select Process: " '
,
} )[ 0 ]
if empty ( line_selected)
return 0
endif
let pid = split ( line_selected )[ 0 ]
return str2nr ( pid )
endfunction
let g: vimspector_custom_process_picker_func = ' CustomPickProcess '
Чтобы запустить конкретную конфигурацию отладки или указать переменные замены для запуска, вы можете использовать:
:call vimspector#LaunchWithSettings( dict )
Аргумент представляет собой dict
со следующими ключами:
configuration
: (необязательно) Имя запускаемой конфигурации отладки.<anything else>
: (необязательно) Имя устанавливаемой переменной. Это обеспечивает некоторую интеграцию и автоматизацию. Например, если у вас есть конфигурация с именем Run Test
, содержащая замещающую переменную с именем ${Test}
вы можете написать сопоставление, которое в конечном итоге выполнит:
vimspector#LaunchWithSettings ( #{ configuration: ' Run Test '
Test: ' Name of the test ' } )
Это запустит конфигурацию Run Test
с ${Test}
установленным в 'Name of the test'
и Vimspector не будет предлагать пользователю ввести или подтвердить эти данные.
См. еще один пример, где его можно использовать для указания порта для подключения отладчика Java, в нашем руководстве по интеграции YouCompleteMe.
Для запуска со специальной конфигурацией вы можете использовать:
call vimspector#LaunchWithConfigurations( dict )
Аргументом является dict
, который представляет собой раздел configurations
файла .vimspector. Передайте одну конфигурацию, и она будет выбрана для запуска. Например:
let pid = <some_expression>
call vimspector#LaunchWithConfigurations ({
" attach " : {
" adapter " : " netcoredbg " ,
" configuration " : {
" request " : " attach " ,
" processId " : pid
}
}
} )
Это запустит отладчик и подключится к указанному процессу без необходимости иметь локальный файл .vimspector на диске. Переменная ${workspaceRoot}
будет указывать на родительскую папку файла, который в данный момент открыт в vim.
Vimspector использует следующую логику для выбора конфигурации для запуска:
autoselect
false
, используйте ее.default
установлено значение true
и без autoselect
установлено значение false
, используйте ее.Подробности смотрите в справочном руководстве.
vimspector#GetConfigurations()
чтобы получить список конфигураций для типа файла текущего буфера.Например, чтобы получить массив конфигураций и нечеткое сопоставление результата
: call matchfuzzy ( vimspector#GetConfigurations (), " test::case_1 " )
См. раздел сопоставлений для сопоставлений по умолчанию для работы с точками останова. В этом разделе описывается полный API функций vimscript.
Точки останова связаны с текущим [сеансом отладки][#multiple-debugging-sessions]. При переключении между сеансами знаки точек останова для предыдущего сеанса удаляются и отображаются точки останова для вновь активированного сеанса. Хотя было бы полезно видеть точки останова для всех сеансов, это может привести к путанице.
Используйте :VimspectorBreakpoints
или сопоставьте что-нибудь с <Plug>VimspectorBreakpoints
чтобы открыть представление точек останова. Отсюда вы можете перечислять, переходить к удалению, добавлению и переключению точек останова.
Я рекомендую такое сопоставление для переключения окна точек останова:
nmap <Leader> db <Plug> VimspectorBreakpoints
Следующие сопоставления применяются по умолчанию в окне точек останова:
t
, <F9>
— переключение, т.е. включение/выключение точки остановаT
- переключение, т.е. включение/отключение ВСЕХ точек остановаdd
, <Del>
— удалить текущую точку остановаcc
, C
— редактировать текущие параметры точки остановаi
, a
, o
— добавить новую точку останова на строкеI
, A
, O
— добавить новую точку останова функции<Enter>
или двойной щелчок — переход к точке разрыва строкиТакже предоставляется WinBar (если поддерживается). Это добавляет такие функции, как сохранение/восстановление сеансов, очистка всех точек останова и сброс параметров точек останова для исключений.
Самая простая и распространенная форма точки останова — это точка останова на строке. Выполнение приостанавливается, когда выполняется указанная строка.
В большинстве сценариев отладки пользователи просто нажимают <F9>
, чтобы создать точку останова на текущей строке, и <F5>
чтобы запустить приложение.
Некоторые адаптеры отладки поддерживают условные точки останова. Обратите внимание, что vimspector не сообщает вам, не поддерживает ли отладчик условные точки останова (пока). Условная точка останова — это точка останова, которая срабатывает только в том случае, если какое-либо выражение принимает значение true или удовлетворяет каким-либо другим ограничениям.
Некоторые из приведенных выше функций принимают один необязательный аргумент, который представляет собой словарь опций. Словарь может иметь следующие ключи:
condition
: необязательное выражение, оцениваемое для определения того, должна ли срабатывать точка останова. Поддерживается не всеми адаптерами отладки. Например, чтобы прервать, когда abc
равно 10
, введите что-то вроде abc == 10
, в зависимости от языка.hitCondition
: необязательное выражение, вычисляемое для определения того, сколько раз точку останова следует игнорировать. Не следует (вероятно?) использовать в сочетании с condition
. Поддерживается не всеми адаптерами отладки. Например, чтобы прерваться при третьем нажатии на эту строку, введите 3
.logMessage
: необязательная строка, позволяющая сделать эту точку останова «точкой журнала». При срабатывании это сообщение выводится на консоль, а не прерывает выполнение. Вы можете вставлять выражения в фигурные скобки {like this}
, например #{ logMessage: "Iteration {i} or {num_entries / 2}" }
В каждом случае выражения оцениваются отладчиком, поэтому они должны быть на том диалекте, который понимает отладчик при оценке выражений.
При использовании сопоставления <leader><F9>
пользователю предлагается ввести эти выражения в командной строке (с историей).
Точки останова для исключений обычно срабатывают при возникновении исключения или возникновении другой ошибки. В зависимости от отладчика при запуске отладки вам могут задать несколько вопросов о том, как обрабатывать исключения. Это «точки останова исключений», и vimspector запоминает ваш выбор, пока Vim все еще работает.
Обычно вы можете принять значения по умолчанию (просто продолжайте нажимать <CR>
!), поскольку большинство значений по умолчанию для адаптера отладки разумны, но если вы хотите прервать работу, скажем, uncaught exception
а затем ответьте Y
на это (например).
Вы можете настроить свой выбор в .vimspector.json
. Подробную информацию об этом смотрите в руководстве по настройке.
ПРИМЕЧАНИЕ. Раньше ToggleBreakpoint переключался между тремя состояниями: включено, отключено, удалено. Многие пользователи обнаружили, что «отключенное» состояние редко бывает полезным, поэтому поведение было изменено. ToggleBreakpoint всегда создает или удаляет точку останова. Если вы хотите «отключить» точки останова, используйте окно точек останова и «переключите» ( t
) оттуда.
vimspector#ToggleBreakpoint( { options dict } )
чтобы установить/удалить точку останова на строке. Аргумент не является обязательным (см. ниже).vimspector#AddFunctionBreakpoint( '<name>', { options dict} )
чтобы добавить точку останова функции. Второй аргумент является необязательным (см. ниже).vimspector#SetLineBreakpoint( file_name, line_num, { options dict } )
чтобы установить точку останова в определенном файле/строке. Последний аргумент не является обязательным (см. ниже).vimspector#ClearLineBreakpoint( file_name, line_num )
чтобы удалить точку останова в определенном файле/строке.vimspector#ClearBreakpoints()
чтобы очистить все точки останова.vimspector#ResetExceptionBreakpoints()
чтобы очистить конфигурацию точек останова для исключений и повторно ответить на различные вопросы, такие как «Break on C++ Throw».:VimspectorMkSession
и :VimspectorLoadSession
для сохранения и восстановления точек останова.call vimspector#ListBreakpoints()
— переключить окно точек остановаcall vimspector#BreakpointsAsQuickFix()
— возвращает текущий набор точек останова в формате vim QuickfixПримеры:
call vimspector#ToggleBreakpoint()
— переключить точку останова на текущей строкеcall vimspector#SetLineBreakpoint( 'some_file.py', 10 )
— установите точку останова на some_filepy:10
call vimspector#AddFunctionBreakpoint( 'main' )
— добавляет точку останова функции в main
функциюcall vimspector#ToggleBreakpoint( { 'condition': 'i > 5' } )
- добавляет точку останова в текущей строке, которая срабатывает только тогда, когда i > 5
true
call vimspector#SetLineBreakpoint( 'some_file.py', 10, { 'condition': 'i > 5' } )
- добавьте точку останова в some_file.py:10
, которая срабатывает только тогда, когда i > 5
true
call vimspector#ClearLineBreakpoint( 'some_file.py', 10 )
— удалить точку останова в some_file.py:10
call vimspector#ClearBreakpoints()
— очистить все точки остановаVimspectorMkSession
— создать .vimspector.session
VimspectorLoadSession
— чтение .vimspector.session
VimspectorMkSession my_session_file
— создать my_session_file
VimspectorLoadSession my_session_file
— прочитать my_session_file
ПРИМЕЧАНИЕ . Экспериментальная функция, которая в будущем может существенно измениться на основе отзывов пользователей.
Точки останова инструкций можно добавлять из окна дизассемблирования точно так же, как вы добавляете точки останова строки в окне кода. Для их добавления и переключения используются одни и те же сопоставления и функции. Если это поддерживается адаптером отладки, таким способом можно даже создавать точки журнала и условные точки останова.
В настоящее время точки остановки инструкций внутренне смоделированы как точки останова линейных точек против буфера, содержащего разборку, но это может измениться в будущем, поэтому, пожалуйста, не полагайтесь на это.
Точки останова инструкции также видны и могут быть удалены/отключены из окна точек останова.
В настоящее время точки останова инструкции автоматически очищаются, когда сеанс отладки заканчивается. Причина этого заключается в том, что адреса нельзя гарантировать, что для любого другого сеанса отладки. Однако это также может измениться в будущем.
Используйте vimspector#ClearBreakpoints()
чтобы очистить все точки останова, включая память о выборе точек разрыва исключений.
Используйте vimspector#RunToCursor
или <leader><F8>
: это создает временную точку останова на текущей строке, а затем продолжает выполнять, очищая точку останова, когда она нажимает.
Используйте vimspector#GoToCurrentLine()
или какое -то отображение в <Plug>VimspectorGoToCurrentLine
чтобы перейти на текущее выполнение на линию, в которой в настоящее время находится ваш курсор.
Там, где поддерживается, это может быть полезно для повторного запуска разделов кода или полностью пропустить их.
Если на текущей линии есть несколько возможных «целей», вам предложено выбрать одну.
Vimspector может сохранить и восстановить точки останова (и некоторые другие вещи) в файл сеанса. Для этого существуют следующие команды:
VimspectorMkSession [file/dir name]
- Сохранить текущий набор точек останова строки, logpoints, условные точки останова, точки останова функции и фильтры перерыва исключений в файл предоставленного сеанса или файл по умолчанию в предоставленном каталоге.VimspectorLoadSession [file/dir name]
- Читать точки останова из поставленного файла сеанса или файла по умолчанию в предоставленном каталоге и замените любые в настоящее время установленные точки останова. Перед загрузкой все текущие точки остановки очищаются (как будто vimspector#ClearLineBreakpoints()
были вызваны). В обоих случаях аргумент имени файла/DIR не является обязательным. По умолчанию файл называется .vimspector.session
, но это можно изменить во всем мире, установив g:vimspector_session_file_name
на что -то другое или вручную указав путь при вызове команды. Если вы предоставляете каталог, имя файла по умолчанию или настроенное сеанс считывается или записывается в этот каталог. Отставление, файл читается на основе открытого буфера в настоящее время или записывается в текущий рабочий каталог.
Передовые пользователи могут пожелать автоматизировать процесс загрузки и сохранения, например, путем добавления автокомманды VimEnter
и VimLeave
. В этом случае рекомендуется использовать silent!
Чтобы избежать раздражающих ошибок, если файл нельзя прочитать или записан.
Самая простая форма автоматизации - загрузить сеанс Vimspector всякий раз, когда вы запускаете Vim с файлом сеанса. Это так же просто, как сделать это:
$ echo silent VimspectorLoadSession > Sessionx.vim
См :help mksession
для получения подробной информации о файле *x.vim
. Вы также можете сделать что -то подобное, используя SessionLoadPost
:
autocmd SessionLoadPost * silent ! VimspectorLoadSession
vimspector#StepInto()
и т. Д. Также есть варианты vimspector#StepSOver()
и vimspector#StepIOver()
и т. Д. <CR>
или дважды щелкните левой мышью, чтобы развернуть/коллапс (+, -).<C-CR>
(control + <CR>
) или <leader><CR>
(если modifyOtherKeys
не работает для вас) Прицелы и переменные представлены буфером vimspector.Variables
.
Если вы предпочитаете более многословный дисплей для переменных и часов, то вы можете let g:vimspector_variables_display_mode = 'full'
. По умолчанию отображаются только имя и значение, при этом отображаются другие данные, доступные из парящего мыши или запуска <Plug>VimspectorBalloonEval
на линии, содержащей значение в окне переменных (или наблюдателей).
Все правила для Variables and scopes
применяются плюс следующие:
a + b
) и получить ее результат.nmap
) и визуального режима ( xmap
) до <Plug>VimspectorBalloonEval
чтобы вручную запустить всплывающее окно.<C-CR>
(control + <CR>
) или <leader><CR>
(если modifyOtherKeys
не работает для вас)j
, k
), чтобы выбрать текущий выбор; <Esc>
(или оставьте окно подсказки), чтобы закрыть подсказку. Вы можете отключить автоматическое парящее всплывающее окно путем настройки g:vimspector_enable_auto_hover=0
перед началом сеанса отладки. Затем вы можете сопоставить что -то на <Plug>VimspectorBalloonEval
и запустить его вручную.
Окно наблюдения используется для проверки переменных и выражений. Выражения оцениваются в выбранной кадре стека, которая «сфокусирована»
Окно часов - это быстрый буфер, где это доступно. Введите режим вставки, чтобы добавить новое выражение часов.
<CR>
.:VimspectorWatch <expression>
. Заполнение TAB для выражения доступно в некоторых адаптерах отладки.<CR>
, или дважды щелкните левой мышью.<C-CR>
(control + <CR>
) или <leader><CR>
(если modifyOtherKeys
не работает для вас)<DEL>
. Часы представлены Buffer vimspector.Watches
.
Если вы предпочитаете более многословный дисплей для переменных и часов, то вы можете let g:vimspector_variables_display_mode = 'full'
. По умолчанию отображаются только имя и значение, при этом отображаются другие данные, доступные из парящего мыши или запуска <Plug>VimspectorBalloonEval
на линии, содержащей значение в окне переменных (или наблюдателей).
Вы можете отключить автоматическое парящее всплывающее окно путем настройки g:vimspector_enable_auto_hover=0
перед началом сеанса отладки. Затем вы можете сопоставить что -то на <Plug>VimspectorBalloonEval
и запустить его вручную.
Buffer resmpt Watch имеет свой omnifunc
, который установлен на функцию, которая будет рассчитать завершение для текущего выражения. Это тривиально используется с <Ctrl-x><Ctrl-o>
(см :help ins-completion
) или интегрируется с вашей любимой системой завершения. Филетип в буфере установлен на VimspectorPrompt
.
Для youcompleteme следующий конфигурация работает хорошо:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
:VimspectorDisassemble
, vimspector#ShowDisassembly()
или <Plug>VimspectorDisassemble
Некоторые адаптеры отладки (мало!) Поддерживают разборку. То, как это работает в DAP, немного странно, но на практике Vimspector попросит разобрать ряд инструкций вокруг ПК текущего кадра стека. Затем это отображается в окне с WinBar, похожим на окно кода, но с шагом инструкции. Существует знак для текущей инструкции и синтаксиса по умолчанию по умолчанию на «ASM», который в основном работает нормально для x86 и ARM.
Как упомянуто выше, когда ваше текущее окно представляет собой Windows разборки, и вы используете команды «Шаг» по умолчанию (например, <F10>
), шаг автоматически перевозит для каждого внедрения, а не для каждого оператора.
Каждый раз, когда процесс останавливается, Vimspector запрашивает около 2 окон, полных инструкций вокруг текущего ПК. Чтобы увидеть больше, вы можете прокрутить окно. Vimspector будет проходить дополнительный экран инструкций, когда окно прокручивается вверху или внизу. Это не идеально. Иногда вам приходится немного больше прокручивать, чтобы сделать это (например, ctrl-e ctrl-y вверху). Это не идеально и может быть улучшено в будущем.
Вы можете управлять интенсивной высотой окна разборки с помощью let g:vimspector_disassembly_height = 10
(или количество линий, которое).
Филетип (и синтаксис) буферов в окне разборки-это vimspector-disassembly
. Вы можете использовать FileType
AutoCommands для настройки таких вещей, как синтаксис.
Примечание . Эта функция экспериментальна и может измениться любым способом на основе отзывов пользователей.
Некоторые адаптеры отладки предоставляют способ сбросить память процесса, связанную с переменными. Это можно сделать из переменных и смотреть окна с:
<leader>m
отображение (по умолчанию может быть настроено)vimspector#ReadMemory()
функция При этом вас просят ввести несколько байтов для чтения (из местоположения, связанного с текущей линией курсора) и смещению из этого места. В окне кода отображается новый буфер, содержащий дамп памяти в HEX и ASCII, аналогично выводу xxd
.
Примечание . Эта функция экспериментальна и может измениться любым способом на основе отзывов пользователей.
В окне трассировки стека показано состояние каждого потока программы. Потоки, которые остановлены, могут быть расширены, чтобы показать трассировку стека этого потока.
Часто, но не всегда, все потоки останавливаются, когда попадает точка останова. Статус потока отображается в скобках после имени потока. Где поддерживается базовым отладчиком, потоки можно приостановить и продолжаться индивидуально из окна трассировки стека.
Определенная тема, выделенная группой Highline CursorLine
представляет собой поток "сфокусированного". Это поток, который получает такие команды, как «Step In», «Step Out», «Продолжить» и «Пауза» в окне кода. Сфокусированный поток может быть изменен вручную, чтобы «переключиться на» этот поток.
<CR>
или дважды щелкните левой мышью, чтобы развернуть/свернуть трассу стека потоков или использовать кнопку Winbar.<CR>
или дважды щелкните левой мышью на раме стека, чтобы прыгнуть к нему.vimspector#PauseContinueThread()
чтобы индивидуально остановиться или продолжить выбранную поток.<leader><CR>
или vimspector#SetCurrentThread()
чтобы установить поток «Focussed» на выбранную в настоящее время. Если выбранная строка представляет собой кадр стека, установите сфокусированный поток в поток этого кадра и перейдите к этой кадре в окне кода. Степень -след представлен буфером vimspector.StackTrace
.
Если есть сессии отладки детей, например, где Debugee запускает детские процессы, а адаптер отладки поддерживает многосекционную отладку, то потоки каждой сессии отображаются отдельно. В настоящее время активное сеанс - это то, что выделяется как в данный момент активным потоком/стеком. Чтобы переключить управление на другой сеанс, сосредоточьте поток в этом сеансе.
Примечание. Это относится к сеансам, созданным как детьми существующей сессии, и не следует путать с [многочисленными (родителями) сессиями отладки] [#несколько де-дюймовых сессий].
:VimspectorShowOutput <category>
. Используйте завершение командной линии, чтобы увидеть категории. Если выходное окно закрыто, новое можно открыть с помощью :VimspectorShowOutput <category>
(используйте завершение вкладок - wildmenu
, чтобы увидеть параметры).
Консольное окно - это быстрый буфер, где он доступен, и может использоваться в качестве интерактивного CLI для адаптера отладки. Поддержка этого варьируется среди адаптеров.
:VimspectorEval <expression>
. Завершение доступно с некоторыми адаптерами отладки.<CR>
Примечание. См. Также часы выше.
Если выходное окно закрыто, новое можно открыть с помощью :VimspectorShowOutput Console
.
Буфер подсказки консоли имеет свой omnifunc
установленную для функции, которая будет рассчитать завершение для текущей команды/выражения. Это тривиально используется с <Ctrl-x><Ctrl-o>
(см :help ins-completion
) или интегрируется с вашей любимой системой завершения. Филетип в буфере установлен на VimspectorPrompt
.
Для youcompleteme следующий конфигурация работает хорошо:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
Файл журнала Vimspector содержит полную трассировку связи между Vimspector и адаптером отладки. Это основной источник диагностической информации, когда что -то идет не так, что не является Vim Traceback.
Если вы просто хотите увидеть файл журнала Vimspector, используйте :VimspectorToggleLog
, который будет заводить его в небольшом окне (не работает в Windows).
Вы можете увидеть некоторую информацию от отладки с :VimspectorDebugInfo
Чтобы закрыть отладчик, используйте:
Reset
кнопку Winbar:VimspectorReset
, когда Winbar недоступен.call vimspector#Reset()
Если отладчик все еще работает при остановке или сбросе, то некоторые адаптеры отладки позволяют вам указать, что должно произойти с ним при завершении отладки. Как правило, поведение по умолчанию разумно, и это то, что происходит большую часть времени. Это значения по умолчанию в соответствии с DAP:
Некоторые адаптеры отладки позволяют вам выбирать, что делать при отключении. Если вы хотите контролировать это поведение, используйте :VimspectorReset
или вызовите vimspector#Reset( { 'interactive': v:true } )
. Если адаптер отладки предлагает выбор относительно того, прекратить ли вам отладку, вам будет предложено выбрать. То же самое относится и к vimspector#Stop()
, который может принять аргумент: vimspector#Stop( { 'interactive': v:true } )
.
Примечание . Эта функция экспериментальна , и любая ее часть может измениться в ответ на отзывы пользователей.
Vimspector поддерживает начало произвольного количества сессий отладки. Каждый сеанс связан с индивидуальной вкладкой пользовательского интерфейса. Как правило, вы отлаживаете только одно приложение, поэтому вам не нужно думать об этом, но эта расширенная функция может быть полезна, если вам нужно одновременно отлаживать несколько независимых приложений или несколько независимых экземпляров вашего приложения.
В любое время существует единая «активная» корневая сеанс. Точки останова связаны с текущим сеансом, и все команды пользовательского интерфейса и API применяются к активному сеансу в настоящее время.
При переключении между корневыми сеансами знаки капота для предыдущего сеанса удаляются, и отображаются точки останова для вновь активированного сеанса. Хотя было бы полезно увидеть точки останова для всех сессий, это может быть очень запутанным.
Типичный рабочий процесс может быть:
:edit server.cc
тогда <F5>
). Это запускает сеанс отладки, названную в честь выбранной конфигурации. Вы можете переименовать это :VimspectorRenameSession server
.:tabedit client.cc
)client
:: :VimspectorNewSession client
( client
теперь является активным сеансом).client
и начните отладку с <F5>
. Теперь у вас есть 2 вкладки Vimspepor. Интуитивно, что Wwitching на конкретную вкладку сделает его сеанс активным. Вы также можете вручную переключить активную сессию :VimspectorSwitchToSession <name>
.
Итак, в итоге у вас есть следующие средства:
VimspectorNewSession <name>
Это создает новую сессию и делает его активным. Необязательное имя используется вместо сгенерированного при запуске.VimspectorSwitchToSession <tab complete>
.VimspectorRenameSession <new name>
VimspectorDestroySession <name>
. Вы не можете уничтожить бегущую/активную сессию.vimspector#GetSessionName()
Полезно для введения линии состояния. Также есть vimspector#GetSessionID()
для технических техников. Вот пример того, как вы можете отобразить текущее имя сеанса на statusline
(см :help statusline
или документация для вашего плагина по линии причудливого состояния).
function ! StlVimspectorSession ()
" Only include in buffers containing actual files
if ! empty ( & buftype )
return ' '
endif
" Abort if vimspector not loaded
if ! exists ( ' *vimspector#GetSessionName ' ) ||
! exists ( ' *vimspector#GetSessionID ' )
return ' '
endif
return vimspector#GetSessionName ()
.. ' ( '
.. vimspector#GetSessionID ()
.. ' ) '
endfunction
" ... existing statusline stuff
" set statusline=...
" Show the vimspector active session name (max 20 chars) if there is onw.
set statusline += % ( % . 20 { StlVimspectorSession ()} % )
Для введения в конфигурацию .vimspector.json
взгляните на раздел «Начало работы» веб -сайта Vimspepor.
Для полного объяснения, включая то, как использовать переменные, замены и как указать точки останова исключения, см. Документы.
Файл конфигурации JSON позволяет комментарии C-стилю:
// comment to end of line ...
/* inline comment ... */
В настоящее время протестировано со следующими адаптерами отладки.
Пример .vimspector.json
(работает как с vscode-cpptools
, так и lldb-vscode
. Для lldb-vscode
Замените имя адаптера на lldb-vscode
:
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
"args" : [ ... ],
"cwd" : " <working directory> " ,
"environment" : [ ... ],
"externalConsole" : true ,
"MIMode" : " <lldb or gdb> "
}
},
"Attach" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " attach " ,
"program" : " <path to binary> " ,
"MIMode" : " <lldb or gdb> "
}
}
// ...
}
}
Примечание для пользователей Windows: вам нужно установить gdb.exe
. Я рекомендую использовать scoop install gdb
. Vimspector не может использовать отладчик Visual Studio из -за лицензирования.
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
"stopAtEntry" : true
}
}
}
}
В зависимости от бэкэнда, вам необходимо включить красивую печать сложных типов вручную.
LLDB: Pretty Printing включена по умолчанию
GDB: Чтобы включить симпатичные принтеры GDB, рассмотрите фрагмент ниже. Недостаточно set print pretty on
в вашем .gdbinit!
{
"configurations" : {
"Launch" : {
"adapter" : " vscode-cpptools " ,
"filetypes" : [ " cpp " , " c " , " objc " , " rust " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " <path to binary> " ,
// ...
"MIMode" : " gdb " ,
"setupCommands" : [
{
"description" : " Enable pretty-printing for gdb " ,
"text" : " -enable-pretty-printing " ,
"ignoreFailures" : true
}
]
}
}
}
}
В документации CPPTools описывается, как прикрепить CPPTOLS к GDBServer с помощью miDebuggerAddress
. Обратите внимание, что при этом вы должны использовать "request": "attach"
.
Если вы чувствуете себя причудливым, ознакомьтесь с справочным руководством для примера того, что Vimspector будет удаленно запустить и прикрепить.
CodellDB превосходит VSCode-CppTools, по крайней мере, на MacOS.
Увидеть ржавчину.
Альтернативой является использование lldb-vscode
, который поставляется с LLVM. Вот как:
brew install llvm
)/path/to/vimspector/gadgets/macos/.gadgets.d/lldb-vscode.json
: {
"adapters" : {
"lldb-vscode" : {
"variables" : {
"LLVM" : {
"shell" : " brew --prefix llvm "
}
},
"attach" : {
"pidProperty" : " pid " ,
"pidSelect" : " ask "
},
"command" : [
" ${LLVM}/bin/lldb-vscode "
],
"env" : {
"LLDB_LAUNCH_FLAG_LAUNCH_IN_TTY" : " YES "
},
"name" : " lldb "
}
}
}
Rust поддерживается любым отладчиком на основе GDB/LLDB. Таким образом, он отлично работает с vscode-cpptools
и lldb-vscode
выше. Тем не менее, поддержка ржавчины лучше всего в CodeLLDB
.
./install_gadget.py --enable-rust
или :VimspectorInstall CodeLLDB
support/test/rust/vimspector_test
{
"configurations" : {
"launch" : {
"adapter" : " CodeLLDB " ,
"filetypes" : [ " rust " ],
"configuration" : {
"request" : " launch " ,
"program" : " ${workspaceRoot}/target/debug/vimspector_test "
}
},
"attach" : {
"adapter" : " CodeLLDB " ,
"filetypes" : [ " rust " , " c " , " cpp " , " jai " ],
"configuration" : {
"request" : " attach " ,
"program" : " ${workspaceRoot}/${fileBasenameNoExtension} " ,
"PID" : " ${PID} "
}
}
}
}
"request": "custom"
- это недействительно. Вместо этого используйте "request": "launch", "custom": true
. Потому что причиныcargo
осуществляется в DavaScript Madness Vscode, поэтому не поддерживается."request": custom
; Смотрите точку о «пользовательском» запуска вышеstep-into
для стандартных библиотечных функций) может быть выполнено путем добавления "sourceMap": { "from_path" : "to_path" }
. "from_path"
можно найти в окне разборки, поднимаясь в трассировке стека; "to_path"
- это только ваш стандартный стандартный библиотечный путь для текущего инструмента. Отладка JAI отлично работает с любым из других отладчиков. Я рекомендую Codelldb, но CPPTools также работает.
Пример:
{
"$schema" : "https://puremourning.github.io/vimspector/schema/vimspector.schema.json" ,
"adapters" : {
"gdb-with-build" : {
"extends" : "vscode-cpptools" ,
"variables" : {
"buildme" : {
"shell" : "jai ${workspaceRoot}/build.jai"
}
}
} ,
"codelldb-with-build" : {
"extends" : "CodeLLDB" ,
"variables" : {
"buildme" : {
"shell" : "jai ${workspaceRoot}/build.jai"
}
}
}
} ,
"configurations" : {
"Run - gdb" : {
"adapter" : "gdb-with-build" ,
"filetypes" : [ "jai" ] ,
"configuration" : {
"request" : "launch" ,
"program" : "${workspaceRoot}/${binaryName}" ,
"args" : [ "*${args}" ] ,
"stopAtEntry" : true ,
"stopOnEntry" : true
}
} ,
"Run - lldb" : {
"extends" : "Run - gdb" ,
"filetypes" : [ "jai" ] ,
"adapter" : "codelldb-with-build"
} ,
"Attach - gdb" : {
"adapter" : "vscode-cpptools" ,
"filetypes" : [ "jai" ] ,
"configuration" : {
"request" : "attach" ,
"program" : "${workspaceRoot}/${binaryName}" ,
"processId" : "${PID}"
}
} ,
"Attach - lldb" : {
"extends" : "Attach - gdb" ,
"filetypes" : [ "jai" ] ,
"adapter" : "CodeLLDB" ,
"configuration" : {
"pid" : "${PID}"
}
}
}
}
Python: Debugpy
Установите с помощью install_gadget.py --enable-python
или :VimspectorInstall debugpy
, в идеале требуется рабочий компилятор и заголовки/LIBS для разработки Python для создания расширения C Python для производительности.
Примечание . Debugpy больше не поддерживает Python 2. Чтобы продолжать отлаживать приложения Python 2, используйте адаптер debugpy-python2
после установки гаджета debugpy-python2
.
Полные варианты: https://github.com/microsoft/debugpy/wiki/debug-configuration-settings
{
"configurations" : {
"<name>: Launch" : {
"adapter" : " debugpy " ,
"filetypes" : [ " python " ],
"configuration" : {
"name" : " <name>: Launch " ,
"type" : " python " ,
"request" : " launch " ,
"cwd" : " <working directory> " ,
"python" : " /path/to/python/interpreter/to/use " ,
"stopOnEntry" : true ,
"console" : " externalTerminal " ,
"debugOptions" : [],
"program" : " <path to main python file> "
}
}
...
}
}
Чтобы использовать удаленную отладку с Debugpy, вы должны подключить Vimspector напрямую к приложению, которое отлаживается. Это легко, но это немного отличается от того, как мы обычно настроим вещи. В частности, вам нужно:
--listen
. Смотрите документацию Debugpy для деталей.{
"configurations" : {
"Python Attach" : {
"adapter" : " multi-session " ,
"filetypes" : [ " python " ], // optional
"configuration" : {
"request" : " attach " ,
"pathMappings" : [
// mappings here (optional)
]
}
}
}
}
См. Подробности конфигурации запуска для объяснения таких вещей, как pathMappings
.
Дополнительная документация, в том числе «Как сделать это», когда с дистанционной машиной можно связаться только через SSH, предоставляется Debugpy.
Если вы чувствуете себя причудливым, проверьте справочное руководство для примера того, что Vimspector будет удаленно запустить и прикрепить.
Чтобы продолжить отладку приложений Python 2, убедитесь, что вы устанавливаете гаджет debugpy-python2
(например, --force-enable-python2
или :VimspectorInstall debugpy-python2
), а затем измените свою конфигурацию на использование:
{
"configurations" : {
"Python Attach" : {
"adapter" : " debugpy-python2 " ,
// ...
}
}
}
Для экзамена
Смотрите мою вилку TCLProdebug для инструкций.
Установка с install_gadget.py --force-enable-csharp
или :VimspectorInstall netcoredbg
{
"configurations" : {
"launch - netcoredbg" : {
"adapter" : " netcoredbg " ,
"filetypes" : [ " cs " , " fsharp " , " vbnet " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " ${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll " ,
"args" : [],
"stopAtEntry" : true ,
"cwd" : " ${workspaceRoot} " ,
"env" : {}
}
}
}
}
Требует:
install_gadget.py --enable-go
или :VimspectorInstall delve
go 1.16
или более поздней версии (YMMV на более ранних версиях)Это использует поддержку DAP, встроенную в Delve Debugger
{
"configurations" : {
"run" : {
"adapter" : " delve " ,
"filetypes" : [ " go " ], // optional
"variables" : {
// example, to disable delve's go version check
// "dlvFlags": "--check-go-version=false"
},
"configuration" : {
"request" : " launch " ,
"program" : " ${fileDirname} " ,
"mode" : " debug "
}
}
}
}
Используйте переменные для настройки следующего:
dlvFlags
: (String) Дополнительные аргументы командной строки для передачи в DELVEОтладчик (DELVE) запускается в окне терминала, так что вы можете увидеть его вывод и передавать вход в отладку.
См. Документы VSCODE-GO для полного запуска. Да, кажется, что это единственное место, где они задокументированы (очевидно, они не документированы самим DELVE).
Документы Vscode-Go также имеют полезную информацию об устранении неполадок
Требует:
install_gadget.py --enable-go
или :VimspectorInstall vscode-go
go get -u github.com/go-delve/delve/cmd/dlv
dlvToolPath
Примечание. Vimspector использует адаптер отладки «Legacy» VSCODE-GO, а не «встроенную» поддержку DAP в DELVE. Вы можете отслеживать № 186 для этого.
{
"configurations" : {
"run" : {
"adapter" : " vscode-go " ,
"filetypes" : [ " go " ], // optional
"configuration" : {
"request" : " launch " ,
"program" : " ${fileDirname} " ,
"mode" : " debug " ,
"dlvToolPath" : " $HOME/go/bin/dlv "
// example, to disable delve's go version check
// "dlvFlags": [ "--check-go-version=false" ]
}
}
}
}
См. Документы VSCODE-GO для устранения неполадок
Это использует PHP-debug, см. Https://marketplace.visualstudio.com/items?itemname=felixfbecker.php-debug
Требует:
install_gadget.py --force-enable-php
или :VimspectorInstall vscode-php-debug
zend_extension =xdebug.so
xdebug.remote_enable =on
xdebug.remote_handler =dbgp
xdebug.remote_host =localhost
xdebug.remote_port =9000
Замените localhost
на IP вашей рабочей станции.
ленивая альтернатива
zend_extension =xdebug.so
xdebug.remote_enable =on
xdebug.remote_handler =dbgp
xdebug.remote_connect_back =true
xdebug.remote_port =9000
{
"configurations" : {
"Listen for XDebug" : {
"adapter" : " vscode-php-debug " ,
"filetypes" : [ " php " ], // optional
"configuration" : {
"name" : " Listen for XDebug " ,
"type" : " php " ,
"request" : " launch " ,
"port" : 9000 ,
"stopOnEntry" : false ,
"pathMappings" : {
"/var/www/html" : " ${workspaceRoot} "
}
}
},
"Launch currently open script" : {
"adapter" : " vscode-php-debug " ,
"filetypes" : [ " php " ], // optional
"configuration" : {
"name" : " Launch currently open script " ,
"type" : " php " ,
"request" : " launch " ,
"program" : " ${file} " ,
"cwd" : " ${fileDirname} " ,
"port" : 9000
}
}
}
}
Приложение XDEBUG_SESSION_START=xdebug
к вашей строке запроса
curl "http://localhost?XDEBUG_SESSION_START=xdebug"
или используйте ранее упомянутое расширение HDEBUG Helper (которое устанавливает cookie XDEBUG_SESSION
)
export XDEBUG_CONFIG= " idekey=xdebug "
php < path to script >
Это использует VSCODE-JS-DEBUG, отладчик, который также используется в VSCODE. Для получения дополнительных конфигураций проверьте документацию здесь.
Чтобы установить vscode-js-debug, запустите VimspectorInstall vscode-js-debug
из Vim или запустите установку install_gadget.py --force-enable-node
. Есть несколько примеров, которые вы можете проверить. Найдите их под support/test/node/simple
, support/test/node/multiprocess
и support/test/node/typescript
. Типичная конфигурация для отладки TypeScript выглядит так:
{
"configurations" : {
"run - js-debug" : {
"adapter" : " js-debug " ,
"filetypes" : [ " javascript " , " typescript " ],
"configuration" : {
"request" : " launch " ,
"program" : " ${workspaceRoot}/src/index.ts " ,
"cwd" : " ${workspaceRoot} " ,
"stopOnEntry" : false ,
"type" : " pwa-node "
},
// 'breakpoints' is an optional part. This is a way to configure exception
// breakpoints. You can leave this out or set as you prefer.
"breakpoints" : {
"exception" : {
"all" : " N " ,
"uncaught" : " N "
}
}
}
}
}
vscode-js-debug
поддерживает ряд различных «типов» и может делать некоторые вещи, которые могут работать или не работать. Поле type
, к сожалению, не задокументировано, но действительные значения определяются здесь в перечислении Devugtype.
Vimspector был протестирован только с типом pwa-node
.
Также обратите внимание, что по какой -то причине этот адаптер отладки всегда заставляет нас начать несколько сессий отладки. Для пользователя это не должно ничего изменить (кроме, возможно, немного запутанного трассировки стека). Но это делает вещи более сложными, и поэтому могут быть тонкие ошибки.
Это использует отладчик Chrome/Firefox (они очень похожи), см. Https://marketplace.visualstudio.com/items?itemname=msjsdiag.debugger-for-chrome и https://marketplace.visualstudio.com/items?itenme = firefox-devtools.vscode-firefox-debug, соответственно.
Это позволяет вам отлаживать сценарии, работающие внутри Chrome изнутри Vim.
./install_gadget.py --force-enable-chrome
или :VimspectorInstall debugger-for-chrome
./install_gadget.py --force-enable-firefox
или :VimspectorInstall debugger-for-firefox
support/test/web
{
"configurations" : {
"chrome" : {
"adapter" : " chrome " ,
"configuration" : {
"request" : " launch " ,
"url" : " http://localhost:1234/ " ,
"webRoot" : " ${workspaceRoot}/www "
}
},
"firefox" : {
"adapter" : " firefox " ,
"configuration" : {
"request" : " launch " ,
"url" : " http://localhost:1234/ " ,
"webRoot" : " ${workspaceRoot}/www " ,
"reAttach" : true
}
}
}
}
Vimspector хорошо работает с Java Debug Server, который работает как плагин JDT.LS (Java Language Server), а не автономный адаптер отладки.
Vimspector не занимается управлением языковыми серверами, адаптерами отладки, так что это означает, что вам нужен плагин редактора протокола совместимого языкового сервера для использования Java. Я рекомендую YouCompleteme, которая имеет полную поддержку JDT.LS, и, что наиболее важно, тривиальный способ загрузить адаптер отладки и использования его с Vimspector.
При использовании сервера отладки Java Vimspector поддерживает горячий код заменить пользовательскую функцию. По умолчанию, когда базовые файлы класса изменяются, Vimspector спрашивает пользователя, хотят ли они перезагрузить эти классы во время выполнения.
Такое поведение можно настроить:
let g:vimspector_java_hotcodereplace_mode = 'ask'
- по умолчанию, спросите пользователя для каждой перезагрузки.let g:vimspector_java_hotcodereplace_mode = 'always'
- не спрашивайте, всегда перезагрузитеlet g:vimspector_java_hotcodereplace_mode = 'never'
- не спрашивайте, никогда не перезагружайтеinstall_gadget.py --force-enable-java <other options...>
или :VimspectorInstall java-debug-adapter
vscode-java
, например: {
"configurations" : {
"Java Attach" : {
"adapter" : " vscode-java " ,
"filetypes" : [ " java " ],
"configuration" : {
"request" : " attach " ,
"hostName" : " ${host} " ,
"port" : " ${port} " ,
"sourcePaths" : [
" ${workspaceRoot}/src/main/java " ,
" ${workspaceRoot}/src/test/java "
]
}
}
}
}
gadgets/<os>
, а не какой -либо конкретный адаптер. Например, в .vimrc
" Tell YCM where to find the plugin. Add to any existing values.
let g: ycm_java_jdtls_extension_path = [
' </path/to/Vimspector/gadgets/<os> '
]
<leader><F5>
чтобы запустить сервер отладки и запустить Vimspector, например, в ~/.vim/ftplugin/java.vim
: let s: jdt_ls_debugger_port = 0
function ! s: StartDebugging ()
if s: jdt_ls_debugger_port <= 0
" Get the DAP port
let s: jdt_ls_debugger_port = youcompleteme#GetCommandResponse (
' ExecuteCommand ' ,
' vscode.java.startDebugSession ' )
if s: jdt_ls_debugger_port == ' '
echom " Unable to get DAP port - is JDT.LS initialized? "
let s: jdt_ls_debugger_port = 0
return
endif
endif
" Start debugging with the DAP port
call vimspector#LaunchWithSettings ( { ' DAPPort ' : s: jdt_ls_debugger_port } )
endfunction
nnoremap <silent> <buffer> <Leader><F5> :call <SID> StartDebugging() <CR>
Затем вы можете использовать <Leader><F5>
чтобы начать отладку, а не просто <F5>
.
Если вы видите «Невозможно получить порт DAP - инициализируется ли JDT.LS?», Попробуйте запустить :YcmCompleter ExecuteCommand vscode.java.startDebugSession
и отметьте вывод. Если вы видите ошибку, такую как ResponseFailedException: Request failed: -32601: No delegateCommandHandler for vscode.java.startDebugSession
, убедитесь, что:
g:ycm_java_jdtls_extension_path
установлен в .vimrc
или до начала YCMДля запуска аргументов см. Документ VSCODE.
Смотрите эту проблему для получения дополнительной информации.
LUA поддерживается через локальный Lua-Debugger-VSCODE. Этот отладчик использует Stdio для связи с процессом работы, поэтому вызовы io.read
будут вызывать проблемы.
./install_gadget.py --enable-lua
или :VimspectorInstall local-lua-debugger-vscode
support/test/lua/simple
и support/test/lua/love
{
"$schema" : " https://puremourning.github.io/vimspector/schema/vimspector.schema.json# " ,
"configurations" : {
"lua" : {
"adapter" : " lua-local " ,
"filetypes" : [ " lua " ],
"configuration" : {
"request" : " launch " ,
"type" : " lua-local " ,
"cwd" : " ${workspaceFolder} " ,
"program" : {
"lua" : " lua " ,
"file" : " ${file} "
}
}
},
"luajit" : {
"adapter" : " lua-local " ,
"filetypes" : [ " lua " ],
"configuration" : {
"request" : " launch " ,
"type" : " lua-local " ,
"cwd" : " ${workspaceFolder} " ,
"program" : {
"lua" : " luajit " ,
"file" : " ${file} "
}
}
},
"love" : {
"adapter" : " lua-local " ,
"filetypes" : [ " love " ],
"configuration" : {
"request" : " launch " ,
"type" : " lua-local " ,
"cwd" : " ${workspaceFolder} " ,
"program" : {
"command" : " love "
},
"args" : [ " ${workspaceFolder} " ]
}
}
}
}
Существует очень ограниченная поддержка для настройки пользовательского интерфейса.
Vemsector использует следующие знаки внутри. Если они будут определены до того, как Вайсктор их использует, они не будут заменены. Поэтому, чтобы настроить знаки, определите их в своем vimrc
.
Знак | Описание | Приоритет |
---|---|---|
vimspectorBP | Точка останова строки | 9 |
vimspectorBPCond | Условная точка останова | 9 |
vimspectorBPLog | Logpoint | 9 |
vimspectorBPDisabled | Отключенная точка останова | 9 |
vimspectorPC | Программа счетчик (т.е. текущая линия) | 200 |
vimspectorPCBP | Программный счетчик и точка останова | 200 |
vimspectorNonActivePC | Счетчик программы для не сфокусированного потока | 9 |
vimspectorCurrentThread | Сфокусированный поток в виде стека просмотра трассировки | 200 |
vimspectorCurrentFrame | Текущая кадр стека в стек -трассировке | 200 |
Символы по умолчанию являются эквивалентом чего -то вроде следующего:
sign define vimspectorBP text = ● texthl = WarningMsg
sign define vimspectorBPCond text = ◆ texthl = WarningMsg
sign define vimspectorBPLog text = ◆ texthl = SpellRare
sign define vimspectorBPDisabled text = ● texthl = LineNr
sign define vimspectorPC text = ▶ texthl = MatchParen linehl = CursorLine
sign define vimspectorPCBP text = ●▶ texthl = MatchParen linehl = CursorLine
sign define vimspectorNonActivePC linehl = DiffAdd
sign define vimspectorCurrentThread text = ▶ texthl = MatchParen linehl = CursorLine
sign define vimspectorCurrentFrame text = ▶ texthl = Special linehl = CursorLine
Если знаки не отображаются должным образом, ваш шрифт, вероятно, не содержит этих глифов. Вы можете легко изменить их, определив знак в вашем VIMRC. Например, вы можете поместить это в свой vimrc
, чтобы использовать некоторые простые символы ASCII:
sign define vimspectorBP text = o texthl = WarningMsg
sign define vimspectorBPCond text = o ? texthl = WarningMsg
sign define vimspectorBPLog text = !! texthl = SpellRare
sign define vimspectorBPDisabled text = o ! texthl = LineNr
sign define vimspectorPC text = > texthl = MatchParen
sign define vimspectorPCBP text = o > texthl = MatchParen
sign define vimspectorCurrentThread text = > texthl = MatchParen
sign define vimspectorCurrentFrame text = > texthl = Special
Многие разные плагины предоставляют знаки для различных целей. Примеры включают диагностические знаки для ошибок кода и т. Д. Vim предоставляет только один приоритет, чтобы определить, какой знак следует отображать, когда несколько знаков размещены на одной строке. Если вы обнаружите, что другие знаки мешают Vimspeper's (или наоборот), вы можете настроить приоритет, используемый Vimspector, установив следующий словарь:
let g: vimspector_sign_priority = {
' <sign-name> ' : <priority> ,
}
Например:
let g: vimspector_sign_priority = {
' vimspectorBP ' : 3 ,
' vimspectorBPCond ' : 3 ,
' vimspectorBPLog ' : 3 ,
' vimspectorBPDisabled ' : 3 ,
' vimspectorNonActivePC ' : 3 ,
' vimspectorPC ' : 999 ,
' vimspectorPCBP ' : 999 ,
}
Все ключи необязательны. Если знак не настроен, приоритет по умолчанию, который он использовал (как показано выше).
Смотрите :help sign-priority
. Приоритет по умолчанию составляет 10, большие числа переопределяют меньшие.
ПРИМЕЧАНИЕ . Знак vimspectorNonActivePC
по умолчанию не добавляет ни одного текста в столбец знака, он просто добавляет выделение строки, чтобы вы могли видеть строки, где в настоящее время остановлены другие потоки или процессы. В результате этот знак обычно должен сливаться с любым знаком, который добавляет символ (например, знак точки останова). VIM объединит свойства знаков только с тем же приоритетом, поэтому при изменении приоритетов по умолчанию рекомендуется:
vimspectorBP
, vimspectorBPCond
и т. Д.) имеют одинаковый приоритет.vimspectorNonActivePC
того же приоритетаvimspectorPC
, vimspectorPCBP
и т. Д.) имеет более высокий приоритет. Примечание. Эта точка настройки в настоящее время невысокая и может измениться в любое время.
Иногда адаптер отладки дает намеки на то, как пользовательский интерфейс должен отображать определенные вещи. Это включает в себя рамки стека, переменные и т. Д.
Vimspector предоставляет простой способ настройки того, как они отображаются, установив значения в словаре g:vimsepctor_presentation_hint_hl
.
Следующие ключи поддерживаются с упомянутой группой Highlate Default.
Группа | Ключ | Использование | По умолчанию |
---|---|---|---|
все | normal | Все, что не покрыто ниже | Normal |
Стек трассировки | emphasize | подчеркнуть источники в стеке трассировки | Title |
Стек трассировки | deemphasize | Уточнить источники в стеке трассировки | Conceal |
Стек трассировки | label | Рамки стеков, которые являются «метками», не представляющие реальные кадры | NonText |
Стек трассировки | subtle | Кадры стека, которые являются внутренними или не интересными | Conceal |
Области применения | arguments | Функция аргументов область применения | Title |
Области применения | locals | Локальные переменные | Title |
Области применения | registers | Регистры обладают объемом | Title |
Переменные | property | Функция аргументов область применения | Identifier |
Переменные | method | Локальные переменные | Function |
Переменные | class | Регистры обладают объемом | Type |
Переменные | data | Регистры обладают объемом | String |
Кроме того, может быть установлено любое значение, предоставленное в DAP VariablePresentationHint
, которое будет использоваться в случае предоставления адаптером отладки.
Глупый пример; По умолчанию, вероятно, должны быть в порядке для большинства цветных сэм:
let g: vimspector_presentation_hint_hl = {
' normal ' : ' Identifier ' ,
' label ' : ' Title ' ,
}
Обратите внимание : этот API настройки нестабилен , что означает, что он может измениться в любое время. Я постараюсь уменьшить влияние этого и объявить об изменениях в друтке.
Следующие параметры управляют размерами по умолчанию Windows пользовательского интерфейса (все они являются числами)
g:vimspector_sidebar_width
(по умолчанию: 50 столбцов): ширина в столбцах левых оконg:vimspector_bottombar_height
(по умолчанию 10 строк): высота в рядах окна вывода под окном кода.Пример:
let g: vimspector_sidebar_width = 75
let g: vimspector_bottombar_height = 15
The terminal is typically created as a vertical split to the right of the code window, and that window is re-used for subsequent terminal buffers. The following control the sizing of the terminal window used for debuggee input/output when using Vim's built-in terminal.
g:vimspector_code_minwidth
(default: 82 columns): Minimum number of columns to try and maintain for the code window when splitting to create the terminal window.g:vimspector_terminal_maxwidth
(default: 80 columns): Maximum number of columns to use for the terminal.g:vimspector_terminal_minwidth
(default: 10 columns): Minimum number of columns to use when it is not possible to fit g:vimspector_terminal_maxwidth
columns for the terminal. That's a lot of options, but essentially we try to make sure that there are at least g:vimspector_code_minwidth
columns for the main code window and that the terminal is no wider than g:vimspector_terminal_maxwidth
columns. g:vimspector_terminal_minwidth
is there to ensure that there's a reasonable number of columns for the terminal even when there isn't enough horizontal space to satisfy the other constraints.
Пример:
let g: vimspector_code_minwidth = 90
let g: vimspector_terminal_maxwidth = 75
let g: vimspector_terminal_minwidth = 20
It's useful to be able to define mappings only while debugging and remove those mappings when debugging is complete. For this purpose, Vimspector provides 2 User
autocommands:
VimspectorJumpedToFrame
- triggered whenever a 'break' event happens, or when selecting a stack from to jump to. This can be used to create (for example) buffer-local mappings for any files opened in the code window.VimspectorDebugEnded
- triggered when the debug session is terminated (actually when Vimspector is fully reset) An example way to use this is included in support/custom_ui_vimrc
. In there, these autocommands are used to create buffer-local mappings for any files visited while debugging and to clear them when completing debugging. This is particularly useful for commands like <Plug>VimspectorBalloonEval
which only make sense while debugging (and only in the code window). Check the commented section Custom mappings while debugging
.
NOTE: This is a fairly advanced feature requiring some nontrivial vimscript. It's possible that this feature will be incorporated into Vimspector in future as it is a common requirement.
In many cases you will want to rebuild your project before starting a new debugging session. Vimspector is not a task manager and implementing this functionality is out of the scope of this project. However, there are some strategies described in the community wiki to achieve similar functionality.
You can tell vimspector not to draw the WinBar (the toolbars in the code, variables, output, etc. windows) by setting:
let g: vimspector_enable_winbar = 0
The WinBar is in any case not displayed if the mouse is not enabled.
Please Note : This customisation API is unstable , meaning that it may change at any time. I will endeavour to reduce the impact of this and announce changes in Gitter.
The above customisation of window sizes is limited intentionally to keep things simple. Vimspector also provides a way for you to customise the UI without restrictions, by running a User
autocommand just after creating the UI or opening the terminal. This requires you to write some vimscript, but allows you to do things like:
You can essentially do anything you could do manually by writing a little vimscript code.
The User
autocommand is raised with pattern
set with the following values:
VimspectorUICreated
: Just after setting up the UI for a debug sessionVimspectorTerminalOpened
: Just after opening the terminal window for program input/output. The following global variable is set up for you to get access to the UI elements: g:vimspector_session_windows
. This is a dict
with the following keys:
g:vimspector_session_windows.tabpage
: The tab page for the sessiong:vimspector_session_windows.variables
: Window ID of the variables window, containing the vimspector.Variables
buffer.g:vimspector_session_windows.watches
: Window ID of the watches window, containing the vimspector.Watches
buffer.g:vimspector_session_windows.stack_trace
: Window ID of the stack trade window containing the vimspector.StackTrace
buffer.g:vimspector_session_windows.code
: Window ID of the code window.g:vimspector_session_windows.output
: Window ID of the output window. In addition, the following key is added when triggering the VimspectorTerminalOpened
event:
g:vimspector_session_windows.terminal
: Window ID of the terminal window You can even customise the WinBar buttons by simply running the usual menu
(and unmenu
) commands.
By default, Vimspector uses something a bit like this:
nnoremenu WinBar.■ Stop : call vimspector#Stop ( { ' interactive ' : v: false } ) <CR>
nnoremenu WinBar.▶ Cont : call vimspector#Continue () <CR>
nnoremenu WinBar.▷ Pause : call vimspector#Pause () <CR>
nnoremenu WinBar.↷ Next : call vimspector#StepOver () <CR>
nnoremenu WinBar.→ Step : call vimspector#StepInto () <CR>
nnoremenu WinBar.← Out : call vimspector#StepOut () <CR>
nnoremenu WinBar.⟲: : call vimspector#Restart () <CR>
nnoremenu WinBar.✕ : call vimspector#Reset ( { ' interactive ' : v: false } ) <CR>
If you prefer a different layout or if the unicode symbols don't render correctly in your font, you can customise this in the VimspectorUICreated
autocommand, for example:
func ! CustomiseUI ()
call win_gotoid ( g: vimspector_session_windows .code )
" Clear the existing WinBar created by Vimspector
nunmenu WinBar
" Create our own WinBar
nnoremenu WinBar.Kill : call vimspector#Stop ( { ' interactive ' : v: true } ) <CR>
nnoremenu WinBar. Continue : call vimspector#Continue () <CR>
nnoremenu WinBar.Pause : call vimspector#Pause () <CR>
nnoremenu WinBar. Step Over : call vimspector#StepOver () <CR>
nnoremenu WinBar. Step In : call vimspector#StepInto () <CR>
nnoremenu WinBar. Step Out : call vimspector#StepOut () <CR>
nnoremenu WinBar.Restart : call vimspector#Restart () <CR>
nnoremenu WinBar.Exit : call vimspector#Reset () <CR>
endfunction
augroup MyVimspectorUICustomistaion
autocmd !
autocmd User VimspectorUICreated call s: CustomiseUI ()
augroup END
There is some example code in support/custom_ui_vimrc
showing how you can use the window IDs to modify various aspects of the UI using some basic vim commands, primarily win_gotoid
function and the wincmd
ex command.
To try this out vim -Nu support/custom_ui_vimrc <some file>
.
Here's a rather smaller example. A simple way to use this is to drop it into a file named my_vimspector_ui.vim
in ~/.vim/plugin
(or paste into your vimrc
):
" Set the basic sizes
let g: vimspector_sidebar_width = 80
let g: vimspector_code_minwidth = 85
let g: vimspector_terminal_minwidth = 75
function ! s: CustomiseUI ()
" Customise the basic UI...
" Close the output window
call win_gotoid ( g: vimspector_session_windows .output )
q
endfunction
function s: SetUpTerminal ()
" Customise the terminal window size/position
" For some reasons terminal buffers in Neovim have line numbers
call win_gotoid ( g: vimspector_session_windows . terminal )
set norelativenumber nonumber
endfunction
augroup MyVimspectorUICustomistaion
autocmd !
autocmd User VimspectorUICreated call s: CustomiseUI ()
autocmd User VimspectorTerminalOpened call s: SetUpTerminal ()
augroup END
.vimspector.json
. As you can see above, some of the servers aren't really editor agnostic, and require very-specific unique handling. See the wiki for details on additional language support.vimspector.json
? Yes, see here..vimspector.json
, or could it be the current vim file? Вам это не нужно. You can specify $file for the current active file. See here for complete list of replacements in the configuration file..vimspector.json
, but Vim highlights these as errors, do you know how to make this not-an-error? Yes, put this in ~/.vim/after/syntax/json.vim
: syn region jsonComment start = " / * " end = " * / "
hi link jsonCommentError Comment
hi link jsonComment Comment
gadget
and an adapter
? A gadget is something you install with :VimspectorInstall
or install_gadget.py
, an adapter
is something that Vimspector talks to (actually it's the Vimspector config describing that thing). These are usually one-to-one, but in theory a single gadget can supply multiple adapter
configs. Typically this happens when a gadget
supplies different adapter
config for, say remote debugging, or debugging in a container, etc..vimspector.json
in the root of every project? No, you can use g:vimspector_adapters
and g:vimspector_configurations
or put all of your adapter and debug configs in a single directory if you want to, but note the caveat that ${workspaceRoot}
won't be calculated correctly in that case. The vimsepctor author uses this a lotvimspector#LaunchWithSettings( { 'ThePID': the_pid_i_picked } )
. Alternatively, you could use a shell
variable to guess the PID, like this (which runs pgrep vim | sort | tail -1
to get the 'highest' PID of the command to be debugged (NOTE: this is for debugging Vim. replace with something appropriate to your actual use case. If this doesn't make sense to you, you might be better off just typing in the PID). "Attach: max PID" : {
"adapter" : " CodeLLDB " ,
"variables" : {
"pid" : {
"shell" : [
" /bin/bash " ,
" -c " ,
" pgrep vim | sort | tail -1 "
]
}
},
"configuration" : {
"request" : " attach " ,
"program" : " ${workspaceRoot}/src/vim " ,
"expressions" : " native " ,
"stopOnEntry#json" : " ${StopOnEntry:true} " ,
"pid" : " ${pid} "
}
},
Example g:vimspector_adapters
and g:vimspector_configurations
:
let g: vimspector_adapters = #{
test_debugpy: #{ extend s: ' debugpy ' }
}
let g: vimspector_configurations = {
" test_debugpy_config " : {
" adapter " : " test_debugpy " ,
" filetypes " : [ " python " ],
" configuration " : {
" request " : " launch " ,
" type " : " python " ,
" cwd " : " ${fileDirname} " ,
" args " : [],
" program " : " ${file} " ,
" stopOnEntry " : v: false ,
" console " : " integratedTerminal " ,
" integer " : 123 ,
},
" breakpoints " : {
" exception " : {
" raised " : " N " ,
" uncaught " : " " ,
" userUnhandled " : " "
}
}
} }