You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
8.8 KiB
227 lines
8.8 KiB
;; Copyright (C) 2010-2015, 2017 Free Software Foundation, Inc
|
|
|
|
;; Author: Rocky Bernstein <rocky@gnu.org>
|
|
|
|
;; This program is free software; you can redistribute it and/or modify
|
|
;; it under the terms of the GNU General Public License as published by
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
;; (at your option) any later version.
|
|
|
|
;; This program is distributed in the hope that it will be useful,
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;; GNU General Public License for more details.
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
(require 'load-relative)
|
|
(require-relative-list '("cmds" "custom" "eval" "helper" "key" "lochist" "loc"
|
|
"menu")
|
|
"realgud-")
|
|
(require-relative-list '("buffer/command" "buffer/helper" "buffer/source")
|
|
"realgud-buffer-")
|
|
|
|
(eval-when-compile
|
|
(defvar realgud:tool-bar-map) ;; Fully defined in track-mode
|
|
)
|
|
|
|
|
|
(declare-function realgud-cmds--mouse-add-remove-bp 'realgud-cmds)
|
|
(declare-function realgud-cmdbuf? 'realgud-buffer-command)
|
|
(declare-function realgud:debugger-name-transform 'realgud-helper)
|
|
(declare-function realgud-get-cmdbuf 'realgud-buffer-helper)
|
|
(declare-function realgud:follow-mark 'realgud-follow)
|
|
(declare-function realgud-loc-hist-item-at 'realgud-lochist)
|
|
(declare-function realgud-cmdbuf-loc-hist 'realgud-command)
|
|
(declare-function realgud-populate-debugger-menu 'realgud-menu)
|
|
(declare-function realgud-populate-common-keys 'realgud-key)
|
|
(declare-function realgud-populate-src-buffer-map-plain 'realgud-key)
|
|
(declare-function realgud-srcbuf-info-short-key?=, 'realgud-source)
|
|
(declare-function realgud-srcbuf-info-was-read-only?= 'realgud-source)
|
|
(declare-function realgud-srcbuf-info-prev-local-map= 'realgud-source)
|
|
(declare-function realgud-srcbuf? 'realgud-buffer-source)
|
|
(declare-function realgud--ensure-attached 'realgud-buffer-source)
|
|
(declare-function realgud-srcbuf-info-set? 'realgud-buffer-source)
|
|
|
|
;; (defvar realgud::tool-bar-map) ;; fully defined in track-mode.el
|
|
|
|
(defvar realgud:shortkey-mode-map
|
|
(let ((map (make-sparse-keymap)))
|
|
(suppress-keymap map)
|
|
(realgud-populate-debugger-menu map)
|
|
(realgud-populate-common-keys map)
|
|
(realgud-populate-src-buffer-map-plain map)
|
|
(define-key map "1" 'realgud-goto-arrow1)
|
|
(define-key map "2" 'realgud-goto-arrow2)
|
|
(define-key map "3" 'realgud-goto-arrow3)
|
|
(define-key map "4" 'realgud:goto-loc-hist-4)
|
|
(define-key map "5" 'realgud:goto-loc-hist-5)
|
|
(define-key map "6" 'realgud:goto-loc-hist-6)
|
|
(define-key map "7" 'realgud:goto-loc-hist-7)
|
|
(define-key map "8" 'realgud:goto-loc-hist-8)
|
|
(define-key map "9" 'realgud:goto-loc-hist-9)
|
|
(define-key map "b" 'realgud:cmd-break)
|
|
(define-key map "j" 'realgud:cmd-jump)
|
|
(define-key map "c" 'realgud:cmd-continue)
|
|
(define-key map "e" 'realgud:cmd-eval-dwim)
|
|
(define-key map "E" 'realgud:cmd-eval-at-point)
|
|
(define-key map "U" 'realgud:cmd-until)
|
|
(define-key map "h" 'realgud:cmd-until-here)
|
|
|
|
(define-key map [mouse-2] 'realgud:tooltip-eval)
|
|
(define-key map [left-fringe mouse-1] #'realgud-cmds--mouse-add-remove-bp)
|
|
(define-key map [left-margin mouse-1] #'realgud-cmds--mouse-add-remove-bp)
|
|
|
|
;; FIXME: these can go to a common routine
|
|
(define-key map "<" 'realgud:cmd-newer-frame)
|
|
(define-key map ">" 'realgud:cmd-older-frame)
|
|
(define-key map "d" 'realgud:cmd-newer-frame)
|
|
(define-key map "u" 'realgud:cmd-older-frame)
|
|
(define-key map "l" 'realgud-recenter-arrow)
|
|
(define-key map "C" 'realgud-window-cmd-undisturb-src)
|
|
(define-key map "I" 'realgud:cmdbuf-info-describe)
|
|
(define-key map "S" 'realgud-window-src-undisturb-cmd)
|
|
|
|
(define-key map "R" 'realgud:cmd-restart)
|
|
(define-key map "!" 'realgud:cmd-shell)
|
|
(define-key map [insert] 'realgud-short-key-mode)
|
|
(define-key map [(control x)(control q)] 'realgud-short-key-mode)
|
|
map)
|
|
"Keymap used in `realgud-short-key-mode'.")
|
|
|
|
;; Implementation note: This is the mode that does all the work, it's
|
|
;; local to the buffer that is affected.
|
|
(define-minor-mode realgud-short-key-mode
|
|
"Minor mode with short keys for source buffers for the `realgud' debugger.
|
|
If `realgud-srcbuf-lock' is set, the buffer is read-only when the
|
|
minor mode is active.
|
|
|
|
\\{realgud:shortkey-mode-map}"
|
|
:group 'realgud
|
|
:global nil
|
|
:init-value nil
|
|
:lighter " ShortKeys"
|
|
:keymap realgud:shortkey-mode-map
|
|
;; executed on activation/deactivation:
|
|
(realgud-short-key-mode-setup realgud-short-key-mode))
|
|
|
|
(defun realgud-get-short-key-mode-map (cmdbuf)
|
|
(when (realgud-cmdbuf? cmdbuf)
|
|
(with-current-buffer cmdbuf
|
|
(let* ((info realgud-cmdbuf-info)
|
|
(debugger-name (realgud-cmdbuf-info-debugger-name info))
|
|
(base-variable-name
|
|
(or (gethash debugger-name realgud:variable-basename-hash)
|
|
debugger-name))
|
|
(keymap-symbol
|
|
(intern
|
|
(replace-regexp-in-string
|
|
"\\." ""
|
|
(concat base-variable-name "-short-key-mode-map"))))
|
|
(keymap (eval keymap-symbol))
|
|
)
|
|
(cond ((keymapp keymap) keymap)
|
|
('t nil))
|
|
))
|
|
))
|
|
|
|
(defun realgud-short-key-mode-setup (mode-on?)
|
|
"Set up or tear down `realgud-short-key-mode'.
|
|
MODE-ON? is a boolean indicating whether the mode should be
|
|
turned on or off."
|
|
(setq realgud-short-key-mode mode-on?)
|
|
;; When enabling, try to find a command buffer to attach to.
|
|
(when (and realgud-short-key-mode (not (realgud--ensure-attached)))
|
|
(setq realgud-short-key-mode nil))
|
|
;; Now apply mode change
|
|
(cond
|
|
;; Mode was just enabled
|
|
(realgud-short-key-mode
|
|
;; Record info to restore it when disabling
|
|
(unless (equal (realgud-sget 'srcbuf-info 'short-key?) realgud-short-key-mode)
|
|
(realgud-srcbuf-info-prev-local-map= (current-local-map))
|
|
(realgud-srcbuf-info-was-read-only?= buffer-read-only))
|
|
;; Apply local map
|
|
(let ((keymap (realgud-get-short-key-mode-map (realgud-get-cmdbuf))))
|
|
(when keymap (use-local-map keymap)))
|
|
;; Finish setting up
|
|
(set (make-local-variable 'tool-bar-map) realgud:tool-bar-map)
|
|
(local-set-key [m-insert] #'realgud-short-key-mode)
|
|
(setq buffer-read-only realgud-srcbuf-lock)
|
|
(run-mode-hooks 'realgud-short-key-mode-hook))
|
|
;; Mode was just disabled
|
|
(t
|
|
(kill-local-variable 'tool-bar-map)
|
|
(when (realgud-srcbuf-info-set?)
|
|
;; Restore previous state
|
|
(use-local-map (realgud-sget 'srcbuf-info 'prev-local-map))
|
|
(setq buffer-read-only (realgud-sget 'srcbuf-info 'was-read-only?)))))
|
|
;; Record state
|
|
(when (realgud-srcbuf-info-set?)
|
|
(realgud-srcbuf-info-short-key?= realgud-short-key-mode)))
|
|
|
|
(defun realgud-short-key-mode-off ()
|
|
"Turn off `realgud-short-key-mode' in all buffers."
|
|
(interactive)
|
|
(save-excursion
|
|
(dolist (buf (buffer-list))
|
|
(set-buffer buf)
|
|
(when realgud-short-key-mode
|
|
(realgud-short-key-mode -1)))))
|
|
|
|
(defun realgud-populate-src-buffer-map (map)
|
|
"Bind all common keys and menu used in src buffers.
|
|
This includes the keys bound to `realgud-key-prefix' (typically C-x
|
|
C-a)."
|
|
(realgud-populate-src-buffer-map-plain map)
|
|
(realgud-populate-common-keys map)
|
|
(let ((prefix-map (make-sparse-keymap)))
|
|
(realgud-populate-debugger-menu map)
|
|
(realgud-populate-src-buffer-map-plain prefix-map)
|
|
(define-key map realgud-key-prefix prefix-map)))
|
|
|
|
(defun realgud:goto-loc-hist(num)
|
|
"Go to position nth from the newest position."
|
|
(let ((cmdbuf (realgud-get-cmdbuf)))
|
|
(if cmdbuf
|
|
(let* ((loc-hist (realgud-cmdbuf-loc-hist cmdbuf))
|
|
(loc (realgud-loc-hist-item-at loc-hist (- num)))
|
|
(loc-marker (realgud-loc-marker loc)))
|
|
(realgud:follow-mark loc-marker))
|
|
;; else
|
|
(message "No command buffer associated with this buffer")
|
|
)))
|
|
|
|
|
|
(defun realgud:goto-loc-hist-4 ()
|
|
"Go to position 4th from the newest position."
|
|
(interactive)
|
|
(realgud:goto-loc-hist 4))
|
|
|
|
(defun realgud:goto-loc-hist-5 ()
|
|
"Go to position 5th from the newest position."
|
|
(interactive)
|
|
(realgud:goto-loc-hist 5))
|
|
|
|
(defun realgud:goto-loc-hist-6 ()
|
|
"Go to position 6th from the newest position."
|
|
(interactive)
|
|
(realgud:goto-loc-hist 6))
|
|
|
|
(defun realgud:goto-loc-hist-7 ()
|
|
"Go to position 7th from the newest position."
|
|
(interactive)
|
|
(realgud:goto-loc-hist 7))
|
|
|
|
(defun realgud:goto-loc-hist-8 ()
|
|
"Go to position 8th from the newest position."
|
|
(interactive)
|
|
(realgud:goto-loc-hist 8))
|
|
|
|
(defun realgud:goto-loc-hist-9 ()
|
|
"Go to position 9th from the newest position."
|
|
(interactive)
|
|
(realgud:goto-loc-hist 9))
|
|
|
|
(provide-me "realgud-")
|