للحصول على نظرة عامة على البرنامج التعليمي والاستخدام، قم بإلقاء نظرة على موقع Vimspector.
للحصول على شرح تفصيلي لتنسيق .vimspector.json
، راجع الدليل المرجعي.
البرنامج المساعد عبارة عن مصحح أخطاء رسومية Vim قادر على لغات متعددة. يتم اختباره في الغالب لـ C++ وPython وTCL، ولكنه يدعم نظريًا أي لغة يدعمها Visual Studio Code (لكن راجع التحذيرات).
يحتوي موقع Vimspector على نظرة عامة على واجهة المستخدم، إلى جانب الإرشادات الأساسية للتكوين والإعداد.
لكن في الوقت الحالي، إليك لقطة شاشة (قديمة إلى حد ما) لبرنامج Vimspector لتصحيح أخطاء Vim:
واثنين من العروض التوضيحية المختصرة:
<Plug>VimspectorBalloonEval
)يسرد الجدول التالي اللغات "المضمنة" (مع تبعيات وقت التشغيل الخاصة بها). ويتم تصنيفهم حسب مستوى الدعم الخاص بهم:
Tested
: مدعوم بالكامل، وتغطيها اختبارات الانحدار VimspectorSupported
: مدعوم بالكامل، ويستخدم بشكل متكرر ويتم اختباره يدويًاExperimental
: يعمل، ولكن لا يتم استخدامه بشكل متكرر ونادرا ما يتم اختبارهLegacy
: لم يعد مدعومًا، يرجى ترحيل ملف التكوين الخاص بكRetired
: لم يعد متضمنًا أو مدعومًا.اللغة (اللغات) | حالة | التبديل (من أجل install_gadget.py ) | محول (من أجل :VimspectorInstall ) | التبعيات |
---|---|---|---|---|
C، C++، الصدأ، جاي، الخ. | تم اختباره | --all أو --enable-c (أو CPP) | vscode-cpptools | أحادية النواة |
C، C++، الصدأ، جاي، الخ. | تم اختباره | --enable-rust ، --enable-c ، وما إلى ذلك. | CodeLLDB | لا أحد |
بايثون | تم اختباره | --all أو --enable-python | debugpy | بايثون 3 |
يذهب | تم اختباره | --enable-go | الخوض | الذهاب 1.16+ |
تي سي ال | المدعومة | --all أو --enable-tcl | com.tclpro | تي سي ال 8.5 |
بورن شل | المدعومة | --all أو --enable-bash | vscode-bash-debug | باش ف؟؟ |
لوا | تم اختباره | --all أو --enable-lua | local-lua-debugger-vscode | العقدة >=12.13.0، Npm، مترجم Lua |
Node.js | المدعومة | --force-enable-node | vscode-js-debug | العقدة >= 18 |
جافا سكريبت | المدعومة | --force-enable-chrome | مصحح الأخطاء للكروم | الكروم |
جافا سكريبت | المدعومة | --force-enable-firefox | vscode-firefox-debug | فايرفوكس |
جافا | المدعومة | --force-enable-java | vscode-java-debug | البرنامج المساعد LSP المتوافق (انظر لاحقًا) |
PHP | تجريبي | --force-enable-php | vscode-php-debug | العقدة، PHP، XDEBUG |
C # (دوت نت الأساسية) | تم اختباره | --force-enable-csharp | netcoredbg | الدوت نت الأساسية |
F #، VB، الخ. | المدعومة | --force-enable-[fsharp,vbnet] | netcoredbg | الدوت نت الأساسية |
اذهب (تراث) | إرث | --enable-go | vscode-go | العقدة، الذهاب، الخوض |
بايثون 2 | إرث | --force-enable-python2 | debugpy-python2 | بايثون 2.7 |
يجب أن يعمل Vimspector مع أي محول تصحيح يعمل في Visual Studio Code.
لاستخدام Vimspector مع لغة غير "مدمجة"، راجع صفحة wiki هذه.
هناك طريقتان للتثبيت:
:help packages
.packadd! vimspector
إلى .vimrc
الخاص بك.vimspector.json
أو قم بتعيين g:vimspector_configurations
) - راجع الدليل المرجعيتحقق من التبعيات
راجع مستندات مدير البرنامج المساعد وقم بتثبيت البرنامج المساعد بالنسبة لـ Vundle، استخدم:
Plugin ' puremourning/vimspector '
قم بتثبيت بعض "الأدوات" (محولات تصحيح الأخطاء) - راجع هنا للحصول على أوامر التثبيت وحدد الأدوات الذكية المراد تثبيتها
قم بتكوين ملفات تعريف تصحيح الأخطاء الخاصة بمشروعك (قم بإنشاء .vimspector.json
أو قم بتعيين g:vimspector_configurations
) - راجع الدليل المرجعي
تتوسع الأقسام التالية في النظرة العامة الموجزة أعلاه.
يتطلب Vimspector:
ما هي إصدارات لينكس؟ أنا أختبر فقط على 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
لرؤية الخيارات، ويقبل أيضًا أي خيار 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
.
نرحب دائمًا بممثلي العلاقات العامة لإضافة اللغات المدعومة (والتي تُترجم تقريبًا إلى تحديث python/vimspector/gadgets.py
واختبارها).
يستخدم Vimspector الدليل التالي بشكل افتراضي للبحث عن ملف يسمى .gadgets.json
: </path/to/vimspector>/gadgets/<os>
.
يتم عرض هذا المسار كمتغير vimspector ${gadgetDir}
. يعد هذا مفيدًا لتكوين أسطر أوامر الأداة الذكية.
حيث نظام التشغيل هو واحد من:
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، أردت استكشاف الخيارات.
على الرغم من أن بروتوكول خادم اللغة معروف جيدًا، إلا أن بروتوكول Debug Adaptor أقل شهرة، ولكنه يحقق هدفًا مشابهًا: واجهة برمجة التطبيقات (API) المحايدة للغة التي تستخلص مصححات الأخطاء من العملاء.
الهدف من هذا المشروع هو توفير تجربة تصحيح أخطاء بسيطة ولكنها فعالة في Vim للغات متعددة، من خلال الاستفادة من محولات تصحيح الأخطاء التي تم إنشاؤها لـ Visual Studio Code.
القدرة على القيام بالتصحيح عن بعد أمر لا بد منه. يعد هذا أمرًا أساسيًا لسير العمل الخاص بي، لذا فإن دمجه في تجربة تصحيح الأخطاء هو الهدف الرئيسي للمشروع. لذلك يتمتع vimspector بدعم من الدرجة الأولى لتنفيذ البرامج عن بعد والاتصال بها. يعد هذا الدعم فريدًا بالنسبة إلى vimspector ويأتي فوق (مكمل) لأي دعم من هذا القبيل في محولات تصحيح الأخطاء الفعلية.
Vimspector عبارة عن واجهة مستخدم حيوية أعلى بروتوكول محول التصحيح. تم تصميمه ليكون عالي المستوى وملائمًا لمهام تصحيح الأخطاء اليومية.
فيمسبيكتور ليس:
Vimspector هو عمل مستمر، وأي تعليقات/مساهمات هي موضع ترحيب كبير.
يمكن الاطلاع على الأعمال المتراكمة على Trello.
البرنامج المساعد تجريبي حاليا . وهذا يعني أن أي جزء منه يمكن (وربما سيتغير)، بما في ذلك أشياء مثل:
ومع ذلك، فإنني ألتزم بالقيام بذلك فقط في الحالات القصوى والإعلان عن مثل هذه التغييرات على Gitter مقدمًا. لا يوجد شيء أكثر إزعاجًا من الأشياء التي تنكسر عليك. لقد فهمت ذلك.
رسالة من المؤلف حول الدافع لهذا البرنامج المساعد:
تحتوي العديد من بيئات التطوير على مصحح أخطاء مضمن. أقضي قدرًا هائلاً من وقتي في فيم. أقوم بكل عمليات التطوير الخاصة بي في Vim وقمت أيضًا بتخصيص سير العمل الخاص بي لبناء التعليمات البرمجية وإجراء الاختبارات وما إلى ذلك.
لقد لاحظت بنفسي لسنوات عديدة، وأصدقائي وزملائي يكتبون
printf
،puts
،أعتقد حقًا أن بيئات تصحيح الأخطاء الرسومية التفاعلية هي أفضل طريقة لفهم التعليمات البرمجية المألوفة وغير المألوفة والتفكير فيها، وأن الافتقار إلى الوصول الجاهز والبسيط إلى مصحح الأخطاء يمثل فجوة إنتاجية مخفية ضخمة للكثيرين.
لا تفهموني خطأ، أعلم أن هناك ملايين المطورين الذين يتمتعون بكفاءة أكبر في التطوير بدون مصحح أخطاء رسومي، لكنني أصر على أنه إذا كانت لديهم القدرة على الضغط على مفتاح فقط والانتقال إلى مصحح الأخطاء، فسيكون ذلك سيكون أسرع وأكثر متعة من مجرد فهم الكود الدماغي.
لقد قمت بإنشاء Vimspector لأنني أجد تغيير الأدوات أمرًا محبطًا.
gdb
لـ c++،pdb
لـ python، وما إلى ذلك. ولكل منها بناء الجملة الخاص بها. كل معجم خاص به. كل نقاط الضعف الخاصة بها.لقد صممت نظام التكوين بحيث يمكن التزام التكوين بالتحكم في المصدر بحيث يعمل فقط مع أي من زملائك أو أصدقائك أو المتعاونين أو الغرباء تمامًا.
لقد جعلت تصحيح الأخطاء عن بعد ميزة من الدرجة الأولى لأن هذه حالة استخدام أساسية بالنسبة لي في وظيفتي.
باستخدام Vimspector، يمكنني فقط الضغط على
<F5>
بجميع اللغات التي أقوم بالتطوير بها وتصحيح الأخطاء محليًا أو عن بُعد باستخدام نفس سير العمل والتعيينات وواجهة المستخدم. لقد قمت بدمج هذا مع Vim الخاص بي بطريقة يمكنني من خلالها الضغط على زر وإجراء الاختبار تحت المؤشر في Vimspector . لقد أدى هذا النوع من التكامل إلى تحسين سير العمل والإنتاجية بشكل كبير. حتى أنها جعلت عملية تعلم قاعدة تعليمات برمجية جديدة... ممتعة.- بن جاكسون، مبدع.
أباتشي 2.0
حقوق النشر © 2018 بن جاكسون
إذا كنت تحب Vimspector كثيرًا لدرجة أنك ترغب في التخلي عن أموالك التي كسبتها بشق الأنفس، فيرجى التفكير في التبرع لإحدى الجمعيات الخيرية التالية، والتي لها معنى بالنسبة لمؤلف Vimspector (حسب ترتيب التفضيل):
بشكل افتراضي، لا يقوم vimspector بتغيير أي من تعييناتك. تعد التعيينات شخصية للغاية، لذا يجب عليك تحديد ما تريد واستخدام ميزات رسم الخرائط القوية الخاصة بـ vim لتعيين تعييناتك الخاصة. ولتحقيق هذه الغاية، يحدد Vimspector تعيينات <Plug>
التالية:
رسم الخرائط | وظيفة | واجهة برمجة التطبيقات |
---|---|---|
<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 معينة فقط أثناء تنشيط تصحيح الأخطاء. وهذا ممكن أيضًا، على الرغم من أنه يتطلب كتابة بعض vimscipt.
ومع ذلك، فإن العديد من الأشخاص على دراية بمصححات أخطاء معينة، لذا يمكن تمكين التعيينات التالية عن طريق تعيين 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
والمصادر الأخرى. إذا لم تتمكن من إنجاز هذا العمل، فما عليك سوى استخدام تعيينات "الوضع البشري".
إذا كان لديك، مثلي، يدان و10 أصابع فقط، فمن المحتمل أنك لا تحب مفاتيح Ctrl-Shift-F. أيضًا، إذا كنت تعمل في محطة طرفية، فهناك احتمال حقيقي أن تكون معلومات terminfo خاطئة بالنسبة لمفاتيح Shift-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
يحدد هذا القسم تعليمات الاستخدام التفصيلية، مرتبة حسب الميزة. بالنسبة لمعظم المستخدمين، يحتوي قسم التعيينات على الأوامر الأكثر شيوعًا والاستخدام الافتراضي. يمكن استخدام هذا القسم كمرجع لإنشاء تعييناتك أو سلوكياتك المخصصة.
تفترض كافة الإرشادات أدناه جلسة تصحيح أخطاء واحدة. للحصول على تفاصيل حول كيفية تصحيح أخطاء العديد من التطبيقات المستقلة في نفس الوقت، راجع [جلسات تصحيح الأخطاء المتعددة] [#جلسات تصحيح الأخطاء المتعددة].
.vimspector.json
. انظر أدناه.:call vimspector#Launch()
وحدد التكوين.إن إطلاق جلسة جديدة يجعلها [جلسة تصحيح الأخطاء] نشطة [#جلسات تصحيح الأخطاء المتعددة].
إذا كان تكوين محول التصحيح يستخدم pidProperty
، وقمت بتقديم طلب attach
، فسيُطلب منك إدخال PID (معرف العملية) للإرفاق به.
لتسهيل ذلك، يوفر Vimspector أداة مساعدة صغيرة لإدراج معرفات PID. إنه يشبه استنساخًا بسيطًا جدًا لـ ps
ولكنه يعمل على جميع الأنظمة الأساسية المدعومة. راجع الملف التمهيدي الخاص به للحصول على إرشادات حول إعداده.
قم بتشغيل 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 المستخدم بإدخال هذه الأشياء أو تأكيدها.
راجع دليل تكامل YouCompleteMe الخاص بنا للحصول على مثال آخر حيث يمكن استخدامه لتحديد المنفذ لتوصيل مصحح أخطاء Java
لبدء التشغيل باستخدام تكوين مخصص، يمكنك استخدام:
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 " )
راجع قسم التعيينات للتعرف على التعيينات الافتراضية للتعامل مع نقاط التوقف. يصف هذا القسم واجهة برمجة التطبيقات الكاملة في وظائف vimscript.
ترتبط نقاط التوقف بـ [جلسة تصحيح الأخطاء] الحالية [#جلسات تصحيح الأخطاء المتعددة]. عند التبديل بين الجلسات، تتم إزالة علامات التوقف للجلسة السابقة ويتم عرض نقاط التوقف للجلسة التي تم تنشيطها حديثًا. على الرغم من أنه قد يكون من المفيد رؤية نقاط التوقف لجميع الجلسات، إلا أن هذا قد يكون مربكًا للغاية.
استخدم :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 لا يخبرك إذا كان مصحح الأخطاء لا يدعم نقاط التوقف الشرطية (حتى الآن). نقطة التوقف الشرطية هي نقطة توقف يتم تشغيلها فقط إذا تم تقييم بعض التعبيرات على أنها صحيحة، أو تم استيفاء بعض القيود الأخرى.
بعض هذه الوظائف أعلاه تأخذ وسيطة اختيارية واحدة وهي عبارة عن قاموس للخيارات. يمكن أن يحتوي القاموس على المفاتيح التالية:
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]
- احفظ المجموعة الحالية لنقاط توقف الأسطر ، ونقاط تسجيل الدخول ، ونقاط التوقف الشرطية ، ونقاط توقف الوظائف ، ومرشحات نقطة التوقف الاستثناء إلى ملف الجلسة المقدم أو الملف الافتراضي في الدليل المرفق.VimspectorLoadSession [file/dir name]
- اقرأ نقاط التوقف من ملف الجلسة المقدم أو الملف الافتراضي في الدليل المقدم واستبدال أي نقاط توقف محددة حاليًا. قبل التحميل ، يتم مسح جميع نقاط التوقف الحالية (كما لو كان vimspector#ClearLineBreakpoints()
يسمى). في كلتا الحالتين ، تكون وسيطة اسم الملف/DIR اختياريًا. بشكل افتراضي ، يتم تسمية الملف .vimspector.session
، ولكن يمكن تغيير هذا على مستوى العالم عن طريق الإعداد g:vimspector_session_file_name
إلى شيء آخر ، أو عن طريق تحديد مسار يدويًا عند الاتصال بالأمر. إذا قمت بتزويد الدليل ، فسيتم قراءة اسم ملف الجلسة الافتراضي أو المكون من FRON أو مكتوبة على هذا الدليل. Othewise ، تتم قراءة الملف بناءً على المخزن المؤقت المفتوح حاليًا أو مكتوبًا إلى دليل العمل الحالي.
قد يرغب المستخدمون المتقدمون في أتمتة عملية التحميل والتوفير ، على سبيل المثال عن طريق إضافة موارد توصيل تلقائية 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>
. يتوفر إكمال علامة التبويب للتعبير في بعض محولات التصحيح.<CR>
، أو انقر نقرًا مزدوجًا مع الماوس الأيسر.<C-CR>
(Control + <CR>
) أو <leader><CR>
(إذا لم يكن modifyOtherKeys
يعمل من أجلك)<DEL>
. يتم تمثيل الساعات من قبل العازلة vimspector.Watches
.
إذا كنت تفضل عرضًا أكثر مطوّلة للمتغيرات والساعات ، فيمكنك let g:vimspector_variables_display_mode = 'full'
. بشكل افتراضي ، يتم عرض الاسم والقيمة فقط ، مع وجود بيانات أخرى متوفرة من تحوم الماوس أو تؤدي إلى <Plug>VimspectorBalloonEval
على الخط الذي يحتوي على القيمة في نافذة المتغيرات (أو الساعات).
يمكنك تعطيل المنبثقة الأوتوماتيكية عن طريق الإعدادات g:vimspector_enable_auto_hover=0
قبل بدء جلسة التصحيح. يمكنك بعد ذلك تعيين شيء ما إلى <Plug>VimspectorBalloonEval
وإطلاقه يدويًا.
يحتوي المخزن المؤقت لمطالبة الساعة على تعيين omnifunc
على وظيفة من شأنها حساب الانتهاء من التعبير الحالي. يتم استخدام هذا بشكل تافه مع <Ctrl-x><Ctrl-o>
(انظر :help ins-completion
) ، أو مدمجة مع نظام الانتهاء المفضل لديك. يتم تعيين filetype في المخزن المؤقت على VimspectorPrompt
.
بالنسبة لـ youcompleteme ، يعمل التكوين التالي بشكل جيد:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
:VimspectorDisassemble
<Plug>VimspectorDisassemble
vimspector#ShowDisassembly()
بعض محولات التصحيح (قليلة!) تدعم التفكيك. الطريقة التي يعمل بها هذا في DAP غريبة بعض الشيء ، ولكن في الممارسة العملية سوف تطلب VimSpector تفكيك عدد من التعليمات حول جهاز الكمبيوتر الخاص بإطار المكدس الحالي. ثم يظهر هذا في نافذة مع WinBar مماثلة لنافذة الكود ، ولكن مع تعليمات تخطو التفاصيل. هناك علامة على التعليمات الحالية وتجديد الجملة الافتراضيات إلى "ASM" التي تعمل في الغالب على موافقة على X86 و ARM.
كما هو مذكور أعلاه ، عندما تكون نافذتك الحالية هي نوافذ التفكيك وتستخدم أوامر "الخطوة" الافتراضية (على سبيل المثال <F10>
) ، يتم تلقائيًا إلى كل ما في كل بيان.
في كل مرة تتوقف فيها العملية ، تطلب VimSpector حوالي 2 Windows مليئة بالإرشادات حول الكمبيوتر الحالي. لرؤية المزيد ، يمكنك تمرير النافذة. سيقوم VimSpector بصفحة في شاشة إضافية من الإرشادات عندما يتم تمرير النافذة إلى الأعلى أو بالقرب من أسفل. هذا ليس مثاليًا. في بعض الأحيان ، يجب عليك التمرير أكثر قليلاً لجعلها صفحة (على سبيل المثال Ctrl-e ctrl-y في الأعلى). هذا ليس مثاليًا ، وقد يتم تحسينه في المستقبل.
يمكنك التحكم في الارتفاع العميق لنافذة التفكيك مع let g:vimspector_disassembly_height = 10
(أو عدد الخطوط).
النموذج fileType (وبناء الجملة) من المخازن المؤقتة في نافذة التفكيك هو vimspector-disassembly
. يمكنك استخدام موارد توصيل تلقائية FileType
لتخصيص أشياء مثل تسليط الضوء على بناء الجملة.
ملاحظة : هذه الميزة تجريبية وقد تتغير بأي طريقة بناءً على ملاحظات المستخدم.
توفر بعض محولات التصحيح وسيلة لتفريغ ذاكرة العملية المرتبطة بالمتغيرات. يمكن القيام بذلك من المتغيرات ويشاهد النوافذ مع:
<leader>m
(بشكل افتراضي ،)vimspector#ReadMemory()
عند القيام بذلك ، يُطلب منك إدخال عدد من البايتات للقراءة (من الموقع المرتبط بخط المؤشر الحالي) وإزاحة من هذا الموقع. يتم عرض المخزن المؤقت الجديد في نافذة الكود التي تحتوي على تفريغ الذاكرة في Hex و ASCII ، على غرار إخراج xxd
.
ملاحظة : هذه الميزة تجريبية وقد تتغير بأي طريقة بناءً على ملاحظات المستخدم.
تعرض نافذة تتبع المكدس حالة كل مؤشر ترابط البرنامج. يمكن توسيع المواضيع التي يتم إيقافها لإظهار تتبع المكدس لهذا الموضوع.
في كثير من الأحيان ، ولكن ليس دائمًا ، يتم إيقاف جميع الخيوط عند ضرب نقطة توقف. يتم عرض حالة الموضوع بين قوسين بعد اسم الموضوع. حيث تدعمها مصحح الأخطاء الأساسية ، يمكن إيقاف المواضيع واستمرارها بشكل فردي من داخل نافذة تتبع المكدس.
خيط معين ، تم تسليط الضوء عليه مع مجموعة تسليط الضوء CursorLine
هو الخيط "المركز". هذا هو الموضوع الذي يتلقى أوامر مثل "Step in" و "STEP Out" و "Conter" و "Pause" في نافذة الكود. يمكن تغيير الخيط المركز يدويًا إلى "التبديل إلى" الخيط.
<CR>
، أو انقر نقرًا مزدوجًا مع الماوس الأيسر لتوسيع/انهيار تتبع مكدس الخيط ، أو استخدام زر WinBar.<CR>
، أو انقر نقرًا مزدوجًا مع الماوس الأيسر على إطار مكدس للقفز إليه.vimspector#PauseContinueThread()
لإيقاف مؤشر الترابط المحدد بشكل فردي أو متابعة الخيط المحدد.<leader><CR>
أو vimspector#SetCurrentThread()
لتعيين مؤشر ترابط "Focussed" على الخيط المحدد حاليًا. إذا كان السطر المحدد هو إطار مكدس ، فقم بتعيين مؤشر الترابط المركز على مؤشر ترابط هذا الإطار وقفز إلى هذا الإطار في نافذة الكود. يتم تمثيل تتبع المكدس بواسطة vimspector.StackTrace
العازلة.
إذا كانت هناك جلسات تصحيح للأطفال ، مثل المكان الذي تطلق فيه Debuege عمليات الأطفال ويدعم محول التصحيح تصحيح الأخطاء المتعددة ، يتم عرض مؤشرات ترابط كل جلسة بشكل منفصل. الجلسة النشطة حاليًا هي تلك التي يتم تمييزها كإطار مؤشر ترابط/مكدس نشط حاليًا. لتحويل التحكم إلى جلسة مختلفة ، ركز مؤشر ترابط في تلك الجلسة.
ملاحظة: يشير هذا إلى الجلسات التي تم إنشاؤها كأطفال في جلسة موجودة ، ولا يجب الخلط بينها وبين [جلسات تصحيح الأخطاء (الوالد) المتعددة] [#جلسات التعداد المتعددة].
:VimspectorShowOutput <category>
. استخدم إكمال سطر الأوامر لرؤية الفئات. إذا تم إغلاق نافذة الإخراج ، فيمكن فتح نظام جديد مع :VimspectorShowOutput <category>
(استخدم علامة التبويب - wildmenu
لرؤية الخيارات).
نافذة وحدة التحكم هي مخزن مؤقت للمطالبات ، حيث يكون ذلك متاحًا ، ويمكن استخدامه كـ CLI التفاعلية لمحول التصحيح. دعم هذا يختلف بين المحولات.
:VimspectorEval <expression>
. الانتهاء متاح مع بعض محولات التصحيح.<CR>
ملاحظة: انظر أيضًا الساعات أعلاه.
إذا تم إغلاق نافذة الإخراج ، فيمكن فتح نظام جديد مع :VimspectorShowOutput Console
.
يحتوي المخزن المؤقت لمطالبة وحدة التحكم على نظام omnifunc
على وظيفة من شأنها حساب الإكمال للأمر/التعبير الحالي. يتم استخدام هذا بشكل تافه مع <Ctrl-x><Ctrl-o>
(انظر :help ins-completion
) ، أو مدمجة مع نظام الانتهاء المفضل لديك. يتم تعيين filetype في المخزن المؤقت على VimspectorPrompt
.
بالنسبة لـ youcompleteme ، يعمل التكوين التالي بشكل جيد:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
يحتوي ملف سجل VIMSpector على تتبع كامل للاتصال بين VIMSpector ومحول التصحيح. هذا هو المصدر الرئيسي للمعلومات التشخيصية عندما يحدث خطأ ما ، وهذا ليس تتبع VIM.
إذا كنت ترغب فقط في رؤية ملف سجل VIMSpector ، فاستخدم :VimspectorToggleLog
، والذي سيؤدي إلى ذنبه في نافذة صغيرة (لا يعمل على Windows).
يمكنك رؤية بعض معلومات تصحيح الأخطاء مع :VimspectorDebugInfo
لإغلاق مصحح الأخطاء ، استخدم:
Reset
زر وينبار:VimspectorReset
عندما لا يتوفر Winbar.call vimspector#Reset()
إذا كان مصحح الأخطاء لا يزال قيد التشغيل عند التوقف أو إعادة ضبط ، فإن بعض محولات الأخطاء تسمح لك بتحديد ما يجب أن يحدث ذلك عند الانتهاء من التصحيح. عادةً ما يكون السلوك الافتراضي معقولًا ، وهذا ما يحدث معظم الوقت. هذه هي الإعدادات الافتراضية وفقًا لـ DAP:
تسمح لك بعض محولات التصحيح باختيار ما يجب القيام به عند الانفصال. إذا كنت ترغب في التحكم في هذا السلوك ، فاستخدم :VimspectorReset
أو اتصل vimspector#Reset( { 'interactive': v:true } )
. إذا كان محول التصحيح يوفر خيارًا حول ما إذا كان سيتم إنهاء التصحيح أم لا ، فسيتم مطالبتك بالاختيار. وينطبق الشيء نفسه على vimspector#Stop()
الذي يمكن أن يأخذ وسيطة: vimspector#Stop( { 'interactive': v:true } )
.
ملاحظة : هذه الميزة تجريبية وقد يتغير أي جزء منها استجابةً لتعليقات المستخدمين.
يدعم VimSpector بدء عدد تعسفي من جلسات التصحيح. ترتبط كل جلسة بعلامة واجهة المستخدم الفردية. عادةً ، يمكنك تصحيح تطبيق واحد فقط ، وبالتالي لا تحتاج إلى التفكير في هذا الأمر ، ولكن يمكن أن تكون هذه الميزة المتقدمة مفيدة إذا كنت بحاجة إلى تصحيح تطبيقات متعددة أو مستقلة أو مثيلات مستقلة متعددة في وقت واحد.
في أي وقت توجد جلسة جذر "نشطة" واحدة. ترتبط نقاط التوقف بالجلسة الحالية ، ويتم تطبيق جميع أوامر واجهة المستخدم و API على الجلسة النشطة حاليًا.
عند التبديل بين جلسات الجذر ، تتم إزالة علامات BreakPont للجلسة السابقة ويتم عرض نقاط التوقف للجلسة التي تم تنشيطها حديثًا. على الرغم من أنه قد يكون من المفيد رؤية نقاط التوقف لجميع الجلسات ، إلا أن هذا قد يكون مربكًا للغاية.
قد يكون سير العمل النموذجي:
:edit server.cc
ثم <F5>
). هذا يبدأ جلسة تصحيح سميت على بعد التكوين المحدد. يمكنك إعادة تسميته :VimspectorRenameSession server
.:tabedit client.cc
)client
:: :VimspectorNewSession client
( client
هو الآن الجلسة النشطة).client
وابدأ تصحيح الأخطاء مع <F5>
. لديك الآن 2 علامات تبويب VimSpector. بشكل حدسي ، فإن 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
، ألق نظرة على قسم البدء في موقع VimSpector.
للحصول على شرح كامل ، بما في ذلك كيفية استخدام المتغيرات والبدائل وكيفية تحديد نقاط توقف الاستثناء ، راجع المستندات.
يسمح ملف تكوين 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: تم تمكين الطباعة الجميلة افتراضيًا
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 كيفية إرفاق CPPTools على 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
في جنون VSCODE JavaScript ، لذلك لا يتم دعمه."request": custom
؛ انظر النقطة حول الإطلاق "المخصص" أعلاهstep-into
في وظائف المكتبة القياسية) عن طريق إضافة "sourceMap": { "from_path" : "to_path" }
. يمكن العثور على "from_path"
في نافذة التفكيك عن طريق الصعود في تتبع المكدس ؛ "to_path"
هو مجرد مسار المكتبة القياسي المثبت محليًا لـ CHART TALLCHAIN. جاي تصحيح الأخطاء يعمل بشكل جيد مع أي من أصحاب الأخطاء الأصليين الآخرين. أوصي 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}"
}
}
}
}
بيثون: Debugpy
تثبيت مع install_gadget.py --enable-python
أو :VimspectorInstall debugpy
، يتطلب بشكل مثالي مترجمًا عملًا و Python Development Headers/Libs لبناء امتداد 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
. راجع وثائق التصحيح للحصول على التفاصيل.{
"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 Defer
{
"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
: (سلسلة) وسيطات سطر الأوامر الإضافية لتمريرها إلى الخوضيتم إطلاق مصحح الأخطاء (Delve) في نافذة طرفية بحيث يمكنك رؤية إخراجها ونقل المدخلات إلى Debuggee.
راجع مستندات VSCODE-GO للحصول على خيارات الإطلاق الكاملة. نعم ، يبدو أن هذا هو المكان الوحيد الذي تم توثيقه (على ما يبدو ، لم يتم توثيقهم عن طريق Defevelf).
تحتوي مستندات 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"
أو استخدم امتداد XDebug Helper المذكور مسبقًا (الذي يضع ملف تعريف XDEBUG_SESSION
)
export XDEBUG_CONFIG= " idekey=xdebug "
php < path to script >
هذا يستخدم VSCODE-JS-DEBUG ، مصحح الأخطاء المستخدمة في VSCODE أيضًا. للحصول على تكوينات إضافية ، تحقق من الوثائق هنا.
لتثبيت VSCODE-JS-DEBUG ، قم بتشغيل VimspectorInstall vscode-js-debug
من VIM أو قم بتشغيل برنامج Install install_gadget.py --force-enable-node
. هناك أمثلة متعددة يمكنك التحقق منها. ابحث عنها ضمن support/test/node/simple
، support/test/node/multiprocess
ودعم support/test/node/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
للأسف ، ولكن يتم تعريف القيم الصحيحة هنا في تعداد Debugtype.
تم اختبار vimspector فقط مع نوع pwa-node
.
لاحظ أيضًا أن محول التصحيح هذا لسبب ما يجبرنا دائمًا على بدء جلسات تصحيح متعددة. بالنسبة للمستخدم ، لا ينبغي أن يغير ذلك أي شيء (بخلاف ربما تتبع مكدس مربك قليلاً). لكنه يجعل الأمور أكثر تعقيدًا ، وبالتالي قد يكون هناك حشرات خفية.
هذا يستخدم تصحيح تصحيح Chrome/Firefox (فهي متشابهة جدًا) ، انظر https://marketplace.visualstudio.com/items؟itemname=msjsdiag.debugger-for-chrome و https://marketplace.visualstudio.com/items؟itemname = 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 ، الذي يعمل كمساعد JDT.LS (Java Language Server) ، بدلاً من محول التصحيح المستقل.
لا يعمل VIMSpector في مجال تشغيل خوادم اللغة ، بل فقط محولات تصحيح الأخطاء ، وهذا يعني أنك تحتاج إلى مكون إضافي محرر لبروتوكول خادم اللغة المتوافق لاستخدام Java. أوصي YouCompleteme ، الذي يحظى بدعم كامل لـ JDT.LS ، والأهم من ذلك وسيلة تافهة لتحميل محول التصحيح واستخدامه مع VimSpector.
عند استخدام خادم Java Debug ، يدعم 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 من خلال LUCAL-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} " ]
}
}
}
}
هناك دعم محدود للغاية لتخصيص واجهة المستخدم.
يستخدم Vimsector العلامات التالية داخليًا. إذا تم تعريفها قبل أن يستخدمها Vimsector ، فلن يتم استبدالها. لذلك لتخصيص العلامات ، حددها في 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 أولوية واحدة فقط لتحديد العلامة التي يجب عرضها عند وضع علامات متعددة في سطر واحد. إذا كنت تجد أن العلامات الأخرى تتداخل مع VIMSpector (أو العكس) ، فيمكنك تخصيص الأولوية المستخدمة من قبل 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
.
يتم دعم المفاتيح التالية مع مجموعة أبرز السداد المذكورة.
مجموعة | مفتاح | الاستخدام | تقصير |
---|---|---|---|
الجميع | 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
والتي سيتم استخدامها إذا تم توفيرها بواسطة محول التصحيح.
مثال سخيف ؛ من المحتمل أن تكون الإعدادات الافتراضية على ما يرام بالنسبة لمعظم scehemes الملونة:
let g: vimspector_presentation_hint_hl = {
' normal ' : ' Identifier ' ,
' label ' : ' Title ' ,
}
يرجى ملاحظة : واجهة برمجة تطبيقات التخصيص هذه غير مستقرة ، مما يعني أنه قد يتغير في أي وقت. سأسعى لتقليل تأثير هذا وإعلان التغييرات في Gitter.
تتحكم الخيارات التالية في الأحجام الافتراضية لنوافذ واجهة المستخدم (جميعها أرقام)
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 don't need to. 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 " : " "
}
}
} }