I've done some work on modifying bbdb-lucid.el to also work with FSF emacs (19.24). I'd like some people to give this a try and see if it works for you. I'd especially like feedback in the nature of improvements... this is the first draft here. What I did was move the majority of what used to be bbdb-lucid to bbdb-display, but with calls to lucid-only functions changed into calls to new bbdb functions, which are defined (differently!) in bbdb-display-fsf and bbdb-display-lucid. So if I did my job well, this should still work for lucid, but in reality that claim also needs testing, since I made a few other changes as well (ie, tried to get the "Finger All" menu item to work; it used to refer to a non-existent function bbdb-finger-record). So give this a try and let me know how it does. Installation is just (if window-system (require 'bbdb-display)) Send fixes to me & I'll hopefully I'll be able to report back to the list with an imporved, safer version soon (which perhaps could make it into the next release of BBDB?) Bng shar: saving bbdb-display-fsf.el (Text) #!/bin/sh # This is a shell archive (produced by shar 3.49) # To extract the files from this archive, save it to a file, remove # everything above the "!/bin/sh" line above, and type "sh file_name". # # made 05/31/1994 22:02 UTC by [EMAIL PROTECTED] # Source directory /home/diamond/u14/boris/emacs/lisp # # existing files will NOT be overwritten unless -c is specified # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 2919 -rw-r--r-- bbdb-display-fsf.el # 2468 -rw-r--r-- bbdb-display-lucid.el # 7587 -rw-r--r-- bbdb-display.el # # ============= bbdb-display-fsf.el ============== if test -f 'bbdb-display-fsf.el' -a X"$1" != X"-c"; then echo 'x - skipping bbdb-display-fsf.el (File already exists)' else echo 'x - extracting bbdb-display-fsf.el (Text)' sed 's/^X//' << 'SHAR_EOF' > 'bbdb-display-fsf.el' && ;;; bbdb-display-fsf.el -- FSF Specific definitions for bbdb-display. X ;;; This file is an extension to the Insidious Big Brother Database (aka BBDB), ;;; Copyright (c) 1994 Boris Goldowsky <[EMAIL PROTECTED]> ;;; Derived from bbdb-lucid.el, (c) 1992 Jamie Zawinski <[EMAIL PROTECTED]>. ;;; Last change 31-may-94. X ;;; This 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 1, 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 GNU Emacs; see the file COPYING. If not, write to ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. X (require 'lmenu) X (define-key bbdb-mode-map [down-mouse-3] 'bbdb-menu) X (or (internal-find-face 'bbdb-name) X (face-differs-from-default-p (make-face 'bbdb-name)) X (copy-face 'underline 'bbdb-name)) X (or (internal-find-face 'bbdb-company) X (face-differs-from-default-p (make-face 'bbdb-company)) X (copy-face 'italic 'bbdb-company)) X (or (internal-find-face 'bbdb-field-value) X (copy-face 'default 'bbdb-field-value)) X (or (internal-find-face 'bbdb-field-name) X (face-differs-from-default-p (make-face 'bbdb-field-name)) X (copy-face 'bold 'bbdb-field-name)) X (defalias 'bbdb-extent-start-position 'overlay-start) X (defsubst bbdb-extent-face (e) X (overlay-get e 'face)) X (defsubst bbdb-overlay-length (o) X (- (overlay-end o) (overlay-start o))) X (defun bbdb-extent-at (pos buffer prop) X ;; compatibility function added by Bng. X ;; in lucid, extent-at X "Find overlay enclosing POSITION in BUFFER that has PROPERTY. Returns nil if no such overlay was found." X (interactive "e") X (let ((obuf (current-buffer))) X (set-buffer buffer) X (let* ((list (overlays-at pos)) X (best (car list)) X (bestlength (if best (bbdb-overlay-length best)))) X (foreach (cdr list) X '(lambda (o) X (if (overlay-get o prop) X (let ((length (bbdb-overlay-length o))) X (if (< length bestlength) X (setq best o X bestlength length)))))) X (set-buffer obuf) X best))) X (defun bbdb-make-extent (from to &optional face highlight) X (let ((o (make-overlay from to))) X (overlay-put o 'bbdb t) X (if face X (overlay-put o 'face face)) X (if highlight X (overlay-put o 'mouse-face 'highlight)) X o)) X (defun bbdb-delete-extents () X ;; delete existing extents X (overlay-recenter (point-min)) X (foreach (cdr (overlay-lists)) X (function (lambda (x) X (if (overlay-get x 'bbdb) X (delete-overlay x)))))) X (provide 'bbdb-display-fsf) X ;;; bbdb-fsf ends here. SHAR_EOF chmod 0644 bbdb-display-fsf.el || echo 'restore of bbdb-display-fsf.el failed' Wc_c="`wc -c < 'bbdb-display-fsf.el'`" test 2919 -eq "$Wc_c" || echo 'bbdb-display-fsf.el: original size 2919, current size' "$Wc_c" fi # ==shar: saving bbdb-display-lucid.el (Text) shar: saving bbdb-display.el (Text) =========== bbdb-display-lucid.el ============== if test -f 'bbdb-display-lucid.el' -a X"$1" != X"-c"; then echo 'x - skipping bbdb-display-lucid.el (File already exists)' else echo 'x - extracting bbdb-display-lucid.el (Text)' sed 's/^X//' << 'SHAR_EOF' > 'bbdb-display-lucid.el' && ;;; bbdb-display-lucid.el -- Lucid GNU Emacs definitions for bbdb-display. X ;;; This file is the part of the Insidious Big Brother Database (aka BBDB), ;;; Copyright (c) 1992 Jamie Zawinski <[EMAIL PROTECTED]>. ;;; Derived from bbdb-lucid.el, (c) 1992 Jamie Zawinski <[EMAIL PROTECTED]>. ;;; Last change 31-may-94. X ;;; The Insidious Big Brother Database 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 1, or (at your ;;; option) any later version. ;;; ;;; BBDB 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 GNU Emacs; see the file COPYING. If not, write to ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. X ;;; This code is kind of kludgey, mostly because it needs to parse the contents ;;; of the *BBDB* buffer, since BBDB doesn't save the buffer-positions of the ;;; various fields when it fills in that buffer (doing that would be slow and ;;; cons a lot, so it doesn't seem to be worth it.) X (define-key bbdb-mode-map 'button3 'bbdb-menu) X (or (find-face 'bbdb-name) X (face-differs-from-default-p (make-face 'bbdb-name)) X (set-face-underline-p 'bbdb-name t)) X (or (find-face 'bbdb-company) X (face-differs-from-default-p (make-face 'bbdb-company)) X (make-face-italic 'bbdb-company)) X (or (find-face 'bbdb-field-value) X (make-face 'bbdb-field-value)) X (or (find-face 'bbdb-field-name) X (face-differs-from-default-p (make-face 'bbdb-field-name)) X (copy-face 'bold 'bbdb-field-name)) X (defalias 'bbdb-extent-start-position 'extent-start-position) X (defalias 'bbdb-extent-face 'extent-face) X (defalias 'bbdb-extent-at 'extent-at) X (defalias 'bbdb-find-face 'find-face) X (defun bbdb-delete-extents () X (map-extents (function (lambda (x y) X (if (bbdb-extent-p x) X (delete-extent x)))) X (current-buffer) (point-min) (point-max) nil)) X (defun bbdb-make-extent (from to &optional face highlight) X (let ((e (make-extent from to))) X (set-extent-data e 'bbdb) X (if face X (bbdb-set-extent-face e face)) X (if highlight X (bbdb-set-extent-attribute e 'highlight)) X e)) X (provide 'bbdb-display-lucid) SHAR_EOF chmod 0644 bbdb-display-lucid.el || echo 'restore of bbdb-display-lucid.el failed' Wc_c="`wc -c < 'bbdb-display-lucid.el'`" test 2468 -eq "$Wc_c" || echo 'bbdb-display-lucid.el: original size 2468, current size' "$Wc_c" fi # ============= bbdb-display.el ============== if test -f 'bbdb-display.el' -a X"$1" != X"-c"; then echo 'x - skipping bbdb-display.el (File already exists)' else echo 'x - extracting bbdb-display.el (Text)' sed 's/^X//' << 'SHAR_EOF' > 'bbdb-display.el' && ;;; bbdb-display.el -- Mouse sensitivity & menus for Lucid and FSF Emacs. X ;;; This file is an extension to the Insidious Big Brother Database (aka BBDB), ;;; Copyright (c) 1994 Boris Goldowsky <[EMAIL PROTECTED]> ;;; Derived from bbdb-lucid.el, (c) 1992 Jamie Zawinski <[EMAIL PROTECTED]>. ;;; Last change 31-may-94. X ;;; This 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 1, 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 GNU Emacs; see the file COPYING. If not, write to ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. X ;;; This code is kind of kludgey, mostly because it needs to parse the contents ;;; of the *BBDB* buffer, since BBDB doesn't save the buffer-positions of the ;;; various fields when it fills in that buffer (doing that would be slow and ;;; cons a lot, so it doesn't seem to be worth it.) X (require 'bbdb) (require 'bbdb-com) X ;; Version-specific set up: (cond ((string-match "Lucid" emacs-version) X (require 'bbdb-display-lucid)) X ((>= emacs-major-version 19) X (require 'bbdb-display-fsf))) X (defvar bbdb-fontify-max 25 X ;; Functionality enhancement by Bng X "Don't fontify BBDB buffer if it has more than this many records. Otherwise everything gets very slow if there are many records to parse and highlight.") X ;##autoload (defun bbdb-fontify-buffer () X (save-excursion X (set-buffer bbdb-buffer-name) X (bbdb-delete-extents) X (if (> (length bbdb-records) bbdb-fontify-max) X nil X (let ((rest bbdb-records) X record start end elided-p p e) X (while rest X (setq record (car (car rest)) X elided-p (eq (nth 1 (car rest)) t) X start (marker-position (nth 2 (car rest))) X end (1- (or (nth 2 (car (cdr rest))) (point-max)))) X (bbdb-make-extent start end nil 'region) X (goto-char start) X (if elided-p X (progn X (move-to-column 48) X (skip-chars-backward " \t")) X (end-of-line)) X (setq p (point)) X (goto-char start) X (if (search-forward " - " p t) X (progn X (bbdb-make-extent (point) p 'bbdb-company nil) X (forward-char -3)) X (goto-char p)) X (bbdb-make-extent start (point) 'bbdb-name 'highlight) X (forward-line 1) X (while (< (point) end) X (skip-chars-forward " \t") X (setq p (point)) X (and (looking-at "[^:\n]+:") X (progn X (bbdb-make-extent p (match-end 0) 'bbdb-field-name nil))) X (while (progn (forward-line 1) X (looking-at "^\\(\t\t \\| \\)"))) X (bbdb-make-extent p (1- (point)) 'bbdb-field-value 'highlight)) X (setq rest (cdr rest))))))) X X ;; modified by Bng in an attempt to make it work. ;; referenced bbdb-finger-records, which doesn't exist. (defvar global-bbdb-menu-commands X '(["Save BBDB" bbdb-save-db t] X ["Elide All Records" (bbdb-elide-all-records-internal nil) t] X ["Finger All Records" (bbdb-finger (mapcar 'car bbdb-records)) t] X ["BBDB Manual" bbdb-info t] X ["BBDB Quit" bbdb-bury-buffer t] X )) X (defun build-bbdb-finger-menu (record) X (let ((addrs (bbdb-record-net record))) X (if (cdr addrs) X (cons "Finger..." X (nconc X (mapcar '(lambda (addr) X (vector addr (list 'bbdb-finger record addr) X t)) X addrs) X (list "----" X (vector "Finger all addresses" X (list 'bbdb-finger record ''(4)) t)))) X (vector (concat "Finger " (car addrs)) X (list 'bbdb-finger record (car addrs)) t)))) X X (defun build-bbdb-sendmail-menu (record) X (let ((addrs (bbdb-record-net record))) X (if (cdr addrs) X (cons "Send Mail..." X (mapcar '(lambda (addr) X (vector addr (list 'bbdb-send-mail-internal X (bbdb-dwim-net-address record addr)) X t)) X addrs)) X (vector (concat "Send mail to " (car addrs)) X (list 'bbdb-send-mail-internal X (bbdb-dwim-net-address record (car addrs))) X t)))) X X (defun build-bbdb-field-menu (record field) X (let ((type (car field))) X (nconc X (list X (concat "Commands for " X (cond ((eq type 'property) X (concat "\"" X (symbol-name (if (consp (car (cdr field))) X (car (car (cdr field))) X (car (cdr field)))) X "\" field:")) X ((eq type 'name) "Name field:") X ((eq type 'company) "Company field:") X ((eq type 'net) "Network Addresses field:") X ((eq type 'aka) "Alternate Names field:") X (t X (concat "\"" (aref (nth 1 field) 0) "\" " X (capitalize (symbol-name type)) " field:")))) X "-----" X ["Edit Field" bbdb-edit-current-field t] X ) X (if (memq type '(name company)) X nil X (list ["Delete Field" bbdb-delete-current-field-or-record t])) X (cond ((eq type 'phone) X (list (vector (concat "Dial " (bbdb-phone-string (car (cdr field)))) X (list 'bbdb-dial (list 'quote field) nil) t))) X ) X ))) X X (defun build-bbdb-insert-field-menu (record) X (cons "Insert New Field..." X (mapcar X '(lambda (field) X (let ((type (if (string= (car field) "AKA") X 'aka X (intern (car field))))) X (vector (car field) X (list 'bbdb-insert-new-field (list 'quote type) X (list 'bbdb-prompt-for-new-field-value X (list 'quote type))) X (not X (or (and (eq type 'net) (bbdb-record-net record)) X (and (eq type 'aka) (bbdb-record-aka record)) X (and (eq type 'notes) (bbdb-record-notes record)) X (and (consp (bbdb-record-raw-notes record)) X (assq type (bbdb-record-raw-notes record)))))))) X (append '(("phone") ("address") ("net") ("AKA") ("notes")) X (bbdb-propnames))))) X X (defun build-bbdb-menu (record field) X (append X '("bbdb-menu" "Global BBDB Commands" "-----") X global-bbdb-menu-commands X (if record X (list X "-----" X (concat "Commands for record \"" X (bbdb-record-name record) "\":") X "-----" X (vector "Delete Record" X (list 'bbdb-delete-current-record record) t) X (if (nth 1 (assq record bbdb-records)) X ["Unelide Record" bbdb-elide-record t] X ["Elide Record" bbdb-elide-record t]) X ["Omit Record" bbdb-omit-record t] X ["Refile (Merge) Record" bbdb-refile-record t] X )) X (if record X (list (build-bbdb-finger-menu record))) X (if (and record (bbdb-record-net record)) X (list (build-bbdb-sendmail-menu record))) X (if record X (list (build-bbdb-insert-field-menu record))) X (if field X (cons "-----" (build-bbdb-field-menu record field))) X )) X ;##autoload (defun bbdb-menu (e) X (interactive "e") X (mouse-set-point e) X (require 'bbdb-com) X (beginning-of-line) X (popup-menu X (save-window-excursion X (save-excursion X (mouse-set-point e) X (let ((extent (bbdb-extent-at (point) (current-buffer) 'bbdb)) X record field face) X (if (null extent) X nil X (goto-char (bbdb-extent-start-position extent)) X (beginning-of-line) X (setq record (bbdb-current-record) X face (bbdb-extent-face extent) X field (cond ((memq face X '(bbdb-name bbdb-field-value X bbdb-field-name)) X (bbdb-current-field)) X ((eq face 'bbdb-company) X (cons 'company (cdr (bbdb-current-field)))) X (t nil)))) X (build-bbdb-menu record field)))))) X (bbdb-add-hook 'bbdb-list-hook 'bbdb-fontify-buffer) X (provide 'bbdb-display) SHAR_EOF chmod 0644 bbdb-display.el || echo 'restore of bbdb-display.el failed' Wc_c="`wc -c < 'bbdb-display.el'`" test 7587 -eq "$Wc_c" || echo 'bbdb-display.el: original size 7587, current size' "$Wc_c" fi exit 0