Mercurial > emacs
comparison lisp/progmodes/gud.el @ 62134:6cd1d39df919
Move code for GUD tooltips from tooltip.el.
(require): CL needed to compile case.
(gud-tooltip-mode): Use to toggle GUD tooltips unstead of
tooltip-gud-tips-p. Make it a minor-mode.
(gud-find-file): Only prepare GUD tooltips if gud-tooltip-mode is t.
(gud-menu-map): GUD tooltips use gud-tooltip-mode now.
(gud-tooltip-modes, gud-tooltip-display, gud-tooltip-echo-area)
(gud-tooltip-change-major-mode)
(gud-tooltip-activate-mouse-motions-if-enabled)
(gud-tooltip-mouse-motions-active, gud-tooltip-activate-mouse-motions)
(gud-tooltip-mouse-motion, gud-tooltip-toggle-dereference)
(gud-tooltip-original-filter, gud-tooltip-dereference)
(gud-tooltip-event, tooltip-toggle-gud-tips)
(gud-tooltip-process-output, gud-tooltip-print-command)
(gud-tooltip-tips): Moved from tooltip.el.
author | Nick Roberts <nickrob@snap.net.nz> |
---|---|
date | Fri, 06 May 2005 22:10:50 +0000 |
parents | 471fca8487d3 |
children | 8ea5bf9aeed7 |
comparison
equal
deleted
inserted
replaced
62133:d9019b7cf44f | 62134:6cd1d39df919 |
---|---|
36 ;; a menu. Brian D. Carlstrom <bdc@ai.mit.edu> combined the IRIX kluge with | 36 ;; a menu. Brian D. Carlstrom <bdc@ai.mit.edu> combined the IRIX kluge with |
37 ;; the gud-xdb-directories hack producing gud-dbx-directories. Derek L. Davies | 37 ;; the gud-xdb-directories hack producing gud-dbx-directories. Derek L. Davies |
38 ;; <ddavies@world.std.com> added support for jdb (Java debugger.) | 38 ;; <ddavies@world.std.com> added support for jdb (Java debugger.) |
39 | 39 |
40 ;;; Code: | 40 ;;; Code: |
41 | |
42 (eval-when-compile (require 'cl)) ; for case macro | |
41 | 43 |
42 (require 'comint) | 44 (require 'comint) |
43 (require 'etags) | 45 (require 'etags) |
44 | 46 |
45 ;; ====================================================================== | 47 ;; ====================================================================== |
111 (Info-goto-node "(emacs)GDB Graphical Interface") | 113 (Info-goto-node "(emacs)GDB Graphical Interface") |
112 (Info-goto-node "(emacs)Debuggers")))) | 114 (Info-goto-node "(emacs)Debuggers")))) |
113 | 115 |
114 (easy-mmode-defmap gud-menu-map | 116 (easy-mmode-defmap gud-menu-map |
115 '(([help] "Info" . gud-goto-info) | 117 '(([help] "Info" . gud-goto-info) |
116 ([tooltips] menu-item "Toggle GUD tooltips" tooltip-toggle-gud-tips | 118 ([tooltips] menu-item "Toggle GUD tooltips" gud-tooltip-mode |
117 :enable (and (not emacs-basic-display) | 119 :enable (and (not emacs-basic-display) |
118 (display-graphic-p) | 120 (display-graphic-p) |
119 (fboundp 'x-show-tip)) | 121 (fboundp 'x-show-tip)) |
120 :button (:toggle . tooltip-gud-tips-p)) | 122 :button (:toggle . gud-tooltip-mode)) |
121 ([refresh] "Refresh" . gud-refresh) | 123 ([refresh] "Refresh" . gud-refresh) |
122 ([run] menu-item "Run" gud-run | 124 ([run] menu-item "Run" gud-run |
123 :enable (and (not gud-running) | 125 :enable (and (not gud-running) |
124 (memq gud-minor-mode '(gdbmi gdba gdb dbx jdb)))) | 126 (memq gud-minor-mode '(gdbmi gdba gdb dbx jdb)))) |
125 ([until] menu-item "Continue to selection" gud-until | 127 ([until] menu-item "Continue to selection" gud-until |
226 (when buf | 228 (when buf |
227 ;; Copy `gud-minor-mode' to the found buffer to turn on the menu. | 229 ;; Copy `gud-minor-mode' to the found buffer to turn on the menu. |
228 (with-current-buffer buf | 230 (with-current-buffer buf |
229 (set (make-local-variable 'gud-minor-mode) minor-mode) | 231 (set (make-local-variable 'gud-minor-mode) minor-mode) |
230 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) | 232 (set (make-local-variable 'tool-bar-map) gud-tool-bar-map) |
231 (when (memq gud-minor-mode '(gdbmi gdba)) | 233 (when (and gud-tooltip-mode |
234 (memq gud-minor-mode '(gdbmi gdba))) | |
232 (make-local-variable 'gdb-define-alist) | 235 (make-local-variable 'gdb-define-alist) |
233 (unless gdb-define-alist (gdb-create-define-alist)) | 236 (unless gdb-define-alist (gdb-create-define-alist)) |
234 (add-hook 'after-save-hook 'gdb-create-define-alist nil t)) | 237 (add-hook 'after-save-hook 'gdb-create-define-alist nil t)) |
235 (make-local-variable 'gud-keep-buffer)) | 238 (make-local-variable 'gud-keep-buffer)) |
236 buf))) | 239 buf))) |
3098 (font-lock-syntactic-keywords | 3101 (font-lock-syntactic-keywords |
3099 . gdb-script-font-lock-syntactic-keywords) | 3102 . gdb-script-font-lock-syntactic-keywords) |
3100 (font-lock-syntactic-face-function | 3103 (font-lock-syntactic-face-function |
3101 . gdb-script-font-lock-syntactic-face)))) | 3104 . gdb-script-font-lock-syntactic-face)))) |
3102 | 3105 |
3106 | |
3107 ;;; tooltips for GUD | |
3108 | |
3109 ;;; Customizable settings | |
3110 (defcustom gud-tooltip-modes '(gud-mode c-mode c++-mode fortran-mode) | |
3111 "List of modes for which to enable GUD tips." | |
3112 :type 'sexp | |
3113 :tag "GUD modes" | |
3114 :group 'tooltip) | |
3115 | |
3116 (defcustom gud-tooltip-display | |
3117 '((eq (tooltip-event-buffer gud-tooltip-event) | |
3118 (marker-buffer gud-overlay-arrow-position))) | |
3119 "List of forms determining where GUD tooltips are displayed. | |
3120 | |
3121 Forms in the list are combined with AND. The default is to display | |
3122 only tooltips in the buffer containing the overlay arrow." | |
3123 :type 'sexp | |
3124 :tag "GUD buffers predicate" | |
3125 :group 'tooltip) | |
3126 | |
3127 (defcustom gud-tooltip-echo-area nil | |
3128 "Use the echo area instead of frames for GUD tooltips." | |
3129 :type 'boolean | |
3130 :tag "Use echo area" | |
3131 :group 'tooltip) | |
3132 | |
3133 (define-obsolete-variable-alias 'tooltip-gud-modes | |
3134 'gud-tooltip-modes "22.1") | |
3135 (define-obsolete-variable-alias 'tooltip-gud-display | |
3136 'gud-tooltip-display "22.1") | |
3137 (define-obsolete-variable-alias 'tooltip-use-echo-area | |
3138 'gud-tooltip-echo-area "22.1") | |
3139 | |
3140 ;;; Reacting on mouse movements | |
3141 | |
3142 (defun gud-tooltip-change-major-mode () | |
3143 "Function added to `change-major-mode-hook' when tooltip mode is on." | |
3144 (add-hook 'post-command-hook 'gud-tooltip-activate-mouse-motions-if-enabled)) | |
3145 | |
3146 (defun gud-tooltip-activate-mouse-motions-if-enabled () | |
3147 "Reconsider for all buffers whether mouse motion events are desired." | |
3148 (remove-hook 'post-command-hook | |
3149 'gud-tooltip-activate-mouse-motions-if-enabled) | |
3150 (dolist (buffer (buffer-list)) | |
3151 (save-excursion | |
3152 (set-buffer buffer) | |
3153 (if (and gud-tooltip-mode | |
3154 (memq major-mode gud-tooltip-modes)) | |
3155 (gud-tooltip-activate-mouse-motions t) | |
3156 (gud-tooltip-activate-mouse-motions nil))))) | |
3157 | |
3158 (defvar gud-tooltip-mouse-motions-active nil | |
3159 "Locally t in a buffer if tooltip processing of mouse motion is enabled.") | |
3160 | |
3161 (defun gud-tooltip-activate-mouse-motions (activatep) | |
3162 "Activate/deactivate mouse motion events for the current buffer. | |
3163 ACTIVATEP non-nil means activate mouse motion events." | |
3164 (if activatep | |
3165 (progn | |
3166 (make-local-variable 'gud-tooltip-mouse-motions-active) | |
3167 (setq gud-tooltip-mouse-motions-active t) | |
3168 (make-local-variable 'track-mouse) | |
3169 (setq track-mouse t)) | |
3170 (when gud-tooltip-mouse-motions-active | |
3171 (kill-local-variable 'gud-tooltip-mouse-motions-active) | |
3172 (kill-local-variable 'track-mouse)))) | |
3173 | |
3174 (defun gud-tooltip-mouse-motion (event) | |
3175 "Command handler for mouse movement events in `global-map'." | |
3176 (interactive "e") | |
3177 (tooltip-hide) | |
3178 (when (car (mouse-pixel-position)) | |
3179 (setq tooltip-last-mouse-motion-event (copy-sequence event)) | |
3180 (tooltip-start-delayed-tip))) | |
3181 | |
3182 ;;; Tips for `gud' | |
3183 | |
3184 (defvar gud-tooltip-original-filter nil | |
3185 "Process filter to restore after GUD output has been received.") | |
3186 | |
3187 (defvar gud-tooltip-dereference nil | |
3188 "Non-nil means print expressions with a `*' in front of them. | |
3189 For C this would dereference a pointer expression.") | |
3190 | |
3191 (defvar gud-tooltip-event nil | |
3192 "The mouse movement event that led to a tooltip display. | |
3193 This event can be examined by forms in GUD-TOOLTIP-DISPLAY.") | |
3194 | |
3195 (defun gud-tooltip-toggle-dereference () | |
3196 "Toggle whether tooltips should show `* expr' or `expr'." | |
3197 (interactive) | |
3198 (setq gud-tooltip-dereference (not gud-tooltip-dereference)) | |
3199 (when (interactive-p) | |
3200 (message "Dereferencing is now %s." | |
3201 (if gud-tooltip-dereference "on" "off")))) | |
3202 | |
3203 (define-obsolete-function-alias 'tooltip-gud-toggle-dereference | |
3204 'gud-tooltip-toggle-dereference "22.1") | |
3205 | |
3206 (define-minor-mode gud-tooltip-mode | |
3207 "Toggle the display of GUD tooltips." | |
3208 :global t | |
3209 :group 'gud | |
3210 (if gud-tooltip-mode | |
3211 (progn | |
3212 (add-hook 'change-major-mode-hook 'gud-tooltip-change-major-mode) | |
3213 (add-hook 'pre-command-hook 'tooltip-hide) | |
3214 (add-hook 'tooltip-hook 'gud-tooltip-tips) | |
3215 (define-key global-map [mouse-movement] 'gud-tooltip-mouse-motion)) | |
3216 (unless tooltip-mode (remove-hook 'pre-command-hook 'tooltip-hide) | |
3217 (remove-hook 'change-major-mode-hook 'tooltip-change-major-mode) | |
3218 (remove-hook 'tooltip-hook 'gud-tooltip-tips) | |
3219 (define-key global-map [mouse-movement] 'ignore))) | |
3220 (gud-tooltip-activate-mouse-motions-if-enabled) | |
3221 (if (with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba)) | |
3222 (if gud-tooltip-mode | |
3223 (progn | |
3224 (dolist (buffer (buffer-list)) | |
3225 (unless (eq buffer gud-comint-buffer) | |
3226 (with-current-buffer buffer | |
3227 (when (and (memq gud-minor-mode '(gdbmi gdba)) | |
3228 (not (string-match "\\`\\*.+\\*\\'" | |
3229 (buffer-name)))) | |
3230 (make-local-variable 'gdb-define-alist) | |
3231 (gdb-create-define-alist) | |
3232 (add-hook 'after-save-hook | |
3233 'gdb-create-define-alist nil t)))))) | |
3234 (kill-local-variable 'gdb-define-alist) | |
3235 (remove-hook 'after-save-hook 'gdb-create-define-alist t)))) | |
3236 | |
3237 ; This will only display data that comes in one chunk. | |
3238 ; Larger arrays (say 400 elements) are displayed in | |
3239 ; the tootip incompletely and spill over into the gud buffer. | |
3240 ; Switching the process-filter creates timing problems and | |
3241 ; it may be difficult to do better. Using annotations as in | |
3242 ; gdb-ui.el gets round this problem. | |
3243 (defun gud-tooltip-process-output (process output) | |
3244 "Process debugger output and show it in a tooltip window." | |
3245 (set-process-filter process gud-tooltip-original-filter) | |
3246 (tooltip-show (tooltip-strip-prompt process output) | |
3247 gud-tooltip-echo-area)) | |
3248 | |
3249 (defun gud-tooltip-print-command (expr) | |
3250 "Return a suitable command to print the expression EXPR. | |
3251 If GUD-TOOLTIP-DEREFERENCE is t, also prepend a `*' to EXPR." | |
3252 (when gud-tooltip-dereference | |
3253 (setq expr (concat "*" expr))) | |
3254 (case gud-minor-mode | |
3255 ((gdb gdba) (concat "server print " expr)) | |
3256 (dbx (concat "print " expr)) | |
3257 (xdb (concat "p " expr)) | |
3258 (sdb (concat expr "/")) | |
3259 (perldb expr))) | |
3260 | |
3261 (defun gud-tooltip-tips (event) | |
3262 "Show tip for identifier or selection under the mouse. | |
3263 The mouse must either point at an identifier or inside a selected | |
3264 region for the tip window to be shown. If gud-tooltip-dereference is t, | |
3265 add a `*' in front of the printed expression. In the case of a C program | |
3266 controlled by GDB, show the associated #define directives when program is | |
3267 not executing. | |
3268 | |
3269 This function must return nil if it doesn't handle EVENT." | |
3270 (let (process) | |
3271 (when (and (eventp event) | |
3272 gud-tooltip-mode | |
3273 (boundp 'gud-comint-buffer) | |
3274 gud-comint-buffer | |
3275 (buffer-name gud-comint-buffer); gud-comint-buffer might be killed | |
3276 (setq process (get-buffer-process gud-comint-buffer)) | |
3277 (posn-point (event-end event)) | |
3278 (or (and (eq gud-minor-mode 'gdba) (not gdb-active-process)) | |
3279 (progn (setq gud-tooltip-event event) | |
3280 (eval (cons 'and gud-tooltip-display))))) | |
3281 (let ((expr (tooltip-expr-to-print event))) | |
3282 (when expr | |
3283 (if (and (eq gud-minor-mode 'gdba) | |
3284 (not gdb-active-process)) | |
3285 (progn | |
3286 (with-current-buffer | |
3287 (window-buffer (let ((mouse (mouse-position))) | |
3288 (window-at (cadr mouse) | |
3289 (cddr mouse)))) | |
3290 (let ((define-elt (assoc expr gdb-define-alist))) | |
3291 (unless (null define-elt) | |
3292 (tooltip-show (cdr define-elt)) | |
3293 expr)))) | |
3294 (let ((cmd (gud-tooltip-print-command expr))) | |
3295 (unless (null cmd) ; CMD can be nil if unknown debugger | |
3296 (if (eq gud-minor-mode 'gdba) | |
3297 (gdb-enqueue-input | |
3298 (list (concat cmd "\n") 'gdb-tooltip-print)) | |
3299 (setq gud-tooltip-original-filter (process-filter process)) | |
3300 (set-process-filter process 'gud-tooltip-process-output) | |
3301 (gud-basic-call cmd)) | |
3302 expr)))))))) | |
3303 | |
3103 (provide 'gud) | 3304 (provide 'gud) |
3104 | 3305 |
3105 ;;; arch-tag: 6d990948-df65-461a-be39-1c7fb83ac4c4 | 3306 ;;; arch-tag: 6d990948-df65-461a-be39-1c7fb83ac4c4 |
3106 ;;; gud.el ends here | 3307 ;;; gud.el ends here |