| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 | ;;; org-annotate-file.el --- Annotate a file with org syntax;; Copyright (C) 2008-2014 Philip Jackson;; Author: Philip Jackson <phil@shellarchive.co.uk>;; Version: 0.2;; This file is not currently part of GNU Emacs.;; 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 2, 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.;; You should have received a copy of the GNU General Public License;; along with this program ; see the file COPYING.  If not, write to;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,;; Boston, MA 02111-1307, USA.;;; Commentary:;; This is yet another implementation to allow the annotation of a;; file without modification of the file itself.  The annotation is in;; org syntax so you can use all of the org features you are used to.;; To use you might put the following in your .emacs:;;;; (require 'org-annotate-file);; (global-set-key (kbd "C-c C-l") 'org-annotate-file) ; for example;;;; To change the location of the annotation file:;;;; (setq org-annotate-file-storage-file "~/annotated.org");;;; Then when you visit any file and hit C-c C-l you will find yourself;; in an org buffer on a headline which links to the file you were;; visiting, e.g:;; * ~/org-annotate-file.el;; Under here you can put anything you like, save the file;; and next time you hit C-c C-l you will hit those notes again.;;;; To put a subheading with a text search for the current line set;; `org-annotate-file-add-search` to non-nil value.  Then when you hit;; C-c C-l (on the above line for example) you will get:;; * ~/org-annotate-file.el;; ** `org-annotate-file-add-search` to non-nil value.  Then whe...;; Note that both of the above will be links.;;; Code:(require 'org)(defgroup org-annotate-file nil  "Org Annotate"  :group 'org)(defcustom org-annotate-file-storage-file "~/.org-annotate-file.org"  "File in which to keep annotations."  :group 'org-annotate-file  :type 'file)(defcustom org-annotate-file-add-search nil  "If non-nil, add a link as a second level to the actual file location."  :group 'org-annotate-file  :type 'boolean)(defcustom org-annotate-file-always-open t  "If non-nil, always expand the full tree when visiting the annotation file."  :group 'org-annotate-file  :type 'boolean)(defun org-annotate-file-ellipsify-desc (string &optional after)  "Return shortened STRING with appended ellipsis.Trim whitespace at beginning and end of STRING and replace any  characters that appear after the occurrence of AFTER with '...'"  (let* ((after (number-to-string (or after 30)))         (replace-map (list (cons "^[ \t]*" "")                            (cons "[ \t]*$" "")                            (cons (concat "^\\(.\\{" after                                          "\\}\\).*") "\\1..."))))    (mapc (lambda (x)            (when (string-match (car x) string)              (setq string (replace-match (cdr x) nil nil string))))          replace-map)    string));;;###autoload(defun org-annotate-file ()  "Visit `org-annotate-file-storage-file` and add a new annotation section.The annotation is opened at the new section which will be referencingthe point in the current file."  (interactive)  (unless (buffer-file-name)    (error "This buffer has no associated file!"))  (switch-to-buffer   (org-annotate-file-show-section org-annotate-file-storage-file)));;;###autoload(defun org-annotate-file-show-section (storage-file &optional annotated-buffer)  "Add or show annotation entry in STORAGE-FILE and return the buffer.The annotation will link to ANNOTATED-BUFFER if specified,  otherwise the current buffer is used."  (let ((filename (abbreviate-file-name (or annotated-buffer					    (buffer-file-name))))        (line (buffer-substring-no-properties (point-at-bol) (point-at-eol)))        (annotation-buffer (find-file-noselect storage-file)))    (with-current-buffer annotation-buffer      (org-annotate-file-annotate filename line))    annotation-buffer))(defun org-annotate-file-annotate (filename line)  "Add annotation for FILENAME at LINE using current buffer."  (let* ((link (org-make-link-string (concat "file:" filename) filename))         (search-link (org-make-link-string                       (concat "file:" filename "::" line)		       (org-annotate-file-ellipsify-desc line))))    (unless (eq major-mode 'org-mode)      (org-mode))    (goto-char (point-min))    (widen)    (when org-annotate-file-always-open      (show-all))    (unless (search-forward-regexp	     (concat "^* " (regexp-quote link)) nil t)      (org-annotate-file-add-upper-level link))    (beginning-of-line)    (org-narrow-to-subtree)    ;; deal with a '::' search if need be    (when org-annotate-file-add-search      (unless (search-forward-regexp	       (concat "^** " (regexp-quote search-link)) nil t)	(org-annotate-file-add-second-level search-link)))))(defun org-annotate-file-add-upper-level (link)  "Add and link heading to LINK."  (goto-char (point-min))  (call-interactively 'org-insert-heading)  (insert link))(defun org-annotate-file-add-second-level (link)  "Add and link subheading to LINK."  (goto-char (point-at-eol))  (call-interactively 'org-insert-subheading)  (insert link))(provide 'org-annotate-file);;; org-annotate-file.el ends here
 |