diff --git a/CHANGELOG.md b/CHANGELOG.md index 9714e94..ea084d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,10 @@ 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 (f5), current scene (f6), continue execution (f7), and add breakpoints F9. +- 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 (f5), current scene (f6), continue execution (f7), and toggle breakpoints F9. ## GDScript mode 1.4.1 diff --git a/gdscript-debug.el b/gdscript-debug.el index 66746c0..3594a21 100644 --- a/gdscript-debug.el +++ b/gdscript-debug.el @@ -1868,13 +1868,35 @@ calling `gdscript-debug--table-string'." (setq buffer-read-only t) (buffer-disable-undo)) -(defun gdscript-debug-add-breakpoint () +(defun gdscript-debug-toggle-breakpoint () + "Add or remove a breakpoint on the line at POINT." (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 - (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-absolute (cdr file-info)) (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) (message "Breakpoint already present at %s:%s" file line) (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--breakpoint-command file line t))))))) -(defun gdscript-debug-remove-breakpoint () - (interactive) +(defun gdscript-debug--remove-breakpoint (breakpoint) + "Remove `BREAKPOINT' to the current line in a GDScript buffer." (gdscript-debug--with-gdscript-file file-info (let* ((start (line-beginning-position)) (end (line-end-position)) (line (line-number-at-pos)) - (file (car file-info)) - (file-absolute (cdr file-info)) - (breakpoint (gdscript-breakpoint-create :file file :file-absolute file-absolute :line line))) + (file (car file-info))) (if (not (member breakpoint gdscript-debug--breakpoints)) (message "No breakpoint at %s:%s" file line) (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)))) (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) (setq gdscript-debug--skip-breakpoints (not 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 (goto-char (point-min)) (forward-line (1- line)) - (gdscript-debug-remove-breakpoint))))) + (gdscript-debug--remove-breakpoint breakpoint))))) (message "Not recognized as breakpoint line"))) (defun gdscript-debug-goto-breakpoint () @@ -2048,7 +2070,7 @@ calling `gdscript-debug--table-string'." (defvar gdscript-debug--breakpoints-mode-map (let ((map (make-sparse-keymap))) (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 "D" 'gdscript-debug-delete-breakpoint) (define-key map "\r" 'gdscript-debug-goto-breakpoint) diff --git a/gdscript-mode.el b/gdscript-mode.el index 5532609..3d49124 100644 --- a/gdscript-mode.el +++ b/gdscript-mode.el @@ -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 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 b") 'gdscript-debug-add-breakpoint) - (define-key map (kbd "") 'gdscript-debug-add-breakpoint) - (define-key map (kbd "C-c C-d r") 'gdscript-debug-remove-breakpoint) + (define-key map (kbd "") 'gdscript-debug-toggle-breakpoint) (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 c") 'gdscript-debug-continue)