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.
 
 
 

225 lines
7.1 KiB

;; Copyright (C) 2010, 2014-2016, 2019 Free Software Foundation, Inc
;; Author: Rocky Bernstein <rocky@gnu.org>
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
(require 'load-relative)
(require-relative-list '("helper") "realgud-")
(require-relative-list '("buffer/helper") "realgud-buffer-")
(declare-function realgud:backtrace-init 'realgud-buffer-helper)
(declare-function realgud:breakpoint-init 'realgud-buffer-helper)
(declare-function realgud-get-backtrace-buf 'realgud-buffer-helper)
(declare-function realgud-get-breakpoint-buf 'realgud-buffer-helper)
(declare-function realgud-get-cmdbuf 'realgud-buffer-helper)
(declare-function realgud-get-srcbuf 'realgud-buffer-helper)
(declare-function buffer-killed? 'realgud-helper)
(declare-function one-window-p(bool))
(defun realgud-window-update-position (buffer marker)
"Update BUFFER to position specified with MARKER.
We assume MARKER points inside BUFFER"
(with-current-buffer buffer
(goto-char marker)
(let ((window (get-buffer-window buffer)))
(if window (set-window-point window marker))
)))
(defun realgud-window-src ( &optional opt-buffer )
"Make sure the source buffer is displayed in a window
We don't care if the command buffer is also displayed.
See also `realgud-window-src-undisturb-cmd'"
(let* ((buffer (or opt-buffer (current-buffer)))
(src-buffer (realgud-get-srcbuf buffer))
(src-window (get-buffer-window src-buffer 'visible))
(window (selected-window)))
(if src-buffer
(unless (and src-window (not (window-minibuffer-p)))
(set-window-buffer window src-buffer))
)
))
(defun realgud-window-src-undisturb-cmd ( &optional opt-buffer )
"Make sure the source buffers is displayed in windows without
disturbing the command window if it is also displayed. Returns
the command window
See also `realgud-window-src'."
(interactive)
(let* ((buffer (or opt-buffer (current-buffer)))
(src-buffer (realgud-get-srcbuf buffer))
(src-window (get-buffer-window src-buffer))
(cmd-buffer (realgud-get-cmdbuf buffer))
(cmd-window (get-buffer-window cmd-buffer))
(window (selected-window))
)
(if src-buffer
(unless src-window
(setq src-window
(if (eq window cmd-window)
;; FIXME: generalize what to do here.
(if (one-window-p 't)
(split-window)
(next-window window 'no-minibuf))
window))
(set-window-buffer src-window src-buffer))
)
(select-window src-window)
cmd-window)
)
(defun realgud-window-cmd-undisturb-src ( &optional opt-buffer switch?)
"Make sure the command buffer is displayed in windows without
disturbing the command window if it is also displayed. Returns
the source window."
(interactive)
(let* ((buffer (or opt-buffer (current-buffer)))
(src-buffer (realgud-get-srcbuf buffer))
(src-window (get-buffer-window src-buffer))
(cmd-buffer (realgud-get-cmdbuf buffer))
(cmd-window (get-buffer-window cmd-buffer))
(window (selected-window))
)
(when cmd-buffer
(unless cmd-window
(setq cmd-window
(if (eq window src-window)
;; FIXME: generalize what to do here.
(if (one-window-p 't)
(split-window)
(next-window window 'no-minibuf))
window))
(set-window-buffer cmd-window cmd-buffer)
)
(if switch?
(and (select-window cmd-window)
(switch-to-buffer cmd-buffer)))
)
(select-window cmd-window)
src-window)
)
(defun realgud:window-bt-undisturb-src ( &optional opt-buffer switch?)
"Make sure the backtrace buffer is displayed in windows without
disturbing the source window if it is also displayed. Returns
the source window
See also `realgud-window-src'"
(interactive)
(let* ((buffer (or opt-buffer (current-buffer)))
(src-buffer (realgud-get-srcbuf buffer))
(src-window (get-buffer-window src-buffer))
(cmd-buffer (realgud-get-cmdbuf buffer))
(cmd-window (get-buffer-window cmd-buffer))
(bt-buffer (realgud-get-backtrace-buf cmd-buffer))
(bt-window (get-buffer-window bt-buffer))
(window (selected-window))
)
(when cmd-buffer
(unless bt-window
(setq bt-window
(if (eq window src-window)
;; FIXME: generalize what to do here.
(if (one-window-p 't)
(split-window)
(next-window window 'no-minibuf))
window))
(set-window-buffer bt-window bt-buffer)
)
(if switch?
(and (select-window bt-window)
(switch-to-buffer bt-buffer)))
)
src-window)
)
(defun realgud:window-brkpt-undisturb-src ( &optional opt-buffer switch?)
"Make sure the backtrace buffer is displayed in windows without
disturbing the source window if it is also displayed. Returns
the source window
See also `realgud-window-src'"
(interactive)
(let* ((buffer (or opt-buffer (current-buffer)))
(src-buffer (realgud-get-srcbuf buffer))
(src-window (get-buffer-window src-buffer))
(cmd-buffer (realgud-get-cmdbuf buffer))
(cmd-window (get-buffer-window cmd-buffer))
(brkpt-buffer (realgud-get-breakpoint-buf cmd-buffer))
(brkpt-window (get-buffer-window brkpt-buffer))
(window (selected-window))
)
(when cmd-buffer
(unless brkpt-window
(setq brkpt-window
(if (eq window src-window)
;; FIXME: generalize what to do here.
(if (one-window-p 't)
(split-window)
(next-window window 'no-minibuf))
window))
(set-window-buffer brkpt-window brkpt-buffer)
)
(if switch?
(and (select-window brkpt-window)
(switch-to-buffer brkpt-buffer)))
)
src-window)
)
(defun realgud:window-bt()
"Refresh backtrace information and display that in a buffer"
(interactive)
(with-current-buffer-safe (realgud-get-cmdbuf)
(realgud:backtrace-init)
(realgud:window-bt-undisturb-src)
)
)
(defun realgud:window-brkpt()
"Refresh breakpoint information and display that in a buffer"
(interactive)
(with-current-buffer-safe (realgud-get-cmdbuf)
(realgud:breakpoint-init)
(realgud:window-brkpt-undisturb-src)
)
)
;; (defun realgud-window-src-and-cmd ( &optional opt-buffer )
;; "Make sure the source buffers is displayed in windows without
;; disturbing the command window if it is also displayed. Returns
;; the command window
;; See also `realgud-window-src-window'"
;; (interactive)
;; (let* ((buffer (or opt-buffer (current-buffer)))
;; (src-buffer (realgud-get-srcbuf buffer))
;; (src-window (get-buffer-window src-buffer))
;; (cmd-buffer (realgud-get-cmdbuf buffer))
;; (cmd-window (get-buffer-window cmd-buffer))
;; (window (selected-window))
;; )
;; (if src-buffer
;; (unless src-window
;; (setq src-window
;; (if (eq window cmd-window)
;; (if (one-window-p 't) (split-window) (next-window window))
;; window))
;; (set-window-buffer src-window src-buffer))
;; )
;; cmd-window)
;; )
(provide-me "realgud-")