Mercurial > hg > xemacs-beta
diff lisp/energize/energize-advice.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/energize/energize-advice.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,126 @@ +;;; -*- Mode:Emacs-Lisp -*- +;;; Copyright (c) 1991, 1992, 1993, 1994 by Lucid, Inc. All Rights Reserved. + +;;; This file contains the definitions of existing functions which Energize +;;; must encapsulate. (The number of such functions should be minimized.) + + +;;; This is greatly complicated by the fact that both the old functions +;;; and the new functions are dumped. The only method I've found that +;;; works and doesn't have obscure bootstrapping/feedback problems is +;;; to RELOAD the original definition of the function we are advising +;;; at compile time so that we can extract its original docstring, and +;;; emit a modified version of that to the .elc version of this file. + + +(eval-when-compile ; this only works at compile-time anyway... + + (or noninteractive + (error "bad idea to compile this file in a non-batch-mode emacs!")) + + (load-library "advice") + (fset 'ad-make-freeze-docstring 'ad-make-plain-docstring) + + (load-library "files.el") + (load-library "userlock.el") + (load-library "compile.el") + (load-library "gdb.el") + +) ;closes eval-when-compile + + +;;; The actual definitions + +(defadvice ask-user-about-lock (around energize freeze) + "Energize buffers do this by asking the server." + (if (energize-buffer-p (current-buffer)) + (setq ad-return-value t) ; note: return value matters + ad-do-it)) + +(defadvice normal-mode (after energize freeze) + "If this is an Energize buffer, the Energize modes are turned on as well." + (if (and (energize-buffer-p (current-buffer)) + (not inside-energize-buffer-creation-hook-function)) + (funcall energize-create-buffer-hook (current-buffer)))) + +(defadvice find-file-noselect (around energize freeze) + "This function has been encapsulated to work with Energize." + (if (and (connected-to-energize-p) + (not (file-directory-p (ad-get-arg 0))) + (energize-query-buffer (ad-get-arg 0) t)) + ;; after-find-file and abbreviate-file-name are called from + ;; energize-buffer-creation-hook-function, which is run from + ;; editorside.c (way down under energize-query-buffer). + ;; This is a mess... + (setq ad-return-value ; note: return value matters + (energize-query-buffer (ad-get-arg 0))) + ;; else + ad-do-it)) + +(defadvice write-file (around energize freeze) + "When executed on an Energize buffer, this will cause all +annotations to be lost (that is, the buffer will become a +normal buffer, not one that the Energize server knows about.)" + (if (not (energize-write-file-buffer-p)) + ad-do-it + ;; else... + (let ((filename (ad-get-arg 0))) + (if (and (file-exists-p filename) + (not + (yes-or-no-p (format "File %s already exists. Overwrite it? " + filename)))) + (error "Aborted")) + (write-region (point-min) (point-max) filename nil nil) + (if buffer-file-name + (revert-buffer t t)) ; revert this buffer from the Energize server + (kill-buffer nil) ; kill the current buffer, to lose Energize properties + (set-window-buffer ; and now visit the "new" file, and all that entails + (selected-window) + (find-file-noselect filename))))) + +(defadvice set-visited-file-name (around energize freeze) + "The file name associated with an Energize buffer cannot be changed in this\ +way.\nUse the `write-file' command instead." + (if (and (energize-write-file-buffer-p) + (not (equal (ad-get-arg 0) buffer-file-name))) + (error "Can't change the name associated with an Energize buffer.") + (prog1 + ad-do-it + (if (energize-buffer-p (current-buffer)) + (energize-mode-internal))))) + +(defadvice next-error (around energize freeze) + "This function has been encapsulated to work with the Energize Error Log." + (if (or (not (connected-to-energize-p)) + (non-energize-errors-exist-p)) + ad-do-it + (energize-execute-command (if (ad-get-arg 0) + "previouserror" + "nexterror")))) + +(defadvice gdb-break (around energize freeze) + "This function has been encapsulated to work with the Energize debugger." + (if (not (energize-buffer-p (current-buffer))) + ad-do-it + (energize-execute-command "setbreakpoint"))) + +(defadvice gdb-step (around energize freeze) + "This function has been encapsulated to work with the Energize debugger." + (if (not (energize-buffer-p (current-buffer))) + ad-do-it + (let ((arg (ad-get-arg 0))) + (while (> arg 0) + (energize-execute-command "steponce") + (setq arg (1- arg)))))) + +(defadvice gdb-stepi (around energize freeze) + "This function has been encapsulated to work with the Energize debugger." + (if (not (energize-buffer-p (current-buffer))) + ad-do-it + (let ((arg (ad-get-arg 0))) + ;; there's no energize command for this, so do it this way... + (save-excursion + (set-buffer "*Debugger*") + (goto-char (point-max)) + (insert (format "stepi %d" arg)) + (comint-send-input)))))