Add ability to understand what frame we might be in. Done for trepan.el. Others may follow. Add Emacs command to toggle whether we stay in source or not and better support for cmdbuf-info-describe.
gdb/init.d fix cut-and-paste error.
(dbgr-struct-field-setter "dbgr-cmdbuf-info" "src-shortkey?")
(dbgr-struct-field-setter "dbgr-cmdbuf-info" "in-debugger?")
-(defun dbgr-cmdbuf-info-describe ()
+(defun dbgr-cmdbuf-info-describe (&optional buffer)
(interactive "")
- (let ((info dbgr-cmdbuf-info)
- (cmdbuf-name (buffer-name)))
- (switch-to-buffer (get-buffer-create "*Describe*"))
- (delete-region (point-min) (point-max))
- (insert (format "cmdbuf-info for %s\n" cmdbuf-name))
- (insert (format "Debugger-name: %s\n"
- (dbgr-cmdbuf-info-debugger-name info)))
- (insert (format "In source or command buffer?: %s\n"
- (dbgr-cmdbuf-info-in-srcbuf? info)))
- (insert (format "Command-line args: %s\n"
- (dbgr-cmdbuf-info-cmd-args info)))
- (insert (format "Source should go into shortkey?: %s\n"
- (dbgr-cmdbuf-info-src-shortkey? info)))
- (insert (format "Breakpoint list: %s\n"
- (dbgr-cmdbuf-info-bp-list info)))
- (insert (format "Remap table for debugger commands: %s\n"
- (dbgr-cmdbuf-info-cmd-hash info)))
- (insert (format "Source buffers seen: %s\n"
- (dbgr-cmdbuf-info-srcbuf-list info)))
- (insert (format "Backtrace buffer: %s\n"
- (dbgr-cmdbuf-info-bt-buf info)))
- (insert (format "In debugger?: %s\n"
- (dbgr-cmdbuf-info-in-debugger? info)))
+ (setq buffer (dbgr-get-cmdbuf buffer))
+ (if buffer
+ (with-current-buffer buffer
+ (let ((info dbgr-cmdbuf-info)
+ (cmdbuf-name (buffer-name)))
+ (switch-to-buffer (get-buffer-create "*Describe*"))
+ (delete-region (point-min) (point-max))
+ (insert (format "cmdbuf-info for %s\n" cmdbuf-name))
+ (insert (format "Debugger-name: %s\n"
+ (dbgr-cmdbuf-info-debugger-name info)))
+ (insert (format "Selected window should contain source?: %s\n"
+ (dbgr-cmdbuf-info-in-srcbuf? info)))
+ (insert (format "Command-line args: %s\n"
+ (dbgr-cmdbuf-info-cmd-args info)))
+ (insert (format "Source should go into shortkey?: %s\n"
+ (dbgr-cmdbuf-info-src-shortkey? info)))
+ (insert (format "Breakpoint list: %s\n"
+ (dbgr-cmdbuf-info-bp-list info)))
+ (insert (format "Remap table for debugger commands: %s\n"
+ (dbgr-cmdbuf-info-cmd-hash info)))
+ (insert (format "Source buffers seen: %s\n"
+ (dbgr-cmdbuf-info-srcbuf-list info)))
+ (insert (format "Backtrace buffer: %s\n"
+ (dbgr-cmdbuf-info-bt-buf info)))
+ (insert (format "In debugger?: %s\n"
+ (dbgr-cmdbuf-info-in-debugger? info)))
+ )
+ )
+ (message "Buffer %s is not a debugger buffer; nothing done."
+ (or buffer (current-buffer)))
)
)
dbgr-cmdbuf-info
(dbgr-cmdbuf-info? dbgr-cmdbuf-info)))
-(defun dbgr-cmdbuf-info-in-debugger-toggle ()
- "Toggle state of whether we think we running a debugger or not"
+(defun dbgr-cmdbuf-stay-in-source-toggle (&optional buffer)
+ "Toggle state of whether we should stay in source code or not"
(interactive "")
- (dbgr-cmdbuf-info-in-debugger?= (not (dbgr-sget 'cmdbuf-info 'in-debugger?)))
- (dbgr-cmdbuf-mode-line-update)
-)
+ (setq buffer (dbgr-get-cmdbuf buffer))
+ (if buffer
+ (with-current-buffer buffer
+ (dbgr-cmdbuf-info-in-srcbuf?=
+ (not (dbgr-sget 'cmdbuf-info 'in-srcbuf?)))
+ (message "Selected window should contain source?: %s\n"
+ (dbgr-cmdbuf-info-in-srcbuf? dbgr-cmdbuf-info))
+ )
+ (message "Buffer %s is not a debugger buffer; nothing done."
+ (or buffer (current-buffer)))
+ )
+ )
(defun dbgr-cmdbuf-add-srcbuf(srcbuf &optional cmdbuf)
"Add SRCBUF to srcbuf-list field of INFO unless it is already included."
nil)))))
(defun dbgr-get-cmdbuf( &optional opt-buffer)
- "Return the source-code buffer associated with OPT-BUFFER
+ "Return the command buffer associated with OPT-BUFFER
or `current-buffer' if that is omitted. nil is returned
if we don't find anything."
;; Fringe marks for history of stopping points
;; Bitmap for hollow overlay-arrow in fringe
-;; (define-fringe-bitmap 'hollow-right-triangle
-;; "\xe0\x90\x88\x84\x84\x88\x90\xe0")
+(define-fringe-bitmap 'hollow-right-triangle
+ "\xe0\x90\x88\x84\x84\x88\x90\xe0")
;; FIXME: Figure out how to do this as a macro.
(goto-char dbgr-overlay-arrow1))
)
-(defun dbgr-recenter-arrow()
+(defun dbgr-recenter-arrow(&optional opt-buffer)
"If the current buffer contains dbgr-overlay-arrows 1, 2 or 3
recenter window to show that"
(interactive "")
- ;; We need to update in the order 3..1 so that if there are more than on
- ;; arrows in the same buffer the smaller number (e.g. arrow 1) is the
- ;; position we are at rather than the earlier one (e.g. arrow 3).
- (if (and dbgr-overlay-arrow3
- (eq (marker-buffer dbgr-overlay-arrow3) (current-buffer)))
- (goto-char dbgr-overlay-arrow3)
- )
- (if (and dbgr-overlay-arrow2
- (eq (marker-buffer dbgr-overlay-arrow2) (current-buffer)))
- (goto-char dbgr-overlay-arrow2)
- )
- (if (and dbgr-overlay-arrow1
- (eq (marker-buffer dbgr-overlay-arrow1) (current-buffer)))
- (goto-char dbgr-overlay-arrow1)
- )
- (redisplay)
- )
+ (let ((buffer (or opt-buffer (current-buffer))))
+ ;; We need to update in the order 3..1 so that if there are more than on
+ ;; arrows in the same buffer the smaller number (e.g. arrow 1) is the
+ ;; position we are at rather than the earlier one (e.g. arrow 3).
+ (with-current-buffer-safe buffer
+ (if (and dbgr-overlay-arrow3
+ (eq (marker-buffer dbgr-overlay-arrow3) buffer))
+ (goto-char dbgr-overlay-arrow3)
+ )
+ (if (and dbgr-overlay-arrow2
+ (eq (marker-buffer dbgr-overlay-arrow2) buffer))
+ (goto-char dbgr-overlay-arrow2)
+ )
+ (if (and dbgr-overlay-arrow1
+ (eq (marker-buffer dbgr-overlay-arrow1) buffer))
+ (goto-char dbgr-overlay-arrow1)
+ )
+ (redisplay)
+ )
+ ))
(provide 'dbgr-fringe)
(if (> from to) (psetq to from from to))
(let* ((text (buffer-substring-no-properties from to))
(loc (dbgr-track-loc text cmd-mark))
+ ;; If we see a selected frame number, it is stored
+ ;; in frame-num. Otherwise, nil.
+ (frame-num)
(text-sans-loc)
(bp-loc)
(cmdbuf (or opt-cmdbuf (current-buffer)))
(with-current-buffer cmdbuf
(if (dbgr-sget 'cmdbuf-info 'divert-output?)
(dbgr-track-divert-prompt text cmdbuf to))
+ ;; FIXME: instead of these fixed filters,
+ ;; put into a list and iterate over that.
(setq text-sans-loc (or (dbgr-track-loc-remaining text) text))
+ (setq frame-num (dbgr-track-selected-frame text) text)
(setq bp-loc (dbgr-track-bp-loc text-sans-loc cmd-mark cmdbuf))
(if bp-loc
(let ((src-buffer (dbgr-loc-goto bp-loc)))
(dbgr-bp-add-info bp-loc)
)))
(if loc
- (progn
- (dbgr-track-loc-action loc cmdbuf)
+ (let ((selected-frame
+ (or (not frame-num)
+ (eq frame-num (dbgr-cmdbuf-pat "top-frame-num")))))
+ (dbgr-track-loc-action loc cmdbuf (not selected-frame))
(dbgr-cmdbuf-info-in-debugger?= 't)
(dbgr-cmdbuf-mode-line-update)
)
(interactive)
(dbgr-track-hist-fn-internal 'dbgr-loc-hist-oldest))
-(defun dbgr-track-loc-action (loc cmdbuf)
+(defun dbgr-track-loc-action (loc cmdbuf &optional not-selected-frame)
"If loc is valid, show loc and do whatever actions we do for
encountering a new loc."
(if (dbgr-loc? loc)
(with-current-buffer srcbuf
(if (and (boundp 'dbgr-overlay-arrow1)
(markerp dbgr-overlay-arrow1))
- (dbgr-window-update-position srcbuf dbgr-overlay-arrow1)))
+ (progn
+ ;; Doesn't work
+ ;; (if not-selected-frame
+ ;; (set-fringe-bitmap-face 'hollow-right-triangle
+ ;; 'dbgr-overlay-arrow1)
+ ;; ; else
+ ;; (set-fringe-bitmap-face 'dbgr-right-triangle1
+ ;; 'dbgr-overlay-arrow1)
+ ;; )
+ (dbgr-window-update-position srcbuf dbgr-overlay-arrow1)))
+ )
(if cmd-window (select-window cmd-window)))
- (dbgr-window-src srcbuf)
+ ; else
+ (progn
+ (dbgr-window-src srcbuf)
+ (dbgr-window-update-position srcbuf dbgr-overlay-arrow1))
)
- )))
+ ))
+ )
(defun dbgr-track-loc(text cmd-mark &optional opt-regexp opt-file-group opt-line-group )
"Do regular-expression matching to find a file name and line number inside
nil)
)
+(defun dbgr-track-selected-frame(text)
+ "Return a selected frame number found in TEXT or nil if none found."
+ (if (dbgr-cmdbuf?)
+ (let ((selected-frame-pat (dbgr-cmdbuf-pat "selected-frame"))
+ (frame-num-regexp)
+ )
+ (if (and selected-frame-pat
+ (setq frame-num-regexp (dbgr-loc-pat-regexp
+ selected-frame-pat)))
+ (if (string-match frame-num-regexp text)
+ (let ((frame-num-group (dbgr-loc-pat-num selected-frame-pat)))
+ (string-to-number (match-string frame-num-group text)))
+ nil)
+ nil))
+ nil)
+ )
+
(defun dbgr-track-divert-prompt(text cmdbuf to)
"Return a cons node of the part before the prompt-regexp and the part
after the prompt-regexp-prompt. If not found return nil."
(defun dbgr-window-update-position (buffer marker)
"Update BUFFER to position specified with MARKER.
-We assume MAKER points inside BUFFER"
+We assume MARKER points inside BUFFER"
(with-current-buffer buffer
(let ((window (get-buffer-window buffer)))
(if window
(progn
(select-window window)
- (goto-char marker))))))
+ (goto-char marker)
+ (redisplay)
+ )
+ )))
+ )
(defun dbgr-window-src ( &optional opt-buffer )
See also `dbgr-window-src-undistub-cmd'"
(let* ((buffer (or opt-buffer (current-buffer)))
(src-buffer (dbgr-get-srcbuf buffer))
- (src-window (get-buffer-window src-buffer))
+ (src-window (get-buffer-window src-buffer 'visible))
(window (selected-window)))
(if src-buffer
- (unless src-window
+ (unless (and src-window (not (window-minibuffer-p)))
(set-window-buffer window src-buffer))
- )))
+ )
+ ))
(defun dbgr-window-src-undisturb-cmd ( &optional opt-buffer )
"Make sure the source buffers is displayed in windows without
(1 dbgr-backtrace-number-face))
))
-(setf (gethash "gdb" dbgr-pat-hash) dbgr-trepan-pat-hash)
+(setf (gethash "gdb" dbgr-pat-hash) dbgr-gdb-pat-hash)
(defvar dbgr-gdb-command-hash (make-hash-table :test 'equal)
"Hash key is command name like 'continue' and the value is
:regexp "^Deleted breakpoint \\([0-9]+\\)\n"
:num 1))
+(defconst dbgr-trepan-selected-frame-indicator "-->"
+"String that describes which frame is selected in a debugger
+backtrace listing.")
+
+(defconst dbgr-trepan-frame-file-regexp
+ "[ \t\n]+in file \\([^ \n]+\\)")
+
+;; Top frame number
+(setf (gethash "top-frame-num" dbgr-trepan-pat-hash) 0)
+
+;; Regular expression that describes a debugger "selected" frame in in
+;; a frame-motion command.
+;; For example:
+;; --> #1 TOP Object#<top /usr/local/bin/irb> in file /usr/local/bin/irb at line 9
+(setf (gethash "selected-frame" dbgr-trepan-pat-hash)
+ (make-dbgr-loc-pat
+ :regexp
+ (format "^%s #\\([0-9]+\\) .*%s"
+ dbgr-trepan-selected-frame-indicator
+ dbgr-trepan-frame-file-regexp)
+ :num 1))
+
(setf (gethash "control-frame" dbgr-trepan-pat-hash)
(make-dbgr-loc-pat
:regexp "^c:\\([0-9]+\\) p:\\([0-9]+\\) s:\\([0-9]+\\) b:\\([0-9]+\\) l:\\([0-9a-f]+\\) d:\\([0-9a-f]+\\) \\([A-Z]+\\) \\(.+\\):\\([0-9]+\\)"
;; Regular expression that describes a Ruby $! string
(setf (gethash "dollar-bang" dbgr-trepan-pat-hash) dbgr-ruby-dollar-bang)
-(defconst dbgr-trepan-frame-file-regexp
- "[ \t\n]+in file \\([^ \n]+\\)")
-
;; Regular expression that describes debugger "backtrace" command line.
;; e.g.
;; --> #0 METHOD Object#require(path) in file <internal:lib/require> at line 28
:line-group 7)
)
-(defconst dbgr-trepan-selected-frame-arrow "-->"
-"String that describes which frame is selected in a debugger
-backtrace listing.")
-
;; Regular expression that describes which frame is selected in
;; a debugger backtrace listing.
(setf (gethash "selected-frame-indicator" dbgr-trepan-pat-hash)
- dbgr-trepan-selected-frame-arrow)
+ dbgr-trepan-selected-frame-indicator)
(setf (gethash "font-lock-keywords" dbgr-trepan-pat-hash)
'(
(assert-equal line-number (dbgr-loc-line-number loc)))
)
+ (specify "dbgr-track-selected-frame"
+ (setq debugger-output "up
+--> #1 TOP Object#<top /usr/local/bin/irb> in file /usr/local/bin/irb at line 9
+ (/usr/local/bin/irb:9 @11)
+require irb'
+")
+ (assert-equal 1 (dbgr-track-selected-frame debugger-output))
+
+ (setq debugger-output "
+--> #0 TOP Object#<top /usr/local/bin/irb> in file /usr/local/bin/irb at line 9
+ (/usr/local/bin/irb:9 @11)
+require irb'
+")
+ (assert-equal 0 (dbgr-track-selected-frame debugger-output))
+
+ (setq debugger-output "
+<- (<internal:lib/rubygems/custom_require>:38 remapped /usr/local/lib/ruby/gems/1.9.1/gems/trepanning-0.1.3.dev/data/custom_require.rb:38 @16)
+R=> false
+end
+")
+ (assert-nil (dbgr-track-selected-frame debugger-output))
+ )
+
+
;; (setq debugger-bp-output (format "Breakpoint %d set at line %d\n\tin file %s.\n"
;; bp-num line-number filename))
;; (setq bp-loc (dbgr-track-bp-loc debugger-bp-output nil))