diff lisp/hyperbole/hhist.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/hyperbole/hhist.el	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,90 @@
+;;!emacs
+;;
+;; FILE:         hhist.el
+;; SUMMARY:      Maintains history of Hyperbole buttons selected.
+;; USAGE:        GNU Emacs Lisp Library
+;; KEYWORDS:     hypermedia
+;;
+;; AUTHOR:       Bob Weiner
+;; ORG:          Brown U.
+;;
+;; ORIG-DATE:    24-Apr-91 at 03:36:23
+;; LAST-MOD:     14-Apr-95 at 16:02:05 by Bob Weiner
+;;
+;; This file is part of Hyperbole.
+;; Available for use and distribution under the same terms as GNU Emacs.
+;;
+;; Copyright (C) 1991-1995, Free Software Foundation, Inc.
+;; Developed with support from Motorola Inc.
+;;
+;; DESCRIPTION:  
+;;
+;;   This is minimal right now and will be extended.
+;;   Currently, it implements a push-pop stack of traversed locations.
+;;
+;;   It will be extended to allow random access to previous locations
+;;   and to store traversal histories for later recall.
+;;
+;; DESCRIP-END.
+
+;;; ************************************************************************
+;;; Public functions
+;;; ************************************************************************
+
+(defun hhist:add (elt)
+  "Adds ELT to hyper-history list if not the same as current or previous loc.
+ELT must have been created via a call to 'hhist:element'."
+  ;; Even though this next line looks useless, it cures a problem with
+  ;; window buffer correspondences on startup, so don't remove it.
+  (set-buffer (window-buffer (selected-window)))
+  (let ((prev-buf (car elt)))
+    (if (or (equal prev-buf (buffer-name))
+	    (equal prev-buf (car (car *hhist*))))
+	nil
+      (setq *hhist* (cons elt *hhist*)))))
+
+(defun hhist:element ()
+  "Returns a history element for current point location."
+  (list (current-buffer) (point)))
+
+(defun hhist:remove (&optional arg)
+  "Removes optional prefix ARG entries from history, returns to ARGth location.
+The command is ignored with ARG < 1."
+  (interactive "p")
+  (setq arg (or arg 1))
+  (let ((prev-buf-line))
+    (if (null *hhist*)
+	(and (> arg 0)
+	     (message "(hhist:remove): No previous source to which to return.")
+	     (beep))
+      (while (and (> arg 0) *hhist*)
+	(setq prev-buf-line (car *hhist*)
+	      *hhist* (cdr *hhist*)
+	      arg (1- arg)))
+      (switch-to-buffer (car prev-buf-line))
+      (goto-char (car (cdr prev-buf-line)))
+      )))
+
+(defun hhist:init ()
+  "Resets history list."
+  (interactive)
+  (setq *hhist* nil))
+
+;;; ************************************************************************
+;;; Private functions
+;;; ************************************************************************
+
+(defun hhist:wind-line ()
+  "Returns window relative line number that point is on."
+  (max 0 (1- (- (count-lines 1 (1+ (point)))
+		(count-lines 1 (window-start))))))
+
+;;; ************************************************************************
+;;; Private variables
+;;; ************************************************************************
+
+(defconst *hhist* nil
+  "List of previously visited Hyperbole button source locations.
+Car of list is most recent.")
+
+(provide 'hhist)