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.

208 lines
8.1 KiB

  1. ;;; Copyright (C) 2010, 2012-2015, 2017 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. ;; You should have received a copy of the GNU General Public License
  12. ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. ;;; source-code buffer code
  14. (eval-when-compile
  15. (defvar realgud-srcbuf-info) ;; is buffer local
  16. (defvar realgud-cmdbuf-info) ;; in the cmdbuf, this is buffer local
  17. )
  18. (require 'cl-lib)
  19. (require 'load-relative)
  20. (require-relative-list '("../helper" "../key") "realgud-")
  21. (declare-function realgud-populate-common-keys 'realgud-menu)
  22. (declare-function buffer-killed? 'realgud-helper)
  23. (declare-function buffer-loc-line-number? 'realgud-loc)
  24. (declare-function realgud-cmdbuf-add-srcbuf 'realgud-cmdbuf)
  25. (declare-function realgud-cmdbuf-info-bp-list 'realgud-cmdbuf)
  26. (declare-function realgud-cmdbuf? 'realgud-cmdbuf)
  27. (declare-function realgud-loc-marker 'realgud-loc)
  28. (declare-function realgud-loc-line-number 'realgud-loc)
  29. (declare-function realgud-loc-num 'realgud-loc)
  30. (declare-function make-realgud-loc-hist 'realgud-lochist)
  31. (declare-function realgud-get-srcbuf 'helper)
  32. (declare-function realgud-short-key-mode-setup 'realgud-shortkey)
  33. (cl-defstruct realgud-srcbuf-info
  34. "debugger object/structure specific to a (top-level) source program
  35. to be debugged."
  36. cmdproc ;; buffer of the associated debugger process
  37. cur-pos ;; If not nil, the debugger thinks we are currently
  38. ;; positioned at a corresponding place in the
  39. ;; program.
  40. short-key? ;; Was the source buffer previously in short-key
  41. ;; mode? Used to deterimine when short-key mode
  42. ;; changes state in a source buffer, so we need to
  43. ;; perform on/off actions.
  44. was-read-only? ;; Was buffer initially read only? (i.e. the original
  45. ;; value of the buffer's buffer-read-only
  46. ;; variable. Short-key-mode may change the read-only
  47. ;; state, so we need restore this value when leaving
  48. ;; short-key mode
  49. prev-local-map ;; Local map before enabling short-key-mode
  50. loc-hist ;; ring of locations seen
  51. ;; FILL IN THE FUTURE
  52. ;;(brkpt-alist '()) ;; alist of breakpoints the debugger has referring
  53. ;; to this buffer. Each item is (brkpt-name . marker)
  54. ;;
  55. )
  56. (defalias 'realgud-srcbuf-info? 'realgud-srcbuf-p)
  57. ;; FIXME: figure out how to put in a loop.
  58. (realgud-struct-field-setter "realgud-srcbuf-info" "cmdproc")
  59. (realgud-struct-field-setter "realgud-srcbuf-info" "short-key?")
  60. (realgud-struct-field-setter "realgud-srcbuf-info" "was-read-only?")
  61. (realgud-struct-field-setter "realgud-srcbuf-info" "prev-local-map")
  62. (defun realgud-srcbuf-info-set? ()
  63. "Return non-nil if `realgud-srcbuf-info' is set."
  64. (and (bound-and-true-p realgud-srcbuf-info)
  65. (realgud-srcbuf-info? realgud-srcbuf-info)))
  66. (defun realgud-srcbuf? (&optional buffer)
  67. "Return non-nil if BUFFER is a debugger source buffer."
  68. (with-current-buffer-safe (or buffer (current-buffer))
  69. (and (realgud-srcbuf-info-set?)
  70. (not (buffer-killed? (realgud-sget 'srcbuf-info 'cmdproc)))
  71. )))
  72. (defun realgud--read-cmd-buf (prompt)
  73. "Read a command buffer, prompting with PROMPT."
  74. (let* ((cmd-bufs (cl-remove-if-not #'realgud-cmdbuf? (buffer-list)))
  75. (buf-names (mapcar #'buffer-name cmd-bufs))
  76. (default (car buf-names)))
  77. (when buf-names
  78. ;; Use completing-read instead of read-buffer: annoyingly, ido's
  79. ;; read-buffer ignores predicates.
  80. (setq prompt (format "%s (default: %s): " prompt default))
  81. (get-buffer (completing-read prompt buf-names nil t nil nil default)))))
  82. (defun realgud--ensure-attached (&optional src-buf)
  83. "Try to attach SRC-BUF to a command buffer.
  84. If SRC-BUF is already attached, do nothing. Otherwise, prompt
  85. the user for a command buffer to associate SRC-BUF to. Returns
  86. non-nil if association was successful. SRC-BUF defaults to
  87. current buffer."
  88. (setq src-buf (or src-buf (current-buffer)))
  89. (unless (realgud-srcbuf? src-buf)
  90. (let ((cmd-buf (realgud--read-cmd-buf "Command buffer to attach to")))
  91. (if cmd-buf
  92. (realgud-srcbuf-init src-buf cmd-buf)
  93. (message "No debugger process found to attach %s to" (buffer-name)))))
  94. (realgud-srcbuf? src-buf))
  95. (defun realgud-srcbuf-debugger-name (&optional src-buf)
  96. "Return the debugger name recorded in the debugger command-process buffer."
  97. (with-current-buffer-safe (or src-buf (current-buffer))
  98. (realgud-sget 'srcbuf-info 'debugger-name))
  99. )
  100. (defun realgud-srcbuf-loc-hist(src-buf)
  101. "Return the history ring of locations that a debugger process has stored."
  102. (with-current-buffer-safe src-buf
  103. (realgud-sget 'srcbuf-info 'loc-hist))
  104. )
  105. (declare-function fn-p-to-fn?-alias(sym))
  106. (fn-p-to-fn?-alias 'realgud-srcbuf-info-p)
  107. (declare-function realgud-srcbuf-info?(var))
  108. (declare-function realgud-cmdbuf-info-name(cmdbuf-info))
  109. ;; FIXME: support a list of cmdprocs's since we want to allow
  110. ;; a source buffer to potentially participate in several debuggers
  111. ;; which might be active.
  112. (make-variable-buffer-local 'realgud-srcbuf-info)
  113. (defun realgud-srcbuf-init
  114. (src-buffer cmdproc-buffer)
  115. "Initialize SRC-BUFFER as a source-code buffer for a debugger.
  116. CMDPROC-BUFFER is the process-command buffer containing the
  117. debugger."
  118. (with-current-buffer cmdproc-buffer
  119. (set-buffer src-buffer)
  120. (set (make-local-variable 'realgud-srcbuf-info)
  121. (make-realgud-srcbuf-info
  122. :cmdproc cmdproc-buffer
  123. :loc-hist (make-realgud-loc-hist)))
  124. (put 'realgud-srcbuf-info 'variable-documentation
  125. "Debugger information for a buffer containing source code.")))
  126. (defun realgud-srcbuf-init-or-update (src-buffer cmdproc-buffer)
  127. "Call `realgud-srcbuf-init' for SRC-BUFFER update `realgud-srcbuf-info' variables
  128. in it with those from CMDPROC-BUFFER"
  129. (realgud-cmdbuf-add-srcbuf src-buffer cmdproc-buffer)
  130. (with-current-buffer-safe src-buffer
  131. (realgud-populate-common-keys
  132. ;; use-local-map returns nil so e have to call (current-local-map)
  133. ;; again in this case.
  134. (or (current-local-map) (use-local-map (make-sparse-keymap))
  135. (current-local-map)))
  136. (if (realgud-srcbuf-info? realgud-srcbuf-info)
  137. (realgud-srcbuf-info-cmdproc= cmdproc-buffer)
  138. (realgud-srcbuf-init src-buffer cmdproc-buffer))))
  139. (defun realgud:cmdbuf-associate ()
  140. "Associate a command buffer with the current (source-code) buffer."
  141. ;; realgud-short-key-mode-setup will attempt to associate if needed.
  142. (realgud-short-key-mode-setup t))
  143. (defun realgud-srcbuf-bp-list(&optional buffer)
  144. "Return a list of breakpoint loc structures that reside in
  145. BUFFER. BUFFER should be an initialized source buffer."
  146. (let ((src-buffer (realgud-get-srcbuf buffer)))
  147. (if src-buffer
  148. (with-current-buffer src-buffer
  149. (let* ((info realgud-srcbuf-info)
  150. (cmdbuf (realgud-srcbuf-info-cmdproc info)))
  151. (with-current-buffer cmdbuf
  152. (let ((bp-list
  153. (realgud-cmdbuf-info-bp-list realgud-cmdbuf-info)))
  154. (delq nil
  155. (mapcar (lambda (loc)
  156. (cond ((eq src-buffer
  157. (marker-buffer (realgud-loc-marker loc)))
  158. loc)
  159. (nil)))
  160. bp-list))
  161. )))))))
  162. (defun realgud-get-bpnum-from-line-num(line-num &optional buffer)
  163. "Find a breakpoint number associated with LINE-NUM in source code BUFFER.
  164. If none exists return nil"
  165. (let ((src-buffer (realgud-get-srcbuf buffer))
  166. (bp-num nil)
  167. (bp)
  168. (bp-list)
  169. )
  170. (if src-buffer
  171. (progn
  172. (setq bp-list (realgud-srcbuf-bp-list src-buffer))
  173. (while (and (not bp-num) bp-list)
  174. (setq bp (car bp-list))
  175. (setq bp-list (cdr bp-list))
  176. (if (eq line-num (realgud-loc-line-number bp))
  177. (setq bp-num (realgud-loc-num bp)))
  178. ))
  179. )
  180. bp-num))
  181. (provide-me "realgud-buffer-")