Mercurial > hg > xemacs-beta
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
1 ;;!emacs | |
2 ;; | |
3 ;; FILE: hbmap.el | |
4 ;; SUMMARY: Hyperbole button map maintenance for queries and lookups. | |
5 ;; USAGE: GNU Emacs Lisp Library | |
6 ;; KEYWORDS: hypermedia, matching | |
7 ;; | |
8 ;; AUTHOR: Bob Weiner | |
9 ;; ORG: Brown U. | |
10 ;; | |
11 ;; ORIG-DATE: 6-Oct-91 at 06:34:05 | |
12 ;; LAST-MOD: 24-Oct-95 at 18:32:30 by Bob Weiner | |
13 ;; | |
14 ;; This file is part of Hyperbole. | |
15 ;; Available for use and distribution under the same terms as GNU Emacs. | |
16 ;; | |
17 ;; Copyright (C) 1991-1995, Free Software Foundation, Inc. | |
18 ;; Developed with support from Motorola Inc. | |
19 ;; | |
20 ;; DESCRIPTION: | |
21 ;; DESCRIP-END. | |
22 | |
23 ;;; ************************************************************************ | |
24 ;;; Public variables | |
25 ;;; ************************************************************************ | |
26 | |
27 (defvar hbmap:filename "HYPB" | |
28 "*Filename used for quick access button files.") | |
29 | |
30 ;;; ************************************************************************ | |
31 ;;; Public functions | |
32 ;;; ************************************************************************ | |
33 | |
34 (defun hbmap:dir-add (dir-name &optional no-save) | |
35 "Adds DIR-NAME to map of all directories in which user has written buttons. | |
36 Returns t iff DIR-NAME is not already in map, nil if it is, and some | |
37 other value when cannot read or write map. | |
38 Optional NO-SAVE disables saving of the map after an add." | |
39 (hbmap:dir-operate (function (lambda (dir) (not (hbmap:dir-member dir)))) | |
40 dir-name | |
41 '(progn (prin1 (list dir-name) buf) (terpri buf)) | |
42 no-save)) | |
43 | |
44 (defun hbmap:dir-list () | |
45 "Returns list of all directories in which user has written buttons." | |
46 (save-excursion | |
47 (let ((buf (if (and (file-exists-p hbmap:dir-filename) | |
48 (not (file-readable-p hbmap:dir-filename))) | |
49 nil | |
50 (find-file-noselect hbmap:dir-filename))) | |
51 (dirs)) | |
52 (if buf | |
53 (progn (set-buffer buf) | |
54 (goto-char (point-min)) | |
55 (condition-case () | |
56 (while (setq dirs (cons (car (read (current-buffer))) | |
57 dirs))) | |
58 (error t)) | |
59 dirs))))) | |
60 | |
61 (defun hbmap:dir-remove (dir-name &optional no-save) | |
62 "Removes DIR-NAME from map of all dirs in which user has written buttons. | |
63 Returns t iff DIR-NAME is in the map and is successfully removed, nil if it | |
64 is not, and some other value when the map is not readable or writable. | |
65 Optional NO-SAVE disables saving of the map after a removal." | |
66 (hbmap:dir-operate 'hbmap:dir-member dir-name | |
67 '(delete-region (point) (progn (forward-line 1) (point))) | |
68 no-save)) | |
69 | |
70 (defun hbmap:dir-member (dir-name) | |
71 "Returns t iff DIR-NAME is a member of user's Hyperbole map, else nil. | |
72 If t, point is left at the start of the matching map entry. If nil, | |
73 point is left in a position appropriate for insertion of a new entry." | |
74 (let ((obuf (current-buffer)) | |
75 (buf (and (file-exists-p hbmap:dir-filename) | |
76 (find-file-noselect hbmap:dir-filename))) | |
77 (rtn)) | |
78 (if buf | |
79 (progn (set-buffer buf) (widen) (goto-char 1) | |
80 (if (search-forward (concat "\n(\"" dir-name "\"") nil t) | |
81 (progn (beginning-of-line) (setq rtn t)) | |
82 (goto-char 1) (or (= (forward-line 1) 0) (insert "\n"))) | |
83 (set-buffer obuf))) | |
84 rtn)) | |
85 | |
86 ;;; ************************************************************************ | |
87 ;;; Private functions | |
88 ;;; ************************************************************************ | |
89 | |
90 (defun hbmap:dir-operate (pred dir-name form &optional no-save) | |
91 "If PRED called on DIR-NAME is non-nil, evaluates FORM. | |
92 Returns t if PRED evaluation is successful and nil when not, except when | |
93 hbmap is not readable or writable, in which case returns a symbol indicating | |
94 the error. Optional NO-SAVE disables saving of the map after operation." | |
95 (save-excursion | |
96 (let ((buf (if (and (file-exists-p hbmap:dir-filename) | |
97 (not (file-readable-p hbmap:dir-filename))) | |
98 nil | |
99 (find-file-noselect hbmap:dir-filename)))) | |
100 (if buf | |
101 (progn (set-buffer buf) | |
102 (if (funcall pred dir-name) | |
103 (progn | |
104 (setq buffer-read-only nil) | |
105 (eval form) | |
106 (if no-save t | |
107 (if (file-writable-p buffer-file-name) | |
108 (progn (save-buffer) t) | |
109 'hbmap-not-writable))))) | |
110 'hbmap-not-readable)))) | |
111 | |
112 ;;; ************************************************************************ | |
113 ;;; Private variables | |
114 ;;; ************************************************************************ | |
115 | |
116 (defvar hbmap:dir-user | |
117 (if (memq system-type '(ms-windows windows-nt ms-dos)) | |
118 "c:/_hyperb/" "~/.hyperb/") | |
119 "Per user directory in which to store top level Hyperbole map data. | |
120 Must end with a directory separator. | |
121 Hyperbole will try to create it whenever 'hyperb:init' is called.") | |
122 | |
123 (defvar hbmap:dir-filename | |
124 (expand-file-name "HBMAP" hbmap:dir-user) | |
125 "Name of a file that lists all dirs to which a user has written buttons. | |
126 See also 'hbmap:dir-user'. | |
127 If you change its value, you will be unable to search for buttons created by | |
128 others who use a different value!") | |
129 | |
130 (provide 'hbmap) |