summaryrefslogtreecommitdiff
path: root/_posts/es/2024-04-30-configuring-dape.md
blob: 3e601d91df51de556b7af2291f46e7acb2b511bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
---
layout: post
title: "Configurando Dape: el nuevo cliente DAP para emacs"
lang: es
date: 2024-04-30
tag: Tutoriales
---

Hace un tiempo [eglot](https://github.com/joaotavora/eglot), un cliente LSP (Language Server Protocol) fue introducido al núcleo de
emacs, convirtiéndolo en más o menos el cliente de LSP oficial de emacs, para la desgracia de [lsp-mode](https://github.com/emacs-lsp/lsp-mode).
Me gusta eglot, es fácil de usar, configurar y simplemente funciona, y su integración con otros paquetes y componentes de emacs como _company_ y
_flycheck_ no tiene roces. Pero, si hay un aspecto con el que emacs ha batallado, ese es, en mi opinión, el debugging.

![dape](/assets/images/dape/dape.png){: width="800" }

Los desarrolladores del anteriormente mencionado lsp-mode también trabajan en dap-mode, un cliente de DAP (un LSP pero para debuggers) para emacs.
Pero, como ya podrán adivinar, necesita lsp-mode para funcionar, para el detrimento de los usuarios de eglot.

Pero ahora tenemos un competidor a dap-mode en la misma forma en la que eglot es un competidor de lsp-mode. [Dape](https://github.com/svaante/dape)
(que no es tan nuevo para ser honesto, su primer commit data del 29 de septiembre de 2023).

A diferencia de dap-mode, aspira a ser un cliente de dap minimalista, y no hace uso de un archivo launch.json, utilizando configuraciones escritas
enteramente en elisp en su lugar.

En este post, mostraré una configuración de ejemplo para usar dape con python y flask, pero planeo actualizarlo con más configuraciones.
Dape es un proyecto extremadamente interesante y el hecho de que sea compatible con la _gem_ de ruby rdbg llamó mi atención: emacs actualmente
no puede competir con vs code como **EL** entorno de desarrollo para ruby, principalmente a causa del debugging. No he tenido suerte configurando
dap-mode para ruby y no utiliza rdbg, la cual es la _gem_ más nueva, actualizada, y en general, mejor gema para debuggear ruby. Me gustaría también
checar en un futuro una configuración para debuggear javascript _vanilla_.

Pero bueno, leyendo el código fuente de dape nos encontramos con esto:

```elisp
command "python"
               command-args ("-m" "debugpy.adapter" "--host" "0.0.0.0" "--port" :autoport)
               port :autoport
               :request "launch"
               :type "python"
               :cwd dape-cwd))
            (common
             `(:args []
               :justMyCode nil
               :console "integratedTerminal"
               :showReturnValue t
               :stopOnEntry nil))
```

Esta es la configuración básica para python con debugpy. Cuando instalas dape, y lo ejecutas con `M-x dape`, puedes seleccionar
esta configuración. Y puedes asignar todas las variables que necesitas para debuggear tu proyecto en flask, principalmente `:args` y
`:module`. Pero no es práctico escribir todo eso siempre que quieras depurar tu proyecto, así que vayamos a tu archivo init, y escribe lo
siguiente:

```elisp
(require 'dape)
;; Dape configs
(add-to-list 'dape-configs
	     `(debugpy-flask
	       modes (python-mode jinja2-mode)
	       command "python"
	       command-args ["-m" "debugpy.adapter" "--host" "0.0.0.0" "--port" :autoport]
	       port :autoport
	       :type "python"
	       :request "launch"
	       :module "flask"
	       :args ["--app" "src" "run" "--no-debugger" "--no-reload"]
	       :console "integratedTerminal"
	       :showReturnValue t
	       :justMyCode nil
	       :jinja t
	       :cwd dape-cwd-fn))
```

Primero, requerimos dape, y entonces, añadimos otra configuración a la lista de dape-configs, definida en dape.el.
Como puedes ver, es básicamente una copia descarada de la configuración base de debugpy, pero con todas las variables
definidas para desarrollo con flask, como el módulo a usar (flask) y los argumentos para la línea de comandos (--app, run, etc.)
Hay un detalle, como puedes ver, el arreglo de argumentos define el nombre de mi aplicación como "src". Intenté referirme al nombre
de mi aplicación como una variable, para que pudiera ser utilizada con otros proyectos con diferentes nombres, pero bueno, no estoy
muy familiarizado con dape, o con elisp incluso.
Una posible solución (aunque lejos de ideal) sería copiar esta configuración a un archivo .dir-locals.el para la configuración de
un proyecto específico.