Mercurial > hg > xemacs-beta
diff lisp/hyperbole/hversion.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/hversion.el Mon Aug 13 08:45:50 2007 +0200 @@ -0,0 +1,231 @@ +;;!emacs +;; +;; LCD-ENTRY: hyperbole|Bob Weiner|hyperbole@hub.ucsb.edu|Everyday Info Manager|03-Nov-95|4.01|ftp.cs.uiuc.edu:/pub/xemacs/infodock/ +;; +;; FILE: hversion.el +;; SUMMARY: Hyperbole version, system and load path information. +;; USAGE: GNU Emacs Lisp Library +;; KEYWORDS: hypermedia +;; +;; AUTHOR: Bob Weiner +;; ORG: Brown U. +;; +;; ORIG-DATE: 1-Jan-94 +;; LAST-MOD: 3-Nov-95 at 23:08:37 by Bob Weiner +;; +;; This file is part of Hyperbole. +;; Available for use and distribution under the same terms as GNU Emacs. +;; +;; Copyright (C) 1994, 1995 Free Software Foundation, Inc. +;; Developed with support from Motorola Inc. +;; +;; DESCRIPTION: +;; DESCRIP-END. + +;;; ************************************************************************ +;;; Public variables +;;; ************************************************************************ + +(defconst hyperb:version "04.01" "Hyperbole revision number.") + +;;; Support button highlighting and flashing under XEmacs. +;;; +(defvar hyperb:xemacs-p + (let ((case-fold-search t)) + (if (string-match "XEmacs" emacs-version) + emacs-version)) + "Version string under XEmacs (not Lucid Emacs) or nil") + +;;; Support button highlighting and flashing under obsolete Lucid Emacs. +;;; +(defvar hyperb:lemacs-p + (let ((case-fold-search t)) + (if (string-match "XEmacs\\|Lucid" emacs-version) + emacs-version)) + "Version string under XEmacs or Lucid Emacs or nil") + +;;; Support mouse handling under GNU Emacs V19. +;;; +(defvar hyperb:emacs19-p + (and (not hyperb:lemacs-p) + (string-match "^19\\." emacs-version) + emacs-version) + "Version string under GNU Emacs 19 or nil") + +;;; Support button highlighting and flashing under obsolete Epoch. +;;; +(defvar hyperb:epoch-p + (if (and (boundp 'epoch::version) + (stringp epoch::version)) + (if (string< epoch::version "Epoch 4") "V3" "V4")) + "Simplified version string under Epoch, e.g. \"V4\", or nil") + +;; Koutlines work only with specific versions of Emacs 19 and XEmacs. +(defconst hyperb:kotl-p + (if hyperb:lemacs-p + ;; Only works for XEmacs 19.9 and above. + (string-match "^19\\.9 \\|^19\\.[1-9][0-9]" emacs-version) + hyperb:emacs19-p) + "Non-nil iff this Emacs version supports the Hyperbole outliner.") + +(defun sm-window-sys-term () + "Returns the first part of the term-type if running under a window system, else nil. +Where a part in the term-type is delimited by a '-' or an '_'." + (let ((term (cond ((memq window-system '(x ns dps pm)) + ;; X11, NEXTSTEP (DPS), or OS/2 Presentation Manager (PM) + (cond (hyperb:emacs19-p "emacs19") + (hyperb:lemacs-p "lemacs") + (hyperb:epoch-p "epoch") + (t "xterm"))) + ((or (featurep 'eterm-fns) + (equal (getenv "TERM") "NeXT") + (equal (getenv "TERM") "eterm")) + ;; NEXTSTEP add-on support to Emacs + "next") + ((or window-system + (featurep 'sun-mouse) (featurep 'apollo)) + (getenv "TERM"))))) + (and term + (substring term 0 (string-match "[-_]" term))))) + +(defconst hyperb:window-system (sm-window-sys-term) + "String name for window system or term type under which Emacs was run. +If nil, no window system or mouse support is available.") + +;;; ************************************************************************ +;;; Public functions to dynamically compute Hyperbole directory. +;;; ************************************************************************ + +(defvar hyperb:automount-prefixes + (if (and (boundp 'automount-dir-prefix) (stringp automount-dir-prefix)) + automount-dir-prefix + "^/tmp_mnt/" + "*Regexp to match any automounter prefix in a pathname.")) + +(defun hyperb:stack-frame (function-list &optional debug-flag) + "Return the nearest Emacs Lisp stack frame which called any function symbol from FUNCTION-LIST or nil if no match. +If FUNCTION-LIST contains 'load, 'autoload or 'require, detect +autoloads not visible within the Lisp level stack frames. + +With optional DEBUG-FLAG non-nil, if no matching frame is found, return list +of stack frames (from innermost to outermost)." + (let ((count 0) + (frame-list) + (load-flag (or (memq 'load function-list) + (memq 'autoload function-list) + (memq 'require function-list))) + fsymbol + fbody + frame) + (or (catch 'hyperb:stack-frame + (while (setq frame (backtrace-frame count)) + (if debug-flag (setq frame-list (cons frame frame-list))) + (setq count (1+ count) + fsymbol (nth 1 frame)) + (and (eq fsymbol 'command-execute) + (not (memq 'command-execute function-list)) + ;; Use command being executed instead because it might not + ;; show up in the stack anywhere else, e.g. if it is an + ;; autoload under Emacs 19. + (setq fsymbol (nth 2 frame))) + (cond ((and load-flag (symbolp fsymbol) + (fboundp fsymbol) + (listp (setq fbody (symbol-function fsymbol))) + (eq (car fbody) 'autoload)) + (setq frame (list (car frame) 'load + (car (cdr fbody)) + nil noninteractive nil)) + (throw 'hyperb:stack-frame frame)) + ((memq fsymbol function-list) + (throw 'hyperb:stack-frame frame)))) + nil) + (if debug-flag (nreverse frame-list))))) + +(defun hyperb:path-being-loaded () + "Return the full pathname used by the innermost `load' or 'require' call. +Removes any matches for `hyperb:automount-prefixes' before returning +the pathname." + (let* ((frame (hyperb:stack-frame '(load require))) + (function (nth 1 frame)) + file nosuffix) + (cond ((eq function 'load) + (setq file (nth 2 frame) + nosuffix (nth 5 frame))) + ((eq function 'require) + (setq file (or (nth 3 frame) (symbol-name (nth 2 frame)))))) + (if (stringp file) + (setq nosuffix (or nosuffix + (string-match + "\\.\\(elc?\\|elc?\\.gz\\|elc?\\.Z\\)$" + file)) + file (substitute-in-file-name file) + file (locate-file file load-path + (if nosuffix "" ".elc:.el:.el.gz:.el.Z:") + ;; accept any existing file + 0) + file (if (and (stringp file) + (string-match hyperb:automount-prefixes file)) + (substring file (1- (match-end 0))) + file))))) + +(if (fboundp 'locate-file) + nil + (defun locate-file (file dir-list &optional suffix-string unused) + "Search for FILE in DIR-LIST. +If optional SUFFIX-STRING is provided, allow file to be followed by one of the +colon separated suffixes." + (let ((suffix-list)) + (cond ((null suffix-string) (setq suffix-list '(""))) + ((stringp suffix-string) + (let ((start 0) + (len (length suffix-string))) + (while (and (< start len) + (string-match "[^:]+" suffix-string start)) + (setq suffix-list + (cons (substring suffix-string + (match-beginning 0) + (match-end 0)) + suffix-list) + start (1+ (match-end 0)))) + (setq suffix-list (nconc (nreverse suffix-list) '(""))))) + (t (error "(locate-file): Invalid third arg, '%s', use a colon separated string of file suffixes" + suffix-string))) + (if (and (file-name-absolute-p file) (file-readable-p file)) + file;; file exists without suffix addition, so return it + (if (file-name-absolute-p file) (setq dir-list '(nil))) + (if (equal file "") (error "(locate-file): Empty file argument")) + (let (suffixes pathname) + ;; Search dir-list for a matching, readable file. + (catch 'found + (while dir-list + (setq suffixes suffix-list) + (while suffixes + (setq pathname (expand-file-name + (concat file (car suffixes)) + (car dir-list))) + (if (file-readable-p pathname) + (throw 'found pathname)) + (setq suffixes (cdr suffixes))) + (setq dir-list (cdr dir-list))))))))) + +;;; ************************************************************************ +;;; Public functions used by pulldown and popup menus +;;; ************************************************************************ + +(if (not (fboundp 'id-browse-file)) + (fset 'id-browse-file 'find-file-read-only)) + +(if (not (fboundp 'id-info)) + (defun id-info (node) + (if (br-in-browser) (br-to-view-window)) + (Info-goto-node node))) + +(if (not (fboundp 'id-tool-quit)) (fset 'id-tool-quit 'eval)) + +(if (not (fboundp 'id-tool-invoke)) + (defun id-tool-invoke (sexp) + (if (commandp sexp) + (call-interactively sexp) + (funcall sexp)))) + +(provide 'hversion)