Created
November 24, 2012 21:31
-
-
Save mshroyer/4141475 to your computer and use it in GitHub Desktop.
Keyboard navigation between emacs gdb windows
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ;; For the consistency of gdb-select-window's calling convention... | |
| (defun gdb-comint-buffer-name () | |
| (buffer-name gud-comint-buffer)) | |
| (defun gdb-source-buffer-name () | |
| (buffer-name (window-buffer gdb-source-window))) | |
| (defun gdb-select-window (header) | |
| "Switch directly to the specified GDB window. | |
| Moves the cursor to the requested window, switching between | |
| `gdb-many-windows' \"tabs\" if necessary in order to get there. | |
| Recognized window header names are: 'comint, 'locals, 'registers, | |
| 'stack, 'breakpoints, 'threads, and 'source." | |
| (interactive "Sheader: ") | |
| (let* ((header-alternate (case header | |
| ('locals 'registers) | |
| ('registers 'locals) | |
| ('breakpoints 'threads) | |
| ('threads 'breakpoints))) | |
| (buffer (intern (concat "gdb-" (symbol-name header) "-buffer"))) | |
| (buffer-names (mapcar (lambda (header) | |
| (funcall (intern (concat "gdb-" | |
| (symbol-name header) | |
| "-buffer-name")))) | |
| (if (null header-alternate) | |
| (list header) | |
| (list header header-alternate)))) | |
| (window (if (eql header 'source) | |
| gdb-source-window | |
| (or (get-buffer-window (car buffer-names)) | |
| (when (not (null (cadr buffer-names))) | |
| (get-buffer-window (cadr buffer-names))))))) | |
| (when (not (null window)) | |
| (let ((was-dedicated (window-dedicated-p window))) | |
| (select-window window) | |
| (set-window-dedicated-p window nil) | |
| (when (member header '(locals registers breakpoints threads)) | |
| (switch-to-buffer (gdb-get-buffer-create buffer)) | |
| (setq header-line-format (gdb-set-header buffer))) | |
| (set-window-dedicated-p window was-dedicated)) | |
| t))) | |
| ;; Use global keybindings for the window selection functions so that they | |
| ;; work from the source window too... | |
| (mapcar (lambda (setting) | |
| (lexical-let ((key (car setting)) | |
| (header (cdr setting))) | |
| (global-set-key (concat "\C-c\C-g" key) #'(lambda () | |
| (interactive) | |
| (gdb-select-window header))))) | |
| '(("c" . comint) | |
| ("l" . locals) | |
| ("r" . registers) | |
| ("u" . source) | |
| ("s" . stack) | |
| ("b" . breakpoints) | |
| ("t" . threads))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment