[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Annotation mode
From: |
PT |
Subject: |
Re: Annotation mode |
Date: |
15 Oct 2005 21:56:35 -0700 |
User-agent: |
G2/0.2 |
I took a look at the options and decided to implement my own solution,
since it was pretty easy. Here it is if someone is interested:
;;; annotate.el --- simple file annotation system
;;;
;;;
;;; M-x annotate-file pops up a window where the annotation for the
;;; current file can be edited. If the annotation window is left open
;;; it always shows the annotation belonging to the current buffer.
;;;
;;;
;;; Code:
(defvar annotate-storage-file "~/.annotate"
"File containing the stored annotations.")
(defvar annotate-current-buffer nil
"The last buffer known to be the current one.")
(defvar annotate-window-configuration nil
"The window configuration before the annoation buffer was
displayed.")
(defun annotate-file ()
(interactive)
(annotate-narrow-to-annotation)
(setq annotate-window-configuration (current-window-configuration))
(pop-to-buffer (get-file-buffer annotate-storage-file))
(local-set-key (kbd "C-c C-c") 'annotate-finish)
(message "Type C-c C-c to hide the annotation buffer.")
(setq annotate-current-buffer 'nosuchbuffer)
(ad-activate 'switch-to-buffer))
(defun annotate-narrow-to-annotation ()
"Narrow the annotation buffer to the portion belonging to the file
associated
wit the current buffer.
If no annotation exists for the file a new section is created.
If the current buffer has no file associated with it then show a
warning message."
(let* ((buffer (find-file-noselect annotate-storage-file))
(file (buffer-file-name))
(filename (if file
(expand-file-name file)
"nofile")))
(with-current-buffer buffer
(widen)
(unless (equal filename (expand-file-name annotate-storage-file))
(goto-char (point-min))
(if (re-search-forward (concat "^ " filename) nil t)
(forward-line)
(goto-char (point-min))
(insert " " filename "\n\n")
(forward-line -1))
(let ((begin (point)))
(if (re-search-forward "^" nil t)
(progn (forward-line -1)
(end-of-line))
(goto-char (point-max)))
(narrow-to-region begin (point))
(goto-char (point-min)))
;; prepare warning message if it does not exist yet
(if (and (not file)
(= (point-min) (point-max)))
(insert "The current buffer has no file associated with it,
"
"so it cannot have an annotation."))))))
(defadvice switch-to-buffer (after annotate-handle-buffer-change)
(annotate-update-annotation-display))
(defun annotate-update-annotation-display ()
"Synchronize the displayed annotation to the current buffer if the
annotation
window is visible. Otherwise cancel current buffer monitoring."
(if (get-buffer-window (get-file-buffer annotate-storage-file))
(unless (equal (current-buffer) annotate-current-buffer)
(setq annotate-current-buffer (current-buffer))
(annotate-narrow-to-annotation))
(ad-deactivate 'switch-to-buffer)))
(defun annotate-finish ()
"Hide the annotation buffer and restore previous window
configuration."
(interactive)
(set-window-configuration annotate-window-configuration)
(with-current-buffer (get-file-buffer annotate-storage-file)
(save-buffer)))
(provide 'annotate)
;;; annotate.el ends here