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.
189 lines
6.7 KiB
189 lines
6.7 KiB
; Copyright (C) 2010-2011, 2015, 2019 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.
|
|
|
|
;; -------------------------------------------------------------------
|
|
;; Menu support.
|
|
;;
|
|
|
|
(require 'load-relative)
|
|
|
|
;; We want the doc strings from gdb-like commands for our help
|
|
;; menus.
|
|
(require-relative-list '("cmds") "realgud-")
|
|
|
|
;; Note: We want the key binding to show in the menu. However, our
|
|
;; situation is a little bit complex:
|
|
;;
|
|
;; 1) We want the binding of the `common' man (i.e. the function key
|
|
;; the user has selected.)
|
|
;;
|
|
;; 2) We want this even when the menu is disabled and the key isn't
|
|
;; bound, typically when the debugger isn't running.
|
|
;;
|
|
;; This has been solved by setting up an explicit ":keys" properly.
|
|
(defun realgud-menu-item (common-map name cmd &rest args)
|
|
"Return a menu item entry with the correct key bindings.
|
|
|
|
A command can be bound to a number of different key sequences. If
|
|
the realgud common map contains a binding it is displayed in the
|
|
menu. (The common map typically contains function key bindings.)"
|
|
(let ((key-binding (where-is-internal cmd (list common-map) t))
|
|
(hint '()))
|
|
(if key-binding
|
|
(setq hint (list :keys (key-description key-binding))))
|
|
(append (list 'menu-item name cmd)
|
|
hint
|
|
args)))
|
|
|
|
|
|
;; I had a *lot* of trouble with emacs keymaps and duplicate menus.
|
|
;; Don't use set-parent-mode on any minor mode.
|
|
;; It is possible that realgud-track-mode could be a derived major mode whose parent
|
|
;; is comint, but that seems drastic.
|
|
;; Instead we take the various minor modes and add a debugger menu to that.
|
|
(defun realgud-populate-debugger-menu (map)
|
|
"Populate the 'Debugger' menu inside an existing menu (short-key or track-mode)."
|
|
(let ((debugger-map (make-sparse-keymap "Debugger")))
|
|
(define-key map [menu-bar debugger] (cons "Debugger" debugger-map))
|
|
(define-key debugger-map [command]
|
|
(realgud-menu-item debugger-map "Go to Command Buffer"
|
|
'realgud-window-cmd-undisturb-src
|
|
:enable '(and (realgud-get-process) (not (realgud-cmdbuf?)))
|
|
:help (documentation 'realgud-window-cmd-undisturb-src)
|
|
))
|
|
|
|
(define-key debugger-map [source]
|
|
(realgud-menu-item debugger-map "Go to Source Buffer"
|
|
'realgud-window-src-undisturb-cmd
|
|
:enable '(and (realgud-get-process) (not (realgud-srcbuf?)))
|
|
:help (documentation 'realgud-window-src-undisturb-cmd)
|
|
))
|
|
|
|
(define-key debugger-map [info]
|
|
(realgud-menu-item debugger-map "Debugger Info"
|
|
'realgud:cmdbuf-info-describe
|
|
:help (documentation 'realgud:cmdbuf-info-describe)
|
|
))
|
|
|
|
(define-key debugger-map [backtrace]
|
|
(realgud-menu-item debugger-map "Backtrace" 'realgud:window-bt
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:window-bt)
|
|
))
|
|
|
|
(define-key debugger-map [breakpoints]
|
|
(realgud-menu-item debugger-map "Breakpoints" 'realgud:window-brkpt
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:window-brkpt)
|
|
))
|
|
|
|
(define-key debugger-map [arrow3]
|
|
(realgud-menu-item debugger-map "Arrow 3" 'realgud-goto-arrow3
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud-goto-arrow3)
|
|
))
|
|
|
|
(define-key debugger-map [arrow2]
|
|
(realgud-menu-item debugger-map "Arrow 2" 'realgud-goto-arrow2
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud-goto-arrow2)
|
|
))
|
|
|
|
(define-key debugger-map [arrow1]
|
|
(realgud-menu-item debugger-map "Arrow 1" 'realgud-goto-arrow1
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud-goto-arrow1)
|
|
))
|
|
|
|
(define-key debugger-map [break]
|
|
(realgud-menu-item debugger-map "Set Breakpoint" 'realgud:cmd-break
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-break)
|
|
))
|
|
|
|
(define-key debugger-map [continue]
|
|
(realgud-menu-item debugger-map "Continue" 'realgud:cmd-continue
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-continue)
|
|
))
|
|
|
|
(define-key debugger-map [until]
|
|
(realgud-menu-item debugger-map "Continue to Line" 'realgud:cmd-until
|
|
:enable '(and (realgud-get-process) realgud-short-key-mode)
|
|
:help (documentation 'realgud:cmd-until)
|
|
))
|
|
|
|
(define-key debugger-map [next]
|
|
(realgud-menu-item debugger-map "Next (step through)" 'realgud:cmd-next
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-next)
|
|
))
|
|
|
|
(define-key debugger-map [finish]
|
|
(realgud-menu-item debugger-map "Finish (step out)" 'realgud:cmd-finish
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-finish)
|
|
))
|
|
|
|
(define-key debugger-map [step]
|
|
(realgud-menu-item debugger-map "Step (step into)" 'realgud:cmd-step
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-step)
|
|
))
|
|
|
|
(define-key debugger-map [menu-bar debugger line1] '(menu-item "--"))
|
|
|
|
(define-key debugger-map [down]
|
|
(realgud-menu-item debugger-map "Down Stack" 'realgud:cmd-newer-frame
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-newer-frame)
|
|
))
|
|
|
|
(define-key debugger-map [up]
|
|
(realgud-menu-item debugger-map "Up Stack" 'realgud:cmd-older-frame
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-older-frame)
|
|
))
|
|
|
|
(define-key debugger-map [menu-bar debugger line1] '(menu-item "--"))
|
|
|
|
(define-key debugger-map [quit]
|
|
(realgud-menu-item debugger-map "Quit" 'realgud:cmd-quit
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-quit)
|
|
))
|
|
|
|
(define-key debugger-map [restart]
|
|
(realgud-menu-item debugger-map "Restart" 'realgud:cmd-restart
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-restart)
|
|
))
|
|
|
|
(define-key debugger-map [eval]
|
|
(realgud-menu-item debugger-map "Evaluate region or string" 'realgud:cmd-eval-dwim
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud:cmd-eval-dwim)
|
|
))
|
|
|
|
(define-key debugger-map [Recenter]
|
|
(realgud-menu-item debugger-map "Recenter" 'realgud-recenter-arrow
|
|
:enable '(realgud-get-process)
|
|
:help (documentation 'realgud-recenter-arrow)
|
|
))
|
|
;; Put them in the menu bar:
|
|
(setq menu-bar-final-items (append '(debugger) menu-bar-final-items))
|
|
map
|
|
))
|
|
|
|
(provide-me "realgud-")
|