Add ability to toggle breakpoints on current line

This commit is contained in:
Nathan Lovato
2021-01-24 22:13:47 -06:00
parent fe59b77c3f
commit bdce2da794
3 changed files with 36 additions and 15 deletions

View File

@@ -2,9 +2,10 @@
This document lists new features, improvements, changes, and bug fixes in each release of the package. This document lists new features, improvements, changes, and bug fixes in each release of the package.
## GDScript mode 1.4.2 ## GDScript mode 1.5.0
- Added keybindings matching Godot to run the project (<kbd>f5</kbd>), current scene (<kbd>f6</kbd>), continue execution (<kbd>f7</kbd>), and add breakpoints <kbd>F9</kbd>. - Added the ability to toggle breakpoint on the current line instead of either adding or removing them.
- Added keybindings matching Godot to run the project (<kbd>f5</kbd>), current scene (<kbd>f6</kbd>), continue execution (<kbd>f7</kbd>), and toggle breakpoints <kbd>F9</kbd>.
## GDScript mode 1.4.1 ## GDScript mode 1.4.1

View File

@@ -1868,13 +1868,35 @@ calling `gdscript-debug--table-string'."
(setq buffer-read-only t) (setq buffer-read-only t)
(buffer-disable-undo)) (buffer-disable-undo))
(defun gdscript-debug-add-breakpoint () (defun gdscript-debug-toggle-breakpoint ()
"Add or remove a breakpoint on the line at POINT."
(interactive) (interactive)
(let* ((breakpoint (gdscript-debug--construct-breakpoint-at-point)))
(if (gdscript-debug--is-existing-breakpoint-p breakpoint)
(gdscript-debug--remove-breakpoint breakpoint)
(gdscript-debug--add-breakpoint-to-line breakpoint))))
(defun gdscript-debug--construct-breakpoint-at-point ()
"Construct a breakpoint object for the line at POINT and return it.
May match an existing breakpoint."
(gdscript-debug--with-gdscript-file file-info (gdscript-debug--with-gdscript-file file-info
(let* ((line (line-number-at-pos)) (let* ((start (line-beginning-position))
(end (line-end-position))
(line (line-number-at-pos))
(file (car file-info)) (file (car file-info))
(file-absolute (cdr file-info)) (file-absolute (cdr file-info))
(breakpoint (gdscript-breakpoint-create :file file :file-absolute file-absolute :line line))) (breakpoint (gdscript-breakpoint-create :file file :file-absolute file-absolute :line line)))
breakpoint)))
(defun gdscript-debug--is-existing-breakpoint-p (breakpoint)
"Return t if `BREAKPOINT' is an existing breakpoint in the project."
(member breakpoint gdscript-debug--breakpoints))
(defun gdscript-debug--add-breakpoint-to-line (breakpoint)
"Register `BREAKPOINT' to the current line in a GDScript buffer."
(gdscript-debug--with-gdscript-file file-info
(let* ((line (line-number-at-pos))
(file (car file-info)))
(if (member breakpoint gdscript-debug--breakpoints) (if (member breakpoint gdscript-debug--breakpoints)
(message "Breakpoint already present at %s:%s" file line) (message "Breakpoint already present at %s:%s" file line)
(gdscript-debug--add-fringe (line-beginning-position) (not gdscript-debug--skip-breakpoints) 'gdb-bptno 1) (gdscript-debug--add-fringe (line-beginning-position) (not gdscript-debug--skip-breakpoints) 'gdb-bptno 1)
@@ -1884,15 +1906,13 @@ calling `gdscript-debug--table-string'."
(gdscript-debug--send-command (gdscript-debug--send-command
(gdscript-debug--breakpoint-command file line t))))))) (gdscript-debug--breakpoint-command file line t)))))))
(defun gdscript-debug-remove-breakpoint () (defun gdscript-debug--remove-breakpoint (breakpoint)
(interactive) "Remove `BREAKPOINT' to the current line in a GDScript buffer."
(gdscript-debug--with-gdscript-file file-info (gdscript-debug--with-gdscript-file file-info
(let* ((start (line-beginning-position)) (let* ((start (line-beginning-position))
(end (line-end-position)) (end (line-end-position))
(line (line-number-at-pos)) (line (line-number-at-pos))
(file (car file-info)) (file (car file-info)))
(file-absolute (cdr file-info))
(breakpoint (gdscript-breakpoint-create :file file :file-absolute file-absolute :line line)))
(if (not (member breakpoint gdscript-debug--breakpoints)) (if (not (member breakpoint gdscript-debug--breakpoints))
(message "No breakpoint at %s:%s" file line) (message "No breakpoint at %s:%s" file line)
(gdscript-debug--remove-strings start end) (gdscript-debug--remove-strings start end)
@@ -1920,7 +1940,9 @@ calling `gdscript-debug--table-string'."
(prop `(left-fringe breakpoint ,(if (not enabled) 'breakpoint-enabled 'breakpoint-disabled)))) (prop `(left-fringe breakpoint ,(if (not enabled) 'breakpoint-enabled 'breakpoint-disabled))))
(put-text-property 0 1 'display prop string)))))))))))) (put-text-property 0 1 'display prop string))))))))))))
(defun gdscript-debug-toggle-breakpoint () (defun gdscript-debug-toggle-skip-breakpoints ()
"Toggle the execution of all breakpoints without removing them.
Like Godot's Skip Breakpoints button."
(interactive) (interactive)
(setq gdscript-debug--skip-breakpoints (not gdscript-debug--skip-breakpoints)) (setq gdscript-debug--skip-breakpoints (not gdscript-debug--skip-breakpoints))
(gdscript-debug--set-left-fringe-breakpoints gdscript-debug--skip-breakpoints) (gdscript-debug--set-left-fringe-breakpoints gdscript-debug--skip-breakpoints)
@@ -1937,7 +1959,7 @@ calling `gdscript-debug--table-string'."
(with-current-buffer buffer (with-current-buffer buffer
(goto-char (point-min)) (goto-char (point-min))
(forward-line (1- line)) (forward-line (1- line))
(gdscript-debug-remove-breakpoint))))) (gdscript-debug--remove-breakpoint breakpoint)))))
(message "Not recognized as breakpoint line"))) (message "Not recognized as breakpoint line")))
(defun gdscript-debug-goto-breakpoint () (defun gdscript-debug-goto-breakpoint ()
@@ -2048,7 +2070,7 @@ calling `gdscript-debug--table-string'."
(defvar gdscript-debug--breakpoints-mode-map (defvar gdscript-debug--breakpoints-mode-map
(let ((map (make-sparse-keymap))) (let ((map (make-sparse-keymap)))
(suppress-keymap map) (suppress-keymap map)
(define-key map " " 'gdscript-debug-toggle-breakpoint) (define-key map " " 'gdscript-debug-toggle-skip-breakpoints)
(define-key map "q" 'kill-current-buffer) (define-key map "q" 'kill-current-buffer)
(define-key map "D" 'gdscript-debug-delete-breakpoint) (define-key map "D" 'gdscript-debug-delete-breakpoint)
(define-key map "\r" 'gdscript-debug-goto-breakpoint) (define-key map "\r" 'gdscript-debug-goto-breakpoint)

View File

@@ -87,9 +87,7 @@
(define-key map (kbd "C-c C-d C-d d") 'gdscript-debug-display-stack-dump-buffer) (define-key map (kbd "C-c C-d C-d d") 'gdscript-debug-display-stack-dump-buffer)
(define-key map (kbd "C-c C-d C-d b") 'gdscript-debug-display-breakpoint-buffer) (define-key map (kbd "C-c C-d C-d b") 'gdscript-debug-display-breakpoint-buffer)
(define-key map (kbd "C-c C-d C-d i") 'gdscript-debug-display-inspector-buffer) (define-key map (kbd "C-c C-d C-d i") 'gdscript-debug-display-inspector-buffer)
(define-key map (kbd "C-c C-d b") 'gdscript-debug-add-breakpoint) (define-key map (kbd "<f9>") 'gdscript-debug-toggle-breakpoint)
(define-key map (kbd "<f9>") 'gdscript-debug-add-breakpoint)
(define-key map (kbd "C-c C-d r") 'gdscript-debug-remove-breakpoint)
(define-key map (kbd "C-c C-d q") 'gdscript-debug-make-server) (define-key map (kbd "C-c C-d q") 'gdscript-debug-make-server)
(define-key map (kbd "C-c C-d n") 'gdscript-debug-next) (define-key map (kbd "C-c C-d n") 'gdscript-debug-next)
(define-key map (kbd "C-c C-d c") 'gdscript-debug-continue) (define-key map (kbd "C-c C-d c") 'gdscript-debug-continue)