Mercurial > hg > xemacs-beta
diff lisp/hyperbole/hbmap.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 4103f0995bd7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/hyperbole/hbmap.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,130 @@ +;;!emacs +;; +;; FILE: hbmap.el +;; SUMMARY: Hyperbole button map maintenance for queries and lookups. +;; USAGE: GNU Emacs Lisp Library +;; KEYWORDS: hypermedia, matching +;; +;; AUTHOR: Bob Weiner +;; ORG: Brown U. +;; +;; ORIG-DATE: 6-Oct-91 at 06:34:05 +;; LAST-MOD: 24-Oct-95 at 18:32:30 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: +;; DESCRIP-END. + +;;; ************************************************************************ +;;; Public variables +;;; ************************************************************************ + +(defvar hbmap:filename "HYPB" + "*Filename used for quick access button files.") + +;;; ************************************************************************ +;;; Public functions +;;; ************************************************************************ + +(defun hbmap:dir-add (dir-name &optional no-save) + "Adds DIR-NAME to map of all directories in which user has written buttons. +Returns t iff DIR-NAME is not already in map, nil if it is, and some +other value when cannot read or write map. +Optional NO-SAVE disables saving of the map after an add." + (hbmap:dir-operate (function (lambda (dir) (not (hbmap:dir-member dir)))) + dir-name + '(progn (prin1 (list dir-name) buf) (terpri buf)) + no-save)) + +(defun hbmap:dir-list () + "Returns list of all directories in which user has written buttons." + (save-excursion + (let ((buf (if (and (file-exists-p hbmap:dir-filename) + (not (file-readable-p hbmap:dir-filename))) + nil + (find-file-noselect hbmap:dir-filename))) + (dirs)) + (if buf + (progn (set-buffer buf) + (goto-char (point-min)) + (condition-case () + (while (setq dirs (cons (car (read (current-buffer))) + dirs))) + (error t)) + dirs))))) + +(defun hbmap:dir-remove (dir-name &optional no-save) + "Removes DIR-NAME from map of all dirs in which user has written buttons. +Returns t iff DIR-NAME is in the map and is successfully removed, nil if it +is not, and some other value when the map is not readable or writable. +Optional NO-SAVE disables saving of the map after a removal." +(hbmap:dir-operate 'hbmap:dir-member dir-name + '(delete-region (point) (progn (forward-line 1) (point))) + no-save)) + +(defun hbmap:dir-member (dir-name) + "Returns t iff DIR-NAME is a member of user's Hyperbole map, else nil. +If t, point is left at the start of the matching map entry. If nil, +point is left in a position appropriate for insertion of a new entry." + (let ((obuf (current-buffer)) + (buf (and (file-exists-p hbmap:dir-filename) + (find-file-noselect hbmap:dir-filename))) + (rtn)) + (if buf + (progn (set-buffer buf) (widen) (goto-char 1) + (if (search-forward (concat "\n(\"" dir-name "\"") nil t) + (progn (beginning-of-line) (setq rtn t)) + (goto-char 1) (or (= (forward-line 1) 0) (insert "\n"))) + (set-buffer obuf))) + rtn)) + +;;; ************************************************************************ +;;; Private functions +;;; ************************************************************************ + +(defun hbmap:dir-operate (pred dir-name form &optional no-save) + "If PRED called on DIR-NAME is non-nil, evaluates FORM. +Returns t if PRED evaluation is successful and nil when not, except when +hbmap is not readable or writable, in which case returns a symbol indicating +the error. Optional NO-SAVE disables saving of the map after operation." + (save-excursion + (let ((buf (if (and (file-exists-p hbmap:dir-filename) + (not (file-readable-p hbmap:dir-filename))) + nil + (find-file-noselect hbmap:dir-filename)))) + (if buf + (progn (set-buffer buf) + (if (funcall pred dir-name) + (progn + (setq buffer-read-only nil) + (eval form) + (if no-save t + (if (file-writable-p buffer-file-name) + (progn (save-buffer) t) + 'hbmap-not-writable))))) + 'hbmap-not-readable)))) + +;;; ************************************************************************ +;;; Private variables +;;; ************************************************************************ + +(defvar hbmap:dir-user + (if (memq system-type '(ms-windows windows-nt ms-dos)) + "c:/_hyperb/" "~/.hyperb/") + "Per user directory in which to store top level Hyperbole map data. +Must end with a directory separator. +Hyperbole will try to create it whenever 'hyperb:init' is called.") + +(defvar hbmap:dir-filename + (expand-file-name "HBMAP" hbmap:dir-user) + "Name of a file that lists all dirs to which a user has written buttons. +See also 'hbmap:dir-user'. +If you change its value, you will be unable to search for buttons created by +others who use a different value!") + +(provide 'hbmap)