diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index f01a833..828ec18 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -57,6 +57,12 @@ discussing on Gitter rather than raising an issue.
* Version of Vimspector: (e.g. output of `git rev-parse HEAD` if cloned or the
name of the tarball used to install otherwise)
+* Output of `:VimspectorDebugInfo`
+
+```
+paste here
+```
+
* Output of `vim --version` or `nvim --version`
```
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 17f9601..f186f5d 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -13,7 +13,7 @@ defaults:
jobs:
PythonLint:
- runs-on: ubuntu-16.04
+ runs-on: ubuntu-18.04
container: 'puremourning/vimspector:test'
steps:
- uses: actions/checkout@v2
@@ -22,7 +22,7 @@ jobs:
- name: 'Run flake8'
run: '$HOME/.local/bin/flake8 python3/ *.py'
VimscriptLint:
- runs-on: 'ubuntu-16.04'
+ runs-on: 'ubuntu-18.04'
container: 'puremourning/vimspector:test'
steps:
- uses: actions/checkout@v2
@@ -32,7 +32,7 @@ jobs:
run: $HOME/.local/bin/vint autoload/ compiler/ plugin/ tests/ syntax/
Linux:
- runs-on: 'ubuntu-16.04'
+ runs-on: 'ubuntu-18.04'
container:
image: 'puremourning/vimspector:test'
options: --cap-add=SYS_PTRACE --security-opt seccomp=unconfined
@@ -111,6 +111,16 @@ jobs:
path: gadgets/macos/download
name: Cache gadgets
+ - name: 'Install .NET Core SDK 3.1'
+ uses: actions/setup-dotnet@v1.7.2
+ with:
+ dotnet-version: 3.1
+
+ - uses: maxim-lobanov/setup-xcode@v1
+ with:
+ xcode-version: ^11
+ name: "Switch to xcode 11 because of .NET debugging bug"
+
- run: vim --version
name: 'Print vim version information'
@@ -143,10 +153,10 @@ jobs:
# if: failure()
# with:
# NGROK_AUTH_TOKEN: ${{ secrets.NGROK_AUTH_TOKEN }}
- # SSH_PASS: ${{ secrets.SSH_PASS }}
+ # SSH_PASS: ${{ secrets.SSH_PASS }} # [V]imspector
PublishRelease:
- runs-on: 'ubuntu-16.04'
+ runs-on: 'ubuntu-18.04'
needs:
- Linux
- MacOS
diff --git a/.github/workflows/lock_old_issues.yaml b/.github/workflows/lock_old_issues.yaml
new file mode 100644
index 0000000..25d65e0
--- /dev/null
+++ b/.github/workflows/lock_old_issues.yaml
@@ -0,0 +1,27 @@
+name: "Lock Old Issues"
+
+on:
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+
+jobs:
+ lock:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: dessant/lock-threads@v2
+ with:
+ github-token: ${{ github.token }}
+ issue-lock-inactive-days: '60'
+ # issue-exclude-created-before: ''
+ # issue-exclude-labels: ''
+ # issue-lock-labels: ''
+ # issue-lock-comment: ''
+ # issue-lock-reason: 'resolved'
+ # pr-lock-inactive-days: '365'
+ # pr-exclude-created-before: ''
+ # pr-exclude-labels: ''
+ # pr-lock-labels: ''
+ # pr-lock-comment: ''
+ # pr-lock-reason: 'resolved'
+ process-only: 'issues'
diff --git a/.gitignore b/.gitignore
index 77f22a9..05dc8cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,4 @@ support/test/csharp/*.exe*
configurations/
venv/
test-base/
+tags
diff --git a/.mergify.yml b/.mergify.yml
index 09d3d83..0f02002 100644
--- a/.mergify.yml
+++ b/.mergify.yml
@@ -9,9 +9,8 @@ pull_request_rules:
# CI https://doc.mergify.io/conditions.html#github-actions
- status-success=PythonLint
- status-success=VimscriptLint
+ - status-success=Linux
- status-success=MacOS
-
-
actions: &merge-actions
merge:
method: merge
diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py
index f2e32ae..6f42505 100644
--- a/.ycm_extra_conf.py
+++ b/.ycm_extra_conf.py
@@ -42,7 +42,17 @@ def Settings( **kwargs ):
return {
'sys_path': [
p.join( PATH_TO_THIS_DIR, 'python3' )
- ]
+ ],
+ 'ls': {
+ 'python': {
+ 'analysis': {
+ 'extraPaths': [
+ p.join( PATH_TO_THIS_DIR, 'python3' ),
+ ],
+ 'useLibraryCodeForTypes': True
+ }
+ }
+ }
}
if IgnoreExtraConf:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 1866974..adec034 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -46,6 +46,23 @@ The GitHub issue tracker is for *bug reports* and *features requests* for the
Vimspector project, and on-topic comments and follow-ups to them. It is not for
general discussion, general support or for any other purpose.
+Please **search the issue tracker for similar issues** before creating a new
+one. There's no point in duplication; if an existing open issue addresses your
+problem, please comment there instead of creating a duplicate. However, if the
+issue you found is **closed as resolved** (e.g. with a PR or the original user's
+problem was resolved), raise a **new issue**, because you've found a new
+problem. Reference the original issue if you think that's useful information.
+
+Closed issues which have been inactive for 60 days will be locked, this helps to
+keep discussions focussed. If you believe you are still experiencing an issue
+which has been closed, please raise a new issue, completing the issue template.
+
+If you do find a similar _open_ issue, **don't just post 'me too' or similar**
+responses. This almost never helps resolve the issue, and just causes noise for
+the maintainers. Only post if it will aid the maintainers in solving the issue;
+if there are existing diagnostics requested in the thread, perform
+them and post the results.
+
Please do not be offended if your Issue or comment is closed or hidden, for any
of the following reasons:
@@ -53,6 +70,7 @@ of the following reasons:
* The issue or comment is off-topic
* The issue does not represent a Vimspector bug or feature request
* The issue cannot be reasonably reproduced using the minimal vimrc
+* The issue is a duplicate of an existing issue
* etc.
Issue titles are important. It's not usually helpful to write a title like
diff --git a/README.md b/README.md
index 2152a9c..d198292 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@
For a tutorial and usage overview, take a look at the
[Vimspector website][website].
-For detailed explanatin of the `.vimspector.json` format, see the
+For detailed explanation of the `.vimspector.json` format, see the
[reference guide][vimspector-ref].
 [](https://gitter.im/vimspector/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
@@ -59,15 +59,16 @@ For detailed explanatin of the `.vimspector.json` format, see the
* [Console autocompletion](#console-autocompletion)
* [Log View](#log-view)
* [Closing debugger](#closing-debugger)
+ * [Terminate debuggee](#terminate-debuggee)
* [Debug profile configuration](#debug-profile-configuration)
- * [C, C , Rust, etc.](#c-c-rust-etc)
- * [C Remote debugging](#c-remote-debugging)
- * [C Remote launch and attach](#c-remote-launch-and-attach)
+ * [C, C++, Rust, etc.](#c-c-rust-etc)
+ * [Data visualization / pretty printing](#data-visualization--pretty-printing)
+ * [C++ Remote debugging](#c-remote-debugging)
+ * [C++ Remote launch and attach](#c-remote-launch-and-attach)
* [Rust](#rust)
* [Python](#python)
* [Python Remote Debugging](#python-remote-debugging)
* [Python Remote launch and attach](#python-remote-launch-and-attach)
- * [Legacy: vscode-python](#legacy-vscode-python)
* [TCL](#tcl)
* [C♯](#c)
* [Go](#go)
@@ -76,6 +77,7 @@ For detailed explanatin of the `.vimspector.json` format, see the
* [Debug cli application](#debug-cli-application)
* [JavaScript, TypeScript, etc.](#javascript-typescript-etc)
* [Java](#java)
+ * [Hot code replace](#hot-code-replace)
* [Usage with YouCompleteMe](#usage-with-youcompleteme)
* [Other LSP clients](#other-lsp-clients)
* [Lua](#lua)
@@ -91,14 +93,14 @@ For detailed explanatin of the `.vimspector.json` format, see the
* [Example](#example)
* [FAQ](#faq)
-
+
# Features and Usage
The plugin is a capable Vim graphical debugger for multiple languages.
-It's mostly tested for c++, python and TCL, but in theory supports any
+It's mostly tested for C++, Python and TCL, but in theory supports any
language that Visual Studio Code supports (but see caveats).
The [Vimspector website][website] has an overview of the UI, along with basic
@@ -143,23 +145,24 @@ runtime dependencies). They are categorised by their level of support:
* `Supported` : Fully supported, frequently used and manually tested
* `Experimental`: Working, but not frequently used and rarely tested
* `Legacy`: No longer supported, please migrate your config
+* `Retired`: No longer included or supported.
-| Language | Status | Switch (for `install_gadget.py`) | Adapter (for `:VimspectorInstall`) | Dependencies |
-|--------------------|--------------|------------------------------------|------------------------------------|--------------------------------------------|
-| C, C++, Rust etc. | Tested | `--all` or `--enable-c` (or cpp) | vscode-cpptools | mono-core |
-| Rust, C, C++, etc. | Supported | `--force-enable-rust` | CodeLLDB | Python 3 |
-| Python | Tested | `--all` or `--enable-python` | debugpy | Python 2.7 or Python 3 |
-| Go | Tested | `--enable-go` | vscode-go | Go, [Delve][] |
-| TCL | Supported | `--all` or `--enable-tcl` | tclpro | TCL 8.5 |
-| Bourne Shell | Supported | `--all` or `--enable-bash` | vscode-bash-debug | Bash v?? |
-| Lua | Supported | `--all` or `--enable-lua` | local-lua-debugger-vscode | Node >=12.13.0, Npm, Lua interpreter |
-| Node.js | Supported | `--force-enable-node` | vscode-node-debug2 | 6 < Node < 12, Npm |
-| Javascript | Supported | `--force-enable-chrome` | debugger-for-chrome | Chrome |
-| Java | Supported | `--force-enable-java ` | vscode-java-debug | Compatible LSP plugin (see [later](#java)) |
-| C# (dotnet core) | Experimental | `--force-enable-csharp` | netcoredbg | DotNet core |
-| C# (mono) | Experimental | `--force-enable-csharp` | vscode-mono-debug | Mono |
-| F#, VB, etc. | Experimental | `--force-enable-fsharp` (or vbnet) | netcoredbg | DotNet core |
-| Python.legacy | Legacy | `--force-enable-python.legacy` | vscode-python | Node 10, Python 2.7 or Python 3 |
+| Language | Status | Switch (for `install_gadget.py`) | Adapter (for `:VimspectorInstall`) | Dependencies |
+|--------------------|-----------|----------------------------------|------------------------------------|--------------------------------------------|
+| C, C++, Rust etc. | Tested | `--all` or `--enable-c` (or cpp) | vscode-cpptools | mono-core |
+| Rust, C, C++, etc. | Supported | `--force-enable-rust` | CodeLLDB | Python 3 |
+| Python | Tested | `--all` or `--enable-python` | debugpy | Python 2.7 or Python 3 |
+| Go | Tested | `--enable-go` | vscode-go | Node, Go, [Delve][] |
+| TCL | Supported | `--all` or `--enable-tcl` | tclpro | TCL 8.5 |
+| Bourne Shell | Supported | `--all` or `--enable-bash` | vscode-bash-debug | Bash v?? |
+| Lua | Supported | `--all` or `--enable-lua` | local-lua-debugger-vscode | Node >=12.13.0, Npm, Lua interpreter |
+| Node.js | Supported | `--force-enable-node` | vscode-node-debug2 | 6 < Node < 12, Npm |
+| Javascript | Supported | `--force-enable-chrome` | debugger-for-chrome | Chrome |
+| Java | Supported | `--force-enable-java ` | vscode-java-debug | Compatible LSP plugin (see [later](#java)) |
+| C# (dotnet core) | Tested | `--force-enable-csharp` | netcoredbg | DotNet core |
+| F#, VB, etc. | Supported | `--force-enable-[fsharp,vbnet]` | `, `--force-enable-vbnet` | netcoredbg | DotNet core |
+| C# (mono) | _Retired_ | N/A | N/A | N/A |
+| Python.legacy | _Retired_ | N/A | N/A | N/A |
## Other languages
@@ -288,7 +291,7 @@ If you just want to try out vimspector without changing your vim config, there
are example projects for a number of languages in `support/test`, including:
* Python (`support/test/python/simple_python`)
-* Go (`support/test/go/hello_world`)
+* Go (`support/test/go/hello_world` and `support/test/go/name-starts-with-vowel`)
* Nodejs (`support/test/node/simple`)
* Chrome (`support/test/chrome/`)
* etc.
@@ -524,13 +527,6 @@ Example:
"${gadgetDir}/vscode-cpptools/debugAdapters/OpenDebugAD7"
],
"name": "cppdbg"
- },
- "vscode-python": {
- "command": [
- "node",
- "${gadgetDir}/vscode-python/out/client/debugger/debugAdapter/main.js"
- ],
- "name": "vscode-python"
}
}
}
@@ -1012,6 +1008,8 @@ be changed manually to "switch to" that thread.
to set the "focussed" thread to the currently selected one. If the selected
line is a stack frame, set the focussed thread to the thread of that frame and
jump to that frame in the code window.
+* The current frame when a breakpoint is hit or if manuall jumping is also
+ highlighted.

@@ -1073,6 +1071,8 @@ information when something goes wrong that's not a Vim traceback.
If you just want to see the Vimspector log file, use `:VimspectorToggleLog`,
which will tail it in a little window (doesn't work on Windows).
+You can see some debugging info with `:VimspectorDebugInfo`
+
## Closing debugger
To close the debugger, use:
@@ -1177,6 +1177,38 @@ licensing.
}
```
+### Data visualization / pretty printing
+
+Depending on the backend you need to enable pretty printing of complex types manually.
+
+* LLDB: Pretty printing is enabled by default
+
+* GDB: To enable gdb pretty printers, consider the snippet below.
+ It is not enough to have `set print pretty on` in your .gdbinit!
+
+```
+{
+ "configurations": {
+ "Launch": {
+ "adapter": "vscode-cpptools",
+ "configuration": {
+ "request": "launch",
+ "program": "",
+ ...
+ "MIMode": "gdb"
+ "setupCommands": [
+ {
+ "description": "Enable pretty-printing for gdb",
+ "text": "-enable-pretty-printing",
+ "ignoreFailures": true
+ }
+ ],
+ }
+ }
+ }
+}
+```
+
### C++ Remote debugging
The cpptools documentation describes how to attach cpptools to gdbserver using
@@ -1262,10 +1294,6 @@ Rust is supported with any gdb/lldb-based debugger. So it works fine with
headers/libs to build a C python extension for performance.
* Full options: https://github.com/microsoft/debugpy/wiki/Debug-configuration-settings
-
-**Migrating from `vscode-python`**: change `"adapter": "vscode-python"` to
-`"adapter": "debugpy"`.
-
```json
{
"configurations": {
@@ -1332,34 +1360,6 @@ debugpy](https://github.com/microsoft/debugpy/wiki/Debugging-over-SSH).
If you're feeling fancy, checkout the [reference guide][remote-debugging] for
an example of getting Vimspector to remotely launch and attach.
-### Legacy: vscode-python
-
-* No longer installed by default - please pass `--force-enable-python.legacy` if
- you just want to continue using your working setup.
-* [vscode-python](https://github.com/Microsoft/vscode-python)
-* NOTE: You must be running `node` 10. See [this issue](https://github.com/puremourning/vimspector/issues/105)
-
-```json
-{
- "configurations": {
- ": Launch": {
- "adapter": "vscode-python",
- "configuration": {
- "name": ": Launch",
- "type": "python",
- "request": "launch",
- "cwd": "",
- "stopOnEntry": true,
- "console": "externalTerminal",
- "debugOptions": [],
- "program": ""
- }
- }
- ...
- }
-}
-```
-
## TCL
* TCL (TclProDebug)
@@ -1383,35 +1383,8 @@ netcoredbg`
"program": "${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll",
"args": [],
"stopAtEntry": true,
- "cwd": "${workspaceRoot}"
- }
- }
- }
-}
-```
-
-* C# - mono
-
-Install with `install_gadget.py --force-enable-csharp` or `:VimspectorInstall
-vscode-mono-debug`.
-
-***Known not to work.***
-
-```json
-{
- "configurations": {
- "launch - mono": {
- "adapter": "vscode-mono-debug",
- "configuration": {
- "request": "launch",
- "program": "${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll",
- "args": [],
"cwd": "${workspaceRoot}",
- "runtimeExecutable": "mono",
- "runtimeArgs": [],
- "env": [],
- "externalConsole": false,
- "console": "integratedTerminal"
+ "env": {}
}
}
}
@@ -1428,6 +1401,8 @@ Requires:
* [Delve][delve-install] installed, e.g. `go get -u github.com/go-delve/delve/cmd/dlv`
* Delve to be in your PATH, or specify the `dlvToolPath` launch option
+NOTE: Vimspector uses the ["legacy" vscode-go debug adapter](https://github.com/golang/vscode-go/blob/master/docs/debugging-legacy.md) rather than the "built-in" DAP support in Delve. You can track https://github.com/puremourning/vimspector/issues/186 for that.
+
```json
{
"configurations": {
@@ -1445,7 +1420,7 @@ Requires:
```
See the vscode-go docs for
-[troubleshooting information](https://github.com/golang/vscode-go/blob/master/docs/debugging.md#troubleshooting)
+[troubleshooting information](https://github.com/golang/vscode-go/blob/master/docs/debugging-legacy.md#troubleshooting)
## PHP
@@ -1591,6 +1566,20 @@ editor plugin to use Java. I recommend [YouCompleteMe][], which has full support
for jdt.ls, and most importantly a trivial way to load the debug adapter and to
use it with Vimspector.
+### Hot code replace
+
+When using the [java debug server][java-debug-server], Vimspector supports the
+hot code replace custom feature. By default, when the underlying class files
+change, vimspector asks the user if they wish to reload these classes at
+runtime.
+
+This behaviour can be customised:
+
+* `let g:ycm_java_hotcodereplace_mode = 'ask'` - the default, ask the user for
+ each reload.
+* `let g:ycm_java_hotcodereplace_mode = 'always'` - don't ask, always reload
+* `let g:ycm_java_hotcodereplace_mode = 'never'` - don't ask, never reload
+
### Usage with YouCompleteMe
* Set up [YCM for java][YcmJava].
@@ -1750,22 +1739,26 @@ Vimsector uses them, they will not be replaced. So to customise the signs,
define them in your `vimrc`.
-| Sign | Description | Priority |
-|------------------------|-------------------------------------|----------|
-| `vimspectorBP` | Line breakpoint | 9 |
-| `vimspectorBPCond` | Conditional line breakpoint | 9 |
-| `vimspectorBPDisabled` | Disabled breakpoint | 9 |
-| `vimspectorPC` | Program counter (i.e. current line) | 200 |
-| `vimspectorPCBP` | Program counter and breakpoint | 200 |
+| Sign | Description | Priority |
+|---------------------------|-----------------------------------------|----------|
+| `vimspectorBP` | Line breakpoint | 9 |
+| `vimspectorBPCond` | Conditional line breakpoint | 9 |
+| `vimspectorBPDisabled` | Disabled breakpoint | 9 |
+| `vimspectorPC` | Program counter (i.e. current line) | 200 |
+| `vimspectorPCBP` | Program counter and breakpoint | 200 |
+| `vimspectorCurrentThread` | Focussed thread in stack trace view | 200 |
+| `vimspectorCurrentFrame` | Current stack frame in stack trace view | 200 |
The default symbols are the equivalent of something like the following:
```viml
-sign define vimspectorBP text=\ ● texthl=WarningMsg
-sign define vimspectorBPCond text=\ ◆ texthl=WarningMsg
-sign define vimspectorBPDisabled text=\ ● texthl=LineNr
-sign define vimspectorPC text=\ ▶ texthl=MatchParen linehl=CursorLine
-sign define vimspectorPCBP text=●▶ texthl=MatchParen linehl=CursorLine
+sign define vimspectorBP text=\ ● texthl=WarningMsg
+sign define vimspectorBPCond text=\ ◆ texthl=WarningMsg
+sign define vimspectorBPDisabled text=\ ● texthl=LineNr
+sign define vimspectorPC text=\ ▶ texthl=MatchParen linehl=CursorLine
+sign define vimspectorPCBP text=●▶ texthl=MatchParen linehl=CursorLine
+sign define vimspectorCurrentThread text=▶ texthl=MatchParen linehl=CursorLine
+sign define vimspectorCurrentFrame text=▶ texthl=Special linehl=CursorLine
```
If the signs don't display properly, your font probably doesn't contain these
@@ -1773,11 +1766,13 @@ glyphs. You can easily change them by defining the sign in your vimrc. For
example, you could put this in your `vimrc` to use some simple ASCII symbols:
```viml
-sign define vimspectorBP text=o texthl=WarningMsg
-sign define vimspectorBPCond text=o? texthl=WarningMsg
-sign define vimspectorBPDisabled text=o! texthl=LineNr
-sign define vimspectorPC text=\ > texthl=MatchParen
-sign define vimspectorPCBP text=o> texthl=MatchParen
+sign define vimspectorBP text=o texthl=WarningMsg
+sign define vimspectorBPCond text=o? texthl=WarningMsg
+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
```
## Sign priority
@@ -2054,6 +2049,10 @@ hi link jsonComment Comment
Debug adapters (for some reason) send telemetry data to clients. Vimspector simply
displays this information in the output window. It *does not* and *will not ever*
collect, use, forward or otherwise share any data with any third parties.
+10. Do I _have_ to put a `.vimspector.json` in the root of every project? No, you
+ can put all of your adapter and debug configs in a [single directory](https://puremourning.github.io/vimspector/configuration.html#debug-configurations) if you want to, but note
+ the caveat that `${workspaceRoot}` won't be calculated correctly in that case.
+ The vimsepctor author uses this [a lot](https://github.com/puremourning/.vim-mac/tree/master/vimspector-conf).
[ycmd]: https://github.com/Valloric/ycmd
diff --git a/autoload/vimspector.vim b/autoload/vimspector.vim
index a547e5c..78c7c1b 100644
--- a/autoload/vimspector.vim
+++ b/autoload/vimspector.vim
@@ -13,6 +13,9 @@
" See the License for the specific language governing permissions and
" limitations under the License.
+if !has( 'python3' )
+ finish
+endif
" Boilerplate {{{
let s:save_cpo = &cpoptions
@@ -41,11 +44,11 @@ function! s:Enabled() abort
return s:enabled
endfunction
-function! vimspector#Launch() abort
+function! vimspector#Launch( ... ) abort
if !s:Enabled()
return
endif
- py3 _vimspector_session.Start()
+ py3 _vimspector_session.Start( *vim.eval( 'a:000' ) )
endfunction
function! vimspector#LaunchWithSettings( settings ) abort
@@ -554,6 +557,14 @@ function! vimspector#ShowEvalBalloon( is_visual ) abort
\ . '", 0 )' )
endfunction
+function! vimspector#PrintDebugInfo() abort
+ if !s:Enabled()
+ return
+ endif
+
+ py3 _vimspector_session.PrintDebugInfo()
+endfunction
+
" Boilerplate {{{
let &cpoptions=s:save_cpo
diff --git a/autoload/vimspector/internal/balloon.vim b/autoload/vimspector/internal/balloon.vim
index 32d17ab..b607e51 100644
--- a/autoload/vimspector/internal/balloon.vim
+++ b/autoload/vimspector/internal/balloon.vim
@@ -69,14 +69,9 @@ function! vimspector#internal#balloon#CreateTooltip( is_hover, ... ) abort
\ 'resize': 1,
\ 'close': 'button',
\ 'callback': 'vimspector#internal#balloon#CloseCallback',
- \ 'mapping': 0
\ }
- " When ambiwidth is single, use prettier characters for the border. This
- " would look silly when ambiwidth is double.
- if &ambiwidth ==# 'single' && &encoding ==? 'utf-8'
- let config[ 'borderchars' ] = [ '─', '│', '─', '│', '╭', '╮', '┛', '╰' ]
- endif
+ let config = vimspector#internal#popup#SetBorderChars( config )
if a:is_hover
let config[ 'filter' ] = 'vimspector#internal#balloon#MouseFilter'
@@ -86,6 +81,7 @@ function! vimspector#internal#balloon#CreateTooltip( is_hover, ... ) abort
let config[ 'filter' ] = 'vimspector#internal#balloon#CursorFilter'
let config[ 'moved' ] = 'any'
let config[ 'cursorline' ] = 1
+ let config[ 'mapping' ] = 0
let s:popup_win_id = popup_atcursor( body, config )
endif
diff --git a/autoload/vimspector/internal/neojob.vim b/autoload/vimspector/internal/neojob.vim
index 0cefc63..a398afe 100644
--- a/autoload/vimspector/internal/neojob.vim
+++ b/autoload/vimspector/internal/neojob.vim
@@ -159,15 +159,16 @@ function! s:_OnCommandEvent( category, id, data, event ) abort
call setbufvar( buffer, '&modified', 0 )
endtry
- " if the buffer is visible, scroll it
+ " if the buffer is visible, scroll it, but don't allow autocommands to fire,
+ " as this may close the current window!
let w = bufwinnr( buffer )
if w > 0
let cw = winnr()
try
- execute w . 'wincmd w'
- normal! Gz-
+ noautocmd execute w . 'wincmd w'
+ noautocmd normal! Gz-
finally
- execute cw . 'wincmd w'
+ noautocmd execute cw . 'wincmd w'
endtry
endif
elseif a:event ==# 'exit'
diff --git a/autoload/vimspector/internal/neopopup.vim b/autoload/vimspector/internal/neopopup.vim
index fe5fe05..a734ca3 100644
--- a/autoload/vimspector/internal/neopopup.vim
+++ b/autoload/vimspector/internal/neopopup.vim
@@ -80,6 +80,56 @@ function! vimspector#internal#neopopup#HideSplash( id ) abort
unlet s:db[ a:id ]
endfunction
+function! vimspector#internal#neopopup#Confirm( confirm_id,
+ \ text,
+ \ options,
+ \ default_value,
+ \ keys ) abort
+
+ " Neovim doesn't have an equivalent of popup_dialog, and it's way too much
+ " effort to write one, so we just use confirm()...
+ " Annoyingly we can't use confirm() here because for some reason it doesn't
+ " render properly in a channel callback. So we use input() and mimic dialog
+ " behaviour.
+ let prompt = a:text
+ for opt in a:options
+ let prompt .= ' ' . opt
+ endfor
+ let prompt .= ': '
+
+ try
+ let result = input( prompt, a:keys[ a:default_value - 1 ] )
+ catch /.*/
+ let result = -1
+ endtry
+
+ " Map the results to what the vim popup stuff would return (s:ConfirmCallback
+ " in popup.vim), i.e.:
+ " - 1-based index of selected item, or
+ " - -1 or 0 for cancellation
+ if result == ''
+ " User pressed ESC/ctrl-c
+ let result = -1
+ else
+ let index = 1
+ for k in a:keys
+ if k ==? result
+ let result = index
+ break
+ endif
+ let index += 1
+ endfor
+
+ if index > len( a:keys )
+ let result = -1
+ endif
+ endif
+
+ py3 __import__( 'vimspector', fromlist = [ 'utils' ] ).utils.ConfirmCallback(
+ \ int( vim.eval( 'a:confirm_id' ) ),
+ \ int( vim.eval( 'result' ) ) )
+endfunction
+
" Boilerplate {{{
let &cpoptions=s:save_cpo
unlet s:save_cpo
diff --git a/autoload/vimspector/internal/popup.vim b/autoload/vimspector/internal/popup.vim
index fc8820b..083fdf5 100644
--- a/autoload/vimspector/internal/popup.vim
+++ b/autoload/vimspector/internal/popup.vim
@@ -12,6 +12,7 @@
" WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
" See the License for the specific language governing permissions and
" limitations under the License.
+scriptencoding utf-8
" Boilerplate {{{
@@ -32,6 +33,113 @@ function! vimspector#internal#popup#HideSplash( id ) abort
call popup_hide( a:id )
endfunction
+let s:current_selection = 0
+let s:selections = []
+let s:text = []
+
+function! s:UpdatePopup( id ) abort
+ let buf = copy( s:text )
+ call extend( buf, s:DrawButtons() )
+ call popup_settext( a:id, buf )
+endfunction
+
+function! s:ConfirmKeyFilter( keys, id, key ) abort
+ if a:key ==# "\"
+ call popup_close( a:id, s:current_selection + 1 )
+ return 1
+ elseif index( [ "\", "\" ], a:key ) >= 0
+ let s:current_selection = ( s:current_selection + 1 ) % len( s:selections )
+ call s:UpdatePopup( a:id )
+ return 1
+ elseif index( [ "\", "\" ], a:key ) >= 0
+ let s:current_selection = s:current_selection == 0
+ \ ? len( s:selections ) - 1: s:current_selection - 1
+ call s:UpdatePopup( a:id )
+ return 1
+ elseif a:key ==# "\" || a:key ==# "\"
+ call popup_close( a:id, -1 )
+ return 1
+ endif
+
+ let index = 1
+ for key in a:keys
+ if a:key ==? key
+ call popup_close( a:id, index )
+ return 1
+ endif
+ let index += 1
+ endfor
+endfunction
+
+function! s:ConfirmCallback( confirm_id, id, result ) abort
+ py3 __import__( 'vimspector', fromlist = [ 'utils' ] ).utils.ConfirmCallback(
+ \ int( vim.eval( 'a:confirm_id' ) ),
+ \ int( vim.eval( 'a:result' ) ) )
+endfunction
+
+function! s:SelectionPosition( idx ) abort
+ return a:idx == 0 ? 0 : len( join( s:selections[ : a:idx - 1 ], ' ' ) ) + 1
+endfunction
+
+function! s:DrawButtons() abort
+ return [ {
+ \ 'text': join( s:selections, ' ' ),
+ \ 'props': [
+ \ {
+ \ 'col': s:SelectionPosition( s:current_selection ) + 1,
+ \ 'length': len( s:selections[ s:current_selection ] ),
+ \ 'type': 'VimspectorSelectedItem'
+ \ },
+ \ ]
+ \ } ]
+endfunction
+
+function! vimspector#internal#popup#Confirm(
+ \ confirm_id,
+ \ text,
+ \ options,
+ \ default_value,
+ \ keys ) abort
+
+ silent! call prop_type_add( 'VimspectorSelectedItem', {
+ \ 'highlight': 'PMenuSel'
+ \ } )
+
+ let lines = split( a:text, "\n", v:true )
+ let buf = []
+ for line in lines
+ call add( buf, { 'text': line, 'props': [] } )
+ endfor
+
+ call add( buf, { 'text': '', 'props': [] } )
+
+ let s:selections = a:options
+ let s:current_selection = ( a:default_value - 1 )
+
+ let s:text = copy( buf )
+ call extend( buf, s:DrawButtons() )
+
+ let config = {
+ \ 'callback': function( 's:ConfirmCallback', [ a:confirm_id ] ),
+ \ 'filter': function( 's:ConfirmKeyFilter', [ a:keys ] ),
+ \ 'mapping': v:false,
+ \ }
+ let config = vimspector#internal#popup#SetBorderChars( config )
+
+ return popup_dialog( buf, config )
+endfunction
+
+function! vimspector#internal#popup#SetBorderChars( config ) abort
+ " When ambiwidth is single, use prettier characters for the border. This
+ " would look silly when ambiwidth is double.
+ if &ambiwidth ==# 'single' && &encoding ==? 'utf-8'
+ let a:config[ 'borderchars' ] = [ '─', '│', '─', '│', '╭', '╮', '┛', '╰' ]
+ endif
+
+ return a:config
+endfunction
+
+
" Boilerplate {{{
let &cpoptions=s:save_cpo
unlet s:save_cpo
diff --git a/doc/vimspector-ref.txt b/doc/vimspector-ref.txt
new file mode 100644
index 0000000..367d409
--- /dev/null
+++ b/doc/vimspector-ref.txt
@@ -0,0 +1,1085 @@
+*vimspector-ref*
+
+===============================================================================
+Contents ~
+
+ 1. Introduction |vimspector-ref-introduction|
+ 2. title: Configuration |vimspector-ref-title-configuration|
+ 3. Concepts |vimspector-ref-concepts|
+ 1. Debug adapter configuration |vimspector-ref-debug-adapter-configuration|
+ 2. Debug profile configuration |vimspector-ref-debug-profile-configuration|
+ 3. Replacements and variables |vimspector-ref-replacements-variables|
+ 1. The splat operator |vimspector-ref-splat-operator|
+ 2. Default values |vimspector-ref-default-values|
+ 3. Coercing Types |vimspector-ref-coercing-types|
+ 4. Configuration Format |vimspector-ref-configuration-format|
+ 5. Files and locations |vimspector-ref-files-locations|
+ 6. Adapter configurations |vimspector-ref-adapter-configurations|
+ 7. Debug configurations |vimspector-ref-debug-configurations|
+ 1. Configuration selection |vimspector-ref-configuration-selection|
+ 1. Specifying a default configuration |vimspector-ref-specifying-default-configuration|
+ 2. Preventing automatic selection |vimspector-ref-preventing-automatic-selection|
+ 2. Exception Breakpoints |vimspector-ref-exception-breakpoints|
+ 8. Predefined Variables |vimspector-ref-predefined-variables|
+ 9. Remote Debugging Support |vimspector-ref-remote-debugging-support|
+ 1. Python (debugpy) Example |vimspector-ref-python-example|
+ 2. C-family (gdbserver) Example |vimspector-ref-c-family-example|
+ 3. Docker Example |vimspector-ref-docker-example|
+ 10. Appendix: Configuration file format |vimspector-ref-appendix-configuration-file-format|
+ 11. Appendix: Editor configuration |vimspector-ref-appendix-editor-configuration|
+ 12. References |vimspector-ref-references|
+
+===============================================================================
+ *vimspector-ref-introduction*
+Introduction ~
+
+===============================================================================
+ *vimspector-ref-title-configuration*
+title: Configuration ~
+
+This document defines the supported format for project and adapter
+configuration for Vimspector.
+
+- Concepts
+
+ - Debug adapter configuration
+ - Debug profile configuration
+ - Replacements and variables
+ - The splat operator
+ - Default values
+ - Coercing Types
+
+- Configuration Format
+- Files and locations
+- Adapter configurations
+- Debug configurations
+
+ - Configuration selection
+
+ - Specifying a default configuration
+ - Preventing automatic selection
+
+ - Exception Breakpoints
+
+- Predefined Variables
+- Remote Debugging Support
+
+ - Python (debugpy) Example
+ - C-family (gdbserver) Example
+ - Docker Example
+
+- Appendix: Configuration file format
+- Appendix: Editor configuration
+
+===============================================================================
+ *vimspector-ref-concepts*
+Concepts ~
+
+As Vimspector supports debugging arbitrary projects, you need to tell it a few
+details about what you want to debug, and how to go about doing that.
+
+In order to debug things, Vimspector requires a Debug Adapter which bridges
+between Vimspector and the actual debugger tool. Vimspector can be used with
+any debug adapter that implements the Debug Adapter Protocol [1].
+
+For each debugging session, you provide a _debug configuration_ which includes
+things like:
+
+- The debug adapter to use (and possibly how to launch and configure it).
+- How to connect to the remote host, if remote debugging.
+- How to launch or attach to your process.
+
+Along with optional additional configuration for things like:
+
+- Exception breakpoints
+
+-------------------------------------------------------------------------------
+ *vimspector-ref-debug-adapter-configuration*
+Debug adapter configuration ~
+
+The adapter to use for a particular debug session can be specified inline
+within the _debug configuration_, but more usually the debug adapter is defined
+separately and just referenced from the _debug configuration_.
+
+The adapter configuration includes things like:
+
+- How to launch or connect to the debug adapter
+- How to configure it for PID attachment
+- How to set up remote debugging, such as how to launch the process remotely
+ (for example, under 'gdbserver', 'ptvsd', etc.)
+
+-------------------------------------------------------------------------------
+ *vimspector-ref-debug-profile-configuration*
+Debug profile configuration ~
+
+Projects can have many different debug profiles. For example you might have all
+of the following, for a given source tree:
+
+- Remotely launch c++ the process, and break on 'main'
+- Locally Python test and break exception
+- Remotely attach to a c++ process
+- Locally launch a bash script
+- Attach to a JVM listening on a port
+
+Each of these represents a different use case and a different _debug
+configuration_. As mentioned above, a _debug configuration_ is essentially:
+
+- The adapter to use
+
+- The type of session (launch or attach), and whether or not to do it
+ remotely
+
+- The configuration to pass to the adapter in order to launch or attach to
+ the process.
+
+The bulk of the configuration is the last of these, which comprises
+adapter-specific options, as the Debug Adapter Protocol does not specify any
+standard for launch or attach configuration.
+
+-------------------------------------------------------------------------------
+ *vimspector-ref-replacements-variables*
+Replacements and variables ~
+
+Vimspector _debug configuration_ is intended to be as general as possible, and
+to be committed to source control so that debugging your applications becomes a
+simple, quick and pain-free habit (e.g. answering questions like "what happens
+if..." with "just hit F5 and step through!").
+
+Therefore it's important to abstract certain details, like runtime and
+build-time paths, and to parameterise the _debug configuration_. Vimspector
+provides a simple mechanism to do this with '${replacement}' style
+replacements.
+
+The values available within the '${...}' are defined below, but in summary the
+following are supported:
+
+- Environment variables, such as '${PATH}'
+- Predefined variables, such as '${workspaceRoot}', '${file}' etc.
+- Configuration-defined variables, either provided by the adapter
+ configuration or debug configuration, or from running a simple shell
+ command.
+- Anything else you like - the user will be asked to provide a value.
+
+If the latter 2 are confusing, for now, suffice to say that they are how
+Vimspector allows parameterisation of debug sessions. The [Vimspector
+website][website-getting-started] has a good example of where this sort of
+thing is useful: accepting the name of a test to run.
+
+But for now, consider the following example snippet:
+>
+ {
+ "configurations": {
+ "example-debug-configuration": {
+ // This is a single-line comment explaining the purpose
+ "adapter": "example-adapter-name",
+ "variables": {
+ "SecretToken": { // Variables should start with upper-case letters
+ "shell" : [ "cat", "${HOME}/.secret_token" ]
+ }
+ },
+ "configuration": {
+ "request": "launch" /* or it could be "attach" */,
+ "program": [
+ "${fileBasenameNoExtension}",
+ "-c", "configuration_file.cfg",
+ "-u", "${USER}",
+ "--test-identifier", "${TestIdentifier}",
+ "--secret-token", "${SecretToken}"
+ ]
+ },
+ "breakpoints": {
+ "exception": {
+ "caught": "",
+ "uncaught": "Y"
+ }
+ }
+ }
+ }
+ }
+<
+In this (fictitious) example the 'program' launch configuration item contains
+the following variable substitutions:
+
+- '${fileBasenameNoExtension}' - this is a Predefined Variable, set by
+ Vimspector to the base name of the file that's opened in Vim, with its
+ extension removed ('/path/to/xyz.cc' -> 'xyz').
+
+- '${USER}' - this refers to the Environment Variable 'USER'.
+
+- '${TestIdentifier}' - this variable is not defined, so the user is asked to
+ provide a value interactively when starting debugging. Vimspector remembers
+ what they said and provides it as the default should they debug again.
+
+- '${SecretToken}' - this variable is provided by the configuration's
+ 'variables' block. Its value is taken from the 'strip''d result of running
+ the shell command. Note these variables can be supplied by both the debug
+ and adapter configurations and can be either static strings or shell
+ commands.
+
+-------------------------------------------------------------------------------
+ *vimspector-ref-splat-operator*
+The splat operator ~
+
+Often we want to create a single '.vimspector.json' entry which encompasses
+many use cases, as it is tedious to write every use case/start up option in
+JSON. This is why we have the replacement variables after all.
+
+Frequently debug adapters request command arguments as a JSON array, for
+example:
+>
+ "args": [ "one", "two three", "four" ],
+<
+To help with this sort of case, Vimspector supports a 'splat' operator for
+replacement variables operating within lists. The syntax is: '"*${var}', which
+means roughly "splice the contents of '${var}' into the list at this position".
+'${var}' is parsed like a shell command (using python's 'shlex' parser) and
+each word is added as a list item.
+
+For example:
+>
+ "args": [ "*${CommandLineArgs}" ]
+<
+This would:
+
+- Ask the user to provide the variable 'CommandLineArgs'. Let's say they
+ entered 'one "two three" four'
+- Split 'CommandLineArgs' like shell arguments: 'one', 'two three' and 'four'
+- Set 'args' in the settings dict to: '[ "one", "two three", "four" ]'
+
+You can also combine with static values:
+>
+ "args": [ "First", "*${CommandLineArgs}", "Last" ]
+<
+This would yield the intuitive result: '[ "First", "one", "two three", "four",
+"Last" ]'
+
+-------------------------------------------------------------------------------
+ *vimspector-ref-default-values*
+Default values ~
+
+You can specify replacements with default values. In this case if the user has
+not specified a value, they are prompted but with the default value
+pre-populated, allowing them to just press return to accept the default.
+
+The syntax is '${variableName:default value}'. The default value can contain
+any character, but to include a '}' you must escape it with a backslash. To
+include a backslash in the JSON you must write '\\', as in:
+>
+ { "key": "${value:default {\\} stuff}" }
+<
+The default value can also be a replacement variable. However, this _must_ be a
+variable that's already defined, such as one of the predefined variables, or
+one specified in a 'variables' block. In order to reference them, you _must_
+use '${var}' syntax and you _must_ escape the closing '}'. For example, the is
+a common and useful case:
+>
+ {
+ "configuration": {
+ "program": "${script:${file\\}}"
+ }
+ }
+<
+This will prompt the user to specify 'script', but it will default to the path
+to the current file.
+
+-------------------------------------------------------------------------------
+ *vimspector-ref-coercing-types*
+Coercing Types ~
+
+Sometimes, you want to provide an option for a boolean parameter, or want to
+allow the user to specify more than just strings. Vimspector allows you to do
+this, ensuring that the resulting JSON is valid. This is done by interpreting a
+value as a JSON string and substituting the resulting JSON value in its place.
+
+This is easier to explain with an example. Let's say we want to offer the
+ability to break on entry, as an option for the user. The launch configuration
+requires 'stopOnEntry' to be a bool. This doesn't work:
+>
+ "stopOnEntry": "${StopOnEntry}"
+<
+The reason is that if the user types 'true', the resulting object is:
+>
+ "stopOnEntry": "true"
+<
+The problem being that is a string, not a boolean. So Vimspector allows you to
+re-interpret the string as a JSON value and use that instead. To do this, add
+'#json' to the key's name. You can even add a default, like this:
+>
+ "stopOnEntry#json": "${stopOnEntry:true}"
+<
+If the user accepts the default, the resulting string '"true"' is coerced to a
+JSON value 'true', and the suffix is stripped fom the key, resulting in the
+following:
+>
+ "stopOnEntry#json": true
+<
+Which is what we need.
+
+If you happen to have a key that already ends in '#json' (unlikely!), then you
+can force Vimspector to treat the value as a string by appending '#s', as in:
+>
+ "unlikelyKeyName#json#s": "this is a string, not JSON data"
+<
+**_Advanced usage:_**
+
+The most common usage for this is for number and bool types, but it works for
+objects too. If you want to be able to specify a whole object (e.g. a whole
+'env' dict), then you can do that too:
+>
+ "env#json": "${Environment:{\\}}"
+<
+The default value here is '{}' (note the '}' must be escaped!). The user can
+then enter something like '{ "MYVAR": "MyValue", "OTHER": "Other" }' and the
+resulting object would be:
+>
+ "env": {
+ "MYVAR": "MyValue",
+ "OTHER": "Other"
+ }
+<
+It also works for lists, though the splat operator is usually more convenient
+for that.
+
+===============================================================================
+ *vimspector-ref-configuration-format*
+Configuration Format ~
+
+All Vimspector configuration is defined in a JSON object. The complete
+specification of this object is available in the JSON Schema [2], but the basic
+format for the configuration object is:
+>
+ {
+ "adapters": { /gadgets/'.
+
+This path is exposed as the vimspector _variable_ '${gadgetDir}'. This is
+useful for configuring gadget command lines.
+
+Where os is one of:
+
+- 'macos'
+- 'linux'
+- 'windows' (though note: Windows is not supported)
+
+The format is the same as '.vimspector.json', but only the 'adapters' key is
+used:
+
+Example:
+>
+ {
+ "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/OpenDebugAD7"
+ ],
+ "name": "cppdbg"
+ },
+ "vscode-python": {
+ "command": [
+ "node",
+ "${gadgetDir}/vscode-python/out/client/debugger/debugAdapter/main.js"
+ ],
+ "name": "vscode-python"
+ }
+ }
+ }
+<
+The gadget file is automatically written by 'install_gadget.py' (or
+':VimspectorInstall').
+
+Vimspector will also load any fies matching:
+'/gadgets//.gadgets.d/*.json'. These have the same
+format as '.gadgets.json' but are not overwritten when running
+'install_gadget.py'.
+
+-------------------------------------------------------------------------------
+ *vimspector-upgrade*
+Upgrade ~
+
+After updating the Vimspector code (either via 'git pull' or whatever package
+manager), run ':VimspectorUpdate' to update any already-installed gadgets.
+
+===============================================================================
+ *vimspector-about*
+About ~
+
+-------------------------------------------------------------------------------
+ *vimspector-background*
+Background ~
+
+The motivation is that debugging in Vim is a pretty horrible experience,
+particularly if you use multiple languages. With pyclewn no more and the
+built-in termdebug plugin limited to gdb, I wanted to explore options.
+
+While Language Server Protocol is well known, the Debug Adapter Protocol is
+less well known, but achieves a similar goal: language agnostic API abstracting
+debuggers from clients.
+
+The aim of this project is to provide a simple but effective debugging
+experience in Vim for multiple languages, by leveraging the debug adapters that
+are being built for Visual Studio Code.
+
+The ability to do remote debugging is a must. This is key to my workflow, so
+baking it in to the debugging experience is a top bill goal for the project. So
+vimspector has first-class support for executing programs remotely and
+attaching to them. This support is unique to vimspector and on top of
+(complementary to) any such support in actual debug adapters.
+
+-------------------------------------------------------------------------------
+ *vimspector-status*
+Status ~
+
+Vimspector is a work in progress, and any feedback/contributions are more than
+welcome.
+
+The backlog can be viewed on Trello [15].
+
+-------------------------------------------------------------------------------
+ *vimspector-experimental*
+Experimental ~
+
+The plugin is currently _experimental_. That means that any part of it can (and
+probably will) change, including things like:
+
+- breaking changes to the configuration
+- keys, layout, functionality of the UI
+
+However, I commit to only doing this in the most extreme cases and to annouce
+such changes on Gitter well in advance. There's nothing more annoying than
+stuff just breaking on you. I get that.
+
+-------------------------------------------------------------------------------
+ *vimspector-motivation*
+Motivation ~
+
+A message from the author about the motivation for this plugin:
+
+Many development environments have a built-in debugger. I spend an inordinate
+amount of my time in Vim. I do all my development in Vim and I have even
+customised my workflows for building code, running tests etc.
+
+For many years I have observed myself, friends and colleagues have been writing
+'printf', 'puts', 'print', etc. debugging statements in all sorts of files
+simply because there is no _easy_ way to run a debugger for _whatever_ language
+we happen to be developing in.
+
+I truly believe that interactive, graphical debugging environments are the best
+way to understand and reason about both unfamiliar and familiar code, and that
+the lack of ready, simple access to a debugger is a huge hidden productivity
+hole for many.
+
+Don't get me wrong, I know there are literally millions of developers out there
+that are more than competent at developing without a graphical debugger, but I
+maintain that if they had the ability to _just press a key_ and jump into the
+debugger, it would be faster and more enjoyable that just cerebral code
+comprehension.
+
+I created Vimspector because I find changing tools frustrating. 'gdb' for c++,
+'pdb' for python, etc. Each has its own syntax. Each its own lexicon. Each its
+own foibles.
+
+I designed the configuration system in such a way that the configuration can be
+committed to source control so that it _just works_ for any of your colleagues,
+friends, collaborators or complete strangers.
+
+I made remote debugging a first-class feature because that's a primary use case
+for me in my job.
+
+With Vimspector I can _just hit ''_ in all of the languages I develop in
+and debug locally or remotely using the exact same workflow, mappings and UI. I
+have integrated this with my Vim in such a way that I can hit a button and _run
+the test under the cursor in Vimspector_. This kind of integration has
+massively improved my workflow and productivity. It's even made the process of
+learning a new codebase... fun.
+
+- Ben Jackson, Creator.
+
+-------------------------------------------------------------------------------
+ *vimspector-license*
+License ~
+
+Apache 2.0 [16]
+
+Copyright © 2018 Ben Jackson
+
+-------------------------------------------------------------------------------
+ *vimspector-sponsorship*
+Sponsorship ~
+
+If you like Vimspector so much that you're wiling to part with your hard-earned
+cash, please consider donating to one of the following charities, which are
+meaningful to the author of Vimspector (in order of preference):
+
+- Greyhound Rescue Wales [17]
+- Cancer Research UK [18]
+- ICCF Holland [19]
+- Any charity of your choosing.
+
+===============================================================================
+ *vimspector-mappings*
+Mappings ~
+
+By default, vimspector does not change any of your mappings. Mappings are very
+personal and so you should work out what you like and use vim's powerful
+mapping features to set your own mappings. To that end, Vimspector defines the
+following '' mappings:
+
+=================================================================================================================================================================================
+| _Mapping_ | _Function_ | _API_ |
+=================================================================================================================================================================================
+| 'VimspectorContinue' | When debugging, continue. Otherwise start debugging. | 'vimspector#Continue()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorStop' | Stop debugging. | 'vimspector#Stop()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimpectorRestart' | Restart debugging with the same configuration. | 'vimspector#Restart()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorPause' | Pause debuggee. | 'vimspector#Pause()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorToggleBreakpoint' | Toggle line breakpoint on the current line. | 'vimspector#ToggleBreakpoint()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorToggleConditionalBreakpoint' | Toggle conditional line breakpoint on the current line. | 'vimspector#ToggleBreakpoint( { trigger expr, hit count expr } )' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorAddFunctionBreakpoint' | Add a function breakpoint for the expression under cursor | "vimspector#AddFunctionBreakpoint( '' )" |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorRunToCursor' | Run to Cursor | 'vimspector#RunToCursor()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorStepOver' | Step Over | 'vimspector#StepOver()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorStepInto' | Step Into | 'vimspector#StepInto()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorStepOut' | Step out of current function scope | 'vimspector#StepOut()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorUpFrame' | Move up a frame in the current call stack | 'vimspector#UpFrame()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorDownFrame' | Move down a frame in the current call stack | 'vimspector#DownFrame()' |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| 'VimspectorBalloonEval' | Evaluate expression under cursor (or visual) in popup | _internal_ |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+
+
+These map roughly 1-1 with the API functions below.
+
+For example, if you want '' to start/continue debugging, add this to some
+appropriate place, such as your 'vimrc' (hint: run ':e $MYVIMRC').
+>
+ nmap VimspectorContinue
+<
+In addition, many users probably want to only enable certain Vimspector
+mappings while debugging is active. This is also possible, though it requires
+writing some vimscipt.
+
+That said, many people are familiar with particular debuggers, so the following
+mappings can be enabled by setting 'g:vimspector_enable_mappings' to the
+specified value.
+
+-------------------------------------------------------------------------------
+ *vimspector-visual-studio-vscode*
+Visual Studio / VSCode ~
+
+To use Visual Studio-like mappings, add the following to your 'vimrc' **before
+loading vimspector**:
+>
+ let g:vimspector_enable_mappings = 'VISUAL_STUDIO'
+<
+=========================================================================================================================
+| _Key_ | _Mapping_ | _Function_ |
+=========================================================================================================================
+| 'F5' | 'VimspectorContinue' | When debugging, continue. Otherwise start debugging. |
+-------------------------------------------------------------------------------------------------------------------------
+| 'Shift F5' | 'VimspectorStop' | Stop debugging. |
+-------------------------------------------------------------------------------------------------------------------------
+| 'Ctrl Shift F5' | 'VimspectorRestart' | Restart debugging with the same configuration. |
+-------------------------------------------------------------------------------------------------------------------------
+| 'F6' | 'VimspectorPause' | Pause debuggee. |
+-------------------------------------------------------------------------------------------------------------------------
+| 'F9' | 'VimspectorToggleBreakpoint' | Toggle line breakpoint on the current line. |
+-------------------------------------------------------------------------------------------------------------------------
+| 'Shift F9' | 'VimspectorAddFunctionBreakpoint' | Add a function breakpoint for the expression under cursor |
+-------------------------------------------------------------------------------------------------------------------------
+| 'F10' | 'VimspectorStepOver' | Step Over |
+-------------------------------------------------------------------------------------------------------------------------
+| 'F11' | 'VimspectorStepInto' | Step Into |
+-------------------------------------------------------------------------------------------------------------------------
+| 'Shift F11' | 'VimspectorStepOut' | Step out of current function scope |
+-------------------------------------------------------------------------------------------------------------------------
+
+
+-------------------------------------------------------------------------------
+ *vimspector-human-mode*
+Human Mode ~
+
+If, like me, you only have 2 hands and 10 fingers, you probably don't like
+Ctrl-Shift-F keys. Also, if you're running in a terminal, there's a real
+possibility of terminfo being wrong for shifted-F-keys, particularly if your
+'TERM' is 'screen-256color'. If these issues (number of hands, 'TERM'
+variables) are unfixable, try the following mappings, by adding the following
+**before loading vimspector**:
+>
+ let g:vimspector_enable_mappings = 'HUMAN'
+<
+============================================================================================================================
+| _Key_ | _Mapping_ | _Function_ |
+============================================================================================================================
+| 'F5' | 'VimspectorContinue' | When debugging, continue. Otherwise start debugging. |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F3' | 'VimspectorStop' | Stop debugging. |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F4' | 'VimspectorRestart' | Restart debugging with the same configuration. |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F6' | 'VimspectorPause' | Pause debuggee. |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F9' | 'VimspectorToggleBreakpoint' | Toggle line breakpoint on the current line. |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F9' | 'VimspectorToggleConditionalBreakpoint' | Toggle conditional line breakpoint on the current line. |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F8' | 'VimspectorAddFunctionBreakpoint' | Add a function breakpoint for the expression under cursor |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F8' | 'VimspectorRunToCursor' | Run to Cursor |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F10' | 'VimspectorStepOver' | Step Over |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F11' | 'VimspectorStepInto' | Step Into |
+----------------------------------------------------------------------------------------------------------------------------
+| 'F12' | 'VimspectorStepOut' | Step out of current function scope |
+----------------------------------------------------------------------------------------------------------------------------
+
+
+In addition, I recommend adding a mapping to 'VimspectorBalloonEval', in
+normal and visual modes, for example:
+>
+ " mnemonic 'di' = 'debug inspect' (pick your own, if you prefer!)
+
+ " for normal mode - the word under the cursor
+ nmap di VimspectorBalloonEval
+ " for visual mode, the visually selected text
+ xmap di VimspectorBalloonEval
+<
+You may also wish to add mappings for up/down the stack, for example:
+>
+ nmap VimspectorUpFrame
+ nmap VimspectorDownFrame
+<
+===============================================================================
+ *vimspector-usage-api*
+Usage and API ~
+
+This section defines detailed usage instructions, organised by feature. For
+most users, the mappings section contains the most common commands and default
+usage. This section can be used as a reference to create your own mappings or
+custom behaviours.
+
+-------------------------------------------------------------------------------
+ *vimspector-launch-attach-by-pid*
+Launch and attach by PID: ~
+
+- Create '.vimspector.json'. See below.
+- ':call vimspector#Launch()' and select a configuration.
+
+ Image: debug session (see reference [6])
+
+-------------------------------------------------------------------------------
+ *vimspector-launch-with-options*
+Launch with options ~
+
+To launch a specific debug configuration, or specify replacement variables [20]
+for the launch, you can use:
+
+- ':call vimspector#LaunchWithSettings( dict )'
+
+The argument is a 'dict' with the following keys:
+
+- 'configuration': (optional) Name of the debug configuration to launch
+- '': (optional) Name of a variable to set
+
+This allows for some integration and automation. For example, if you have a
+configuration named 'Run Test' that contains a replacement variable [20] named
+'${Test}' you could write a mapping which ultimately executes:
+>
+ vimspector#LaunchWithSettings( #{ configuration: 'Run Test'
+ \ Test: 'Name of the test' } )
+<
+This would start the 'Run Test' configuration with '${Test}' set to "'Name of
+the test'" and Vimspector would _not_ prompt the user to enter or confirm these
+things.
+
+See our YouCompleteMe integration guide for another example where it can be
+used to specify the port to connect the java debugger
+
+-------------------------------------------------------------------------------
+ *vimspector-debug-configuration-selection*
+Debug configuration selection ~
+
+Vimspector uses the following logic to choose a configuration to launch:
+
+1. If a configuration was specified in the launch options (as above), use
+ that.
+
+2. Otherwise if there's only one configuration and it doesn't have
+ 'autoselect' set to 'false', use that.
+
+3. Otherwise if there's exactly one configuration with 'default' set to
+ 'true' and without 'autoselect' set to 'false', use that.
+
+4. Otherwise, prompt the user to select a configuration.
+
+See the reference guide [21] for details.
+
+-------------------------------------------------------------------------------
+ *vimspector-get-configurations*
+Get configurations ~
+
+- Use 'vimspector#GetConfigurations()' to get a list of configurations
+
+For example, to get an array of configurations and fuzzy matching on the result
+>
+ :call matchfuzzy(vimspector#GetConfigurations(), "test::case_1")
+<
+-------------------------------------------------------------------------------
+ *vimspector-breakpoints*
+Breakpoints ~
+
+See the mappings [22] section for the default mappings for working with
+breakpoints. This section describes the full API in vimscript functions.
+
+-------------------------------------------------------------------------------
+ *vimspector-summary*
+Summary ~
+
+- Use 'vimspector#ToggleBreakpoint( { options dict } )' to set/disable/delete
+ a line breakpoint. The argument is optional (see below).
+
+- Use "vimspector#AddFunctionBreakpoint( '', { options dict} )" to add
+ a function breakpoint. The second argument is optional (see below).
+
+- Use 'vimspector#SetLineBreakpoint( file_name, line_num, { options dict } )'
+ to set a breakpoint at a specific file/line. The last argument is optional
+ (see below)
+
+- Use 'vimspector#ClearLineBreakpoint( file_name, line_num )' to remove a
+ breakpoint at a specific file/line
+
+- Use 'vimspector#ClearBreakpoints()' to clear all breakpoints
+
+Examples:
+
+- 'call vimspector#ToggleBreakpoint()' - toggle breakpoint on current line
+
+- "call vimspector#SetLineBreakpoint( 'some_file.py', 10 )" - set a
+ breakpoint on 'some_filepy:10'
+
+- "call vimspector#AddFunctionBreakpoint( 'main' )" - add a function
+ breakpoint on the 'main' function
+
+- "call vimspector#ToggleBreakpoint( { 'condition': 'i > 5' } )" - add a
+ breakpoint on the current line that triggers only when 'i > 5' is 'true'
+
+- "call vimspector#SetLineBreakpoint( 'some_file.py', 10, { 'condition': 'i >
+ 5' } )" - add a breakpoint at 'some_file.py:10' that triggers only when 'i
+ > 5' is 'true'
+
+- "call vimspector#ClearLineBreakpoint( 'some_file.py', 10 )" - delete the
+ breakpoint at 'some_file.py:10'
+
+- 'call vimspector#ClearBreakpoints()' - clear all breakpoints
+
+-------------------------------------------------------------------------------
+ *vimspector-line-breakpoints*
+Line breakpoints ~
+
+The simplest and most common form of breakpoint is a line breakpoint. Execution
+is paused when the specified line is executed.
+
+For most debugging scenarios, users will just hit '' to create a line
+breakpoint on the current line and '' to launch the application.
+
+-------------------------------------------------------------------------------
+ *vimspector-conditional-breakpoints*
+Conditional breakpoints ~
+
+Some debug adapters support conditional breakpoints. Note that vimspector does
+not tell you if the debugger doesn't support conditional breakpoints (yet). A
+conditional breakpoint is a breakpoint which only triggers if some expression
+evaluates to true, or has some other constraints met.
+
+Some of these functions above take a single optional argument which is a
+dictionary of options. The dictionary can have the following keys:
+
+- 'condition': An optional expression evaluated to determine if the
+ breakpoint should fire. Not supported by all debug adapters. For example,
+ to break when 'abc' is '10', enter something like 'abc == 10', depending on
+ the language.
+
+- 'hitCondition': An optional expression evaluated to determine a number of
+ times the breakpoint should be ignored. Should (probably?) not be used in
+ combination with 'condition'. Not supported by all debug adapters. For
+ example, to break on the 3rd time hitting this line, enter '3'.
+
+In both cases, the expression is evaluated by the debugger, so should be in
+whatever dialect the debugger understands when evaluating expressions.
+
+When using the '' mapping, the user is prompted to enter these
+expressions in a command line (with history).
+
+-------------------------------------------------------------------------------
+ *vimspector-exception-breakpoints*
+Exception breakpoints ~
+
+Exception breakpoints typically fire when an exception is throw or other error
+condition occurs. Depending on the debugger, when starting debugging, you may
+be asked a few questions about how to handle exceptions. These are "exception
+breakpoints" and vimspector remembers your choices while Vim is still running.
+
+Typically you can accept the defaults (just keep pressing ''!) as most
+debug adapter defaults are sane, but if you want to break on, say 'uncaught
+exception' then answer 'Y' to that (for example).
+
+You can configure your choices in the '.vimspector.json'. See the configuration
+guide [23] for details on that.
+
+-------------------------------------------------------------------------------
+ *vimspector-clear-breakpoints*
+Clear breakpoints ~
+
+Use 'vimspector#ClearBreakpoints()' to clear all breakpoints including the
+memory of exception breakpoint choices.
+
+-------------------------------------------------------------------------------
+ *vimspector-run-to-cursor*
+Run to Cursor ~
+
+Use 'vimspector#RunToCursor' or '': this creates a temporary
+breakpoint on the current line, then continues execution, clearing the
+breakpoint when it is hit.
+
+-------------------------------------------------------------------------------
+ *vimspector-stepping*
+Stepping ~
+
+- Step in/out, finish, continue, pause etc. using the WinBar, or mappings.
+- If you really want to, the API is 'vimspector#StepInto()' etc.
+
+ Image: code window (see reference [24])
+
+-------------------------------------------------------------------------------
+ *vimspector-variables-scopes*
+Variables and scopes ~
+
+- Current scope shows values of locals.
+- Use '', or double-click with left mouse to expand/collapse (+, -).
+- Set the value of the variable with '' (control + '') or
+ '' (if 'modifyOtherKeys' doesn't work for you)
+- When changing the stack frame the locals window updates.
+- While paused, hover to see values
+
+ Image: locals window (see reference [25])
+
+Scopes and variables are represented by the buffer 'vimspector.Variables'.
+
+-------------------------------------------------------------------------------
+ *vimspector-variable-or-selection-hover-evaluation*
+Variable or selection hover evaluation ~
+
+All rules for 'Variables and scopes' apply plus the following:
+
+- With mouse enabled, hover over a variable and get the value it evaluates
+ to.
+
+- Use your mouse to perform a visual selection of an expression (e.g. 'a +
+ b') and get its result.
+
+- Make a normal mode ('nmap') and visual mode ('xmap') mapping to
+ 'VimspectorBalloonEval' to manually trigger the popup.
+
+- Set the value of the variable with '' (control + '') or
+ '' (if 'modifyOtherKeys' doesn't work for you)
+
+- Use regular nagivation keys ('j', 'k') to choose the current selection;
+ '' (or leave the tooltip window) to close the tooltip.
+
+ Image: variable eval hover (see reference [26])
+
+-------------------------------------------------------------------------------
+ *vimspector-watches*
+Watches ~
+
+The watch window is used to inspect variables and expressions. Expressions are
+evaluated in the selected stack frame which is "focussed"
+
+The watches window is a prompt buffer, where that's available. Enter insert
+mode to add a new watch expression.
+
+- Add watches to the variables window by entering insert mode and typing the
+ expression. Commit with ''.
+
+- Alternatively, use ':VimspectorWatch '. Tab-completion for
+ expression is available in some debug adapters.
+
+- Expand result with '', or double-click with left mouse.
+
+- Set the value of the variable with '' (control + '') or
+ '' (if 'modifyOtherKeys' doesn't work for you)
+
+- Delete with ''.
+
+ Image: watch window (see reference [27])
+
+The watches are represented by the buffer 'vimspector.StackTrace'.
+
+-------------------------------------------------------------------------------
+ *vimspector-watch-autocompletion*
+Watch autocompletion ~
+
+The watch prompt buffer has its 'omnifunc' set to a function that will
+calculate completion for the current expression. This is trivially used with
+'' (see ':help ins-completion'), or integrated with your
+favourite completion system. The filetype in the buffer is set to
+'VimspectorPrompt'.
+
+For YouCompleteMe, the following config works well:
+>
+ let g:ycm_semantic_triggers = {
+ \ 'VimspectorPrompt': [ '.', '->', ':', '<' ]
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-stack-traces*
+Stack Traces ~
+
+The stack trace window shows the state of each program thread. Threads which
+are stopped can be expanded to show the stack trace of that thread.
+
+Often, but not always, all threads are stopped when a breakpoint is hit. The
+status of a thread is show in parentheses after the thread's name. Where
+supported by the underlying debugger, threads can be paused and continued
+individually from within the Stack Trace window.
+
+A particular thread, highlighted with the 'CursorLine' highlight group is the
+"focussed" thread. This is the thread that receives commands like "Stop In",
+"Stop Out", "Continue" and "Pause" in the code window. The focussed thread can
+be changed manually to "switch to" that thread.
+
+- Use '', or double-click with left mouse to expand/collapse a thread
+ stack trace, or use the WinBar button.
+
+- Use '', or double-click with left mouse on a stack frame to jump to it.
+
+- Use the WinBar or 'vimspector#PauseContinueThread()' to individually pause
+ or continue the selected thread.
+
+- Use the "Focus" WinBar button, '' or
+ 'vimspector#SetCurrentThread()' to set the "focussed" thread to the
+ currently selected one. If the selected line is a stack frame, set the
+ focussed thread to the thread of that frame and jump to that frame in the
+ code window.
+
+ Image: stack trace (see reference [28])
+
+The stack trace is represented by the buffer 'vimspector.StackTrace'.
+
+-------------------------------------------------------------------------------
+ *vimspector-program-output*
+Program Output ~
+
+- In the outputs window, use the WinBar to select the output channel.
+- Alternatively, use ':VimspectorShowOutput '. Use command-line
+ completion to see the categories.
+- The debuggee prints to the stdout channel.
+- Other channels may be useful for debugging.
+
+ Image: output window (see reference [29])
+
+If the output window is closed, a new one can be opened with
+':VimspectorShowOutput ' (use tab-completion - 'wildmenu' to see the
+options).
+
+-------------------------------------------------------------------------------
+ *vimspector-console*
+Console ~
+
+The console window is a prompt buffer, where that's available, and can be used
+as an interactive CLI for the debug adapter. Support for this varies amongst
+adapters.
+
+- Enter insert mode to enter a command to evaluate.
+- Alternatively, ':VimspectorEval '. Completion is available with
+ some debug adapters.
+- Commit the request with ''
+- The request and subsequent result are printed.
+
+NOTE: See also Watches above.
+
+If the output window is closed, a new one can be opened with
+':VimspectorShowOutput Console'.
+
+-------------------------------------------------------------------------------
+ *vimspector-console-autocompletion*
+Console autocompletion ~
+
+The console prompt buffer has its 'omnifunc' set to a function that will
+calculate completion for the current command/expression. This is trivially used
+with '' (see ':help ins-completion'), or integrated with your
+favourite completion system. The filetype in the buffer is set to
+'VimspectorPrompt'.
+
+For YouCompleteMe, the following config works well:
+>
+ let g:ycm_semantic_triggers = {
+ \ 'VimspectorPrompt': [ '.', '->', ':', '<' ]
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-log-view*
+Log View ~
+
+The Vimspector log file contains a full trace of the communication between
+Vimspector and the debug adapter. This is the primary source of diagnostic
+information when something goes wrong that's not a Vim traceback.
+
+If you just want to see the Vimspector log file, use ':VimspectorToggleLog',
+which will tail it in a little window (doesn't work on Windows).
+
+-------------------------------------------------------------------------------
+ *vimspector-closing-debugger*
+Closing debugger ~
+
+To close the debugger, use:
+
+- 'Reset' WinBar button
+- ':VimspectorReset' when the WinBar is not available.
+- 'call vimspector#Reset()'
+
+-------------------------------------------------------------------------------
+ *vimspector-terminate-debuggee*
+Terminate debuggee ~
+
+If the debuggee is still running when stopping or resetting, then some debug
+adapters allow you to specify what should happen to it when finishing
+debugging. Typically, the default behaviour is sensible, and this is what
+happens most of the time. These are the defaults according to DAP:
+
+- If the request was 'launch': terminate the debuggee
+- If the request was 'attach': don't terminate the debuggee
+
+Some debug adapters allow you to choose what to do when disconnecting. If you
+wish to control this behaviour, use ':VimspectorReset' or call
+"vimspector#Reset( { 'interactive': v:true } )". If the debug adapter offers a
+choice as to whether or not to terminate the debuggee, you will be prompted to
+choose. The same applies for 'vimspector#Stop()' which can take an argument:
+"vimspector#Stop( { 'interactive': v:true } )".
+
+===============================================================================
+ *vimspector-debug-profile-configuration*
+Debug profile configuration ~
+
+For an introduction to the configuration of '.vimspector.json', take a look at
+the Getting Started section of the Vimspector website [1].
+
+For full explanation, including how to use variables, substitutions and how to
+specify exception breakpoints, see the docs [2].
+
+The JSON configuration file allows C-style comments:
+
+- '// comment to end of line ...'
+- '/* inline comment ... */'
+
+Current tested with the following debug adapters.
+
+-------------------------------------------------------------------------------
+ *vimspector-c-c-rust-etc.*
+C, C++, Rust, etc. ~
+
+- vscode-cpptools [30]
+
+- On macOS, I _strongly_ recommend using CodeLLDB instead for C and C++
+ projects. It's really excellent, has fewer dependencies and doesn't open
+ console apps in another Terminal window.
+
+Example '.vimspector.json' (works with both 'vscode-cpptools' and
+'lldb-vscode'. For 'lldb-vscode' replace the name of the adapter with
+'lldb-vscode':
+
+- vscode-cpptools Linux/MacOS:
+>
+ {
+ "configurations": {
+ "Launch": {
+ "adapter": "vscode-cpptools",
+ "configuration": {
+ "request": "launch",
+ "program": "",
+ "args": [ ... ],
+ "cwd": "",
+ "environment": [ ... ],
+ "externalConsole": true,
+ "MIMode": ""
+ }
+ },
+ "Attach": {
+ "adapter": "vscode-cpptools",
+ "configuration": {
+ "request": "attach",
+ "program": "",
+ "MIMode": ""
+ }
+ }
+ ...
+ }
+ }
+<
+- vscode-cpptools Windows
+
+**_NOTE FOR WINDOWS USERS:_** You need to install 'gdb.exe'. I recommend using
+'scoop install gdb'. Vimspector cannot use the visual studio debugger due to
+licensing.
+>
+ {
+ "configurations": {
+ "Launch": {
+ "adapter": "vscode-cpptools",
+ "configuration": {
+ "request": "launch",
+ "program": "",
+ "stopAtEntry": true
+ }
+ }
+ }
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-c-remote-debugging*
+C++ Remote debugging ~
+
+The cpptools documentation describes how to attach cpptools to gdbserver using
+'miDebuggerAddress'. Note that when doing this you should use the '"request":
+"attach"'.
+
+-------------------------------------------------------------------------------
+ *vimspector-c-remote-launch-attach*
+C++ Remote launch and attach ~
+
+If you're feeling fancy, checkout the reference guide [31] for an example of
+getting Vimspector to remotely launch and attach.
+
+- CodeLLDB (MacOS)
+
+CodeLLDB is superior to vscode-cpptools in a number of ways on macOS at least.
+
+See Rust.
+
+- lldb-vscode (MacOS)
+
+An alternative is to to use 'lldb-vscode', which comes with llvm. Here's how:
+
+- Install llvm (e.g. with HomeBrew: 'brew install llvm')
+- Create a file named
+ '/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"
+ }
+ }
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-rust*
+Rust ~
+
+Rust is supported with any gdb/lldb-based debugger. So it works fine with
+'vscode-cpptools' and 'lldb-vscode' above. However, support for rust is best in
+'CodeLLDB' [32].
+
+- './install_gadget.py --force-enable-rust' or ':VimspectorInstall CodeLLDB'
+- Example: 'support/test/rust/vimspector_test'
+>
+ {
+ "configurations": {
+ "launch": {
+ "adapter": "CodeLLDB",
+ "configuration": {
+ "request": "launch",
+ "program": "${workspaceRoot}/target/debug/vimspector_test"
+ }
+ }
+ }
+ }
+<
+- Docs: https://github.com/vadimcn/vscode-lldb/blob/master/MANUAL.md
+
+-------------------------------------------------------------------------------
+ *vimspector-python*
+Python ~
+
+- Python: debugpy [33]
+
+- Install with 'install_gadget.py --enable-python' or ':VimspectorInstall
+ debugpy', ideally requires a working compiler and the python development
+ headers/libs to build a C python extension for performance.
+
+- Full options:
+ https://github.com/microsoft/debugpy/wiki/Debug-configuration-settings
+
+**Migrating from 'vscode-python'**: change '"adapter": "vscode-python"' to
+'"adapter": "debugpy"'.
+>
+ {
+ "configurations": {
+ ": Launch": {
+ "adapter": "debugpy",
+ "configuration": {
+ "name": ": Launch",
+ "type": "python",
+ "request": "launch",
+ "cwd": "",
+ "python": "/path/to/python/interpreter/to/use",
+ "stopOnEntry": true,
+ "console": "externalTerminal",
+ "debugOptions": [],
+ "program": ""
+ }
+ }
+ ...
+ }
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-python-remote-debugging*
+Python Remote Debugging ~
+
+In order to use remote debugging with debugpy, you have to connect Vimspector
+directly to the application that is being debugged. This is easy, but it's a
+little different from how we normally configure things. Specifically, you need
+to:
+
+- Start your application with debugpy, specifying the '--listen' argument.
+ See the debugpy documentation [34] for details.
+
+- Use the built-in "multi-session" adapter. This just asks for the host/port
+ to connect to. For example:
+>
+ {
+ "configurations": {
+ "Python Attach": {
+ "adapter": "multi-session",
+ "configuration": {
+ "request": "attach",
+ "pathMappings": [
+ // mappings here (optional)
+ ]
+ }
+ }
+ }
+ }
+<
+See details of the launch configuration [35] for explanation of things like
+'pathMappings'.
+
+Additional documentation, including how to do this when the remote machine can
+only be contacted via SSH are provided by debugpy [36].
+
+-------------------------------------------------------------------------------
+ *vimspector-python-remote-launch-attach*
+Python Remote launch and attach ~
+
+If you're feeling fancy, checkout the reference guide [31] for an example of
+getting Vimspector to remotely launch and attach.
+
+-------------------------------------------------------------------------------
+ *vimspector-legacy-vscode-python*
+Legacy: vscode-python ~
+
+- No longer installed by default - please pass '--force-enable-python.legacy'
+ if you just want to continue using your working setup.
+- vscode-python [37]
+- NOTE: You must be running 'node' 10. See this issue [38]
+>
+ {
+ "configurations": {
+ ": Launch": {
+ "adapter": "vscode-python",
+ "configuration": {
+ "name": ": Launch",
+ "type": "python",
+ "request": "launch",
+ "cwd": "",
+ "stopOnEntry": true,
+ "console": "externalTerminal",
+ "debugOptions": [],
+ "program": ""
+ }
+ }
+ ...
+ }
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-tcl*
+TCL ~
+
+- TCL (TclProDebug)
+
+See my fork of TclProDebug [39] for instructions.
+
+-------------------------------------------------------------------------------
+ *vimspector-c*
+C♯ ~
+
+- C# - dotnet core
+
+Install with 'install_gadget.py --force-enable-csharp' or ':VimspectorInstall
+netcoredbg'
+>
+ {
+ "configurations": {
+ "launch - netcoredbg": {
+ "adapter": "netcoredbg",
+ "configuration": {
+ "request": "launch",
+ "program": "${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll",
+ "args": [],
+ "stopAtEntry": true,
+ "cwd": "${workspaceRoot}"
+ }
+ }
+ }
+ }
+<
+- C# - mono
+
+Install with 'install_gadget.py --force-enable-csharp' or ':VimspectorInstall
+vscode-mono-debug'.
+
+**_Known not to work._**
+>
+ {
+ "configurations": {
+ "launch - mono": {
+ "adapter": "vscode-mono-debug",
+ "configuration": {
+ "request": "launch",
+ "program": "${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll",
+ "args": [],
+ "cwd": "${workspaceRoot}",
+ "runtimeExecutable": "mono",
+ "runtimeArgs": [],
+ "env": [],
+ "externalConsole": false,
+ "console": "integratedTerminal"
+ }
+ }
+ }
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-go*
+Go ~
+
+- Go
+
+Requires:
+
+- 'install_gadget.py --enable-go' or ':VimspectorInstall vscode-go'
+- Delve [40] installed, e.g. 'go get -u github.com/go-delve/delve/cmd/dlv'
+- Delve to be in your PATH, or specify the 'dlvToolPath' launch option
+>
+ {
+ "configurations": {
+ "run": {
+ "adapter": "vscode-go",
+ "configuration": {
+ "request": "launch",
+ "program": "${fileDirname}",
+ "mode": "debug",
+ "dlvToolPath": "$HOME/go/bin/dlv"
+ }
+ }
+ }
+ }
+<
+See the vscode-go docs for troubleshooting information [41]
+
+-------------------------------------------------------------------------------
+ *vimspector-php*
+PHP ~
+
+This uses the php-debug, see
+https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug
+
+Requires:
+
+- (optional) Xdebug helper for chrome https://chrome.google.com/webstore/deta
+ il/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc
+
+- 'install_gadget.py --force-enable-php' or ':VimspectorInstall
+ vscode-php-debug'
+
+- configured php xdebug extension
+>
+ zend_extension=xdebug.so
+ xdebug.remote_enable=on
+ xdebug.remote_handler=dbgp
+ xdebug.remote_host=localhost
+ xdebug.remote_port=9000
+<
+ replace 'localhost' with the ip of your workstation.
+
+lazy alternative
+>
+ zend_extension=xdebug.so
+ xdebug.remote_enable=on
+ xdebug.remote_handler=dbgp
+ xdebug.remote_connect_back=true
+ xdebug.remote_port=9000
+<
+- .vimspector.json
+>
+ {
+ "configurations": {
+ "Listen for XDebug": {
+ "adapter": "vscode-php-debug",
+ "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",
+ "configuration": {
+ "name": "Launch currently open script",
+ "type": "php",
+ "request": "launch",
+ "program": "${file}",
+ "cwd": "${fileDirname}",
+ "port": 9000
+ }
+ }
+ }
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-debug-web-application*
+Debug web application ~
+
+append 'XDEBUG_SESSION_START=xdebug' to your query string
+>
+ curl "http://localhost?XDEBUG_SESSION_START=xdebug"
+<
+or use the previously mentioned Xdebug Helper extension (which sets a
+'XDEBUG_SESSION' cookie)
+
+-------------------------------------------------------------------------------
+ *vimspector-debug-cli-application*
+Debug cli application ~
+>
+ export XDEBUG_CONFIG="idekey=xdebug"
+ php
+<
+-------------------------------------------------------------------------------
+ *vimspector-javascript-typescript-etc.*
+JavaScript, TypeScript, etc. ~
+
+- Node.js
+
+Requires:
+
+- 'install_gadget.py --force-enable-node'
+
+- For installation, a Node.js environment that is < node 12. I believe this
+ is an incompatibility with gulp. Advice, use [nvm][] with 'nvm install
+ --lts 10; nvm use --lts 10; ./install_gadget.py --force-enable-node ...'
+
+- Options described here:
+ https://code.visualstudio.com/docs/nodejs/nodejs-debugging
+
+- Example: 'support/test/node/simple'
+>
+ {
+ "configurations": {
+ "run": {
+ "adapter": "vscode-node",
+ "configuration": {
+ "request": "launch",
+ "protocol": "auto",
+ "stopOnEntry": true,
+ "console": "integratedTerminal",
+ "program": "${workspaceRoot}/simple.js",
+ "cwd": "${workspaceRoot}"
+ }
+ }
+ }
+ }
+<
+- Chrome
+
+This uses the chrome debugger, see https://marketplace.visualstudio.com/items?i
+temName=msjsdiag.debugger-for-chrome.
+
+It allows you to debug scripts running inside chrome from within Vim.
+
+- './install_gadget.py --force-enable-chrome' or ':VimspectorInstall
+ debugger-for-chrome'
+- Example: 'support/test/chrome'
+>
+ {
+ "configurations": {
+ "launch": {
+ "adapter": "chrome",
+ "configuration": {
+ "request": "launch",
+ "url": "http://localhost:1234/",
+ "webRoot": "${workspaceRoot}/www"
+ }
+ }
+ }
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-java*
+Java ~
+
+Vimspector works well with the java debug server [42], which runs as a jdt.ls
+(Java Language Server) plugin, rather than a standalone debug adapter.
+
+Vimspector is not in the business of running language servers, only debug
+adapters, so this means that you need a compatible Language Server Protocol
+editor plugin to use Java. I recommend YouCompleteMe [43], which has full
+support for jdt.ls, and most importantly a trivial way to load the debug
+adapter and to use it with Vimspector.
+
+-------------------------------------------------------------------------------
+ *vimspector-usage-with-youcompleteme*
+Usage with YouCompleteMe ~
+
+- Set up YCM for java [43].
+
+- Get Vimspector to download the java debug plugin: 'install_gadget.py
+ --force-enable-java ' or ':VimspectorInstall
+ java-debug-adapter'
+
+- Configure Vimspector for your project using the 'vscode-java' adapter,
+ e.g.:
+>
+ {
+ "configurations": {
+ "Java Attach": {
+ "adapter": "vscode-java",
+ "configuration": {
+ "request": "attach",
+ "hostName": "${host}",
+ "port": "${port}",
+ "sourcePaths": [
+ "${workspaceRoot}/src/main/java",
+ "${workspaceRoot}/src/test/java"
+ ]
+ }
+ }
+ }
+ }
+<
+- Tell YCM to load the debugger plugin. This should be the 'gadgets/'
+ directory, not any specific adapter. e.g. in '.vimrc'
+>
+ " Tell YCM where to find the plugin. Add to any existing values.
+ let g:ycm_java_jdtls_extension_path = [
+ \ ''
+ \ ]
+<
+- Create a mapping, such as '' to start the debug server and
+ launch vimspector, e.g. in '~/.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 :call StartDebugging()
+<
+You can then use '' to start debugging rather than just ''.
+
+If you see "Unable to get DAP port - is JDT.LS initialized?", try running
+':YcmCompleter ExecuteCommand vscode.java.startDebugSession' and note the
+output. If you see an error like 'ResponseFailedException: Request failed:
+-32601: No delegateCommandHandler for vscode.java.startDebugSession', make sure
+that: _Your YCM jdt.ls is actually working, see the YCM docs [44] for
+troubleshooting_ The YCM jdt.ls has had time to initialize before you start the
+debugger * That 'g:ycm_java_jdtls_extension_path' is set in '.vimrc' or prior
+to YCM starting
+
+For the launch arguments, see the vscode document [45].
+
+-------------------------------------------------------------------------------
+ *vimspector-other-lsp-clients*
+Other LSP clients ~
+
+See this issue [46] for more background.
+
+-------------------------------------------------------------------------------
+ *vimspector-lua*
+Lua ~
+
+Lua is supported through local-lua-debugger-vscode [47]. This debugger uses
+stdio to communicate with the running process, so calls to 'io.read' will cause
+problems.
+
+- './install_gadget.py --enable-lua' or ':VimspectorInstall
+ local-lua-debugger-vscode'
+- Examples: 'support/test/lua/simple' and 'support/test/lua/love'
+>
+ {
+ "$schema": "https://puremourning.github.io/vimspector/schema/vimspector.schema.json#",
+ "configurations": {
+ "lua": {
+ "adapter": "lua-local",
+ "configuration": {
+ "request": "launch",
+ "type": "lua-local",
+ "cwd": "${workspaceFolder}",
+ "program": {
+ "lua": "lua",
+ "file": "${file}"
+ }
+ }
+ },
+ "luajit": {
+ "adapter": "lua-local",
+ "configuration": {
+ "request": "launch",
+ "type": "lua-local",
+ "cwd": "${workspaceFolder}",
+ "program": {
+ "lua": "luajit",
+ "file": "${file}"
+ }
+ }
+ },
+ "love": {
+ "adapter": "lua-local",
+ "configuration": {
+ "request": "launch",
+ "type": "lua-local",
+ "cwd": "${workspaceFolder}",
+ "program": {
+ "command": "love"
+ },
+ "args": ["${workspaceFolder}"]
+ }
+ }
+ }
+ }
+<
+-------------------------------------------------------------------------------
+ *vimspector-other-servers*
+Other servers ~
+
+- Java - vscode-javac. This works, but is not as functional as Java Debug
+ Server. Take a look at this comment [48] for instructions.
+
+===============================================================================
+ *vimspector-customisation*
+Customisation ~
+
+There is very limited support for customisation of the UI.
+
+-------------------------------------------------------------------------------
+ *vimspector-changing-default-signs*
+Changing the default signs ~
+
+Vimsector uses the following signs internally. If they are defined before
+Vimsector uses them, they will not be replaced. So to customise the signs,
+define them in your 'vimrc'.
+
+=============================================================================
+| _Sign_ | _Description_ | _Priority_ |
+=============================================================================
+| 'vimspectorBP' | Line breakpoint | 9 |
+-----------------------------------------------------------------------------
+| 'vimspectorBPCond' | Conditional line breakpoint | 9 |
+-----------------------------------------------------------------------------
+| 'vimspectorBPDisabled' | Disabled breakpoint | 9 |
+-----------------------------------------------------------------------------
+| 'vimspectorPC' | Program counter (i.e. current line) | 200 |
+-----------------------------------------------------------------------------
+| 'vimspectorPCBP' | Program counter and breakpoint | 200 |
+-----------------------------------------------------------------------------
+
+
+The default symbols are the equivalent of something like the following:
+>
+ sign define vimspectorBP text=\ ● texthl=WarningMsg
+ sign define vimspectorBPCond text=\ ◆ texthl=WarningMsg
+ sign define vimspectorBPDisabled text=\ ● texthl=LineNr
+ sign define vimspectorPC text=\ ▶ texthl=MatchParen linehl=CursorLine
+ sign define vimspectorPCBP text=●▶ texthl=MatchParen linehl=CursorLine
+<
+If the signs don't display properly, your font probably doesn't contain these
+glyphs. You can easily change them by defining the sign in your vimrc. For
+example, you could put this in your 'vimrc' to use some simple ASCII symbols:
+>
+ sign define vimspectorBP text=o texthl=WarningMsg
+ sign define vimspectorBPCond text=o? texthl=WarningMsg
+ sign define vimspectorBPDisabled text=o! texthl=LineNr
+ sign define vimspectorPC text=\ > texthl=MatchParen
+ sign define vimspectorPCBP text=o> texthl=MatchParen
+<
+-------------------------------------------------------------------------------
+ *vimspector-sign-priority*
+Sign priority ~
+
+Many different plugins provide signs for various purposes. Examples include
+diagnostic signs for code errors, etc. Vim provides only a single priority to
+determine which sign should be displayed when multiple signs are placed at a
+single line. If you are finding that other signs are interfering with
+vimspector's (or vice-versa), you can customise the priority used by vimspector
+by setting the following dictionary:
+>
+ let g:vimspector_sign_priority = {
+ \ '': ,
+ \ }
+<
+For example:
+>
+ let g:vimspector_sign_priority = {
+ \ 'vimspectorBP': 3,
+ \ 'vimspectorBPCond': 2,
+ \ 'vimspectorBPDisabled': 1,
+ \ 'vimspectorPC': 999,
+ \ }
+<
+All keys are optional. If a sign is not customised, the default priority it
+used (as shown above).
+
+See ':help sign-priority'. The default priority is 10, larger numbers override
+smaller ones.
+
+-------------------------------------------------------------------------------
+ *vimspector-changing-default-window-sizes*
+Changing the default window sizes ~
+
+**_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 following options control the default sizes of the UI windows (all of them
+are numbers)
+
+- 'g:vimspector_sidebar_width' (default: 50 columns): The width in columns of
+ the left utility windows (variables, watches, stack trace)
+
+- 'g:vimspector_bottombar_height' (default 10 lines): The height in rows of
+ the output window below the code window.
+
+Example:
+>
+ let g:vimspector_sidebar_width = 75
+ let g:vimspector_bottombar_height = 15
+<
+-------------------------------------------------------------------------------
+ *vimspector-changing-terminal-size*
+Changing the terminal size ~
+
+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.
+
+Example:
+>
+ let g:vimspector_code_minwidth = 90
+ let g:vimspector_terminal_maxwidth = 75
+ let g:vimspector_terminal_minwidth = 20
+<
+-------------------------------------------------------------------------------
+ *vimspector-custom-mappings-while-debugging*
+Custom mappings while debugging ~
+
+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 '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.
+
+-------------------------------------------------------------------------------
+ *vimspector-advanced-ui-customisation*
+Advanced UI customisation ~
+
+**_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:
+
+- Hide a particular window or windows
+- Move a particular window or windows
+- Resize windows
+- Have multiple windows for a particular buffer (say, you want 2 watch
+ windows)
+- etc.
+
+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 session
+- 'VimspectorTerminalOpened': 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.tagpage': The tab page for the session
+- 'g: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
+
+-------------------------------------------------------------------------------
+ *vimspector-customising-winbar*
+Customising the WinBar ~
+
+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 } )
+ nnoremenu WinBar.▶\ Cont :call vimspector#Continue()
+ nnoremenu WinBar.▷\ Pause :call vimspector#Pause()
+ nnoremenu WinBar.↷\ Next :call vimspector#StepOver()
+ nnoremenu WinBar.→\ Step :call vimspector#StepInto()
+ nnoremenu WinBar.←\ Out :call vimspector#StepOut()
+ nnoremenu WinBar.⟲: :call vimspector#Restart()
+ nnoremenu WinBar.✕ :call vimspector#Reset( { 'interactive': v:false } )
+<
+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
+ " Cretae our own WinBar
+ nnoremenu WinBar.Kill :call vimspector#Stop( { 'interactive': v:true } )
+ nnoremenu WinBar.Continue :call vimspector#Continue()
+ nnoremenu WinBar.Pause :call vimspector#Pause()
+ nnoremenu WinBar.Step\ Over :call vimspector#StepOver()
+ nnoremenu WinBar.Step\ In :call vimspector#StepInto()
+ nnoremenu WinBar.Step\ Out :call vimspector#StepOut()
+ nnoremenu WinBar.Restart :call vimspector#Restart()
+ nnoremenu WinBar.Exit :call vimspector#Reset()
+ endfunction
+
+ augroup MyVimspectorUICustomistaion
+ autocmd!
+ autocmd User VimspectorUICreated call s:CustomiseUI()
+ augroup END
+<
+-------------------------------------------------------------------------------
+ *vimspector-example*
+Example ~
+
+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 '.
+
+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-faq*
+FAQ ~
+
+1. Q: Does it work? A: Yeah. It's a bit unpolished.
+
+2. Q: Does it work with _this_ language? A: Probably, but it won't
+ necessarily be easy to work out what to put in the '.vimspector.json'. As
+ you can see above, some of the servers aren't really editor agnostic, and
+ require very-specific unique handling.
+
+3. How do I stop it starting a new Terminal.app on macOS? See this comment
+ [49]
+
+4. Can I specify answers to the annoying questions about exception
+ breakpoints in my '.vimspector.json' ? Yes, see here [23].
+
+5. Do I have to specify the file to execute in '.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 [20] for complete list of replacements
+ in the configuration file.
+
+6. You allow comments in '.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
+<
+1. What is the difference between a '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.
+
+2. The signs and winbar display funny symbols. How do I fix them? See this
+ and this
+
+3. What's this telemetry stuff all about? Are you sending my data to evil
+ companies? Debug adapters (for some reason) send telemetry data to
+ clients. Vimspector simply displays this information in the output
+ window. It _does not_ and _will not ever_ collect, use, forward or
+ otherwise share any data with any third parties.
+
+===============================================================================
+ *vimspector-references*
+References ~
+
+[1] https://puremourning.github.io/vimspector-web/
+[2] https://puremourning.github.io/vimspector/configuration.html
+[3] https://github.com/puremourning/vimspector/workflows/Build/badge.svg?branch=master
+[4] https://gitter.im/vimspector/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
+[5] https://badges.gitter.im/vimspector/Lobby.svg
+[6] https://puremourning.github.io/vimspector-web/img/vimspector-overview.png
+[7] https://asciinema.org/a/VmptWmFHTNLPfK3DVsrR2bv8S
+[8] https://asciinema.org/a/VmptWmFHTNLPfK3DVsrR2bv8S.svg
+[9] https://asciinema.org/a/1wZJSoCgs3AvjkhKwetJOJhDh
+[10] https://asciinema.org/a/1wZJSoCgs3AvjkhKwetJOJhDh.svg
+[11] https://github.com/go-delve/delve
+[12] https://github.com/puremourning/vimspector/wiki/languages
+[13] https://asciinema.org/a/Hfu4ZvuyTZun8THNen9FQbTay
+[14] https://asciinema.org/a/Hfu4ZvuyTZun8THNen9FQbTay.svg
+[15] https://trello.com/b/yvAKK0rD/vimspector
+[16] http://www.apache.org/licenses/LICENSE-2.0
+[17] https://greyhoundrescuewales.co.uk
+[18] https://www.cancerresearchuk.org
+[19] https://iccf.nl
+[20] https://puremourning.github.io/vimspector/configuration.html#replacements-and-variables
+[21] https://puremourning.github.io/vimspector/configuration.html#configuration-selection
+[22] €mappings
+[23] https://puremourning.github.io/vimspector/configuration.html#exception-breakpoints
+[24] https://puremourning.github.io/vimspector-web/img/vimspector-code-window.png
+[25] https://puremourning.github.io/vimspector-web/img/vimspector-locals-window.png
+[26] https://puremourning.github.io/vimspector-web/img/vimspector-variable-eval-hover.png
+[27] https://puremourning.github.io/vimspector-web/img/vimspector-watch-window.png
+[28] https://puremourning.github.io/vimspector-web/img/vimspector-callstack-window.png
+[29] https://puremourning.github.io/vimspector-web/img/vimspector-output-window.png
+[30] https://github.com/Microsoft/vscode-cpptools
+[31] https://puremourning.github.io/vimspector/configuration.html#remote-debugging-support
+[32] https://github.com/vadimcn/vscode-lldb#features
+[33] https://github.com/microsoft/debugpy
+[34] https://github.com/microsoft/debugpy#debugpy-cli-usage
+[35] https://github.com/microsoft/debugpy/wiki/Debug-configuration-settings
+[36] https://github.com/microsoft/debugpy/wiki/Debugging-over-SSH
+[37] https://github.com/Microsoft/vscode-python
+[38] https://github.com/puremourning/vimspector/issues/105
+[39] https://github.com/puremourning/TclProDebug
+[40] https://github.com/go-delve/delve/tree/master/Documentation/installation
+[41] https://github.com/golang/vscode-go/blob/master/docs/debugging.md#troubleshooting
+[42] https://github.com/Microsoft/java-debug
+[43] https://github.com/ycm-core/YouCompleteMe#java-semantic-completion
+[44] https://github.com/ycm-core/YouCompleteMe#troubleshooting
+[45] https://code.visualstudio.com/docs/java/java-debugging
+[46] https://github.com/puremourning/vimspector/issues/3
+[47] https://github.com/tomblind/local-lua-debugger-vscode
+[48] https://github.com/puremourning/vimspector/issues/3#issuecomment-576916076
+[49] https://github.com/puremourning/vimspector/issues/90#issuecomment-577857322
+
+vim: ft=help
diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock
index d2eb55f..acf20f2 100644
--- a/docs/Gemfile.lock
+++ b/docs/Gemfile.lock
@@ -1,13 +1,13 @@
GEM
remote: https://rubygems.org/
specs:
- activesupport (6.0.3.4)
+ activesupport (6.0.3.6)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
zeitwerk (~> 2.2, >= 2.2.2)
- addressable (2.7.0)
+ addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
coffee-script (2.4.1)
coffee-script-source
@@ -16,7 +16,7 @@ GEM
colorator (1.1.0)
commonmarker (0.17.13)
ruby-enum (~> 0.5)
- concurrent-ruby (1.1.7)
+ concurrent-ruby (1.1.8)
dnsruby (1.61.5)
simpleidn (~> 0.1)
em-websocket (0.5.2)
@@ -30,12 +30,12 @@ GEM
faraday-net_http (~> 1.0)
multipart-post (>= 1.2, < 3)
ruby2_keywords
- faraday-net_http (1.0.0)
- ffi (1.14.2)
+ faraday-net_http (1.0.1)
+ ffi (1.15.0)
forwardable-extended (2.6.0)
gemoji (3.0.1)
- github-pages (209)
- github-pages-health-check (= 1.16.1)
+ github-pages (214)
+ github-pages-health-check (= 1.17.0)
jekyll (= 3.9.0)
jekyll-avatar (= 0.7.0)
jekyll-coffeescript (= 1.1.1)
@@ -50,9 +50,9 @@ GEM
jekyll-readme-index (= 0.3.0)
jekyll-redirect-from (= 0.16.0)
jekyll-relative-links (= 0.6.1)
- jekyll-remote-theme (= 0.4.2)
+ jekyll-remote-theme (= 0.4.3)
jekyll-sass-converter (= 1.5.2)
- jekyll-seo-tag (= 2.6.1)
+ jekyll-seo-tag (= 2.7.1)
jekyll-sitemap (= 1.4.0)
jekyll-swiss (= 1.0.0)
jekyll-theme-architect (= 0.1.1)
@@ -70,19 +70,19 @@ GEM
jekyll-theme-time-machine (= 0.1.1)
jekyll-titles-from-headings (= 0.5.3)
jemoji (= 0.12.0)
- kramdown (= 2.3.0)
+ kramdown (= 2.3.1)
kramdown-parser-gfm (= 1.1.0)
liquid (= 4.0.3)
mercenary (~> 0.3)
minima (= 2.5.1)
nokogiri (>= 1.10.4, < 2.0)
- rouge (= 3.23.0)
+ rouge (= 3.26.0)
terminal-table (~> 1.4)
- github-pages-health-check (1.16.1)
+ github-pages-health-check (1.17.0)
addressable (~> 2.3)
dnsruby (~> 1.60)
octokit (~> 4.0)
- public_suffix (~> 3.0)
+ public_suffix (>= 2.0.2, < 5.0)
typhoeus (~> 1.3)
html-pipeline (2.14.0)
activesupport (>= 2)
@@ -136,15 +136,15 @@ GEM
jekyll (>= 3.3, < 5.0)
jekyll-relative-links (0.6.1)
jekyll (>= 3.3, < 5.0)
- jekyll-remote-theme (0.4.2)
+ jekyll-remote-theme (0.4.3)
addressable (~> 2.0)
jekyll (>= 3.5, < 5.0)
jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0)
rubyzip (>= 1.3.0, < 3.0)
jekyll-sass-converter (1.5.2)
sass (~> 3.4)
- jekyll-seo-tag (2.6.1)
- jekyll (>= 3.3, < 5.0)
+ jekyll-seo-tag (2.7.1)
+ jekyll (>= 3.8, < 5.0)
jekyll-sitemap (1.4.0)
jekyll (>= 3.7, < 5.0)
jekyll-swiss (1.0.0)
@@ -196,23 +196,23 @@ GEM
gemoji (~> 3.0)
html-pipeline (~> 2.2)
jekyll (>= 3.0, < 5.0)
- kramdown (2.3.0)
+ kramdown (2.3.1)
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
- listen (3.4.0)
+ listen (3.5.1)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.3.6)
- mini_portile2 (2.5.0)
+ mini_portile2 (2.5.1)
minima (2.5.1)
jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
- minitest (5.14.3)
+ minitest (5.14.4)
multipart-post (2.1.1)
- nokogiri (1.11.1)
+ nokogiri (1.11.5)
mini_portile2 (~> 2.5.0)
racc (~> 1.4)
octokit (4.20.0)
@@ -220,16 +220,16 @@ GEM
sawyer (~> 0.8.0, >= 0.5.3)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
- public_suffix (3.1.1)
+ public_suffix (4.0.6)
racc (1.5.2)
rb-fsevent (0.10.4)
rb-inotify (0.10.1)
ffi (~> 1.0)
- rexml (3.2.4)
- rouge (3.23.0)
- ruby-enum (0.8.0)
+ rexml (3.2.5)
+ rouge (3.26.0)
+ ruby-enum (0.9.0)
i18n
- ruby2_keywords (0.0.2)
+ ruby2_keywords (0.0.4)
rubyzip (2.3.0)
safe_yaml (1.0.5)
sass (3.7.4)
@@ -240,7 +240,7 @@ GEM
sawyer (0.8.2)
addressable (>= 2.3.5)
faraday (> 0.8, < 2.0)
- simpleidn (0.1.1)
+ simpleidn (0.2.1)
unf (~> 0.1.4)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
diff --git a/docs/configuration.md b/docs/configuration.md
index e736985..3d524bf 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -271,7 +271,7 @@ JSON value `true`, and the suffix is stripped fom the key, resulting in the
following:
```json
- "stopOnEntry#json": true
+ "stopOnEntry": true
```
Which is what we need.
@@ -722,7 +722,7 @@ Vimspector then orchestrates the various tools to set you up.
"variables": {
// Just an example of how to specify a variable manually rather than
// vimspector asking for input from the user
- "ServiceName": "${fileBasenameNoExtention}"
+ "ServiceName": "${fileBasenameNoExtension}"
},
"adapter": "python-remote",
diff --git a/plugin/vimspector.vim b/plugin/vimspector.vim
index 37509a7..2668bf1 100644
--- a/plugin/vimspector.vim
+++ b/plugin/vimspector.vim
@@ -13,6 +13,13 @@
" See the License for the specific language governing permissions and
" limitations under the License.
+if !has( 'python3' )
+ echohl WarningMsg
+ echom 'Vimspector unavailable: Requires Vim compiled with +python3'
+ echohl None
+ finish
+endif
+
" Boilerplate {{{
let s:save_cpo = &cpoptions
set cpoptions&vim
@@ -35,6 +42,8 @@ let s:mappings = get( g:, 'vimspector_enable_mappings', '' )
nnoremap VimspectorContinue
\ :call vimspector#Continue()
+nnoremap VimspectorLaunch
+ \ :call vimspector#Launch( v:true )
nnoremap VimspectorStop
\ :call vimspector#Stop()
nnoremap VimspectorRestart
@@ -84,6 +93,7 @@ if s:mappings ==# 'VISUAL_STUDIO'
nmap VimspectorStepOut
elseif s:mappings ==# 'HUMAN'
nmap VimspectorContinue
+ nmap VimspectorLaunch
nmap VimspectorStop
nmap VimspectorRestart
nmap VimspectorPause
@@ -105,6 +115,9 @@ command! -bar -nargs=? -complete=custom,vimspector#CompleteOutput
command! -bar
\ VimspectorToggleLog
\ call vimspector#ToggleLog()
+command! -bar
+ \ VimspectorDebugInfo
+ \ call vimspector#PrintDebugInfo()
command! -nargs=1 -complete=custom,vimspector#CompleteExpr
\ VimspectorEval
\ call vimspector#Evaluate( )
diff --git a/python3/vimspector/custom/java.py b/python3/vimspector/custom/java.py
new file mode 100644
index 0000000..c2a2264
--- /dev/null
+++ b/python3/vimspector/custom/java.py
@@ -0,0 +1,51 @@
+# vimspector - A multi-language debugging system for Vim
+# Copyright 2021 Ben Jackson
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from vimspector.debug_session import DebugSession
+from vimspector import utils, settings
+
+
+class JavaDebugAdapter( object ):
+ def __init__( self, debug_session: DebugSession ):
+ self.debug_session = debug_session
+
+ def OnEvent_hotcodereplace( self, message ):
+ # Hack for java debug server hot-code-replace
+ body = message.get( 'body' ) or {}
+
+ if body.get( 'type' ) != 'hotcodereplace':
+ return
+
+ if body.get( 'changeType' ) == 'BUILD_COMPLETE':
+ def handler( result ):
+ if result == 1:
+ self.debug_session._connection.DoRequest( None, {
+ 'command': 'redefineClasses',
+ 'arguments': {},
+ } )
+
+ mode = settings.Get( 'java_hotcodereplace_mode' )
+ if mode == 'ask':
+ utils.Confirm( self.debug_session._api_prefix,
+ 'Code has changed, hot reload?',
+ handler,
+ default_value = 1 )
+ elif mode == 'always':
+ self.debug_session._connection.DoRequest( None, {
+ 'command': 'redefineClasses',
+ 'arguments': {},
+ } )
+ elif body.get( 'message' ):
+ utils.UserMessage( 'Hot code replace: ' + body[ 'message' ] )
diff --git a/python3/vimspector/debug_adapter_connection.py b/python3/vimspector/debug_adapter_connection.py
index 283c40c..206938a 100644
--- a/python3/vimspector/debug_adapter_connection.py
+++ b/python3/vimspector/debug_adapter_connection.py
@@ -29,14 +29,14 @@ class PendingRequest( object ):
class DebugAdapterConnection( object ):
- def __init__( self, handler, send_func ):
+ def __init__( self, handlers, send_func ):
self._logger = logging.getLogger( __name__ )
utils.SetUpLogging( self._logger )
self._Write = send_func
self._SetState( 'READ_HEADER' )
self._buffer = bytes()
- self._handler = handler
+ self._handlers = handlers
self._next_message_id = 0
self._outstanding_requests = {}
@@ -124,7 +124,7 @@ class DebugAdapterConnection( object ):
def Reset( self ):
self._Write = None
- self._handler = None
+ self._handlers = None
while self._outstanding_requests:
_, request = self._outstanding_requests.popitem()
@@ -226,7 +226,12 @@ class DebugAdapterConnection( object ):
# self._logger.debug( 'Message received (raw): %s', payload )
- message = json.loads( payload )
+ try:
+ message = json.loads( payload, strict = False )
+ except Exception:
+ self._logger.exception( "Invalid message received: %s", payload )
+ self._SetState( 'READ_HEADER' )
+ raise
self._logger.debug( 'Message received: {0}'.format( message ) )
@@ -237,7 +242,7 @@ class DebugAdapterConnection( object ):
def _OnMessageReceived( self, message ):
- if not self._handler:
+ if not self._handlers:
return
if message[ 'type' ] == 'response':
@@ -270,25 +275,21 @@ class DebugAdapterConnection( object ):
self._logger.error( 'Request failed: {0}'.format( reason ) )
if request.failure_handler:
request.failure_handler( reason, message )
- elif 'OnFailure' in dir( self._handler ):
- self._handler.OnFailure( reason, request.msg, message )
else:
- utils.UserMessage( 'Request failed: {0}'.format( reason ) )
+ for h in self._handlers:
+ if 'OnFailure' in dir( h ):
+ h.OnFailure( reason, request.msg, message )
+
elif message[ 'type' ] == 'event':
method = 'OnEvent_' + message[ 'event' ]
- if method in dir( self._handler ):
- getattr( self._handler, method )( message )
- else:
- utils.UserMessage( 'Unhandled event: {0}'.format( message[ 'event' ] ),
- persist = True )
+ for h in self._handlers:
+ if method in dir( h ):
+ getattr( h, method )( message )
elif message[ 'type' ] == 'request':
method = 'OnRequest_' + message[ 'command' ]
- if method in dir( self._handler ):
- getattr( self._handler, method )( message )
- else:
- utils.UserMessage(
- 'Unhandled request: {0}'.format( message[ 'command' ] ),
- persist = True )
+ for h in self._handlers:
+ if method in dir( h ):
+ getattr( h, method )( message )
def _KillTimer( request ):
diff --git a/python3/vimspector/debug_session.py b/python3/vimspector/debug_session.py
index 4d8c816..36ad62b 100644
--- a/python3/vimspector/debug_session.py
+++ b/python3/vimspector/debug_session.py
@@ -21,6 +21,7 @@ import shlex
import subprocess
import functools
import vim
+import importlib
from vimspector import ( breakpoints,
code,
@@ -99,7 +100,7 @@ class DebugSession( object ):
return launch_config_file, configurations
- def Start( self, launch_variables = None ):
+ def Start( self, force_choose=False, launch_variables = None ):
# We mutate launch_variables, so don't mutate the default argument.
# https://docs.python-guide.org/writing/gotchas/#mutable-default-arguments
if launch_variables is None:
@@ -134,6 +135,11 @@ class DebugSession( object ):
if 'configuration' in launch_variables:
configuration_name = launch_variables.pop( 'configuration' )
+ elif force_choose:
+ # Always display the menu
+ configuration_name = utils.SelectFromList(
+ 'Which launch configuration?',
+ sorted( configurations.keys() ) )
elif ( len( configurations ) == 1 and
next( iter( configurations.values() ) ).get( "autoselect", True ) ):
configuration_name = next( iter( configurations.keys() ) )
@@ -888,8 +894,21 @@ class DebugSession( object ):
self._splash_screen,
"Unable to start adapter" )
else:
+ if 'custom_handler' in self._adapter:
+ spec = self._adapter[ 'custom_handler' ]
+ if isinstance( spec, dict ):
+ module = spec[ 'module' ]
+ cls = spec[ 'class' ]
+ else:
+ module, cls = spec.rsplit( '.', 1 )
+
+ CustomHandler = getattr( importlib.import_module( module ), cls )
+ handlers = [ CustomHandler( self ), self ]
+ else:
+ handlers = [ self ]
+
self._connection = debug_adapter_connection.DebugAdapterConnection(
- self,
+ handlers,
lambda msg: utils.Call(
"vimspector#internal#{}#Send".format( self._connection_type ),
msg ) )
@@ -897,39 +916,58 @@ class DebugSession( object ):
self._logger.info( 'Debug Adapter Started' )
def _StopDebugAdapter( self, interactive = False, callback = None ):
- self._splash_screen = utils.DisplaySplash(
- self._api_prefix,
- self._splash_screen,
- "Shutting down debug adapter..." )
-
- def handler( *args ):
- self._splash_screen = utils.HideSplash( self._api_prefix,
- self._splash_screen )
-
- if callback:
- self._logger.debug( "Setting server exit handler before disconnect" )
- assert not self._run_on_server_exit
- self._run_on_server_exit = callback
-
- vim.eval( 'vimspector#internal#{}#StopDebugSession()'.format(
- self._connection_type ) )
-
arguments = {}
- if ( interactive and
- self._server_capabilities.get( 'supportTerminateDebuggee' ) ):
- if self._stackTraceView.AnyThreadsRunning():
- choice = utils.AskForInput( "Terminate debuggee [Y/N/default]? ", "" )
- if choice == "Y" or choice == "y":
+
+ def disconnect():
+ self._splash_screen = utils.DisplaySplash(
+ self._api_prefix,
+ self._splash_screen,
+ "Shutting down debug adapter..." )
+
+ def handler( *args ):
+ self._splash_screen = utils.HideSplash( self._api_prefix,
+ self._splash_screen )
+
+ if callback:
+ self._logger.debug( "Setting server exit handler before disconnect" )
+ assert not self._run_on_server_exit
+ self._run_on_server_exit = callback
+
+ vim.eval( 'vimspector#internal#{}#StopDebugSession()'.format(
+ self._connection_type ) )
+
+ self._connection.DoRequest( handler, {
+ 'command': 'disconnect',
+ 'arguments': arguments,
+ }, failure_handler = handler, timeout = 5000 )
+
+ if not interactive:
+ disconnect()
+ elif not self._server_capabilities.get( 'supportTerminateDebuggee' ):
+ disconnect()
+ elif not self._stackTraceView.AnyThreadsRunning():
+ disconnect()
+ else:
+ def handle_choice( choice ):
+ if choice == 1:
+ # yes
arguments[ 'terminateDebuggee' ] = True
- elif choice == "N" or choice == 'n':
+ elif choice == 2:
+ # no
arguments[ 'terminateDebuggee' ] = False
+ elif choice <= 0:
+ # Abort
+ return
+ # Else, use server default
- self._connection.DoRequest( handler, {
- 'command': 'disconnect',
- 'arguments': arguments,
- }, failure_handler = handler, timeout = 5000 )
+ disconnect()
- # TODO: Use the 'tarminate' request if supportsTerminateRequest set
+ utils.Confirm( self._api_prefix,
+ "Terminate debuggee?",
+ handle_choice,
+ default_value = 3,
+ options = [ '(Y)es', '(N)o', '(D)efault' ],
+ keys = [ 'y', 'n', 'd' ] )
def _PrepareAttach( self, adapter_config, launch_config ):
@@ -1232,6 +1270,37 @@ class DebugSession( object ):
self._stackTraceView.LoadThreads( True )
+ @IfConnected()
+ @RequiresUI()
+ def PrintDebugInfo( self ):
+ def Line():
+ return ( "--------------------------------------------------------------"
+ "------------------" )
+
+ def Pretty( obj ):
+ if obj is None:
+ return [ "None" ]
+ return [ Line() ] + json.dumps( obj, indent=2 ).splitlines() + [ Line() ]
+
+
+ debugInfo = [
+ "Vimspector Debug Info",
+ Line(),
+ f"ConnectionType: { self._connection_type }",
+ "Adapter: " ] + Pretty( self._adapter ) + [
+ "Configuration: " ] + Pretty( self._configuration ) + [
+ f"API Prefix: { self._api_prefix }",
+ f"Launch/Init: { self._launch_complete } / { self._init_complete }",
+ f"Workspace Root: { self._workspace_root }",
+ "Launch Config: " ] + Pretty( self._launch_config ) + [
+ "Server Capabilities: " ] + Pretty( self._server_capabilities ) + [
+ ]
+
+ self._outputView.ClearCategory( 'DebugInfo' )
+ self._outputView.Print( "DebugInfo", debugInfo )
+ self.ShowOutput( "DebugInfo" )
+
+
def OnEvent_loadedSource( self, msg ):
pass
diff --git a/python3/vimspector/gadgets.py b/python3/vimspector/gadgets.py
index d1b6872..02eb0e7 100644
--- a/python3/vimspector/gadgets.py
+++ b/python3/vimspector/gadgets.py
@@ -30,12 +30,12 @@ GADGETS = {
root,
gadget ),
'all': {
- 'version': '0.27.0',
+ 'version': '1.6.0',
"adapters": {
"vscode-cpptools": {
"name": "cppdbg",
"command": [
- "${gadgetDir}/vscode-cpptools/debugAdapters/OpenDebugAD7"
+ "${gadgetDir}/vscode-cpptools/debugAdapters/bin/OpenDebugAD7"
],
"attach": {
"pidProperty": "processId",
@@ -53,17 +53,17 @@ GADGETS = {
'linux': {
'file_name': 'cpptools-linux.vsix',
'checksum':
- '3695202e1e75a03de18049323b66d868165123f26151f8c974a480eaf0205435',
+ 'c25299bcfb46b22d41aa3f125df7184e6282a35ff9fb69c47def744cb4778f55',
},
'macos': {
- 'file_name': 'cpptools-osx.vsix',
+ 'file_name': 'cpptools-osx-arm64.vsix',
'checksum':
- 'cb061e3acd7559a539e5586f8d3f535101c4ec4e8a48195856d1d39380b5cf3c',
+ 'ceb3e8cdaa2b5bb45af50913ddd8402089969748af8d70f5d46480408287ba6f',
},
'windows': {
'file_name': 'cpptools-win32.vsix',
'checksum':
- 'aa294368ed16d48c59e49c8000e146eae5a19ad07b654efed5db8ec93b24229e',
+ 'ef7ac5831874a3c7dbf0feb826bfda2be579aff9b6d990622fff1d0d4ede00d1',
"adapters": {
"vscode-cpptools": {
"name": "cppdbg",
@@ -86,29 +86,6 @@ GADGETS = {
},
},
},
- 'vscode-python': {
- 'language': 'python.legacy',
- 'enabled': False,
- 'download': {
- 'url': 'https://github.com/Microsoft/vscode-python/releases/download/'
- '${version}/${file_name}',
- },
- 'all': {
- 'version': '2019.11.50794',
- 'file_name': 'ms-python-release.vsix',
- 'checksum':
- '6a9edf9ecabed14aac424e6007858068204a3638bf3bb4f235bd6035d823acc6',
- },
- 'adapters': {
- "vscode-python": {
- "name": "vscode-python",
- "command": [
- "node",
- "${gadgetDir}/vscode-python/out/client/debugger/debugAdapter/main.js",
- ],
- }
- },
- },
'debugpy': {
'language': 'python',
'download': {
@@ -159,7 +136,8 @@ GADGETS = {
"port": "${DAPPort}",
"configuration": {
"cwd": "${workspaceRoot}"
- }
+ },
+ 'custom_handler': 'vimspector.custom.java.JavaDebugAdapter'
}
},
},
@@ -233,15 +211,15 @@ GADGETS = {
'format': 'tar',
},
'all': {
- 'version': '1.2.0-635'
+ 'version': '1.2.0-782'
},
'macos': {
'file_name': 'netcoredbg-osx.tar.gz',
'checksum':
- '71c773e34d358950f25119bade7e3081c4c2f9d71847bd49027ca5792e918beb',
+ '',
},
'linux': {
- 'file_name': 'netcoredbg-linux-bionic.tar.gz',
+ 'file_name': 'netcoredbg-linux-bionic-amd64.tar.gz',
'checksum': '',
},
'windows': {
@@ -268,41 +246,6 @@ GADGETS = {
},
}
},
- 'vscode-mono-debug': {
- 'language': 'csharp',
- 'enabled': False,
- 'download': {
- 'url': 'https://marketplace.visualstudio.com/_apis/public/gallery/'
- 'publishers/ms-vscode/vsextensions/mono-debug/${version}/'
- 'vspackage',
- 'target': 'vscode-mono-debug.vsix.gz',
- 'format': 'zip.gz',
- },
- 'all': {
- 'file_name': 'vscode-mono-debug.vsix',
- 'version': '0.16.2',
- 'checksum':
- '121eca297d83daeeb1e6e1d791305d1827998dbd595c330086b3b94d33dba3b9',
- },
- 'adapters': {
- 'vscode-mono-debug': {
- "name": "mono-debug",
- "command": [
- "mono",
- "${gadgetDir}/vscode-mono-debug/bin/Release/mono-debug.exe"
- ],
- "attach": {
- "pidSelect": "none"
- },
- "configuration": {
- "cwd": "${workspaceRoot}",
- "console": "integratedTerminal",
- "args": [],
- "env": {}
- }
- },
- }
- },
'vscode-bash-debug': {
'language': 'bash',
'download': {
@@ -380,10 +323,10 @@ GADGETS = {
'${version}/${file_name}',
},
'all': {
- 'version': 'v1.14.9',
- 'file_name': 'php-debug.vsix',
+ 'version': 'v1.17.0',
+ 'file_name': 'php-debug-1.17.0.vsix',
'checksum':
- '0c5709cbbffe26b12aa63a88142195a9a045a5d8fca7fe63d62c789fe601630d',
+ 'd0fff272503414b6696cc737bc2e18e060fdd5e5dc4bcaf38ae7373afd8d8bc9',
},
'adapters': {
'vscode-php-debug': {
@@ -451,12 +394,12 @@ GADGETS = {
'${version}/${file_name}',
},
'all': {
- 'version': 'v1.5.3',
+ 'version': 'v1.6.6',
},
'macos': {
- 'file_name': 'codelldb-x86_64-darwin.vsix',
+ 'file_name': 'codelldb-aarch64-darwin.vsix',
'checksum':
- '7505bc1cdfcfd1cb981e2996aec62d63577440709bac31dcadb41a3b4b44631a',
+ '5adc3b9139eabdafd825bd5efc55df4424a203fb2b6087b425cd434956e7ec58',
'make_executable': [
'adapter/codelldb',
'lldb/bin/debugserver',
@@ -467,7 +410,7 @@ GADGETS = {
'linux': {
'file_name': 'codelldb-x86_64-linux.vsix',
'checksum':
- 'ce7efc3e94d775368e5942a02bf5c326b6809a0b4c389f79ffa6a8f6f6b72139',
+ 'eda2cd9b3089dcc0524c273e91ffb5875fe08c930bf643739a2cd1846e1f98d6',
'make_executable': [
'adapter/codelldb',
'lldb/bin/lldb',
@@ -478,7 +421,7 @@ GADGETS = {
'windows': {
'file_name': 'codelldb-x86_64-windows.vsix',
'checksum':
- '',
+ '8ddebe8381a3d22dc3d95139c3797fda06b5cc34aadf300e13b1c516b9da95fe',
'make_executable': []
},
'adapters': {
diff --git a/python3/vimspector/installer.py b/python3/vimspector/installer.py
index f0f85a4..a81db8f 100644
--- a/python3/vimspector/installer.py
+++ b/python3/vimspector/installer.py
@@ -358,7 +358,8 @@ def InstallCppTools( name, root, gadget ):
# It's hilarious, but the execute bits aren't set in the vsix. So they
# actually have javascript code which does this. It's just a horrible horrible
# hack that really is not funny.
- MakeExecutable( os.path.join( extension, 'debugAdapters', 'OpenDebugAD7' ) )
+ MakeExecutable(
+ os.path.join( extension, 'debugAdapters', 'bin', 'OpenDebugAD7' ) )
with open( os.path.join( extension, 'package.json' ) ) as f:
package = json.load( f )
runtime_dependencies = package[ 'runtimeDependencies' ]
diff --git a/python3/vimspector/output.py b/python3/vimspector/output.py
index c453417..3f0da1e 100644
--- a/python3/vimspector/output.py
+++ b/python3/vimspector/output.py
@@ -32,6 +32,7 @@ class TabBuffer( object ):
BUFFER_MAP = {
'console': 'Console',
'stdout': 'Console',
+ 'output': 'Console',
'stderr': 'stderr',
'telemetry': None,
}
@@ -64,8 +65,11 @@ class OutputView( object ):
self._api_prefix = api_prefix
VIEWS.add( self )
- def Print( self, categroy, text ):
- self._Print( 'server', text.splitlines() )
+ def Print( self, category, text: typing.Union[ str, list ] ):
+ if not isinstance( text, list ):
+ text = text.splitlines()
+
+ self._Print( category, text )
def OnOutput( self, event ):
category = CategoryToBuffer( event.get( 'category' ) or 'output' )
@@ -104,13 +108,26 @@ class OutputView( object ):
def Clear( self ):
for category, tab_buffer in self._buffers.items():
- if tab_buffer.is_job:
- utils.CleanUpCommand( category, self._api_prefix )
- utils.CleanUpHiddenBuffer( tab_buffer.buf )
+ self._CleanUpBuffer( category, tab_buffer )
# FIXME: nunmenu the WinBar ?
self._buffers = {}
+
+ def ClearCategory( self, category: str ):
+ if category not in self._buffers:
+ return
+
+ self._CleanUpBuffer( category, self._buffers[ category ] )
+
+
+ def _CleanUpBuffer( self, category: str, tab_buffer: TabBuffer ):
+ if tab_buffer.is_job:
+ utils.CleanUpCommand( category, self._api_prefix )
+
+ utils.CleanUpHiddenBuffer( tab_buffer.buf )
+
+
def WindowIsValid( self ):
return self._window.valid
diff --git a/python3/vimspector/settings.py b/python3/vimspector/settings.py
index e9e76ea..89378af 100644
--- a/python3/vimspector/settings.py
+++ b/python3/vimspector/settings.py
@@ -42,7 +42,8 @@ DEFAULTS = {
'vimspectorBP': 9,
'vimspectorBPCond': 9,
'vimspectorBPDisabled': 9,
- 'vimspectorCurrentThread': 200
+ 'vimspectorCurrentThread': 200,
+ 'vimspectorCurrentFrame': 200,
},
# Installer
@@ -59,7 +60,10 @@ DEFAULTS = {
'expand_or_jump': [ '', '<2-LeftMouse>' ],
'focus_thread': [ '' ],
}
- }
+ },
+
+ # Custom
+ 'java_hotcodereplace_mode': 'ask',
}
diff --git a/python3/vimspector/stack_trace.py b/python3/vimspector/stack_trace.py
index ae14e68..8b1d848 100644
--- a/python3/vimspector/stack_trace.py
+++ b/python3/vimspector/stack_trace.py
@@ -102,7 +102,8 @@ class StackTraceView( object ):
self._scratch_buffers = []
# FIXME: This ID is by group, so should be module scope
- self._next_sign_id = 1
+ self._current_thread_sign_id = 0 # 1 when used
+ self._current_frame_sign_id = 0 # 2 when used
utils.SetUpHiddenBuffer( self._buf, 'vimspector.StackTrace' )
utils.SetUpUIWindow( win )
@@ -127,6 +128,7 @@ class StackTraceView( object ):
':call vimspector#SetCurrentThread()' )
win.options[ 'cursorline' ] = False
+ win.options[ 'signcolumn' ] = 'auto'
if not signs.SignDefined( 'vimspectorCurrentThread' ):
@@ -136,6 +138,13 @@ class StackTraceView( object ):
texthl = 'MatchParen',
linehl = 'CursorLine' )
+ if not signs.SignDefined( 'vimspectorCurrentFrame' ):
+ signs.DefineSign( 'vimspectorCurrentFrame',
+ text = '▶ ',
+ double_text = '▶',
+ texthl = 'Special',
+ linehl = 'CursorLine' )
+
self._line_to_frame = {}
self._line_to_thread = {}
@@ -157,9 +166,12 @@ class StackTraceView( object ):
self._sources = {}
self._requesting_threads = StackTraceView.ThreadRequestState.NO
self._pending_thread_request = None
- if self._next_sign_id:
- signs.UnplaceSign( self._next_sign_id, 'VimspectorStackTrace' )
- self._next_sign_id = 0
+ if self._current_thread_sign_id:
+ signs.UnplaceSign( self._current_thread_sign_id, 'VimspectorStackTrace' )
+ self._current_thread_sign_id = 0
+ if self._current_frame_sign_id:
+ signs.UnplaceSign( self._current_frame_sign_id, 'VimspectorStackTrace' )
+ self._current_frame_sign_id = 0
with utils.ModifiableScratchBuffer( self._buf ):
utils.ClearBuffer( self._buf )
@@ -273,10 +285,10 @@ class StackTraceView( object ):
self._line_to_frame.clear()
self._line_to_thread.clear()
- if self._next_sign_id:
- signs.UnplaceSign( self._next_sign_id, 'VimspectorStackTrace' )
+ if self._current_thread_sign_id:
+ signs.UnplaceSign( self._current_thread_sign_id, 'VimspectorStackTrace' )
else:
- self._next_sign_id = 1
+ self._current_thread_sign_id = 1
with utils.ModifiableScratchBuffer( self._buf ):
with utils.RestoreCursorPosition():
@@ -290,7 +302,7 @@ class StackTraceView( object ):
f'({thread.State()})' )
if self._current_thread == thread.id:
- signs.PlaceSign( self._next_sign_id,
+ signs.PlaceSign( self._current_thread_sign_id,
'VimspectorStackTrace',
'vimspectorCurrentThread',
self._buf.name,
@@ -421,6 +433,7 @@ class StackTraceView( object ):
# Should this set the current _Thread_ too ? If i jump to a frame in
# Thread 2, should that become the focussed thread ?
self._current_frame = frame
+ self._DrawThreads()
return self._session.SetCurrentFrame( self._current_frame, reason )
return False
@@ -518,6 +531,11 @@ class StackTraceView( object ):
if not thread.IsExpanded():
return
+ if self._current_frame_sign_id:
+ signs.UnplaceSign( self._current_frame_sign_id, 'VimspectorStackTrace' )
+ else:
+ self._current_frame_sign_id = 2
+
for frame in thread.stacktrace:
if frame.get( 'source' ):
source = frame[ 'source' ]
@@ -542,6 +560,14 @@ class StackTraceView( object ):
source[ 'name' ],
frame[ 'line' ] ) )
+ if ( self._current_frame is not None and
+ self._current_frame[ 'id' ] == frame[ 'id' ] ):
+ signs.PlaceSign( self._current_frame_sign_id,
+ 'VimspectorStackTrace',
+ 'vimspectorCurrentFrame',
+ self._buf.name,
+ line )
+
self._line_to_frame[ line ] = ( thread, frame )
def _ResolveSource( self, source, and_then ):
diff --git a/python3/vimspector/utils.py b/python3/vimspector/utils.py
index d8dd345..5f836fc 100644
--- a/python3/vimspector/utils.py
+++ b/python3/vimspector/utils.py
@@ -375,6 +375,44 @@ def AskForInput( prompt, default_value = None, completion = None ):
return None
+CONFIRM = {}
+CONFIRM_ID = 0
+
+
+def ConfirmCallback( confirm_id, result ):
+ try:
+ handler = CONFIRM.pop( confirm_id )
+ except KeyError:
+ UserMessage( f"Internal error: unexpected callback id { confirm_id }",
+ persist = True,
+ error = True )
+ return
+
+ handler( result )
+
+
+def Confirm( api_prefix,
+ prompt,
+ handler,
+ default_value = 2,
+ options: list = None,
+ keys: list = None ):
+ if not options:
+ options = [ '(Y)es', '(N)o' ]
+ if not keys:
+ keys = [ 'y', 'n' ]
+
+ global CONFIRM_ID
+ CONFIRM_ID += 1
+ CONFIRM[ CONFIRM_ID ] = handler
+ Call( f'vimspector#internal#{ api_prefix }popup#Confirm',
+ CONFIRM_ID,
+ prompt,
+ options,
+ default_value,
+ keys )
+
+
def AppendToBuffer( buf, line_or_lines, modified=False ):
line = 1
try:
@@ -403,8 +441,10 @@ def AppendToBuffer( buf, line_or_lines, modified=False ):
-def ClearBuffer( buf ):
+def ClearBuffer( buf, modified = False ):
buf[ : ] = None
+ if not modified:
+ buf.options[ 'modified' ] = False
def SetBufferContents( buf, lines, modified=False ):
diff --git a/run_tests b/run_tests
index 39dc7ec..201ec1b 100755
--- a/run_tests
+++ b/run_tests
@@ -21,7 +21,7 @@ out_fd=1
while [ -n "$1" ]; do
case "$1" in
- "--basedir")
+ "--basedir"|"--base-dir"|"--test-base")
shift
SetBaseDir $1
shift
@@ -36,7 +36,7 @@ while [ -n "$1" ]; do
INSTALL=$1
shift
;;
- "--update")
+ "--update"|"--upgrade")
UPDATE=1
shift
;;
@@ -91,7 +91,8 @@ if [ "$INSTALL" = "1" ] || [ "$INSTALL" = "script" ]; then
if ! python3 $(dirname $0)/install_gadget.py \
--basedir ${BASEDIR} \
${INSTALLER_ARGS} \
- --all; then
+ --all \
+ --force-enable-csharp; then
echo "Script installation reported errors" >&2
exit 1
fi
@@ -102,7 +103,7 @@ if [ "$INSTALL" = "1" ] || [ "$INSTALL" = "vim" ]; then
--cmd "${BASEDIR_CMD}" \
-c 'autocmd User VimspectorInstallSuccess qa!' \
-c 'autocmd User VimspectorInstallFailed cquit!' \
- -c "VimspectorInstall --all"; then
+ -c "VimspectorInstall --all netcoredbg"; then
echo "Vim installation reported errors" >&2
exit 1
fi
@@ -144,6 +145,9 @@ set -e
pushd tests/testdata/cpp/simple
make clean all
popd
+ pushd support/test/csharp
+ dotnet build
+ popd
set +e
echo "%DONE - built test programs"
diff --git a/support/custom_ui_vimrc b/support/custom_ui_vimrc
index a8812cb..e76c6ee 100644
--- a/support/custom_ui_vimrc
+++ b/support/custom_ui_vimrc
@@ -54,7 +54,7 @@ function s:SetUpTerminal()
let padding = 4
let cols = max( [ min( [ &columns - left_bar - code - padding, 80 ] ), 10 ] )
call win_gotoid( terminal_win )
- execute cols . 'wincmd |'
+ execute string(cols) . 'wincmd |'
endfunction
function! s:CustomiseWinBar()
diff --git a/support/gadget_upgrade/README.md b/support/gadget_upgrade/README.md
new file mode 100644
index 0000000..9ae3d7f
--- /dev/null
+++ b/support/gadget_upgrade/README.md
@@ -0,0 +1,8 @@
+# Manually updating shipped gadgets
+
+Download the gadget files manuall from their official source into this dir.
+Run `./checksum.py ` to get the checksums.
+
+Update ../../python3/vimspector/gadgets.py with the new version and the
+checksums.
+
diff --git a/support/gadget_upgrade/checksum.py b/support/gadget_upgrade/checksum.py
new file mode 100755
index 0000000..d0c1404
--- /dev/null
+++ b/support/gadget_upgrade/checksum.py
@@ -0,0 +1,13 @@
+#!/usr/bin/env python3
+
+import hashlib
+import sys
+
+
+def GetChecksumSHA254( file_path ):
+ with open( file_path, 'rb' ) as existing_file:
+ return hashlib.sha256( existing_file.read() ).hexdigest()
+
+
+for arg in sys.argv[ 1: ]:
+ print( f"{ arg } = { GetChecksumSHA254( arg ) }" )
diff --git a/support/test/bash/.vimspector.json b/support/test/bash/.vimspector.json
new file mode 100644
index 0000000..a1be1b9
--- /dev/null
+++ b/support/test/bash/.vimspector.json
@@ -0,0 +1,15 @@
+{
+ "$schema": "https://puremourning.github.io/vimspector/schema/vimspector.schema.json",
+ "configurations": {
+ "Run Current Script": {
+ "adapter": "vscode-bash",
+ "autoselect": false,
+ "configuration": {
+ "request": "launch",
+ "program": "${file}",
+ "cwd": "${fileDirname}",
+ "args": [ "*${args}" ]
+ }
+ }
+ }
+}
diff --git a/support/test/cpp/simple_c_program/.vimspector.json b/support/test/cpp/simple_c_program/.vimspector.json
index 7b8c53a..fb4c958 100644
--- a/support/test/cpp/simple_c_program/.vimspector.json
+++ b/support/test/cpp/simple_c_program/.vimspector.json
@@ -15,6 +15,15 @@
"program": "${workspaceRoot}/test",
"stopAtEntry": true
}
+ },
+ "cpptools": {
+ "adapter": "vscode-cpptools",
+ "configuration": {
+ "request": "launch",
+ "program": "${workspaceRoot}/test",
+ "stopOnEntry": true,
+ "MIMode": "lldb"
+ }
}
}
}
diff --git a/support/test/cpp/simple_c_program/.ycm_extra_conf.py b/support/test/cpp/simple_c_program/.ycm_extra_conf.py
index 0d17586..4203b36 100644
--- a/support/test/cpp/simple_c_program/.ycm_extra_conf.py
+++ b/support/test/cpp/simple_c_program/.ycm_extra_conf.py
@@ -1,4 +1,4 @@
def Settings( **kwargs ):
return {
- 'flags': [ '-x', 'c++', '-Wall', '-Wextra' ]
+ 'flags': [ '-x', 'c++', '-Wall', '-Wextra', '-std=c++17' ]
}
diff --git a/support/test/csharp/.gitignore b/support/test/csharp/.gitignore
index b7d74e4..03cd7d8 100644
--- a/support/test/csharp/.gitignore
+++ b/support/test/csharp/.gitignore
@@ -1,2 +1,3 @@
bin/
obj/Debug
+obj/
diff --git a/support/test/csharp/.vimspector.json b/support/test/csharp/.vimspector.json
index 524ae1a..326739b 100644
--- a/support/test/csharp/.vimspector.json
+++ b/support/test/csharp/.vimspector.json
@@ -1,25 +1,57 @@
{
- "configurations": {
- "launch - netcoredbg": {
- "adapter": "netcoredbg",
- "configuration": {
- "request": "launch",
- "program": "${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll",
- "args": [],
- "stopAtEntry": true
- }
+ "adapters": {
+ "netcoredbg-debuglog": {
+ "attach": {
+ "pidProperty": "processId",
+ "pidSelect": "ask"
},
- "launch - mono": {
- "adapter": "vscode-mono-debug",
- "configuration": {
- "request": "launch",
- "program": "${workspaceRoot}/Program.exe",
- "console": "integratedTerminal",
- "cwd": "${workspaceRoot}",
- "args": [],
- "env": {}
- }
+ "command": [
+ "${gadgetDir}/netcoredbg/netcoredbg",
+ "--interpreter=vscode",
+ "--engineLogging=${workspaceRoot}/netcoredbg.engine.log",
+ "--log=${workspaceRoot}/netcoredbg.log"
+ ],
+ "configuration": {
+ "cwd": "${workspaceRoot}"
+ },
+ "name": "netcoredbg"
+ }
+ },
+ "configurations": {
+ //
+ // NOTE:
+ // If you add to this, you must update tests/get_configurations.test.vim
+ //
+
+ "launch - netcoredbg": {
+ "adapter": "netcoredbg",
+ "configuration": {
+ "request": "launch",
+ "program": "${workspaceRoot}/bin/Debug/netcoreapp3.1/csharp.dll",
+ "args": [],
+ "stopAtEntry": false
+ }
+ },
+ "launch - netcoredbg - with debug log": {
+ "adapter": "netcoredbg-debuglog",
+ "configuration": {
+ "request": "launch",
+ "program": "${workspaceRoot}/bin/Debug/netcoreapp3.1/csharp.dll",
+ "args": [],
+ "stopAtEntry": false
+ }
+ },
+ "launch - mono": {
+ "adapter": "vscode-mono-debug",
+ "configuration": {
+ "request": "launch",
+ "program": "${workspaceRoot}/Program.exe",
+ "console": "integratedTerminal",
+ "cwd": "${workspaceRoot}",
+ "args": [],
+ "env": {}
}
}
+ }
}
diff --git a/support/test/csharp/csharp.csproj b/support/test/csharp/csharp.csproj
index 01d5113..d453e9a 100644
--- a/support/test/csharp/csharp.csproj
+++ b/support/test/csharp/csharp.csproj
@@ -2,7 +2,7 @@
Exe
- netcoreapp2.2
+ netcoreapp3.1
diff --git a/support/test/csharp/csharp.sln b/support/test/csharp/csharp.sln
index bba50e0..91f59bf 100644
--- a/support/test/csharp/csharp.sln
+++ b/support/test/csharp/csharp.sln
@@ -3,6 +3,8 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
MinimumVisualStudioVersion = 15.0.26124.0
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharp", "csharp.csproj", "{91DB205F-E422-430B-BBB8-955110C7B3B6}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -15,4 +17,18 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|x64.Build.0 = Debug|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|x86.Build.0 = Debug|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|x64.ActiveCfg = Release|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|x64.Build.0 = Release|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|x86.ActiveCfg = Release|Any CPU
+ {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
EndGlobal
diff --git a/support/test/csharp/obj/csharp.csproj.nuget.cache b/support/test/csharp/obj/csharp.csproj.nuget.cache
deleted file mode 100644
index 3ac8d84..0000000
--- a/support/test/csharp/obj/csharp.csproj.nuget.cache
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "version": 1,
- "dgSpecHash": "6/vdr7YprlSIoQecv/nNuLNflFpO0X7eN7jHUinZTsgian9nYpmHMWirsDWMi5l+29TH+Qy8O/QfaB/48QtjRQ==",
- "success": true
-}
\ No newline at end of file
diff --git a/support/test/csharp/obj/csharp.csproj.nuget.g.props b/support/test/csharp/obj/csharp.csproj.nuget.g.props
deleted file mode 100644
index c71f0e6..0000000
--- a/support/test/csharp/obj/csharp.csproj.nuget.g.props
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- True
- NuGet
- $(MSBuildThisFileDirectory)project.assets.json
- /Users/ben/.nuget/packages/
- /Users/ben/.nuget/packages/;/usr/local/share/dotnet/sdk/NuGetFallbackFolder
- PackageReference
- 5.7.0
-
-
-
-
-
- $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
-
-
-
-
-
\ No newline at end of file
diff --git a/support/test/csharp/obj/csharp.csproj.nuget.g.targets b/support/test/csharp/obj/csharp.csproj.nuget.g.targets
deleted file mode 100644
index 099158b..0000000
--- a/support/test/csharp/obj/csharp.csproj.nuget.g.targets
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
- $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
-
-
-
-
-
-
\ No newline at end of file
diff --git a/support/test/csharp/obj/project.assets.json b/support/test/csharp/obj/project.assets.json
deleted file mode 100644
index bd6c0fc..0000000
--- a/support/test/csharp/obj/project.assets.json
+++ /dev/null
@@ -1,748 +0,0 @@
-{
- "version": 3,
- "targets": {
- ".NETCoreApp,Version=v2.2": {
- "Microsoft.NETCore.App/2.2.0": {
- "type": "package",
- "dependencies": {
- "Microsoft.NETCore.DotNetHostPolicy": "2.2.0",
- "Microsoft.NETCore.Platforms": "2.2.0",
- "Microsoft.NETCore.Targets": "2.0.0",
- "NETStandard.Library": "2.0.3"
- },
- "compile": {
- "ref/netcoreapp2.2/Microsoft.CSharp.dll": {},
- "ref/netcoreapp2.2/Microsoft.VisualBasic.dll": {},
- "ref/netcoreapp2.2/Microsoft.Win32.Primitives.dll": {},
- "ref/netcoreapp2.2/System.AppContext.dll": {},
- "ref/netcoreapp2.2/System.Buffers.dll": {},
- "ref/netcoreapp2.2/System.Collections.Concurrent.dll": {},
- "ref/netcoreapp2.2/System.Collections.Immutable.dll": {},
- "ref/netcoreapp2.2/System.Collections.NonGeneric.dll": {},
- "ref/netcoreapp2.2/System.Collections.Specialized.dll": {},
- "ref/netcoreapp2.2/System.Collections.dll": {},
- "ref/netcoreapp2.2/System.ComponentModel.Annotations.dll": {},
- "ref/netcoreapp2.2/System.ComponentModel.DataAnnotations.dll": {},
- "ref/netcoreapp2.2/System.ComponentModel.EventBasedAsync.dll": {},
- "ref/netcoreapp2.2/System.ComponentModel.Primitives.dll": {},
- "ref/netcoreapp2.2/System.ComponentModel.TypeConverter.dll": {},
- "ref/netcoreapp2.2/System.ComponentModel.dll": {},
- "ref/netcoreapp2.2/System.Configuration.dll": {},
- "ref/netcoreapp2.2/System.Console.dll": {},
- "ref/netcoreapp2.2/System.Core.dll": {},
- "ref/netcoreapp2.2/System.Data.Common.dll": {},
- "ref/netcoreapp2.2/System.Data.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.Contracts.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.Debug.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.DiagnosticSource.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.FileVersionInfo.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.Process.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.StackTrace.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.TextWriterTraceListener.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.Tools.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.TraceSource.dll": {},
- "ref/netcoreapp2.2/System.Diagnostics.Tracing.dll": {},
- "ref/netcoreapp2.2/System.Drawing.Primitives.dll": {},
- "ref/netcoreapp2.2/System.Drawing.dll": {},
- "ref/netcoreapp2.2/System.Dynamic.Runtime.dll": {},
- "ref/netcoreapp2.2/System.Globalization.Calendars.dll": {},
- "ref/netcoreapp2.2/System.Globalization.Extensions.dll": {},
- "ref/netcoreapp2.2/System.Globalization.dll": {},
- "ref/netcoreapp2.2/System.IO.Compression.Brotli.dll": {},
- "ref/netcoreapp2.2/System.IO.Compression.FileSystem.dll": {},
- "ref/netcoreapp2.2/System.IO.Compression.ZipFile.dll": {},
- "ref/netcoreapp2.2/System.IO.Compression.dll": {},
- "ref/netcoreapp2.2/System.IO.FileSystem.DriveInfo.dll": {},
- "ref/netcoreapp2.2/System.IO.FileSystem.Primitives.dll": {},
- "ref/netcoreapp2.2/System.IO.FileSystem.Watcher.dll": {},
- "ref/netcoreapp2.2/System.IO.FileSystem.dll": {},
- "ref/netcoreapp2.2/System.IO.IsolatedStorage.dll": {},
- "ref/netcoreapp2.2/System.IO.MemoryMappedFiles.dll": {},
- "ref/netcoreapp2.2/System.IO.Pipes.dll": {},
- "ref/netcoreapp2.2/System.IO.UnmanagedMemoryStream.dll": {},
- "ref/netcoreapp2.2/System.IO.dll": {},
- "ref/netcoreapp2.2/System.Linq.Expressions.dll": {},
- "ref/netcoreapp2.2/System.Linq.Parallel.dll": {},
- "ref/netcoreapp2.2/System.Linq.Queryable.dll": {},
- "ref/netcoreapp2.2/System.Linq.dll": {},
- "ref/netcoreapp2.2/System.Memory.dll": {},
- "ref/netcoreapp2.2/System.Net.Http.dll": {},
- "ref/netcoreapp2.2/System.Net.HttpListener.dll": {},
- "ref/netcoreapp2.2/System.Net.Mail.dll": {},
- "ref/netcoreapp2.2/System.Net.NameResolution.dll": {},
- "ref/netcoreapp2.2/System.Net.NetworkInformation.dll": {},
- "ref/netcoreapp2.2/System.Net.Ping.dll": {},
- "ref/netcoreapp2.2/System.Net.Primitives.dll": {},
- "ref/netcoreapp2.2/System.Net.Requests.dll": {},
- "ref/netcoreapp2.2/System.Net.Security.dll": {},
- "ref/netcoreapp2.2/System.Net.ServicePoint.dll": {},
- "ref/netcoreapp2.2/System.Net.Sockets.dll": {},
- "ref/netcoreapp2.2/System.Net.WebClient.dll": {},
- "ref/netcoreapp2.2/System.Net.WebHeaderCollection.dll": {},
- "ref/netcoreapp2.2/System.Net.WebProxy.dll": {},
- "ref/netcoreapp2.2/System.Net.WebSockets.Client.dll": {},
- "ref/netcoreapp2.2/System.Net.WebSockets.dll": {},
- "ref/netcoreapp2.2/System.Net.dll": {},
- "ref/netcoreapp2.2/System.Numerics.Vectors.dll": {},
- "ref/netcoreapp2.2/System.Numerics.dll": {},
- "ref/netcoreapp2.2/System.ObjectModel.dll": {},
- "ref/netcoreapp2.2/System.Reflection.DispatchProxy.dll": {},
- "ref/netcoreapp2.2/System.Reflection.Emit.ILGeneration.dll": {},
- "ref/netcoreapp2.2/System.Reflection.Emit.Lightweight.dll": {},
- "ref/netcoreapp2.2/System.Reflection.Emit.dll": {},
- "ref/netcoreapp2.2/System.Reflection.Extensions.dll": {},
- "ref/netcoreapp2.2/System.Reflection.Metadata.dll": {},
- "ref/netcoreapp2.2/System.Reflection.Primitives.dll": {},
- "ref/netcoreapp2.2/System.Reflection.TypeExtensions.dll": {},
- "ref/netcoreapp2.2/System.Reflection.dll": {},
- "ref/netcoreapp2.2/System.Resources.Reader.dll": {},
- "ref/netcoreapp2.2/System.Resources.ResourceManager.dll": {},
- "ref/netcoreapp2.2/System.Resources.Writer.dll": {},
- "ref/netcoreapp2.2/System.Runtime.CompilerServices.VisualC.dll": {},
- "ref/netcoreapp2.2/System.Runtime.Extensions.dll": {},
- "ref/netcoreapp2.2/System.Runtime.Handles.dll": {},
- "ref/netcoreapp2.2/System.Runtime.InteropServices.RuntimeInformation.dll": {},
- "ref/netcoreapp2.2/System.Runtime.InteropServices.WindowsRuntime.dll": {},
- "ref/netcoreapp2.2/System.Runtime.InteropServices.dll": {},
- "ref/netcoreapp2.2/System.Runtime.Loader.dll": {},
- "ref/netcoreapp2.2/System.Runtime.Numerics.dll": {},
- "ref/netcoreapp2.2/System.Runtime.Serialization.Formatters.dll": {},
- "ref/netcoreapp2.2/System.Runtime.Serialization.Json.dll": {},
- "ref/netcoreapp2.2/System.Runtime.Serialization.Primitives.dll": {},
- "ref/netcoreapp2.2/System.Runtime.Serialization.Xml.dll": {},
- "ref/netcoreapp2.2/System.Runtime.Serialization.dll": {},
- "ref/netcoreapp2.2/System.Runtime.dll": {},
- "ref/netcoreapp2.2/System.Security.Claims.dll": {},
- "ref/netcoreapp2.2/System.Security.Cryptography.Algorithms.dll": {},
- "ref/netcoreapp2.2/System.Security.Cryptography.Csp.dll": {},
- "ref/netcoreapp2.2/System.Security.Cryptography.Encoding.dll": {},
- "ref/netcoreapp2.2/System.Security.Cryptography.Primitives.dll": {},
- "ref/netcoreapp2.2/System.Security.Cryptography.X509Certificates.dll": {},
- "ref/netcoreapp2.2/System.Security.Principal.dll": {},
- "ref/netcoreapp2.2/System.Security.SecureString.dll": {},
- "ref/netcoreapp2.2/System.Security.dll": {},
- "ref/netcoreapp2.2/System.ServiceModel.Web.dll": {},
- "ref/netcoreapp2.2/System.ServiceProcess.dll": {},
- "ref/netcoreapp2.2/System.Text.Encoding.Extensions.dll": {},
- "ref/netcoreapp2.2/System.Text.Encoding.dll": {},
- "ref/netcoreapp2.2/System.Text.RegularExpressions.dll": {},
- "ref/netcoreapp2.2/System.Threading.Overlapped.dll": {},
- "ref/netcoreapp2.2/System.Threading.Tasks.Dataflow.dll": {},
- "ref/netcoreapp2.2/System.Threading.Tasks.Extensions.dll": {},
- "ref/netcoreapp2.2/System.Threading.Tasks.Parallel.dll": {},
- "ref/netcoreapp2.2/System.Threading.Tasks.dll": {},
- "ref/netcoreapp2.2/System.Threading.Thread.dll": {},
- "ref/netcoreapp2.2/System.Threading.ThreadPool.dll": {},
- "ref/netcoreapp2.2/System.Threading.Timer.dll": {},
- "ref/netcoreapp2.2/System.Threading.dll": {},
- "ref/netcoreapp2.2/System.Transactions.Local.dll": {},
- "ref/netcoreapp2.2/System.Transactions.dll": {},
- "ref/netcoreapp2.2/System.ValueTuple.dll": {},
- "ref/netcoreapp2.2/System.Web.HttpUtility.dll": {},
- "ref/netcoreapp2.2/System.Web.dll": {},
- "ref/netcoreapp2.2/System.Windows.dll": {},
- "ref/netcoreapp2.2/System.Xml.Linq.dll": {},
- "ref/netcoreapp2.2/System.Xml.ReaderWriter.dll": {},
- "ref/netcoreapp2.2/System.Xml.Serialization.dll": {},
- "ref/netcoreapp2.2/System.Xml.XDocument.dll": {},
- "ref/netcoreapp2.2/System.Xml.XPath.XDocument.dll": {},
- "ref/netcoreapp2.2/System.Xml.XPath.dll": {},
- "ref/netcoreapp2.2/System.Xml.XmlDocument.dll": {},
- "ref/netcoreapp2.2/System.Xml.XmlSerializer.dll": {},
- "ref/netcoreapp2.2/System.Xml.dll": {},
- "ref/netcoreapp2.2/System.dll": {},
- "ref/netcoreapp2.2/WindowsBase.dll": {},
- "ref/netcoreapp2.2/mscorlib.dll": {},
- "ref/netcoreapp2.2/netstandard.dll": {}
- },
- "build": {
- "build/netcoreapp2.2/Microsoft.NETCore.App.props": {},
- "build/netcoreapp2.2/Microsoft.NETCore.App.targets": {}
- }
- },
- "Microsoft.NETCore.DotNetAppHost/2.2.0": {
- "type": "package"
- },
- "Microsoft.NETCore.DotNetHostPolicy/2.2.0": {
- "type": "package",
- "dependencies": {
- "Microsoft.NETCore.DotNetHostResolver": "2.2.0"
- }
- },
- "Microsoft.NETCore.DotNetHostResolver/2.2.0": {
- "type": "package",
- "dependencies": {
- "Microsoft.NETCore.DotNetAppHost": "2.2.0"
- }
- },
- "Microsoft.NETCore.Platforms/2.2.0": {
- "type": "package",
- "compile": {
- "lib/netstandard1.0/_._": {}
- },
- "runtime": {
- "lib/netstandard1.0/_._": {}
- }
- },
- "Microsoft.NETCore.Targets/2.0.0": {
- "type": "package",
- "compile": {
- "lib/netstandard1.0/_._": {}
- },
- "runtime": {
- "lib/netstandard1.0/_._": {}
- }
- },
- "NETStandard.Library/2.0.3": {
- "type": "package",
- "dependencies": {
- "Microsoft.NETCore.Platforms": "1.1.0"
- },
- "compile": {
- "lib/netstandard1.0/_._": {}
- },
- "runtime": {
- "lib/netstandard1.0/_._": {}
- },
- "build": {
- "build/netstandard2.0/NETStandard.Library.targets": {}
- }
- }
- }
- },
- "libraries": {
- "Microsoft.NETCore.App/2.2.0": {
- "sha512": "7z5l8Jp324S8bU8+yyWeYHXUFYvKyiI5lqS1dXgTzOx1H69Qbf6df12kCKlNX45LpMfCMd4U3M6p7Rl5Zk7SLA==",
- "type": "package",
- "path": "microsoft.netcore.app/2.2.0",
- "files": [
- ".nupkg.metadata",
- ".signature.p7s",
- "LICENSE.TXT",
- "Microsoft.NETCore.App.versions.txt",
- "THIRD-PARTY-NOTICES.TXT",
- "build/netcoreapp2.2/Microsoft.NETCore.App.PlatformManifest.txt",
- "build/netcoreapp2.2/Microsoft.NETCore.App.props",
- "build/netcoreapp2.2/Microsoft.NETCore.App.targets",
- "microsoft.netcore.app.2.2.0.nupkg.sha512",
- "microsoft.netcore.app.nuspec",
- "ref/netcoreapp2.2/Microsoft.CSharp.dll",
- "ref/netcoreapp2.2/Microsoft.CSharp.xml",
- "ref/netcoreapp2.2/Microsoft.VisualBasic.dll",
- "ref/netcoreapp2.2/Microsoft.VisualBasic.xml",
- "ref/netcoreapp2.2/Microsoft.Win32.Primitives.dll",
- "ref/netcoreapp2.2/Microsoft.Win32.Primitives.xml",
- "ref/netcoreapp2.2/System.AppContext.dll",
- "ref/netcoreapp2.2/System.Buffers.dll",
- "ref/netcoreapp2.2/System.Buffers.xml",
- "ref/netcoreapp2.2/System.Collections.Concurrent.dll",
- "ref/netcoreapp2.2/System.Collections.Concurrent.xml",
- "ref/netcoreapp2.2/System.Collections.Immutable.dll",
- "ref/netcoreapp2.2/System.Collections.Immutable.xml",
- "ref/netcoreapp2.2/System.Collections.NonGeneric.dll",
- "ref/netcoreapp2.2/System.Collections.NonGeneric.xml",
- "ref/netcoreapp2.2/System.Collections.Specialized.dll",
- "ref/netcoreapp2.2/System.Collections.Specialized.xml",
- "ref/netcoreapp2.2/System.Collections.dll",
- "ref/netcoreapp2.2/System.Collections.xml",
- "ref/netcoreapp2.2/System.ComponentModel.Annotations.dll",
- "ref/netcoreapp2.2/System.ComponentModel.Annotations.xml",
- "ref/netcoreapp2.2/System.ComponentModel.DataAnnotations.dll",
- "ref/netcoreapp2.2/System.ComponentModel.EventBasedAsync.dll",
- "ref/netcoreapp2.2/System.ComponentModel.EventBasedAsync.xml",
- "ref/netcoreapp2.2/System.ComponentModel.Primitives.dll",
- "ref/netcoreapp2.2/System.ComponentModel.Primitives.xml",
- "ref/netcoreapp2.2/System.ComponentModel.TypeConverter.dll",
- "ref/netcoreapp2.2/System.ComponentModel.TypeConverter.xml",
- "ref/netcoreapp2.2/System.ComponentModel.dll",
- "ref/netcoreapp2.2/System.ComponentModel.xml",
- "ref/netcoreapp2.2/System.Configuration.dll",
- "ref/netcoreapp2.2/System.Console.dll",
- "ref/netcoreapp2.2/System.Console.xml",
- "ref/netcoreapp2.2/System.Core.dll",
- "ref/netcoreapp2.2/System.Data.Common.dll",
- "ref/netcoreapp2.2/System.Data.Common.xml",
- "ref/netcoreapp2.2/System.Data.dll",
- "ref/netcoreapp2.2/System.Diagnostics.Contracts.dll",
- "ref/netcoreapp2.2/System.Diagnostics.Contracts.xml",
- "ref/netcoreapp2.2/System.Diagnostics.Debug.dll",
- "ref/netcoreapp2.2/System.Diagnostics.Debug.xml",
- "ref/netcoreapp2.2/System.Diagnostics.DiagnosticSource.dll",
- "ref/netcoreapp2.2/System.Diagnostics.DiagnosticSource.xml",
- "ref/netcoreapp2.2/System.Diagnostics.FileVersionInfo.dll",
- "ref/netcoreapp2.2/System.Diagnostics.FileVersionInfo.xml",
- "ref/netcoreapp2.2/System.Diagnostics.Process.dll",
- "ref/netcoreapp2.2/System.Diagnostics.Process.xml",
- "ref/netcoreapp2.2/System.Diagnostics.StackTrace.dll",
- "ref/netcoreapp2.2/System.Diagnostics.StackTrace.xml",
- "ref/netcoreapp2.2/System.Diagnostics.TextWriterTraceListener.dll",
- "ref/netcoreapp2.2/System.Diagnostics.TextWriterTraceListener.xml",
- "ref/netcoreapp2.2/System.Diagnostics.Tools.dll",
- "ref/netcoreapp2.2/System.Diagnostics.Tools.xml",
- "ref/netcoreapp2.2/System.Diagnostics.TraceSource.dll",
- "ref/netcoreapp2.2/System.Diagnostics.TraceSource.xml",
- "ref/netcoreapp2.2/System.Diagnostics.Tracing.dll",
- "ref/netcoreapp2.2/System.Diagnostics.Tracing.xml",
- "ref/netcoreapp2.2/System.Drawing.Primitives.dll",
- "ref/netcoreapp2.2/System.Drawing.Primitives.xml",
- "ref/netcoreapp2.2/System.Drawing.dll",
- "ref/netcoreapp2.2/System.Dynamic.Runtime.dll",
- "ref/netcoreapp2.2/System.Globalization.Calendars.dll",
- "ref/netcoreapp2.2/System.Globalization.Extensions.dll",
- "ref/netcoreapp2.2/System.Globalization.dll",
- "ref/netcoreapp2.2/System.IO.Compression.Brotli.dll",
- "ref/netcoreapp2.2/System.IO.Compression.FileSystem.dll",
- "ref/netcoreapp2.2/System.IO.Compression.ZipFile.dll",
- "ref/netcoreapp2.2/System.IO.Compression.ZipFile.xml",
- "ref/netcoreapp2.2/System.IO.Compression.dll",
- "ref/netcoreapp2.2/System.IO.Compression.xml",
- "ref/netcoreapp2.2/System.IO.FileSystem.DriveInfo.dll",
- "ref/netcoreapp2.2/System.IO.FileSystem.DriveInfo.xml",
- "ref/netcoreapp2.2/System.IO.FileSystem.Primitives.dll",
- "ref/netcoreapp2.2/System.IO.FileSystem.Watcher.dll",
- "ref/netcoreapp2.2/System.IO.FileSystem.Watcher.xml",
- "ref/netcoreapp2.2/System.IO.FileSystem.dll",
- "ref/netcoreapp2.2/System.IO.FileSystem.xml",
- "ref/netcoreapp2.2/System.IO.IsolatedStorage.dll",
- "ref/netcoreapp2.2/System.IO.IsolatedStorage.xml",
- "ref/netcoreapp2.2/System.IO.MemoryMappedFiles.dll",
- "ref/netcoreapp2.2/System.IO.MemoryMappedFiles.xml",
- "ref/netcoreapp2.2/System.IO.Pipes.dll",
- "ref/netcoreapp2.2/System.IO.Pipes.xml",
- "ref/netcoreapp2.2/System.IO.UnmanagedMemoryStream.dll",
- "ref/netcoreapp2.2/System.IO.dll",
- "ref/netcoreapp2.2/System.Linq.Expressions.dll",
- "ref/netcoreapp2.2/System.Linq.Expressions.xml",
- "ref/netcoreapp2.2/System.Linq.Parallel.dll",
- "ref/netcoreapp2.2/System.Linq.Parallel.xml",
- "ref/netcoreapp2.2/System.Linq.Queryable.dll",
- "ref/netcoreapp2.2/System.Linq.Queryable.xml",
- "ref/netcoreapp2.2/System.Linq.dll",
- "ref/netcoreapp2.2/System.Linq.xml",
- "ref/netcoreapp2.2/System.Memory.dll",
- "ref/netcoreapp2.2/System.Memory.xml",
- "ref/netcoreapp2.2/System.Net.Http.dll",
- "ref/netcoreapp2.2/System.Net.Http.xml",
- "ref/netcoreapp2.2/System.Net.HttpListener.dll",
- "ref/netcoreapp2.2/System.Net.HttpListener.xml",
- "ref/netcoreapp2.2/System.Net.Mail.dll",
- "ref/netcoreapp2.2/System.Net.Mail.xml",
- "ref/netcoreapp2.2/System.Net.NameResolution.dll",
- "ref/netcoreapp2.2/System.Net.NameResolution.xml",
- "ref/netcoreapp2.2/System.Net.NetworkInformation.dll",
- "ref/netcoreapp2.2/System.Net.NetworkInformation.xml",
- "ref/netcoreapp2.2/System.Net.Ping.dll",
- "ref/netcoreapp2.2/System.Net.Ping.xml",
- "ref/netcoreapp2.2/System.Net.Primitives.dll",
- "ref/netcoreapp2.2/System.Net.Primitives.xml",
- "ref/netcoreapp2.2/System.Net.Requests.dll",
- "ref/netcoreapp2.2/System.Net.Requests.xml",
- "ref/netcoreapp2.2/System.Net.Security.dll",
- "ref/netcoreapp2.2/System.Net.Security.xml",
- "ref/netcoreapp2.2/System.Net.ServicePoint.dll",
- "ref/netcoreapp2.2/System.Net.ServicePoint.xml",
- "ref/netcoreapp2.2/System.Net.Sockets.dll",
- "ref/netcoreapp2.2/System.Net.Sockets.xml",
- "ref/netcoreapp2.2/System.Net.WebClient.dll",
- "ref/netcoreapp2.2/System.Net.WebClient.xml",
- "ref/netcoreapp2.2/System.Net.WebHeaderCollection.dll",
- "ref/netcoreapp2.2/System.Net.WebHeaderCollection.xml",
- "ref/netcoreapp2.2/System.Net.WebProxy.dll",
- "ref/netcoreapp2.2/System.Net.WebProxy.xml",
- "ref/netcoreapp2.2/System.Net.WebSockets.Client.dll",
- "ref/netcoreapp2.2/System.Net.WebSockets.Client.xml",
- "ref/netcoreapp2.2/System.Net.WebSockets.dll",
- "ref/netcoreapp2.2/System.Net.WebSockets.xml",
- "ref/netcoreapp2.2/System.Net.dll",
- "ref/netcoreapp2.2/System.Numerics.Vectors.dll",
- "ref/netcoreapp2.2/System.Numerics.Vectors.xml",
- "ref/netcoreapp2.2/System.Numerics.dll",
- "ref/netcoreapp2.2/System.ObjectModel.dll",
- "ref/netcoreapp2.2/System.ObjectModel.xml",
- "ref/netcoreapp2.2/System.Reflection.DispatchProxy.dll",
- "ref/netcoreapp2.2/System.Reflection.DispatchProxy.xml",
- "ref/netcoreapp2.2/System.Reflection.Emit.ILGeneration.dll",
- "ref/netcoreapp2.2/System.Reflection.Emit.ILGeneration.xml",
- "ref/netcoreapp2.2/System.Reflection.Emit.Lightweight.dll",
- "ref/netcoreapp2.2/System.Reflection.Emit.Lightweight.xml",
- "ref/netcoreapp2.2/System.Reflection.Emit.dll",
- "ref/netcoreapp2.2/System.Reflection.Emit.xml",
- "ref/netcoreapp2.2/System.Reflection.Extensions.dll",
- "ref/netcoreapp2.2/System.Reflection.Metadata.dll",
- "ref/netcoreapp2.2/System.Reflection.Metadata.xml",
- "ref/netcoreapp2.2/System.Reflection.Primitives.dll",
- "ref/netcoreapp2.2/System.Reflection.Primitives.xml",
- "ref/netcoreapp2.2/System.Reflection.TypeExtensions.dll",
- "ref/netcoreapp2.2/System.Reflection.TypeExtensions.xml",
- "ref/netcoreapp2.2/System.Reflection.dll",
- "ref/netcoreapp2.2/System.Resources.Reader.dll",
- "ref/netcoreapp2.2/System.Resources.ResourceManager.dll",
- "ref/netcoreapp2.2/System.Resources.ResourceManager.xml",
- "ref/netcoreapp2.2/System.Resources.Writer.dll",
- "ref/netcoreapp2.2/System.Resources.Writer.xml",
- "ref/netcoreapp2.2/System.Runtime.CompilerServices.VisualC.dll",
- "ref/netcoreapp2.2/System.Runtime.CompilerServices.VisualC.xml",
- "ref/netcoreapp2.2/System.Runtime.Extensions.dll",
- "ref/netcoreapp2.2/System.Runtime.Extensions.xml",
- "ref/netcoreapp2.2/System.Runtime.Handles.dll",
- "ref/netcoreapp2.2/System.Runtime.InteropServices.RuntimeInformation.dll",
- "ref/netcoreapp2.2/System.Runtime.InteropServices.RuntimeInformation.xml",
- "ref/netcoreapp2.2/System.Runtime.InteropServices.WindowsRuntime.dll",
- "ref/netcoreapp2.2/System.Runtime.InteropServices.WindowsRuntime.xml",
- "ref/netcoreapp2.2/System.Runtime.InteropServices.dll",
- "ref/netcoreapp2.2/System.Runtime.InteropServices.xml",
- "ref/netcoreapp2.2/System.Runtime.Loader.dll",
- "ref/netcoreapp2.2/System.Runtime.Loader.xml",
- "ref/netcoreapp2.2/System.Runtime.Numerics.dll",
- "ref/netcoreapp2.2/System.Runtime.Numerics.xml",
- "ref/netcoreapp2.2/System.Runtime.Serialization.Formatters.dll",
- "ref/netcoreapp2.2/System.Runtime.Serialization.Formatters.xml",
- "ref/netcoreapp2.2/System.Runtime.Serialization.Json.dll",
- "ref/netcoreapp2.2/System.Runtime.Serialization.Json.xml",
- "ref/netcoreapp2.2/System.Runtime.Serialization.Primitives.dll",
- "ref/netcoreapp2.2/System.Runtime.Serialization.Primitives.xml",
- "ref/netcoreapp2.2/System.Runtime.Serialization.Xml.dll",
- "ref/netcoreapp2.2/System.Runtime.Serialization.Xml.xml",
- "ref/netcoreapp2.2/System.Runtime.Serialization.dll",
- "ref/netcoreapp2.2/System.Runtime.dll",
- "ref/netcoreapp2.2/System.Runtime.xml",
- "ref/netcoreapp2.2/System.Security.Claims.dll",
- "ref/netcoreapp2.2/System.Security.Claims.xml",
- "ref/netcoreapp2.2/System.Security.Cryptography.Algorithms.dll",
- "ref/netcoreapp2.2/System.Security.Cryptography.Algorithms.xml",
- "ref/netcoreapp2.2/System.Security.Cryptography.Csp.dll",
- "ref/netcoreapp2.2/System.Security.Cryptography.Csp.xml",
- "ref/netcoreapp2.2/System.Security.Cryptography.Encoding.dll",
- "ref/netcoreapp2.2/System.Security.Cryptography.Encoding.xml",
- "ref/netcoreapp2.2/System.Security.Cryptography.Primitives.dll",
- "ref/netcoreapp2.2/System.Security.Cryptography.Primitives.xml",
- "ref/netcoreapp2.2/System.Security.Cryptography.X509Certificates.dll",
- "ref/netcoreapp2.2/System.Security.Cryptography.X509Certificates.xml",
- "ref/netcoreapp2.2/System.Security.Principal.dll",
- "ref/netcoreapp2.2/System.Security.Principal.xml",
- "ref/netcoreapp2.2/System.Security.SecureString.dll",
- "ref/netcoreapp2.2/System.Security.dll",
- "ref/netcoreapp2.2/System.ServiceModel.Web.dll",
- "ref/netcoreapp2.2/System.ServiceProcess.dll",
- "ref/netcoreapp2.2/System.Text.Encoding.Extensions.dll",
- "ref/netcoreapp2.2/System.Text.Encoding.Extensions.xml",
- "ref/netcoreapp2.2/System.Text.Encoding.dll",
- "ref/netcoreapp2.2/System.Text.RegularExpressions.dll",
- "ref/netcoreapp2.2/System.Text.RegularExpressions.xml",
- "ref/netcoreapp2.2/System.Threading.Overlapped.dll",
- "ref/netcoreapp2.2/System.Threading.Overlapped.xml",
- "ref/netcoreapp2.2/System.Threading.Tasks.Dataflow.dll",
- "ref/netcoreapp2.2/System.Threading.Tasks.Dataflow.xml",
- "ref/netcoreapp2.2/System.Threading.Tasks.Extensions.dll",
- "ref/netcoreapp2.2/System.Threading.Tasks.Extensions.xml",
- "ref/netcoreapp2.2/System.Threading.Tasks.Parallel.dll",
- "ref/netcoreapp2.2/System.Threading.Tasks.Parallel.xml",
- "ref/netcoreapp2.2/System.Threading.Tasks.dll",
- "ref/netcoreapp2.2/System.Threading.Tasks.xml",
- "ref/netcoreapp2.2/System.Threading.Thread.dll",
- "ref/netcoreapp2.2/System.Threading.Thread.xml",
- "ref/netcoreapp2.2/System.Threading.ThreadPool.dll",
- "ref/netcoreapp2.2/System.Threading.ThreadPool.xml",
- "ref/netcoreapp2.2/System.Threading.Timer.dll",
- "ref/netcoreapp2.2/System.Threading.Timer.xml",
- "ref/netcoreapp2.2/System.Threading.dll",
- "ref/netcoreapp2.2/System.Threading.xml",
- "ref/netcoreapp2.2/System.Transactions.Local.dll",
- "ref/netcoreapp2.2/System.Transactions.Local.xml",
- "ref/netcoreapp2.2/System.Transactions.dll",
- "ref/netcoreapp2.2/System.ValueTuple.dll",
- "ref/netcoreapp2.2/System.Web.HttpUtility.dll",
- "ref/netcoreapp2.2/System.Web.HttpUtility.xml",
- "ref/netcoreapp2.2/System.Web.dll",
- "ref/netcoreapp2.2/System.Windows.dll",
- "ref/netcoreapp2.2/System.Xml.Linq.dll",
- "ref/netcoreapp2.2/System.Xml.ReaderWriter.dll",
- "ref/netcoreapp2.2/System.Xml.ReaderWriter.xml",
- "ref/netcoreapp2.2/System.Xml.Serialization.dll",
- "ref/netcoreapp2.2/System.Xml.XDocument.dll",
- "ref/netcoreapp2.2/System.Xml.XDocument.xml",
- "ref/netcoreapp2.2/System.Xml.XPath.XDocument.dll",
- "ref/netcoreapp2.2/System.Xml.XPath.XDocument.xml",
- "ref/netcoreapp2.2/System.Xml.XPath.dll",
- "ref/netcoreapp2.2/System.Xml.XPath.xml",
- "ref/netcoreapp2.2/System.Xml.XmlDocument.dll",
- "ref/netcoreapp2.2/System.Xml.XmlSerializer.dll",
- "ref/netcoreapp2.2/System.Xml.XmlSerializer.xml",
- "ref/netcoreapp2.2/System.Xml.dll",
- "ref/netcoreapp2.2/System.dll",
- "ref/netcoreapp2.2/WindowsBase.dll",
- "ref/netcoreapp2.2/mscorlib.dll",
- "ref/netcoreapp2.2/netstandard.dll",
- "runtime.json"
- ]
- },
- "Microsoft.NETCore.DotNetAppHost/2.2.0": {
- "sha512": "DrhaKInRKKvN6Ns2VNIlC7ZffLOp9THf8cO6X4fytPRJovJUbF49/zzx4WfgX9E44FMsw9hT8hrKiIqDSHvGvA==",
- "type": "package",
- "path": "microsoft.netcore.dotnetapphost/2.2.0",
- "files": [
- ".nupkg.metadata",
- ".signature.p7s",
- "LICENSE.TXT",
- "THIRD-PARTY-NOTICES.TXT",
- "microsoft.netcore.dotnetapphost.2.2.0.nupkg.sha512",
- "microsoft.netcore.dotnetapphost.nuspec",
- "runtime.json"
- ]
- },
- "Microsoft.NETCore.DotNetHostPolicy/2.2.0": {
- "sha512": "FJie7IoPZFaPgNDxhZGmDBQP/Bs5vPdfca/G2Wf9gd6LIvMYkZcibtmJwB4tcf4KXkaOYfIOo4Cl9sEPMsSzkw==",
- "type": "package",
- "path": "microsoft.netcore.dotnethostpolicy/2.2.0",
- "files": [
- ".nupkg.metadata",
- ".signature.p7s",
- "LICENSE.TXT",
- "THIRD-PARTY-NOTICES.TXT",
- "microsoft.netcore.dotnethostpolicy.2.2.0.nupkg.sha512",
- "microsoft.netcore.dotnethostpolicy.nuspec",
- "runtime.json"
- ]
- },
- "Microsoft.NETCore.DotNetHostResolver/2.2.0": {
- "sha512": "spDm3AJYmebthDNhzY17YLPtvbc+Y1lCLVeiIH1uLJ/hZaM+40pBiPefFR8J1u66Ndkqi8ipR2tEbqPnYnjRhw==",
- "type": "package",
- "path": "microsoft.netcore.dotnethostresolver/2.2.0",
- "files": [
- ".nupkg.metadata",
- ".signature.p7s",
- "LICENSE.TXT",
- "THIRD-PARTY-NOTICES.TXT",
- "microsoft.netcore.dotnethostresolver.2.2.0.nupkg.sha512",
- "microsoft.netcore.dotnethostresolver.nuspec",
- "runtime.json"
- ]
- },
- "Microsoft.NETCore.Platforms/2.2.0": {
- "sha512": "T/J+XZo+YheFTJh8/4uoeJDdz5qOmOMkjg6/VL8mHJ9AnP8+fmV/kcbxeXsob0irRNiChf+V0ig1MCRLp/+Kog==",
- "type": "package",
- "path": "microsoft.netcore.platforms/2.2.0",
- "files": [
- ".nupkg.metadata",
- ".signature.p7s",
- "LICENSE.TXT",
- "THIRD-PARTY-NOTICES.TXT",
- "lib/netstandard1.0/_._",
- "microsoft.netcore.platforms.2.2.0.nupkg.sha512",
- "microsoft.netcore.platforms.nuspec",
- "runtime.json",
- "useSharedDesignerContext.txt",
- "version.txt"
- ]
- },
- "Microsoft.NETCore.Targets/2.0.0": {
- "sha512": "odP/tJj1z6GylFpNo7pMtbd/xQgTC3Ex2If63dRTL38bBNMwsBnJ+RceUIyHdRBC0oik/3NehYT+oECwBhIM3Q==",
- "type": "package",
- "path": "microsoft.netcore.targets/2.0.0",
- "files": [
- ".nupkg.metadata",
- "LICENSE.TXT",
- "THIRD-PARTY-NOTICES.TXT",
- "lib/netstandard1.0/_._",
- "microsoft.netcore.targets.2.0.0.nupkg.sha512",
- "microsoft.netcore.targets.nuspec",
- "runtime.json",
- "useSharedDesignerContext.txt",
- "version.txt"
- ]
- },
- "NETStandard.Library/2.0.3": {
- "sha512": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
- "type": "package",
- "path": "netstandard.library/2.0.3",
- "files": [
- ".nupkg.metadata",
- "LICENSE.TXT",
- "THIRD-PARTY-NOTICES.TXT",
- "build/netstandard2.0/NETStandard.Library.targets",
- "build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll",
- "build/netstandard2.0/ref/System.AppContext.dll",
- "build/netstandard2.0/ref/System.Collections.Concurrent.dll",
- "build/netstandard2.0/ref/System.Collections.NonGeneric.dll",
- "build/netstandard2.0/ref/System.Collections.Specialized.dll",
- "build/netstandard2.0/ref/System.Collections.dll",
- "build/netstandard2.0/ref/System.ComponentModel.Composition.dll",
- "build/netstandard2.0/ref/System.ComponentModel.EventBasedAsync.dll",
- "build/netstandard2.0/ref/System.ComponentModel.Primitives.dll",
- "build/netstandard2.0/ref/System.ComponentModel.TypeConverter.dll",
- "build/netstandard2.0/ref/System.ComponentModel.dll",
- "build/netstandard2.0/ref/System.Console.dll",
- "build/netstandard2.0/ref/System.Core.dll",
- "build/netstandard2.0/ref/System.Data.Common.dll",
- "build/netstandard2.0/ref/System.Data.dll",
- "build/netstandard2.0/ref/System.Diagnostics.Contracts.dll",
- "build/netstandard2.0/ref/System.Diagnostics.Debug.dll",
- "build/netstandard2.0/ref/System.Diagnostics.FileVersionInfo.dll",
- "build/netstandard2.0/ref/System.Diagnostics.Process.dll",
- "build/netstandard2.0/ref/System.Diagnostics.StackTrace.dll",
- "build/netstandard2.0/ref/System.Diagnostics.TextWriterTraceListener.dll",
- "build/netstandard2.0/ref/System.Diagnostics.Tools.dll",
- "build/netstandard2.0/ref/System.Diagnostics.TraceSource.dll",
- "build/netstandard2.0/ref/System.Diagnostics.Tracing.dll",
- "build/netstandard2.0/ref/System.Drawing.Primitives.dll",
- "build/netstandard2.0/ref/System.Drawing.dll",
- "build/netstandard2.0/ref/System.Dynamic.Runtime.dll",
- "build/netstandard2.0/ref/System.Globalization.Calendars.dll",
- "build/netstandard2.0/ref/System.Globalization.Extensions.dll",
- "build/netstandard2.0/ref/System.Globalization.dll",
- "build/netstandard2.0/ref/System.IO.Compression.FileSystem.dll",
- "build/netstandard2.0/ref/System.IO.Compression.ZipFile.dll",
- "build/netstandard2.0/ref/System.IO.Compression.dll",
- "build/netstandard2.0/ref/System.IO.FileSystem.DriveInfo.dll",
- "build/netstandard2.0/ref/System.IO.FileSystem.Primitives.dll",
- "build/netstandard2.0/ref/System.IO.FileSystem.Watcher.dll",
- "build/netstandard2.0/ref/System.IO.FileSystem.dll",
- "build/netstandard2.0/ref/System.IO.IsolatedStorage.dll",
- "build/netstandard2.0/ref/System.IO.MemoryMappedFiles.dll",
- "build/netstandard2.0/ref/System.IO.Pipes.dll",
- "build/netstandard2.0/ref/System.IO.UnmanagedMemoryStream.dll",
- "build/netstandard2.0/ref/System.IO.dll",
- "build/netstandard2.0/ref/System.Linq.Expressions.dll",
- "build/netstandard2.0/ref/System.Linq.Parallel.dll",
- "build/netstandard2.0/ref/System.Linq.Queryable.dll",
- "build/netstandard2.0/ref/System.Linq.dll",
- "build/netstandard2.0/ref/System.Net.Http.dll",
- "build/netstandard2.0/ref/System.Net.NameResolution.dll",
- "build/netstandard2.0/ref/System.Net.NetworkInformation.dll",
- "build/netstandard2.0/ref/System.Net.Ping.dll",
- "build/netstandard2.0/ref/System.Net.Primitives.dll",
- "build/netstandard2.0/ref/System.Net.Requests.dll",
- "build/netstandard2.0/ref/System.Net.Security.dll",
- "build/netstandard2.0/ref/System.Net.Sockets.dll",
- "build/netstandard2.0/ref/System.Net.WebHeaderCollection.dll",
- "build/netstandard2.0/ref/System.Net.WebSockets.Client.dll",
- "build/netstandard2.0/ref/System.Net.WebSockets.dll",
- "build/netstandard2.0/ref/System.Net.dll",
- "build/netstandard2.0/ref/System.Numerics.dll",
- "build/netstandard2.0/ref/System.ObjectModel.dll",
- "build/netstandard2.0/ref/System.Reflection.Extensions.dll",
- "build/netstandard2.0/ref/System.Reflection.Primitives.dll",
- "build/netstandard2.0/ref/System.Reflection.dll",
- "build/netstandard2.0/ref/System.Resources.Reader.dll",
- "build/netstandard2.0/ref/System.Resources.ResourceManager.dll",
- "build/netstandard2.0/ref/System.Resources.Writer.dll",
- "build/netstandard2.0/ref/System.Runtime.CompilerServices.VisualC.dll",
- "build/netstandard2.0/ref/System.Runtime.Extensions.dll",
- "build/netstandard2.0/ref/System.Runtime.Handles.dll",
- "build/netstandard2.0/ref/System.Runtime.InteropServices.RuntimeInformation.dll",
- "build/netstandard2.0/ref/System.Runtime.InteropServices.dll",
- "build/netstandard2.0/ref/System.Runtime.Numerics.dll",
- "build/netstandard2.0/ref/System.Runtime.Serialization.Formatters.dll",
- "build/netstandard2.0/ref/System.Runtime.Serialization.Json.dll",
- "build/netstandard2.0/ref/System.Runtime.Serialization.Primitives.dll",
- "build/netstandard2.0/ref/System.Runtime.Serialization.Xml.dll",
- "build/netstandard2.0/ref/System.Runtime.Serialization.dll",
- "build/netstandard2.0/ref/System.Runtime.dll",
- "build/netstandard2.0/ref/System.Security.Claims.dll",
- "build/netstandard2.0/ref/System.Security.Cryptography.Algorithms.dll",
- "build/netstandard2.0/ref/System.Security.Cryptography.Csp.dll",
- "build/netstandard2.0/ref/System.Security.Cryptography.Encoding.dll",
- "build/netstandard2.0/ref/System.Security.Cryptography.Primitives.dll",
- "build/netstandard2.0/ref/System.Security.Cryptography.X509Certificates.dll",
- "build/netstandard2.0/ref/System.Security.Principal.dll",
- "build/netstandard2.0/ref/System.Security.SecureString.dll",
- "build/netstandard2.0/ref/System.ServiceModel.Web.dll",
- "build/netstandard2.0/ref/System.Text.Encoding.Extensions.dll",
- "build/netstandard2.0/ref/System.Text.Encoding.dll",
- "build/netstandard2.0/ref/System.Text.RegularExpressions.dll",
- "build/netstandard2.0/ref/System.Threading.Overlapped.dll",
- "build/netstandard2.0/ref/System.Threading.Tasks.Parallel.dll",
- "build/netstandard2.0/ref/System.Threading.Tasks.dll",
- "build/netstandard2.0/ref/System.Threading.Thread.dll",
- "build/netstandard2.0/ref/System.Threading.ThreadPool.dll",
- "build/netstandard2.0/ref/System.Threading.Timer.dll",
- "build/netstandard2.0/ref/System.Threading.dll",
- "build/netstandard2.0/ref/System.Transactions.dll",
- "build/netstandard2.0/ref/System.ValueTuple.dll",
- "build/netstandard2.0/ref/System.Web.dll",
- "build/netstandard2.0/ref/System.Windows.dll",
- "build/netstandard2.0/ref/System.Xml.Linq.dll",
- "build/netstandard2.0/ref/System.Xml.ReaderWriter.dll",
- "build/netstandard2.0/ref/System.Xml.Serialization.dll",
- "build/netstandard2.0/ref/System.Xml.XDocument.dll",
- "build/netstandard2.0/ref/System.Xml.XPath.XDocument.dll",
- "build/netstandard2.0/ref/System.Xml.XPath.dll",
- "build/netstandard2.0/ref/System.Xml.XmlDocument.dll",
- "build/netstandard2.0/ref/System.Xml.XmlSerializer.dll",
- "build/netstandard2.0/ref/System.Xml.dll",
- "build/netstandard2.0/ref/System.dll",
- "build/netstandard2.0/ref/mscorlib.dll",
- "build/netstandard2.0/ref/netstandard.dll",
- "build/netstandard2.0/ref/netstandard.xml",
- "lib/netstandard1.0/_._",
- "netstandard.library.2.0.3.nupkg.sha512",
- "netstandard.library.nuspec"
- ]
- }
- },
- "projectFileDependencyGroups": {
- ".NETCoreApp,Version=v2.2": [
- "Microsoft.NETCore.App >= 2.2.0"
- ]
- },
- "packageFolders": {
- "/Users/ben/.nuget/packages/": {},
- "/usr/local/share/dotnet/sdk/NuGetFallbackFolder": {}
- },
- "project": {
- "version": "1.0.0",
- "restore": {
- "projectUniqueName": "/Users/ben/.vim/bundle/vimspector/support/test/csharp/csharp.csproj",
- "projectName": "csharp",
- "projectPath": "/Users/ben/.vim/bundle/vimspector/support/test/csharp/csharp.csproj",
- "packagesPath": "/Users/ben/.nuget/packages/",
- "outputPath": "/Users/ben/.vim/bundle/vimspector/support/test/csharp/obj/",
- "projectStyle": "PackageReference",
- "fallbackFolders": [
- "/usr/local/share/dotnet/sdk/NuGetFallbackFolder"
- ],
- "configFilePaths": [
- "/Users/ben/.nuget/NuGet/NuGet.Config"
- ],
- "originalTargetFrameworks": [
- "netcoreapp2.2"
- ],
- "sources": {
- "https://api.nuget.org/v3/index.json": {}
- },
- "frameworks": {
- "netcoreapp2.2": {
- "projectReferences": {}
- }
- },
- "warningProperties": {
- "warnAsError": [
- "NU1605"
- ]
- }
- },
- "frameworks": {
- "netcoreapp2.2": {
- "dependencies": {
- "Microsoft.NETCore.App": {
- "suppressParent": "All",
- "target": "Package",
- "version": "[2.2.0, )",
- "autoReferenced": true
- }
- },
- "imports": [
- "net461",
- "net462",
- "net47",
- "net471",
- "net472",
- "net48"
- ],
- "assetTargetFallback": true,
- "warn": true,
- "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/3.1.402/RuntimeIdentifierGraph.json"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/support/test/go/hello_world/.vimspector.json b/support/test/go/hello_world/.vimspector.json
index 8ab5091..4613b98 100644
--- a/support/test/go/hello_world/.vimspector.json
+++ b/support/test/go/hello_world/.vimspector.json
@@ -1,4 +1,18 @@
{
+ "adapters": {
+ "dlv-dap": {
+ "variables": {
+ "port": "${unusedLocalPort}"
+ },
+ "command": [
+ "$HOME/go/bin/dlv",
+ "dap",
+ "--listen",
+ "127.0.0.1:${port}"
+ ],
+ "port": "${port}"
+ }
+ },
"configurations": {
"run": {
"adapter": "vscode-go",
@@ -12,6 +26,21 @@
"env": { "GO111MODULE": "off" }
}
},
+ "run-dap": {
+ "adapter": "dlv-dap",
+ "configuration": {
+ "request": "launch",
+ "env": { "GO111MODULE": "off" },
+
+ "mode": "debug", // debug|test
+ "program": "${workspaceRoot}/hello-world.go"
+
+ // "args": [],
+ // "buildFlags": ...
+ // "stackTraceDepth": ...,
+ // "showGlobalVariables": true,
+ }
+ },
"run-exec": {
// NOTE: To use this you _must_ disable optimistaion:
// go build -o hello_world -gcflags="all=-N -l"
diff --git a/support/test/go/name-starts-with-vowel/.vimspector.json b/support/test/go/name-starts-with-vowel/.vimspector.json
new file mode 100644
index 0000000..ffcfc93
--- /dev/null
+++ b/support/test/go/name-starts-with-vowel/.vimspector.json
@@ -0,0 +1,29 @@
+{
+ "configurations": {
+ "run-cmd": {
+ "adapter": "vscode-go",
+ "configuration": {
+ "request": "launch",
+ "program": "${workspaceRoot}/cmd/namestartswithvowel/main.go",
+ "mode": "debug",
+ "dlvToolPath": "$HOME/go/bin/dlv",
+ "dlvLoadConfig": {
+ "maxArrayValues": 1000,
+ "maxStringLen": 1000
+ }
+ }
+ },
+ "test-current-file": {
+ "adapter": "vscode-go",
+ "configuration": {
+ "request": "launch",
+ "mode": "test",
+ "program": "${fileDirname}",
+ "cwd": "${fileDirname}",
+ "dlvToolPath": "$GOPATH/bin/dlv",
+ "env": {},
+ "args": []
+ }
+ }
+ }
+}
diff --git a/support/test/go/name-starts-with-vowel/README.md b/support/test/go/name-starts-with-vowel/README.md
new file mode 100644
index 0000000..fec967e
--- /dev/null
+++ b/support/test/go/name-starts-with-vowel/README.md
@@ -0,0 +1,33 @@
+# Purpose
+
+This example comes with two example vimspector configs for the Go programming language.
+
+1) `run-cmd` will launch the main programme under `cmd/namestartswithvowel`.
+1) `test-current-file` will run the tests in the current file in debug mode.
+
+## Example use-cases
+
+### run-cmd
+
+* Open `cmd/namestartswithvowel/main.go`
+* Add a breakpoint somewhere within the programme
+* Start the debugger (`:call vimspector#Continue()` or your relevant keymapping)
+* Select the first launch configuration (`1: run-cmd`)
+
+### test-current-file
+
+* Open `internal/vowels/vowels_test.go`
+* Add a breakpoint somewhere within the test
+* Start the debugger (`:call vimspector#Continue()` or your relevant keymapping)
+* Select the second launch configuration (`2: test-current-file`)
+
+## Additional Configuration
+
+There are two additional configuration options specified under `run-cmd`; these parameters configure the maximum string/array size to be shown while debugging.
+
+```
+"dlvLoadConfig": {
+ "maxArrayValues": 1000,
+ "maxStringLen": 1000
+}
+```
diff --git a/support/test/go/name-starts-with-vowel/cmd/namestartswithvowel/main.go b/support/test/go/name-starts-with-vowel/cmd/namestartswithvowel/main.go
new file mode 100644
index 0000000..c160aea
--- /dev/null
+++ b/support/test/go/name-starts-with-vowel/cmd/namestartswithvowel/main.go
@@ -0,0 +1,20 @@
+package main
+
+import (
+ "fmt"
+
+ "example.com/internal/vowels"
+)
+
+func main() {
+ names := []string{"Simon", "Bob", "Jennifer", "Amy", "Duke", "Elizabeth"}
+
+ for _, n := range names {
+ if vowels.NameStartsWithVowel(n) {
+ fmt.Printf("%s starts with a vowel!\n", n)
+ continue
+ }
+
+ fmt.Printf("%s does not start with a vowel!\n", n)
+ }
+}
diff --git a/support/test/go/name-starts-with-vowel/go.mod b/support/test/go/name-starts-with-vowel/go.mod
new file mode 100644
index 0000000..3070734
--- /dev/null
+++ b/support/test/go/name-starts-with-vowel/go.mod
@@ -0,0 +1,3 @@
+module example.com
+
+go 1.16
diff --git a/support/test/go/name-starts-with-vowel/internal/vowels/vowels.go b/support/test/go/name-starts-with-vowel/internal/vowels/vowels.go
new file mode 100644
index 0000000..4e76480
--- /dev/null
+++ b/support/test/go/name-starts-with-vowel/internal/vowels/vowels.go
@@ -0,0 +1,9 @@
+package vowels
+
+import "strings"
+
+func NameStartsWithVowel(name string) bool {
+ s := strings.Split(strings.ToLower(name), "")
+
+ return s[0] == "a" || s[0] == "e" || s[0] == "i" || s[0] == "o" || s[0] == "u"
+}
diff --git a/support/test/go/name-starts-with-vowel/internal/vowels/vowels_test.go b/support/test/go/name-starts-with-vowel/internal/vowels/vowels_test.go
new file mode 100644
index 0000000..e0d5773
--- /dev/null
+++ b/support/test/go/name-starts-with-vowel/internal/vowels/vowels_test.go
@@ -0,0 +1,30 @@
+package vowels
+
+import (
+ "fmt"
+ "testing"
+)
+
+func TestNameStartsWithVowel(t *testing.T) {
+ testCases := []struct {
+ input string
+ expectedOutput bool
+ }{
+ {
+ input: "Simon",
+ expectedOutput: false,
+ },
+ {
+ input: "Andy",
+ expectedOutput: true,
+ },
+ }
+ for _, tt := range testCases {
+ t.Run(fmt.Sprintf("%s should product %t", tt.input, tt.expectedOutput), func(t *testing.T) {
+ out := NameStartsWithVowel(tt.input)
+ if out != tt.expectedOutput {
+ t.Errorf("%s produced %t, when %t was expected", tt.input, out, tt.expectedOutput)
+ }
+ })
+ }
+}
diff --git a/support/test/java/test_project/pom.xml b/support/test/java/test_project/pom.xml
index 890e7e8..e6dc4d3 100644
--- a/support/test/java/test_project/pom.xml
+++ b/support/test/java/test_project/pom.xml
@@ -4,7 +4,7 @@
TestApplication
1
- 8
- 8
+ 11
+ 11
diff --git a/tests/ci/image/Dockerfile b/tests/ci/image/Dockerfile
index a25febc..164a5a7 100644
--- a/tests/ci/image/Dockerfile
+++ b/tests/ci/image/Dockerfile
@@ -70,6 +70,12 @@ RUN mkdir -p /home/linuxbrew/.linuxbrew &&\
RUN /home/linuxbrew/.linuxbrew/bin/brew install golang
+# dotnet
+RUN curl -sSL https://dot.net/v1/dotnet-install.sh \
+ | bash /dev/stdin --channel LTS --install-dir /usr/share/dotnet && \
+ update-alternatives --install /usr/bin/dotnet dotnet \
+ /usr/share/dotnet/dotnet 1
+
# clean up
RUN /home/linuxbrew/.linuxbrew/bin/brew cleanup && \
rm -rf ~/.cache && \
diff --git a/tests/get_configurations.test.vim b/tests/get_configurations.test.vim
index 4a37d01..33e6577 100644
--- a/tests/get_configurations.test.vim
+++ b/tests/get_configurations.test.vim
@@ -12,6 +12,7 @@ function Test_Get_Configurations()
let configs = vimspector#GetConfigurations()
call assert_equal([
\ 'launch - netcoredbg',
+ \ 'launch - netcoredbg - with debug log',
\ 'launch - mono',
\ ], configs)
diff --git a/tests/language_csharp.test.vim b/tests/language_csharp.test.vim
new file mode 100644
index 0000000..64cf954
--- /dev/null
+++ b/tests/language_csharp.test.vim
@@ -0,0 +1,65 @@
+function! SetUp()
+ call vimspector#test#setup#SetUpWithMappings( v:none )
+endfunction
+
+function! ClearDown()
+ call vimspector#test#setup#ClearDown()
+endfunction
+
+function! SetUp_Test_Go_Simple()
+ let g:vimspector_enable_mappings = 'HUMAN'
+endfunction
+
+function! Test_CSharp_Simple()
+ let fn='Program.cs'
+ lcd ../support/test/csharp
+ exe 'edit ' . fn
+
+ call vimspector#SetLineBreakpoint( fn, 31 )
+ call vimspector#LaunchWithSettings( {
+ \ 'configuration': 'launch - netcoredbg'
+ \ } )
+ call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 31, 7 )
+ call WaitForAssert( {->
+ \ vimspector#test#signs#AssertPCIsAtLineInBuffer( fn, 31 )
+ \ } )
+
+ call vimspector#StepOver()
+ call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 32, 12 )
+ call WaitForAssert( {->
+ \ vimspector#test#signs#AssertPCIsAtLineInBuffer( fn, 32 )
+ \ } )
+
+ call vimspector#test#setup#Reset()
+
+ lcd -
+ %bwipeout!
+endfunction
+
+
+function! Test_Run_To_Cursor()
+ let fn='Program.cs'
+ lcd ../support/test/csharp
+ exe 'edit ' . fn
+
+ call vimspector#SetLineBreakpoint( fn, 31 )
+ call vimspector#LaunchWithSettings( {
+ \ 'configuration': 'launch - netcoredbg'
+ \ } )
+ call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 31, 7 )
+ call WaitForAssert( {->
+ \ vimspector#test#signs#AssertPCIsAtLineInBuffer( fn, 31 )
+ \ } )
+
+ call cursor( 33, 1 )
+ call vimspector#RunToCursor()
+ call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 33, 1 )
+ call WaitForAssert( {->
+ \ vimspector#test#signs#AssertPCIsAtLineInBuffer( fn, 33 )
+ \ } )
+
+ call vimspector#test#setup#Reset()
+ lcd -
+ %bwipeout!
+endfunction
+
diff --git a/tests/lib/plugin/shared.vim b/tests/lib/plugin/shared.vim
index 70e297e..f98b8e9 100644
--- a/tests/lib/plugin/shared.vim
+++ b/tests/lib/plugin/shared.vim
@@ -99,7 +99,7 @@ function! ThisTestIsFlaky()
let g:test_is_flaky = v:true
endfunction
-function! AssertMatchist( expected, actual ) abort
+function! AssertMatchList( expected, actual ) abort
let ret = assert_equal( len( a:expected ), len( a:actual ) )
let len = min( [ len( a:expected ), len( a:actual ) ] )
let idx = 0
diff --git a/tests/stack_trace.test.vim b/tests/stack_trace.test.vim
index a65ea5e..b5ed795 100644
--- a/tests/stack_trace.test.vim
+++ b/tests/stack_trace.test.vim
@@ -30,7 +30,7 @@ function! Test_Multiple_Threads_Continue()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call cursor( 1, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread [0-9]\+: .* (paused)',
\ ' .*: .*@threads.cpp:' . string( thread_l )
@@ -45,7 +45,7 @@ function! Test_Multiple_Threads_Continue()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call cursor( 1, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread [0-9]\+: .* (paused)',
\ ' .*: .*@threads.cpp:' . string( thread_l )
@@ -56,7 +56,7 @@ function! Test_Multiple_Threads_Continue()
\ )
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ ],
@@ -70,7 +70,7 @@ function! Test_Multiple_Threads_Continue()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call cursor( 1, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread [0-9]\+: .* (paused)',
\ ' .*: .*@threads.cpp:' . string( thread_l )
@@ -81,7 +81,7 @@ function! Test_Multiple_Threads_Continue()
\ )
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ ],
@@ -95,7 +95,7 @@ function! Test_Multiple_Threads_Continue()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call cursor( 1, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread [0-9]\+: .* (paused)',
\ ' .*: .*@threads.cpp:' . string( thread_l )
@@ -106,7 +106,7 @@ function! Test_Multiple_Threads_Continue()
\ )
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ ],
@@ -121,7 +121,7 @@ function! Test_Multiple_Threads_Continue()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call cursor( 1, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread [0-9]\+: .* (paused)',
\ ' .*: .*@threads.cpp:' . string( thread_l )
@@ -132,7 +132,7 @@ function! Test_Multiple_Threads_Continue()
\ )
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ ],
@@ -146,7 +146,7 @@ function! Test_Multiple_Threads_Continue()
" So we break out of the loop
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, notify_l, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread [0-9]\+: .* (paused)',
\ ' .*: .*@threads.cpp:' . string( notify_l )
@@ -157,7 +157,7 @@ function! Test_Multiple_Threads_Continue()
\ )
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ ],
@@ -192,7 +192,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread [0-9]\+: .* (paused)',
\ ' .*: .*@threads.cpp:' . string( thread_l )
@@ -205,7 +205,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#StepOver()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ ],
@@ -218,7 +218,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ ],
@@ -230,7 +230,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#StepOver()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ '+ Thread [0-9]\+: .* (paused)',
@@ -244,7 +244,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ '+ Thread [0-9]\+: .* (paused)',
@@ -257,7 +257,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#StepOver()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ '+ Thread [0-9]\+: .* (paused)',
@@ -273,7 +273,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ '+ Thread [0-9]\+: .* (paused)',
@@ -287,7 +287,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#StepOver()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ '+ Thread [0-9]\+: .* (paused)',
@@ -304,7 +304,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ '+ Thread [0-9]\+: .* (paused)',
@@ -319,7 +319,7 @@ function! Test_Multiple_Threads_Step()
call vimspector#StepOver()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ '+ Thread [0-9]\+: .* (paused)',
@@ -338,7 +338,7 @@ function! Test_Multiple_Threads_Step()
" So we break out of the loop
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, notify_l, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '+ Thread [0-9]\+: .* (paused)',
\ '+ Thread [0-9]\+: .* (paused)',
@@ -366,7 +366,7 @@ function! Test_UpDownStack()
call vimspector#LaunchWithSettings( { 'configuration': 'run' } )
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 15, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread 1: MainThread (paused)',
\ ' 2: DoSomething@main.py:15',
@@ -379,11 +379,25 @@ function! Test_UpDownStack()
\ '$' )
\ )
\ } )
+ call win_gotoid( g:vimspector_session_windows.stack_trace )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 1,
+ \ 'vimspectorCurrentThread',
+ \ 200 ) } )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 2,
+ \ 'vimspectorCurrentFrame',
+ \ 200 ) } )
+ wincmd w
call vimspector#DownFrame()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 15, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread 1: MainThread (paused)',
\ ' 2: DoSomething@main.py:15',
@@ -396,11 +410,26 @@ function! Test_UpDownStack()
\ '$' )
\ )
\ } )
+ call win_gotoid( g:vimspector_session_windows.stack_trace )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 1,
+ \ 'vimspectorCurrentThread',
+ \ 200 ) } )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 2,
+ \ 'vimspectorCurrentFrame',
+ \ 200 ) } )
+ wincmd w
+
call vimspector#UpFrame()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 8, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread 1: MainThread (paused)',
\ ' 2: DoSomething@main.py:15',
@@ -413,11 +442,26 @@ function! Test_UpDownStack()
\ '$' )
\ )
\ } )
+ call win_gotoid( g:vimspector_session_windows.stack_trace )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 1,
+ \ 'vimspectorCurrentThread',
+ \ 200 ) } )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 3,
+ \ 'vimspectorCurrentFrame',
+ \ 200 ) } )
+ wincmd w
+
call feedkeys( "\VimspectorUpFrame", 'x' )
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 23, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread 1: MainThread (paused)',
\ ' 2: DoSomething@main.py:15',
@@ -430,11 +474,26 @@ function! Test_UpDownStack()
\ '$' )
\ )
\ } )
+ call win_gotoid( g:vimspector_session_windows.stack_trace )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 1,
+ \ 'vimspectorCurrentThread',
+ \ 200 ) } )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 4,
+ \ 'vimspectorCurrentFrame',
+ \ 200 ) } )
+ wincmd w
+
call feedkeys( "\VimspectorDownFrame", 'x' )
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 8, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread 1: MainThread (paused)',
\ ' 2: DoSomething@main.py:15',
@@ -447,11 +506,26 @@ function! Test_UpDownStack()
\ '$' )
\ )
\ } )
+ call win_gotoid( g:vimspector_session_windows.stack_trace )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 1,
+ \ 'vimspectorCurrentThread',
+ \ 200 ) } )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 3,
+ \ 'vimspectorCurrentFrame',
+ \ 200 ) } )
+ wincmd w
+
call vimspector#DownFrame()
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 15, 1 )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Thread 1: MainThread (paused)',
\ ' 2: DoSomething@main.py:15',
@@ -464,6 +538,21 @@ function! Test_UpDownStack()
\ '$' )
\ )
\ } )
+ call win_gotoid( g:vimspector_session_windows.stack_trace )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 1,
+ \ 'vimspectorCurrentThread',
+ \ 200 ) } )
+ call WaitForAssert( { ->
+ \ vimspector#test#signs#AssertSignGroupSingletonAtLine(
+ \ 'VimspectorStackTrace',
+ \ 2,
+ \ 'vimspectorCurrentFrame',
+ \ 200 ) } )
+ wincmd w
+
call vimspector#ClearBreakpoints()
diff --git a/tests/testdata/cpp/simple/.vimspector.json b/tests/testdata/cpp/simple/.vimspector.json
index 0dca061..48ce801 100644
--- a/tests/testdata/cpp/simple/.vimspector.json
+++ b/tests/testdata/cpp/simple/.vimspector.json
@@ -12,7 +12,7 @@
"externalConsole": false,
"stopAtEntry": true,
"stopOnEntry": true,
- "MImode": "${VIMSPECTOR_MIMODE}"
+ "MIMode": "${VIMSPECTOR_MIMODE}"
},
"breakpoints": {
"exception": {
@@ -33,7 +33,7 @@
"externalConsole": false,
"stopAtEntry": false,
"stopOnEntry": false,
- "MImode": "${VIMSPECTOR_MIMODE}"
+ "MIMode": "${VIMSPECTOR_MIMODE}"
},
"breakpoints": {
"exception": {
@@ -55,7 +55,7 @@
"externalConsole": false,
"stopAtEntry": false,
"stopOnEntry": false,
- "MImode": "${VIMSPECTOR_MIMODE}"
+ "MIMode": "${VIMSPECTOR_MIMODE}"
},
"breakpoints": {
"exception": {
@@ -82,7 +82,7 @@
"configuration": {
"request": "launch",
"program": "${workspaceRoot}/${fileBasenameNoExtension}",
- "MImode": "${VIMSPECTOR_MIMODE}",
+ "MIMode": "${VIMSPECTOR_MIMODE}",
"externalConsole": false,
"args": [
"CALCULATED_LIST", "${CALCULATED_LIST}",
diff --git a/tests/variables.test.vim b/tests/variables.test.vim
index c7d373b..c00fb7f 100644
--- a/tests/variables.test.vim
+++ b/tests/variables.test.vim
@@ -194,6 +194,7 @@ function! Test_ExpandVariables()
\ [
\ '- Scope: Locals',
\ ' *+ t (Test): {...}',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -211,7 +212,7 @@ function! Test_ExpandVariables()
call feedkeys( "\", 'xt' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Scope: Locals',
\ ' \*- t (Test): {...}',
@@ -219,6 +220,7 @@ function! Test_ExpandVariables()
\ ' \*- c (char): 0 ''\\0\{1,3}''',
\ ' \*- fffff (float): 0',
\ ' \*+ another_test (AnotherTest):\( {...}\)\?',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -229,7 +231,7 @@ function! Test_ExpandVariables()
" Step - stays expanded
call vimspector#StepOver()
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Scope: Locals',
\ ' - t (Test): {...}',
@@ -237,6 +239,7 @@ function! Test_ExpandVariables()
\ ' - c (char): 0 ''\\0\{1,3}''',
\ ' - fffff (float): 0',
\ ' + another_test (AnotherTest):\( {...}\)\?',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -253,6 +256,7 @@ function! Test_ExpandVariables()
\ [
\ '- Scope: Locals',
\ ' + t (Test): {...}',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -267,6 +271,7 @@ function! Test_ExpandVariables()
\ [
\ '- Scope: Locals',
\ ' + t (Test): {...}',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -278,7 +283,7 @@ function! Test_ExpandVariables()
call setpos( '.', [ 0, 2, 1 ] )
call feedkeys( "\", 'xt' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Scope: Locals',
\ ' - t (Test): {...}',
@@ -286,6 +291,7 @@ function! Test_ExpandVariables()
\ ' \*- c (char): 99 ''c''',
\ ' \*- fffff (float): 0',
\ ' \*+ another_test (AnotherTest):\( {...}\)\?',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -302,6 +308,7 @@ function! Test_ExpandVariables()
\ assert_equal(
\ [
\ '+ Scope: Locals',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -316,6 +323,7 @@ function! Test_ExpandVariables()
\ assert_equal(
\ [
\ '+ Scope: Locals',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -331,6 +339,7 @@ function! Test_ExpandVariables()
\ assert_equal(
\ [
\ '+ Scope: Locals',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -378,7 +387,7 @@ function! Test_ExpandWatch()
call feedkeys( "\", 'xt' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ 'Watches: ----',
\ 'Expression: t',
@@ -397,7 +406,7 @@ function! Test_ExpandWatch()
" Step - stays expanded
call vimspector#StepOver()
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ 'Watches: ----',
\ 'Expression: t',
@@ -449,7 +458,7 @@ function! Test_ExpandWatch()
call setpos( '.', [ 0, 3, 1 ] )
call feedkeys( "\", 'xt' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ 'Watches: ----',
\ 'Expression: t',
@@ -607,7 +616,7 @@ function! Test_EvaluateFailure()
" Add a wtch
call vimspector#AddWatch( 'test' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ 'Watches: ----',
\ 'Expression: test',
@@ -658,7 +667,7 @@ function! Test_VariableEval()
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '{...}',
\ ' - i: 0',
@@ -690,7 +699,7 @@ function! Test_VariableEval()
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '{...}',
\ ' - i: 0',
@@ -724,7 +733,7 @@ function! Test_VariableEval()
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ 'Evaluation error',
\ ],
@@ -768,7 +777,7 @@ function! Test_VariableEvalExpand()
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '{...}',
\ ' - i: 0',
@@ -786,7 +795,7 @@ function! Test_VariableEvalExpand()
call feedkeys( "jjjj\", 'xt' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '{...}',
\ ' - i: 0',
@@ -806,7 +815,7 @@ function! Test_VariableEvalExpand()
call feedkeys( "\", 'xt' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '{...}',
\ ' - i: 0',
@@ -846,6 +855,7 @@ function! Test_SetVariableValue_Local()
\ [
\ '- Scope: Locals',
\ ' *+ t (Test): {...}',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -863,7 +873,7 @@ function! Test_SetVariableValue_Local()
call feedkeys( "\", 'xt' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Scope: Locals',
\ ' \*- t (Test): {...}',
@@ -871,6 +881,7 @@ function! Test_SetVariableValue_Local()
\ ' \*- c (char): 0 ''\\0\{1,3}''',
\ ' \*- fffff (float): 0',
\ ' \*+ another_test (AnotherTest):\( {...}\)\?',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -889,7 +900,7 @@ with mock.patch( 'vimspector.utils.InputSave' ):
EOF
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Scope: Locals',
\ ' \*- t (Test): {...}',
@@ -897,6 +908,7 @@ EOF
\ ' \*- c (char): 0 ''\\0\{1,3}''',
\ ' \*- fffff (float): 0',
\ ' \*+ another_test (AnotherTest):\( {...}\)\?',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -908,7 +920,7 @@ EOF
call vimspector#SetVariableValue( '1234' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Scope: Locals',
\ ' \*- t (Test): {...}',
@@ -916,6 +928,7 @@ EOF
\ ' \*- c (char): 0 ''\\0\{1,3}''',
\ ' \*- fffff (float): 0',
\ ' \*+ another_test (AnotherTest):\( {...}\)\?',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -927,7 +940,7 @@ EOF
call vimspector#SetVariableValue( 'this is invalid' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '- Scope: Locals',
\ ' \*- t (Test): {...}',
@@ -935,6 +948,7 @@ EOF
\ ' \*- c (char): 0 ''\\0\{1,3}''',
\ ' \*- fffff (float): 0',
\ ' \*+ another_test (AnotherTest):\( {...}\)\?',
+ \ '+ Scope: Registers',
\ ],
\ getbufline( winbufnr( g:vimspector_session_windows.variables ),
\ 1,
@@ -983,7 +997,7 @@ function! Test_SetVariableValue_Watch()
call feedkeys( "\", 'xt' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ 'Watches: ----',
\ 'Expression: t',
@@ -1012,7 +1026,7 @@ EOF
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ 'Watches: ----',
\ 'Expression: t',
@@ -1032,7 +1046,7 @@ EOF
call vimspector#SetVariableValue( '1234' )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ 'Watches: ----',
\ 'Expression: t',
@@ -1075,7 +1089,7 @@ function! Test_SetVariableValue_Balloon()
\ } )
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '{...}',
\ ' - i: 0',
@@ -1102,7 +1116,7 @@ with mock.patch( 'vimspector.utils.InputSave' ):
EOF
call WaitForAssert( {->
- \ AssertMatchist(
+ \ AssertMatchList(
\ [
\ '{...}',
\ ' - i: 0',