สำหรับบทช่วยสอนและภาพรวมการใช้งาน โปรดดูที่เว็บไซต์ Vimspector
สำหรับคำอธิบายโดยละเอียดเกี่ยวกับรูปแบบ .vimspector.json
โปรดดูคู่มืออ้างอิง
ปลั๊กอินนี้เป็นดีบักเกอร์กราฟิก Vim ที่มีความสามารถสำหรับหลายภาษา ส่วนใหญ่จะทดสอบสำหรับ C ++, Python และ TCL แต่ในทางทฤษฎีรองรับภาษาใด ๆ ที่ Visual Studio Code รองรับ (แต่ดูคำเตือน)
เว็บไซต์ Vimspector มีภาพรวมของ UI พร้อมด้วยคำแนะนำพื้นฐานสำหรับการกำหนดค่าและการตั้งค่า
แต่สำหรับตอนนี้ นี่คือภาพหน้าจอ (ค่อนข้างเก่า) ของการดีบัก Vimspector Vim:
และการสาธิตสั้นๆ สองสามรายการ:
<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 | ทีซีแอลโปร | ทีซีแอล 8.5 |
บอร์น เชลล์ | รองรับ | --all หรือ --enable-bash | vscode-bash-debug.php | ทุบตีวี?? |
ลัวะ | ผ่านการทดสอบแล้ว | --all หรือ --enable-lua | local-lua-debugger-vscode.php | โหนด >=12.13.0, Npm, ล่าม Lua |
โหนด js | รองรับ | --force-enable-node | vscode-js-debug.php? | โหนด >= 18 |
จาวาสคริปต์ | รองรับ | --force-enable-chrome | ดีบักเกอร์สำหรับ Chrome | โครเมียม |
จาวาสคริปต์ | รองรับ | --force-enable-firefox | vscode-firefox-debug | ไฟร์ฟอกซ์ |
ชวา | รองรับ | --force-enable-java | vscode-java-debug.php | ปลั๊กอิน LSP ที่เข้ากันได้ (ดูภายหลัง) |
PHP | การทดลอง | --force-enable-php | vscode-php-debug.php | โหนด, 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 กับภาษาที่ไม่ใช่ "ในตัว" โปรดดูหน้าวิกินี้
มีวิธีการติดตั้ง 2 วิธี:
: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
รวมถึง:
หากต้องการทดสอบหนึ่งในนั้น ให้ cd ไปที่ไดเร็กทอรีแล้วรัน:
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 เป็นไคลเอนต์ทั่วไปสำหรับ Debug Adapters อะแดปเตอร์แก้ไขข้อบกพร่อง (เรียกว่า 'แกดเจ็ต' หรือ 'อะแดปเตอร์') คือสิ่งที่ใช้งานได้จริงในการพูดคุยกับดีบักเกอร์ตัวจริง
เพื่อให้ Vimspector มีประโยชน์ คุณต้องติดตั้งอะแดปเตอร์บางตัว
มีสองสามวิธีในการดำเนินการนี้:
:VimspectorInstall <adapter> <args...>
(ใช้ TAB wildmenu
เพื่อดูตัวเลือก และยอมรับตัวเลือก install_gadget.py
ใดๆ ด้วย)python3 install_gadget.py <args>
(ใช้ --help
เพื่อดูตัวเลือกทั้งหมด):VimspectorUpdate
เพื่อติดตั้ง Gadget เวอร์ชันล่าสุดที่รองรับนี่คือการสาธิตการติดตั้งและอัปเกรดบางส่วน:
ทั้ง 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 (ซึ่งจะมีประโยชน์หากคุณมีแกดเจ็ตที่กำหนดเองหรือการกำหนดค่าส่วนกลาง) คุณสามารถบอกให้ผู้ติดตั้งใช้ baseir อื่น จากนั้นตั้งค่า 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}
สิ่งนี้มีประโยชน์สำหรับการกำหนดค่าบรรทัดคำสั่งของ Gadget
โดยที่ 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 "
}
}
}
ไฟล์ Gadget จะถูกเขียนโดยอัตโนมัติโดย install_gadget.py
(หรือ :VimspectorInstall
)
Vimspector จะโหลดไฟล์ใด ๆ ที่ตรงกัน: </path/to/vimspector>/gadgets/<os>/.gadgets.d/*.json
สิ่งเหล่านี้มีรูปแบบเดียวกับ .gadgets.json
แต่จะไม่ถูกเขียนทับเมื่อรัน install_gadget.py
หลังจากอัปเดตโค้ด Vimspector (ไม่ว่าจะผ่าน git pull
หรือตัวจัดการแพ็คเกจใดก็ตาม) ให้รัน :VimspectorUpdate
เพื่ออัปเดตอุปกรณ์ที่ติดตั้งไว้แล้ว
แรงจูงใจคือการดีบักใน Vim นั้นเป็นประสบการณ์ที่แย่มาก โดยเฉพาะอย่างยิ่งหากคุณใช้หลายภาษา ด้วย pyclewn no more และปลั๊กอิน termdebug ในตัวที่จำกัดอยู่ที่ gdb ฉันต้องการสำรวจตัวเลือกต่างๆ
แม้ว่า Language Server Protocol จะเป็นที่รู้จักกันดี แต่ Debug Adapter Protocol ก็ยังเป็นที่รู้จักน้อย แต่บรรลุเป้าหมายที่คล้ายกัน: API ที่ไม่เชื่อเรื่องภาษาซึ่งแยกตัวดีบักเกอร์จากไคลเอนต์
จุดมุ่งหมายของโปรเจ็กต์นี้คือ เพื่อมอบประสบการณ์การดีบักที่เรียบง่ายแต่มีประสิทธิภาพใน Vim สำหรับหลายภาษา โดยการใช้ประโยชน์จากอะแดปเตอร์ดีบักที่สร้างขึ้นสำหรับ Visual Studio Code
ความสามารถในการทำการดีบักแบบรีโมตเป็นสิ่งจำเป็น นี่คือกุญแจสำคัญในขั้นตอนการทำงานของฉัน ดังนั้นการเข้าสู่ประสบการณ์การแก้ไขจุดบกพร่องจึงเป็นเป้าหมายสูงสุดสำหรับโปรเจ็กต์ ดังนั้น vimspector จึงได้รับการสนับสนุนระดับเฟิร์สคลาสสำหรับการรันโปรแกรมจากระยะไกลและแนบไปกับโปรแกรมเหล่านั้น การสนับสนุนนี้มีลักษณะเฉพาะสำหรับ vimspector และนอกเหนือจาก (เสริมกับ) การสนับสนุนดังกล่าวในอะแดปเตอร์ดีบักจริง
Vimspector เป็น vim UI ที่อยู่ด้านบนของ Debug Adapter Protocol มีวัตถุประสงค์เพื่อให้อยู่ในระดับสูงและสะดวกสบายสำหรับงานแก้ไขข้อบกพร่องในแต่ละวัน
Vimspector ไม่ใช่:
Vimspector อยู่ในระหว่างดำเนินการ และยินดีรับข้อเสนอแนะ/การสนับสนุนใดๆ
สามารถดู Backlog ได้บน Trello
ขณะนี้ปลั๊กอินอยู่ ระหว่างการทดลอง นั่นหมายความว่าส่วนใดส่วนหนึ่งสามารถ (และอาจจะ) เปลี่ยนแปลงได้ รวมถึงสิ่งต่างๆ เช่น:
อย่างไรก็ตาม ฉันมุ่งมั่นที่จะทำเช่นนี้เฉพาะในกรณีที่ร้ายแรงที่สุดเท่านั้น และจะประกาศการเปลี่ยนแปลงดังกล่าวใน Gitter ล่วงหน้า ไม่มีอะไรน่ารำคาญไปกว่าสิ่งที่เพิ่งทำลายคุณ ฉันเข้าใจแล้ว
ข้อความจากผู้เขียนเกี่ยวกับแรงจูงใจสำหรับปลั๊กอินนี้:
สภาพแวดล้อมการพัฒนาจำนวนมากมีดีบักเกอร์ในตัว ฉันใช้เวลามากเกินไปกับ Vim ฉันทำการพัฒนาทั้งหมดของฉันใน Vim และฉันได้ปรับแต่งเวิร์กโฟลว์ของฉันสำหรับโค้ดอาคาร การรันการทดสอบ ฯลฯ
เป็นเวลาหลายปีที่ฉันสังเกตตัวเอง เพื่อนและเพื่อนร่วมงานเขียนคำสั่ง
printf
,puts
,ฉันเชื่ออย่างแท้จริงว่าสภาพแวดล้อมการดีบักแบบกราฟิกเชิงโต้ตอบเป็นวิธีที่ดีที่สุดในการทำความเข้าใจและให้เหตุผลเกี่ยวกับโค้ดที่ไม่คุ้นเคยและคุ้นเคย และการไม่มีการเข้าถึงดีบักเกอร์ที่พร้อมและง่ายดายนั้นเป็นช่องโหว่ขนาดใหญ่ที่ซ่อนอยู่สำหรับหลาย ๆ คน
อย่าเข้าใจฉันผิด ฉันรู้ว่ามีนักพัฒนาหลายล้านคนที่มีความสามารถมากกว่าในการพัฒนาโดยไม่ต้องใช้ดีบักเกอร์กราฟิก แต่ฉันยืนยันว่าหากพวกเขาสามารถ เพียงกดปุ่ม และกระโดดเข้าสู่ดีบักเกอร์ได้ จะเร็วและสนุกกว่าแค่เข้าใจโค้ดสมอง
ฉันสร้าง Vimspector เพราะฉันพบว่าการเปลี่ยนแปลงเครื่องมือน่าหงุดหงิด
gdb
สำหรับ c++,pdb
สำหรับ python ฯลฯ แต่ละอันมีไวยากรณ์ของตัวเอง แต่ละศัพท์ของตัวเอง ข้อบกพร่องของแต่ละคนฉันออกแบบระบบการกำหนดค่าในลักษณะที่สามารถกำหนดการกำหนดค่าให้กับการควบคุมแหล่งที่มา เพื่อให้ ใช้งานได้ กับเพื่อนร่วมงาน เพื่อน ผู้ทำงานร่วมกัน หรือคนแปลกหน้าโดยสิ้นเชิง
ฉันทำให้การแก้ไขข้อบกพร่องแบบรีโมตเป็นคุณสมบัติชั้นหนึ่งเพราะนั่นเป็นกรณีการใช้งานหลักสำหรับฉันในงานของฉัน
ด้วย Vimspector ฉันสามารถ กด
<F5>
ในทุกภาษาที่ฉันพัฒนาและแก้ไขข้อบกพร่องในเครื่องหรือจากระยะไกลโดยใช้เวิร์กโฟลว์ การแมป และ UI เดียวกันทุกประการ ฉันได้รวมสิ่งนี้เข้ากับ 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 | เลื่อนเฟรมขึ้นไปใน call stack ปัจจุบัน | vimspector#UpFrame() |
<Plug>VimspectorDownFrame | เลื่อนลงมาหนึ่งเฟรมใน call stack ปัจจุบัน | 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-keys อาจไม่ทำงาน ขึ้นอยู่กับเทอร์มินัล คีย์บอร์ด ระบบหน้าต่าง และสิ่งอื่น ๆ ทุกประเภท ดู :help modifyOtherKeys
และแหล่งข้อมูลอื่น ๆ หากคุณไม่สามารถทำงานได้ เพียงใช้การแมป "โหมดมนุษย์"
เช่นฉัน ถ้าคุณมีเพียง 2 มือและ 10 นิ้ว คุณอาจไม่ชอบปุ่ม Ctrl-Shift-F นอกจากนี้ หากคุณใช้งานเทอร์มินัล มีความเป็นไปได้จริงที่คำศัพท์จะผิดสำหรับ shift-F-keys โดยเฉพาะอย่างยิ่งหาก 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 (ID กระบวนการ) ที่จะแนบ
เพื่อให้ง่ายขึ้น 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 จะ ไม่ แจ้งให้ผู้ใช้ป้อนหรือยืนยันสิ่งเหล่านี้
ดูคู่มือการรวม 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}
จะชี้ไปที่โฟลเดอร์หลักของไฟล์ที่เปิดอยู่ในกลุ่มปัจจุบัน
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 ไม่ได้บอกคุณว่าดีบักเกอร์ไม่รองรับเบรกพอยต์แบบมีเงื่อนไขหรือไม่ (ยัง) เบรกพอยต์แบบมีเงื่อนไขคือเบรกพอยต์ซึ่งจะทริกเกอร์เฉพาะเมื่อนิพจน์บางตัวประเมินว่าเป็นจริง หรือเป็นไปตามข้อจำกัดอื่นๆ
ฟังก์ชันบางส่วนข้างต้นใช้อาร์กิวเมนต์ทางเลือกเพียงตัวเดียวซึ่งเป็นพจนานุกรมของตัวเลือก พจนานุกรมสามารถมีคีย์ต่อไปนี้:
condition
: นิพจน์ทางเลือกที่ได้รับการประเมินเพื่อพิจารณาว่าเบรกพอยต์ควรเริ่มทำงานหรือไม่ ไม่รองรับอะแด็ปเตอร์ดีบักทั้งหมด ตัวอย่างเช่น หากต้องการแยกเมื่อ abc
เป็น 10
ให้ป้อนข้อความเช่น abc == 10
ขึ้นอยู่กับภาษาhitCondition
: นิพจน์ทางเลือกที่ได้รับการประเมินเพื่อกำหนดจำนวนครั้งที่ควรละเว้นเบรกพอยต์ ไม่ควร (อาจจะ?) ใช้ร่วมกับ condition
ไม่รองรับอะแด็ปเตอร์ดีบักทั้งหมด ตัวอย่างเช่น หากต้องการหยุดในครั้งที่ 3 กดปุ่มนี้ ให้ป้อน 3
logMessage
: สตริงทางเลือกเพื่อทำให้เบรกพอยต์นี้เป็น "logpoint" แทน เมื่อทริกเกอร์ ข้อความนี้จะถูกพิมพ์ไปยังคอนโซล แทนที่จะขัดจังหวะการดำเนินการ คุณสามารถฝังนิพจน์ในวงเล็บปีกกา {like this}
ได้ เช่น #{ logMessage: "Iteration {i} or {num_entries / 2}" }
ในแต่ละกรณี นิพจน์จะถูกประเมินโดยดีบักเกอร์ ดังนั้นควรเป็นภาษาถิ่นใดก็ตามที่ดีบักเกอร์เข้าใจเมื่อประเมินนิพจน์
เมื่อใช้การแมป <leader><F9>
ผู้ใช้จะได้รับแจ้งให้ป้อนนิพจน์เหล่านี้ในบรรทัดคำสั่ง (พร้อมประวัติ)
โดยทั่วไปจุดพักข้อยกเว้นจะเริ่มทำงานเมื่อมีข้อยกเว้นเกิดขึ้นหรือมีเงื่อนไขข้อผิดพลาดอื่นๆ เกิดขึ้น คุณอาจถูกถามคำถามสองสามข้อเกี่ยวกับวิธีการจัดการกับข้อยกเว้น ทั้งนี้ขึ้นอยู่กับดีบักเกอร์ สิ่งเหล่านี้คือ "จุดพักข้อยกเว้น" และ vimspector จะจดจำตัวเลือกของคุณในขณะที่ Vim ยังคงทำงานอยู่
โดยทั่วไปคุณสามารถยอมรับค่าเริ่มต้นได้ (เพียงแค่กด <CR>
ต่อไป !) เนื่องจากค่าเริ่มต้นของอะแดปเตอร์ดีบักส่วนใหญ่นั้นสมเหตุสมผล แต่ถ้าคุณต้องการหยุดทำงาน ให้พูด uncaught exception
จากนั้นตอบ Y
สำหรับสิ่งนั้น (ตัวอย่าง)
คุณสามารถกำหนดค่าตัวเลือกของคุณได้ใน .vimspector.json
ดูคู่มือการกำหนดค่าสำหรับรายละเอียดเกี่ยวกับเรื่องนั้น
หมายเหตุ: ก่อนหน้านี้ ToggleBreakpoint จะหมุนเวียนระหว่าง 3 สถานะ: เปิดใช้งาน ปิดใช้งาน ลบ ผู้ใช้หลายคนพบว่าสถานะ 'ปิดใช้งาน' ไม่ค่อยมีประโยชน์ ดังนั้นพฤติกรรมจึงเปลี่ยนไป 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
Autocommands ขอแนะนำในกรณีนั้นให้ใช้ 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>
(ควบคุม + <CR>
) หรือ <leader><CR>
(ถ้า modifyOtherKeys
ไม่ทำงานสำหรับคุณ) ขอบเขตและตัวแปรแสดงโดยบัฟเฟอร์ vimspector.Variables
หากคุณต้องการการแสดงผล verbose มากขึ้นสำหรับตัวแปรและนาฬิกาคุณสามารถ let g:vimspector_variables_display_mode = 'full'
โดยค่าเริ่มต้นเฉพาะชื่อและค่าจะปรากฏขึ้นพร้อมกับข้อมูลอื่น ๆ ที่มีอยู่จากการวางเมาส์หรือทริกเกอร์ <Plug>VimspectorBalloonEval
บนบรรทัดที่มีค่าในหน้าต่างตัวแปร (หรือนาฬิกา)
กฎทั้งหมดสำหรับ Variables and scopes
มีผลบวกต่อไปนี้:
a + b
) และรับผลลัพธ์nmap
) และโหมด Visual ( xmap
) ไปยัง <Plug>VimspectorBalloonEval
เพื่อกระตุ้นป๊อปอัพด้วยตนเอง<C-CR>
(ควบคุม + <CR>
) หรือ <leader><CR>
(ถ้า modifyOtherKeys
ไม่ทำงานสำหรับคุณ)j
, k
) เพื่อเลือกการเลือกปัจจุบัน <Esc>
(หรือออกจากหน้าต่างคำแนะนำเครื่องมือ) เพื่อปิดคำแนะนำเครื่องมือ คุณสามารถปิดใช้งานป๊อปอัปโฮวีตโดยอัตโนมัติโดยการตั้งค่า g:vimspector_enable_auto_hover=0
ก่อนเริ่มการดีบักเซสชัน จากนั้นคุณสามารถแมปบางสิ่งบางอย่างกับ <Plug>VimspectorBalloonEval
และเรียกใช้ด้วยตนเอง
หน้าต่างนาฬิกาใช้เพื่อตรวจสอบตัวแปรและนิพจน์ การแสดงออกจะถูกประเมินในเฟรมสแต็กที่เลือกซึ่งเป็น "เพ่งความสนใจ"
หน้าต่างนาฬิกาเป็นบัฟเฟอร์ที่พร้อมใช้งานที่มีอยู่ ป้อนโหมดแทรกเพื่อเพิ่มนิพจน์นาฬิกาใหม่
<CR>
:VimspectorWatch <expression>
การเติมเต็มแท็บสำหรับนิพจน์มีอยู่ในอะแดปเตอร์ดีบั๊กบางตัว<CR>
หรือดับเบิลคลิกด้วยเมาส์ซ้าย<C-CR>
(ควบคุม + <CR>
) หรือ <leader><CR>
(ถ้า modifyOtherKeys
ไม่ทำงานสำหรับคุณ)<DEL>
นาฬิกาแสดงโดยบัฟเฟอร์ vimspector.Watches
หากคุณต้องการการแสดงผล verbose มากขึ้นสำหรับตัวแปรและนาฬิกาคุณสามารถ let g:vimspector_variables_display_mode = 'full'
โดยค่าเริ่มต้นเฉพาะชื่อและค่าจะปรากฏขึ้นพร้อมกับข้อมูลอื่น ๆ ที่มีอยู่จากการวางเมาส์หรือทริกเกอร์ <Plug>VimspectorBalloonEval
บนบรรทัดที่มีค่าในหน้าต่างตัวแปร (หรือนาฬิกา)
คุณสามารถปิดใช้งานป๊อปอัปโฮวีตโดยอัตโนมัติโดยการตั้งค่า g:vimspector_enable_auto_hover=0
ก่อนเริ่มการดีบักเซสชัน จากนั้นคุณสามารถแมปบางสิ่งบางอย่างกับ <Plug>VimspectorBalloonEval
และเรียกใช้ด้วยตนเอง
บัฟเฟอร์ Watch Prompt มีการตั้งค่า omnifunc
เป็นฟังก์ชั่นที่จะคำนวณความสมบูรณ์สำหรับนิพจน์ปัจจุบัน สิ่งนี้ใช้กับ <Ctrl-x><Ctrl-o>
เล็กน้อย (ดู :help ins-completion
) หรือรวมเข้ากับระบบความสำเร็จที่คุณชื่นชอบ FileType ในบัฟเฟอร์ถูกตั้งค่าเป็น VimspectorPrompt
สำหรับ YouCompleTeme การกำหนดค่าต่อไปนี้ใช้งานได้ดี:
let g: ycm_semantic_triggers = {
' VimspectorPrompt ' : [ ' . ' , ' -> ' , ' : ' , ' < ' ]
}
:VimspectorDisassemble
, vimspector#ShowDisassembly()
หรือ <Plug>VimspectorDisassemble
อะแดปเตอร์ดีบั๊กบางตัว (ไม่กี่!) รองรับการถอดประกอบ วิธีการทำงานใน DAP นั้นค่อนข้างแปลก แต่ในทางปฏิบัติ VIMSPECTOR จะขอให้แยกชิ้นส่วนคำแนะนำมากมายเกี่ยวกับพีซีของสแต็กเฟรมปัจจุบัน สิ่งนี้จะแสดงในหน้าต่างที่มีวินบาร์คล้ายกับหน้าต่างรหัส แต่ด้วยคำแนะนำที่ก้าวเป็นเม็ดเล็ก มีเครื่องหมายสำหรับคำสั่งปัจจุบันและค่าเริ่มต้นของการยกระดับไวยากรณ์เป็น "ASM" ซึ่งส่วนใหญ่ใช้งานได้สำหรับ x86 และแขน
ดังที่ได้กล่าวไว้ข้างต้นเมื่อหน้าต่างปัจจุบันของคุณเป็นหน้าต่างถอดชิ้นส่วนและคุณใช้คำสั่ง "ขั้นตอน" เริ่มต้น (เช่น <F10>
) การก้าวจะถูก chnged โดยอัตโนมัติต่อการสอนมากกว่าต่อคำสั่ง
ทุกครั้งที่กระบวนการหยุดลง VIMSPECTOR ร้องขอประมาณ 2 หน้าต่างที่เต็มไปด้วยคำแนะนำเกี่ยวกับพีซีปัจจุบัน หากต้องการดูเพิ่มเติมคุณสามารถเลื่อนหน้าต่างได้ VIMSPECTOR จะอยู่ในหน้าจอพิเศษของคำแนะนำเมื่อหน้าต่างเลื่อนไปด้านบนหรือด้านล่าง นี่ไม่สมบูรณ์แบบ บางครั้งคุณต้องเลื่อนอีกเล็กน้อยเพื่อให้หน้าใน (เช่น Ctrl-e ctrl-y ที่ด้านบน) สิ่งนี้ไม่เหมาะและอาจได้รับการปรับปรุงในอนาคต
คุณสามารถควบคุมความสูงของหน้าต่างถอดชิ้นส่วนได้ด้วย let g:vimspector_disassembly_height = 10
(หรือจำนวนเส้นอะไร)
fileType (และไวยากรณ์) ของบัฟเฟอร์ในหน้าต่างถอดชิ้นส่วนคือ vimspector-disassembly
คุณสามารถใช้ AutoCommands FileType
เพื่อปรับแต่งสิ่งต่าง ๆ เช่นการไฮไลต์ไวยากรณ์
หมายเหตุ : คุณลักษณะนี้เป็นการทดลองและอาจเปลี่ยนแปลงในทางใดทางหนึ่งตามความคิดเห็นของผู้ใช้
อะแดปเตอร์ดีบั๊กบางตัวมีวิธีการทิ้งหน่วยความจำกระบวนการที่เกี่ยวข้องกับตัวแปร สามารถทำได้จากตัวแปรและนาฬิกาหน้าต่างด้วย:
<leader>m
(โดยค่าเริ่มต้นสามารถปรับแต่งได้)vimspector#ReadMemory()
ฟังก์ชั่น ในการทำเช่นนี้คุณขอให้ป้อนจำนวนไบต์เพื่ออ่าน (จากตำแหน่งที่เกี่ยวข้องกับสายเคอร์เซอร์ปัจจุบัน) และชดเชยจากตำแหน่งนั้น บัฟเฟอร์ใหม่จะแสดงในหน้าต่างรหัสที่มีการถ่ายโอนข้อมูลหน่วยความจำใน Hex และ ASCII คล้ายกับเอาต์พุตของ xxd
หมายเหตุ : คุณลักษณะนี้เป็นการทดลองและอาจเปลี่ยนแปลงในทางใดทางหนึ่งตามความคิดเห็นของผู้ใช้
หน้าต่างร่องรอยสแต็กแสดงสถานะของแต่ละเธรดโปรแกรม เธรดที่หยุดสามารถขยายได้เพื่อแสดงร่องรอยสแต็กของเธรดนั้น
บ่อยครั้ง แต่ไม่เสมอไปเธรดทั้งหมดจะหยุดลงเมื่อจุดพักถูกตี สถานะของเธรดจะแสดงในวงเล็บหลังจากชื่อเธรด ในกรณีที่ได้รับการสนับสนุนจากดีบักเกอร์พื้นฐานเธรดสามารถหยุดชั่วคราวและดำเนินการต่อจากภายในหน้าต่างร่องรอยสแต็ก
เธรดเฉพาะที่เน้นด้วยกลุ่มไฮไลท์เคอร์ CursorLine
คือเธรด "เพ่งความสนใจ" นี่คือเธรดที่ได้รับคำสั่งเช่น "ขั้นตอนใน", "ก้าวออก", "ดำเนินการต่อ" และ "หยุด" ในหน้าต่างรหัส เธรดที่เพ่งความสนใจสามารถเปลี่ยนแปลงได้ด้วยตนเองเป็น "สลับไปที่" เธรดนั้น
<CR>
หรือดับเบิลคลิกด้วยเมาส์ซ้ายเพื่อขยาย/ยุบร่องรอยสแต็กเธรดหรือใช้ปุ่ม Winbar<CR>
หรือดับเบิลคลิกด้วยเมาส์ซ้ายบนเฟรมสแต็กเพื่อข้ามไปvimspector#PauseContinueThread()
เพื่อหยุดชั่วคราวหรือดำเนินการต่อเธรดที่เลือก<leader><CR>
หรือ vimspector#SetCurrentThread()
เพื่อตั้งค่าเธรด "เพ่งความสนใจ" เป็นปุ่มที่เลือกในปัจจุบัน หากเส้นที่เลือกเป็นเฟรมสแต็กให้ตั้งเธรดโฟกัสเป็นเธรดของเฟรมนั้นและข้ามไปที่เฟรมนั้นในหน้าต่างรหัส การติดตามสแต็กแสดงโดยบัฟเฟอร์ vimspector.StackTrace
หากมีเซสชันการดีบักเด็กเช่นที่ Debugee เปิดตัวกระบวนการเด็กและอะแดปเตอร์ดีบั๊กรองรับการดีบักหลายเซสชันแล้วเธรดของแต่ละเซสชันจะแสดงแยกต่างหาก เซสชั่นที่ใช้งานอยู่ในปัจจุบันเป็นช่วงเวลาที่เน้นเป็นเฟรมเธรด/สแต็กที่ใช้งานอยู่ในปัจจุบัน หากต้องการสลับการควบคุมเป็นเซสชันที่แตกต่างให้โฟกัสเธรดภายในเซสชันนั้น
หมายเหตุ: นี่หมายถึงเซสชันที่สร้างขึ้นเป็นเด็กของเซสชันที่มีอยู่และไม่ต้องสับสนกับ [หลาย (ผู้ปกครอง) เซสชันการดีบัก] [#multiple-debugging-sessions]
: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
ปุ่ม Winbar:VimspectorReset
เมื่อไม่สามารถใช้วินบาร์ได้call vimspector#Reset()
หาก Debuggee ยังคงทำงานอยู่เมื่อหยุดหรือรีเซ็ตอะแดปเตอร์ดีบั๊กบางตัวช่วยให้คุณระบุสิ่งที่ควรเกิดขึ้นเมื่อเสร็จสิ้นการดีบัก โดยทั่วไปแล้วพฤติกรรมเริ่มต้นจะสมเหตุสมผลและนี่คือสิ่งที่เกิดขึ้นเกือบตลอดเวลา นี่คือค่าเริ่มต้นตาม DAP:
อะแดปเตอร์ดีบั๊กบางตัวอนุญาตให้คุณเลือกสิ่งที่ต้องทำเมื่อถอดการเชื่อมต่อ หากคุณต้องการควบคุมพฤติกรรมนี้ให้ใช้ :VimspectorReset
หรือโทร vimspector#Reset( { 'interactive': v:true } )
หากอะแดปเตอร์ดีบั๊กเสนอทางเลือกว่าจะยุติการดีบักหรือไม่คุณจะได้รับแจ้งให้เลือก เช่นเดียวกับ vimspector#Stop()
ซึ่งสามารถใช้อาร์กิวเมนต์: vimspector#Stop( { 'interactive': v:true } )
หมายเหตุ : คุณลักษณะนี้เป็นการ ทดลอง และส่วนใดส่วนหนึ่งของมันอาจเปลี่ยนแปลงในการตอบสนองต่อความคิดเห็นของผู้ใช้
Vimspector รองรับการเริ่มต้นการดีบักจำนวนมากโดยพลการ แต่ละเซสชันเกี่ยวข้องกับแท็บ UI แต่ละแท็บ โดยทั่วไปคุณจะดีบั๊กแอพเดียวเท่านั้นและไม่จำเป็นต้องคิดเกี่ยวกับเรื่องนี้ แต่คุณสมบัติขั้นสูงนี้จะมีประโยชน์หากคุณต้องการทำการดีบักแอปพลิเคชันอิสระหลายรายการพร้อมกันหรืออินสแตนซ์อิสระหลายรายการของแอปพลิเคชันของคุณ
เมื่อใดก็ตามที่มีเซสชันรูท "ใช้งาน" เดียว จุดพักเชื่อมโยงกับเซสชันปัจจุบันและคำสั่ง UI และ 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: เพื่อเปิดใช้งานเครื่องพิมพ์สวย ๆ ให้พิจารณาตัวอย่างด้านล่าง ไม่เพียงพอที่จะ 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 Madness ดังนั้นจึงไม่รองรับ"request": custom
; ดูจุดเกี่ยวกับการเปิดตัว "กำหนดเอง" ด้านบนstep-into
การใช้งานสำหรับฟังก์ชั่นไลบรารีมาตรฐาน) สามารถทำได้โดยการเพิ่ม "sourceMap": { "from_path" : "to_path" }
"from_path"
สามารถพบได้ในหน้าต่างถอดชิ้นส่วนโดยขึ้นไปในร่องรอยสแต็ก; "to_path"
เป็นเพียงเส้นทางไลบรารีมาตรฐานที่ติดตั้งไว้ในเครื่องสำหรับ Toolchain ปัจจุบัน Jai Debugging ทำงานได้ดีกับผู้เล่นพื้นเมืองคนอื่น ๆ ฉันแนะนำ 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
ต้องใช้คอมไพเลอร์ที่ใช้งานได้และส่วนหัวการพัฒนา Python/LIBs เพื่อสร้างส่วนขยาย C Python เพื่อประสิทธิภาพ
หมายเหตุ : Debugpy ไม่รองรับ Python 2 อีกต่อไปเพื่อที่จะทำการดีบักแอพพลิเคชั่น Python 2 ให้ใช้อะแดปเตอร์ debugpy-python2
หลังจากติดตั้ง Gadget 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 ให้แน่ใจว่าคุณติดตั้ง Gadget debugpy-python2
(เช่น --force-enable-python2
หรือ :VimspectorInstall debugpy-python2
) จากนั้นเปลี่ยนการกำหนดค่าของคุณเพื่อใช้:
{
"configurations" : {
"Python Attach" : {
"adapter" : " debugpy-python2 " ,
// ...
}
}
}
สำหรับการสอบ
ดูส้อมของฉันสำหรับคำแนะนำ
ติดตั้งด้วย 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
: (สตริง) อาร์กิวเมนต์บรรทัดคำสั่งเพิ่มเติมเพื่อส่งผ่านไปยัง delveดีบักเกอร์ (Delve) เปิดตัวในหน้าต่างเทอร์มินัลเพื่อให้คุณสามารถดูเอาต์พุตและส่งผ่านอินพุตไปยัง debuggee
ดูเอกสาร 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 ใช้อะแดปเตอร์ดีบั๊ก VSCODE-GO "Legacy" มากกว่าการสนับสนุน 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 ที่กล่าวถึงก่อนหน้านี้ (ซึ่งตั้งค่าคุกกี้ 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
ไม่น่าเศร้าที่บันทึกไว้ แต่ค่าที่ถูกต้องถูกกำหนดไว้ที่นี่ใน enum 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 Server ซึ่งทำงานเป็นปลั๊กอิน JDT.LS (Java Language Server) แทนที่จะเป็นอะแดปเตอร์ดีบั๊กแบบสแตนด์อโลน
Vimspector ไม่ได้อยู่ในธุรกิจของการใช้งานเซิร์ฟเวอร์ภาษามีเพียงอะแดปเตอร์ดีบั๊กดังนั้นหมายความว่าคุณต้องใช้ปลั๊กอินโปรแกรมแก้ไขโปรโตคอลเซิร์ฟเวอร์ภาษาที่เข้ากันได้เพื่อใช้ Java ฉันขอแนะนำ YoucompleTeMe ซึ่งได้รับการสนับสนุนอย่างเต็มที่สำหรับ JDT.LS และที่สำคัญที่สุดคือวิธีเล็กน้อยในการโหลดอะแดปเตอร์ดีบั๊กและใช้กับ Vimspector
เมื่อใช้เซิร์ฟเวอร์ Java Debug Vimspector จะรองรับคุณสมบัติ Hot Code แทนที่คุณลักษณะที่กำหนดเอง โดยค่าเริ่มต้นเมื่อไฟล์คลาสพื้นฐานเปลี่ยนไป 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
สำหรับอาร์กิวเมนต์การเปิดตัวดูเอกสาร VSCODE
ดูปัญหานี้สำหรับพื้นหลังเพิ่มเติม
Lua ได้รับการสนับสนุนผ่าน Local-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} " ]
}
}
}
}
มีการสนับสนุนที่ จำกัด มากสำหรับการปรับแต่ง UI
Vimsector ใช้สัญญาณต่อไปนี้ภายใน หากพวกเขาถูกกำหนดก่อนที่ Vimsector จะใช้พวกเขาจะไม่ถูกแทนที่ ดังนั้นในการปรับแต่งสัญญาณให้กำหนดไว้ใน vimrc
ของคุณ
เข้าสู่ระบบ | คำอธิบาย | ลำดับความสำคัญ |
---|---|---|
vimspectorBP | จุดพักสาย | 9 |
vimspectorBPCond | เบรกพอยต์สายเงื่อนไข | 9 |
vimspectorBPLog | จุดตัด | 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
เริ่มต้นไม่ได้เพิ่มข้อความใด ๆ ลงในคอลัมน์ Sign มันเพิ่มไฮไลต์บรรทัดเพื่อให้คุณสามารถดูบรรทัดที่เธรดหรือกระบวนการอื่น ๆ หยุดลงในขณะนี้ เป็นผลให้สัญญาณนี้ปกติควร รวมเข้า กับเครื่องหมายใด ๆ ที่เพิ่มสัญลักษณ์ (เช่นเครื่องหมายเบรกพอยต์) VIM จะรวมคุณสมบัติของสัญญาณที่มีลำดับความสำคัญเท่ากันเท่านั้นดังนั้นหากเปลี่ยนลำดับความสำคัญเริ่มต้นขอแนะนำว่า:
vimspectorBP
, vimspectorBPCond
ฯลฯ ) มีลำดับความสำคัญเหมือนกันvimspectorNonActivePC
ลำดับความสำคัญเดียวกันvimspectorPC
, vimspectorPCBP
ฯลฯ ) มีลำดับความสำคัญสูงกว่า หมายเหตุ: จุดปรับแต่งนี้ ไม่สามารถทำได้ และอาจเปลี่ยนแปลงได้ตลอดเวลา
บางครั้งอะแดปเตอร์ดีบักให้คำแนะนำว่า UI ควรแสดงบางสิ่ง ซึ่งรวมถึงเฟรมสแต็กตัวแปร ฯลฯ
VIMSPECTOR ให้วิธีง่ายๆในการปรับแต่งวิธีการแสดงเหล่านี้โดยการตั้งค่าในพจนานุกรม g:vimsepctor_presentation_hint_hl
คีย์ต่อไปนี้ได้รับการสนับสนุนด้วยกลุ่มไฮไลต์เริ่มต้นที่กล่าวถึง
กลุ่ม | สำคัญ | การใช้งาน | ค่าเริ่มต้น |
---|---|---|---|
ทั้งหมด | normal | สิ่งใดที่ไม่ครอบคลุมด้านล่าง | Normal |
สแต็คร่องรอย | emphasize | เน้นแหล่งที่มาในการติดตามสแต็ก | Title |
สแต็คร่องรอย | deemphasize | deemphasize แหล่งที่มาในการติดตามสแต็ก | Conceal |
สแต็คร่องรอย | label | เฟรมสแต็คซึ่งเป็น "ป้ายกำกับ" ไม่ได้แสดงเฟรมจริง | NonText |
สแต็คร่องรอย | subtle | เฟรมสแต็กที่อยู่ภายในหรือไม่น่าสนใจ | Conceal |
ขอบเขต | arguments | ขอบเขตของฟังก์ชั่นอาร์กิวเมนต์ | Title |
ขอบเขต | locals | ขอบเขตตัวแปรท้องถิ่น | Title |
ขอบเขต | registers | ขอบเขตการลงทะเบียน | Title |
ตัวแปร | property | ขอบเขตของฟังก์ชั่นอาร์กิวเมนต์ | Identifier |
ตัวแปร | method | ขอบเขตตัวแปรท้องถิ่น | Function |
ตัวแปร | class | ขอบเขตการลงทะเบียน | Type |
ตัวแปร | data | ขอบเขตการลงทะเบียน | String |
นอกจากนี้ค่าใด ๆ ที่ระบุใน VariablePresentationHint
DAP สามารถตั้งค่าได้ซึ่งจะถูกใช้งานหากจัดทำโดยอะแดปเตอร์ดีบั๊ก
ตัวอย่างโง่ ๆ ; ค่าเริ่มต้นน่าจะโอเคสำหรับ scehemes สีส่วนใหญ่:
let g: vimspector_presentation_hint_hl = {
' normal ' : ' Identifier ' ,
' label ' : ' Title ' ,
}
โปรดทราบ : API การปรับแต่งนี้ ไม่เสถียร ซึ่งหมายความว่าอาจเปลี่ยนแปลงได้ตลอดเวลา ฉันจะพยายามลดผลกระทบของสิ่งนี้และประกาศการเปลี่ยนแปลงใน Gitter
ตัวเลือกต่อไปนี้ควบคุมขนาดเริ่มต้นของหน้าต่าง UI (ทั้งหมดเป็นตัวเลข)
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 " : " "
}
}
} }