Personal emacs config
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

  1. ; Copyright (C) 2010-2011, 2015, 2019 Free Software Foundation, Inc
  2. ;; Author: Rocky Bernstein <rocky@gnu.org>
  3. ;; This program is free software; you can redistribute it and/or modify
  4. ;; it under the terms of the GNU General Public License as published by
  5. ;; the Free Software Foundation, either version 3 of the License, or
  6. ;; (at your option) any later version.
  7. ;; This program is distributed in the hope that it will be useful,
  8. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. ;; GNU General Public License for more details.
  11. ;; -------------------------------------------------------------------
  12. ;; Menu support.
  13. ;;
  14. (require 'load-relative)
  15. ;; We want the doc strings from gdb-like commands for our help
  16. ;; menus.
  17. (require-relative-list '("cmds") "realgud-")
  18. ;; Note: We want the key binding to show in the menu. However, our
  19. ;; situation is a little bit complex:
  20. ;;
  21. ;; 1) We want the binding of the `common' man (i.e. the function key
  22. ;; the user has selected.)
  23. ;;
  24. ;; 2) We want this even when the menu is disabled and the key isn't
  25. ;; bound, typically when the debugger isn't running.
  26. ;;
  27. ;; This has been solved by setting up an explicit ":keys" properly.
  28. (defun realgud-menu-item (common-map name cmd &rest args)
  29. "Return a menu item entry with the correct key bindings.
  30. A command can be bound to a number of different key sequences. If
  31. the realgud common map contains a binding it is displayed in the
  32. menu. (The common map typically contains function key bindings.)"
  33. (let ((key-binding (where-is-internal cmd (list common-map) t))
  34. (hint '()))
  35. (if key-binding
  36. (setq hint (list :keys (key-description key-binding))))
  37. (append (list 'menu-item name cmd)
  38. hint
  39. args)))
  40. ;; I had a *lot* of trouble with emacs keymaps and duplicate menus.
  41. ;; Don't use set-parent-mode on any minor mode.
  42. ;; It is possible that realgud-track-mode could be a derived major mode whose parent
  43. ;; is comint, but that seems drastic.
  44. ;; Instead we take the various minor modes and add a debugger menu to that.
  45. (defun realgud-populate-debugger-menu (map)
  46. "Populate the 'Debugger' menu inside an existing menu (short-key or track-mode)."
  47. (let ((debugger-map (make-sparse-keymap "Debugger")))
  48. (define-key map [menu-bar debugger] (cons "Debugger" debugger-map))
  49. (define-key debugger-map [command]
  50. (realgud-menu-item debugger-map "Go to Command Buffer"
  51. 'realgud-window-cmd-undisturb-src
  52. :enable '(and (realgud-get-process) (not (realgud-cmdbuf?)))
  53. :help (documentation 'realgud-window-cmd-undisturb-src)
  54. ))
  55. (define-key debugger-map [source]
  56. (realgud-menu-item debugger-map "Go to Source Buffer"
  57. 'realgud-window-src-undisturb-cmd
  58. :enable '(and (realgud-get-process) (not (realgud-srcbuf?)))
  59. :help (documentation 'realgud-window-src-undisturb-cmd)
  60. ))
  61. (define-key debugger-map [info]
  62. (realgud-menu-item debugger-map "Debugger Info"
  63. 'realgud:cmdbuf-info-describe
  64. :help (documentation 'realgud:cmdbuf-info-describe)
  65. ))
  66. (define-key debugger-map [backtrace]
  67. (realgud-menu-item debugger-map "Backtrace" 'realgud:window-bt
  68. :enable '(realgud-get-process)
  69. :help (documentation 'realgud:window-bt)
  70. ))
  71. (define-key debugger-map [breakpoints]
  72. (realgud-menu-item debugger-map "Breakpoints" 'realgud:window-brkpt
  73. :enable '(realgud-get-process)
  74. :help (documentation 'realgud:window-brkpt)
  75. ))
  76. (define-key debugger-map [arrow3]
  77. (realgud-menu-item debugger-map "Arrow 3" 'realgud-goto-arrow3
  78. :enable '(realgud-get-process)
  79. :help (documentation 'realgud-goto-arrow3)
  80. ))
  81. (define-key debugger-map [arrow2]
  82. (realgud-menu-item debugger-map "Arrow 2" 'realgud-goto-arrow2
  83. :enable '(realgud-get-process)
  84. :help (documentation 'realgud-goto-arrow2)
  85. ))
  86. (define-key debugger-map [arrow1]
  87. (realgud-menu-item debugger-map "Arrow 1" 'realgud-goto-arrow1
  88. :enable '(realgud-get-process)
  89. :help (documentation 'realgud-goto-arrow1)
  90. ))
  91. (define-key debugger-map [break]
  92. (realgud-menu-item debugger-map "Set Breakpoint" 'realgud:cmd-break
  93. :enable '(realgud-get-process)
  94. :help (documentation 'realgud:cmd-break)
  95. ))
  96. (define-key debugger-map [continue]
  97. (realgud-menu-item debugger-map "Continue" 'realgud:cmd-continue
  98. :enable '(realgud-get-process)
  99. :help (documentation 'realgud:cmd-continue)
  100. ))
  101. (define-key debugger-map [until]
  102. (realgud-menu-item debugger-map "Continue to Line" 'realgud:cmd-until
  103. :enable '(and (realgud-get-process) realgud-short-key-mode)
  104. :help (documentation 'realgud:cmd-until)
  105. ))
  106. (define-key debugger-map [next]
  107. (realgud-menu-item debugger-map "Next (step through)" 'realgud:cmd-next
  108. :enable '(realgud-get-process)
  109. :help (documentation 'realgud:cmd-next)
  110. ))
  111. (define-key debugger-map [finish]
  112. (realgud-menu-item debugger-map "Finish (step out)" 'realgud:cmd-finish
  113. :enable '(realgud-get-process)
  114. :help (documentation 'realgud:cmd-finish)
  115. ))
  116. (define-key debugger-map [step]
  117. (realgud-menu-item debugger-map "Step (step into)" 'realgud:cmd-step
  118. :enable '(realgud-get-process)
  119. :help (documentation 'realgud:cmd-step)
  120. ))
  121. (define-key debugger-map [menu-bar debugger line1] '(menu-item "--"))
  122. (define-key debugger-map [down]
  123. (realgud-menu-item debugger-map "Down Stack" 'realgud:cmd-newer-frame
  124. :enable '(realgud-get-process)
  125. :help (documentation 'realgud:cmd-newer-frame)
  126. ))
  127. (define-key debugger-map [up]
  128. (realgud-menu-item debugger-map "Up Stack" 'realgud:cmd-older-frame
  129. :enable '(realgud-get-process)
  130. :help (documentation 'realgud:cmd-older-frame)
  131. ))
  132. (define-key debugger-map [menu-bar debugger line1] '(menu-item "--"))
  133. (define-key debugger-map [quit]
  134. (realgud-menu-item debugger-map "Quit" 'realgud:cmd-quit
  135. :enable '(realgud-get-process)
  136. :help (documentation 'realgud:cmd-quit)
  137. ))
  138. (define-key debugger-map [restart]
  139. (realgud-menu-item debugger-map "Restart" 'realgud:cmd-restart
  140. :enable '(realgud-get-process)
  141. :help (documentation 'realgud:cmd-restart)
  142. ))
  143. (define-key debugger-map [eval]
  144. (realgud-menu-item debugger-map "Evaluate region or string" 'realgud:cmd-eval-dwim
  145. :enable '(realgud-get-process)
  146. :help (documentation 'realgud:cmd-eval-dwim)
  147. ))
  148. (define-key debugger-map [Recenter]
  149. (realgud-menu-item debugger-map "Recenter" 'realgud-recenter-arrow
  150. :enable '(realgud-get-process)
  151. :help (documentation 'realgud-recenter-arrow)
  152. ))
  153. ;; Put them in the menu bar:
  154. (setq menu-bar-final-items (append '(debugger) menu-bar-final-items))
  155. map
  156. ))
  157. (provide-me "realgud-")