#+TITLE: DAP layer

#+TAGS: layer|tool

* Table of Contents                     :TOC_5_gh:noexport:
- [[#description][Description]]
  - [[#features][Features:]]
- [[#layer-installation][Layer installation]]
- [[#configuration][Configuration]]
  - [[#dap-configuration-in-supported-layers][DAP configuration in supported layers]]
  - [[#variables][Variables]]
- [[#key-bindings][Key bindings]]
  - [[#declared-prefixes][Declared prefixes]]
  - [[#transient-state][Transient state]]
  - [[#startstop][Start/Stop]]
  - [[#breakpoints][Breakpoints]]
  - [[#navigation][Navigation]]
  - [[#evaluation-and-repl][Evaluation and REPL]]
  - [[#inspection][Inspection]]
- [[#references][References]]

* Description
Experimental integrated visual debugger using [[https://code.visualstudio.com/docs/extensionAPI/api-debugging][Debug Adapter Protocol]].

[[https://code.visualstudio.com/docs/extensionAPI/api-debugging][Debug Adapter Protocol]] is a wire protocol for communication between client and
Debug Server. It similar to the [[https://github.com/Microsoft/language-server-protocol][LSP]] but providers integration with debug
server.

** Features:
Fully featured IDE-like debugger providing:
- Launch/Attach
- Breakpoints
- Exceptions
- Pause & Continue
- Step In/Out/Over
- Callstacks
- Threads
- Multiple simultaneous debug sessions
- Evaluating statements
- Debug/Run configurations
- Debug REPL

* Layer installation
To use this configuration layer, add it to your =~/.spacemacs=. You will need to
add =dap= to the existing =dotspacemacs-configuration-layers= list in this
file.

* Configuration
** DAP configuration in supported layers
By default ~dap~ layer registers global key binding defined under ~SPC d~. If you
want to have debug bindings under major mode leader you may do the following:

For instance the =java= layer:

#+BEGIN_SRC emacs-lisp
  (defun java/pre-init-dap-mode ()
    (when (eq java-backend 'lsp)
       (add-to-list 'spacemacs--dap-supported-modes 'java-mode))
    (add-hook 'java-mode-local-vars-hook #'spacemacs//java-setup-dap))
#+END_SRC

See the =java= layer for further example on how to setup =dap-mode= correctly

** Variables

| Variable name              | Default | Description                  |
|----------------------------+---------+------------------------------|
| =dap-enable-mouse-support= | t       | Enable/disable mouse support |

* Key bindings
** Declared prefixes
The following prefixes have been declared:

| prefix    | name              |
|-----------+-------------------|
| ~SPC d~   | debug             |
| ~SPC d b~ | breakpoints       |
| ~SPC d d~ | debugging         |
| ~SPC d e~ | eval              |
| ~SPC d I~ | inspect           |
| ~SPC d w~ | debug windows     |
| ~SPC d S~ | context switching |
| ~SPC d T~ | toggles           |

** Transient state
Most of the DAP functions can be easily repeated using the built-in DAP
transient state which can be initiate with ~SPC m d .~.

| Key binding | Description           |
|-------------+-----------------------|
| ~SPC m d .~ | debug transient state |

** Start/Stop

| Key binding | Description                |
|-------------+----------------------------|
| ~SPC d A~   | abandon all process        |
| ~SPC d a~   | abandon current session    |
| ~SPC d d d~ | start debugging            |
| ~SPC d d e~ | edit debug template        |
| ~SPC d d l~ | debug last configuration   |
| ~SPC d d r~ | debug recent configuration |

** Breakpoints

| Key binding | Description                     |
|-------------+---------------------------------|
| ~SPC d b b~ | toggle a breakpoint             |
| ~SPC d b c~ | change breakpoint condition     |
| ~SPC d b l~ | change breakpoint log condition |
| ~SPC d b h~ | change breakpoint hit count     |
| ~SPC d b a~ | add a breakpoint                |
| ~SPC d b d~ | delete a breakpoint             |
| ~SPC d b D~ | clear all breakpoints           |
| ~SPC d w b~ | list breakpoints                |

** Navigation

| Key binding | Description                   |
|-------------+-------------------------------|
| ~SPC d c~   | continue                      |
| ~SPC d i~   | step in                       |
| ~SPC d o~   | step out                      |
| ~SPC d s~   | next step                     |
| ~SPC d r~   | restart frame                 |
| ~SPC d S f~ | switch frame                  |
| ~SPC d S s~ | switch session                |
| ~SPC d S t~ | switch thread                 |
| ~SPC d w o~ | goto output buffer if present |
| ~SPC d w s~ | list sessions                 |

** Evaluation and REPL

| Key binding | Description         |
|-------------+---------------------|
| ~SPC d '_~  | Run debug REPL      |
| ~SPC d e e~ | eval                |
| ~SPC d e r~ | eval region         |
| ~SPC d e t~ | eval value at point |

** Inspection

| Key binding | Description                               |
|-------------+-------------------------------------------|
| ~SPC d I i~ | inspect                                   |
| ~SPC d I r~ | inspect region                            |
| ~SPC d I t~ | inspect value at point                    |
| ~SPC d v~   | inspect value at point                    |
| ~SPC d w l~ | list local variables                      |
| ~SPC d T m~ | toggle mouse support for value inspection |

* References
- [[https://github.com/yyoncho/dap-mode][dap-mode repo]]
- [[https://github.com/emacs-lsp/lsp-mode][lsp-mode repo]]
