;;(setq debug-on-error t)

(setq start-up-directory default-directory)

;;;;interesting Noah hacks:
;;;;
;;;;Do you know about the comint-based window popup code I wrote?  I use
;;;;it for shell buffers since I often run remote compiles, etc.  and like
;;;;to know when they're done, but without cluttering my windows in the
;;;;meantime.  They're in gnu's ~ftp/friedman/emacs-lisp directory, named
;;;;pb-popup.el (basic code), and comint-popup.el (comint tweaks).  rms
;;;;didn't seem interested in the code when I showed it to him a few years
;;;;ago, but I find it absolutely essential.


;;;;
;;;;Also, fff.el for locating files quickly.  Might save you keystrokes,
;;;;if you don't have shortcuts already.

;; start by Noah Freidman from /home/fsf/friedman/etc/init/emacs/init.el
(defun emacs-version-get-component (component)
  (let ((old-match-data (match-data))
	(version 0)
	(regexp (cond
		 ((eq 'major component) "^\\([0-9]+\\)")
		 ((eq 'minor component) "^[0-9]+\\.\\([0-9]+\\)")
		 ((eq 'build component) "^[0-9]+\\.[0-9]+\\.\\([0-9]+\\)"))))
    (unwind-protect
	(and (string-match regexp emacs-version)
	     (setq version
		   (string-to-int (substring emacs-version
					     (match-beginning 1)
					     (match-end 1)))))
      (store-match-data old-match-data))
    version))

(setq emacs-version-major (emacs-version-get-component 'major)
      emacs-version-minor (emacs-version-get-component 'minor)
      emacs-version-build (emacs-version-get-component 'build))
;; end by Noah Freidman from /home/fsf/friedman/etc/init/emacs/init.el

;;@@ v19 kludge for hp800 from Noah
(defun flatten (list)
  "Descends recursively through LIST to find any sublists, and returns a
new list with copies of all non-list elements (including vectors and strings) at
the same level.  Dotted pairs are handled as lists.

   Example:  (flatten '(foo (bar baz) (quux (bletch (moby . bignum))) frobme))
             => (foo bar baz quux bletch moby bignum frobme)
"
  (let* ((flatlist (cons nil nil))
         (flatlist-tail flatlist))
    (while list
      (if (listp list)
          (progn
            (if (listp (car list))
                (setcdr flatlist-tail (flatten (car list)))
              (setcdr flatlist-tail (list (car list))))
            (setq list (cdr list)))
        (setcdr flatlist-tail (list list))
        (setq list nil))
      (while (cdr flatlist-tail)
        (setq flatlist-tail (cdr flatlist-tail))))
    (cdr flatlist)))

(defun set-load-path (&rest path-lists)
  "Takes a variable number of lists and/or strings and constructs
load-path from the list.  Each argument should be a string or list of
directories to be added to the load-path.  Directories are only added
to load-path if they exist and are unique (i.e. not already in
load-path previously).  The previous value of load-path prior to
calling this function is ignored."
  (let ((load-path-new nil))
    (mapcar
     (function
      (lambda (path)
        (let ((dir (expand-file-name path)))
          (and (file-directory-p dir)   ; is a directory
               ;; Check to see if dir is already in new load-path-new.  If so,
               ;; don't add it again.
               (not (member dir load-path-new))
               ;; add it
               (setq load-path-new (cons dir load-path-new))))))
     (flatten path-lists))
    (setq load-path (nreverse load-path-new))))

(if (file-exists-p (expand-file-name "~tower/.emacs.lisp"))
    (set-load-path (expand-file-name "~tower/.emacs.lisp") load-path)
  )

(and (equal emacs-version-major 19)
     ;; (equal emacs-version-minor 22)
     (member (system-name) '("nutrimat.gnu.ai.mit.edu"
			     "hill.gnu.ai.mit.edu"
			     "goldman.gnu.ai.mit.edu"
			     "kropotkin.gnu.ai.mit.edu"))
     (progn
       (setq system-uses-terminfo nil)
;;       (set-load-path load-path "/home/gp/tower/tmp/w3")
       ))
;;@@ end v19 kludge for hp800 from Noah

(defun load-file-if-exists (file-to-load)
  "load Emacs lisp file if it exists"
  (if (file-exists-p file-to-load)
      (load-file file-to-load)
    (message file-to-load " does not exist, so can't be loaded!")))

(load-file-if-exists (expand-file-name "~tower/.emacsrc.el"))

;;(load (expand-file-name "~mly/e/ehelp") nil t)
;; ~/.emacs.gnulists.el is loaded at the end

;; local machine stuff
;; defvar description: "*text to insert in mail message"
;; emacs19 uses mail-default-reply-to and mail-default-headers
(setq mail-header-inserted-text
"BCC: tower@ai.mit.edu
"
;Reply-To: tower@ai.mit.edu
;Sender: tower@ai.mit.edu
;Home: 36 Porter Street, Somerville, MA  02143, USA             +1-617-629-5822
;URL: http://www.ai.mit.edu/~tower/home.html
)
;Organization: Project GNU, Free Software Foundation,
;    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA   +1-617-542-5942

(defun mail-setup-hook-local ()
  "called from tower's mail-setup-hook"
  (mail-insert-headers-tower))

(defun rmail-mode-hook-local ()
  "called from tower's rmail-mode-hook"
  (cond
   ((equal (getenv "USER") "gnu")
    (progn
;;gnu@\\(\\|prep.\\|gnu.\\)ai.mit.edu\\|
(setq rmail-search-last-regexp "info-g\\(nu\\|cc\\|\\+\\+\\|nu-[^-]+\\)@\\|^Newsgroups:.*gnu.announce\\|^Newsgroups:.*gnu.gcc.announce\\|change\\|remove\\|unsu.*b\\|sig.*off\\|cancel\\|delete\\|rms@\\|stallman\\|ewing\\|gnu-prog\|fsf.*order.*@")
;OLD;      (setq rmail-search-last-regexp "\\([ocmt]:\\|^[ ]\\)\\(.*\\(\\(gnu\\|fsf\\|gnulists\\|moderators\\|tower-prep\\)[%@\\!]\\)\\| \\(bug\\|info\\|help\\)-\\| gnu-emacs-source\\)\\|----- ")
))
   (t
    (progn
      (setq rmail-search-last-regexp	;
	    "^to:.*tower@\\|\\bmoglen@\\|\\brms@\\|\\bapo-request\\|\\bcfcl.com\\|\\bbruce@\\|\\bsimsong@@\\|\\bpks@\\|\\bpeter@\\|\\bphs@\\|\\bbob@\\|\\bhag@\\|\\b3diff@\\|\\btami@\\|\\brtfs@\\|\\bgnu-volunteer-coordinators@\\|\\bgvc@\\|\\blenk@\\|\\bewing\\|\\bsmann@\\|\\bjoeh@\\|\\brjl@")))))
;###	    "bull\\|apo-request\\|cfcl.com\\|comp.org.usenix\\|\\brms\\b\\|\\bbruce\\b\\|\\bsimsong\\b\\|\\btower\\b\\|cd.*rom\\|^to: usenet\\|: root\\|\\bfsf-\\|\\blenk\\b\\|\\bewing\\b\\|\\bpks@\\b\\|\\bpeter@\\b\\|\\bphs\\b\\|\\bbull-edit\\b\\|\\bmelissa\\b\\|\\blab@\\b\\|\\bfriedman@")))))
;###DiffMon@)))))
;#####;	    "^\\#\\!.*/\\|^begin\\|^diff\\|^#! /bin/sh\\|gnuplot\\|\\(summary\\|subject\\):.*part\\|\\(to: \\|^[ ]\\)\\([^\\@\\!]+$\\|.*-request@prep\\|.*prep.*-request\\)\\|\\([ocmt]:\\|^[ ]\\).*\\(@ai.mit.edu\\|apo\\|animation\\|gnu@prep\\|!gnu\\|postmaster\\|root\\|tower\\|mailer-daemon\\|rms@\\|fsf@\\|fsf-hq\\|george@\\|karl@\\|bob@\\|tiemann\\|rsalz\\|sun-\\|gnu.announce\\|-ai\\|[4789]ai\\|-sq\\|bboard\\|swiss\\|theory-seminar\\|lsc-flyers\\|system-hack\\|net-users\\|new-gnu-releases\\|brunchies\\|suspects\\|league\\|terminus-users\\|gnu-emacs-source\\)")))))
;#####;	    "tower\\|system-ha\\|fsf-\\|-ai\\|\\(^subject: \\|^[ ]\\).*\\(result\\|guest-policy\\)")))))

(setq
 rmail-default-dont-reply-to-names
 (concat rmail-default-dont-reply-to-names
;;
;; cross-check vs. (defun gnulists-prog-name-from-field) in .emacs.gnulists.el
	"\\|suspects\\|league-activists\\|all-ai\\|[04789]ai\\|\\b\\(fsf\\|gnu\\|gnulists\\|gnulists-request\\|len\\|tower\\|towercsh\\|listserv\\|listserver\\|listproc\\|majordomo\\|comserve\\|mailbase\\|mailserv\\|newserv\\|saraserv\\)[%@]\\(.*ai\\.mit\\.edu\\|lpf\\.org\\|art\\.net\\)\\|\\*mac\\|\\*mit\\|bboard\\|kabuki-request\\|gnu-prog-request\\|gnu-prog-disc-request\\|hurd-ann-request\\|hurd-announce-request\\|bug-ghostscript-request\\|help-ghostscript-request\\|info-ghostscript-request\\|bug-hurd-request\\|help-hurd-request\\|info-hurd-request\\|bug-gmp-request\\|help-gmp-request\\|info-gmp-request\\|bug-pine-request\\|help-pine-request\\|info-pine-request\\|bug-guile-request\\|help-guile-request\\|info-guile-request\\|bug-lib-g\\+\\+-request\\|bug-gnu-libc-request\\|bug-glibc-request\\|bug-gnu-smalltalk-request\\|bug-gnu-sql-request\\|bug-groff-request\\|vms-gnu-emacs-request\\|help-gnu-emacs-request\\|info-gnu-emacs-request\\|bug-gnu-emacs-request\\|bug-bash-request\\|info-cvs-request\\|bug-cvs-request\\|info-gnu-chess-request\\|help-gnu-chess-request\\|bug-gnu-chess-request\\|info-gnu-shogi-request\\|help-gnu-shogi-request\\|bug-gnu-shogi-request\\|info-gnu-fortran-request\\|info-gnu-request\\|bug-gdb-request\\|help-gdb-request\\|info-gdb-request\\|bug-gnustep-request\\|help-gnustep-request\\|info-gnustep-request\\|discuss-gnustep-request\\|bug-gcc-request\\|bug-gnu-utils-request\\|help-gnu-utils-request\\|info-gnu-utils-request\\|help-gcc-request\\|info-gcc-request\\|bug-oleo-request\\|bug-gnats-request\\|bug-g\\+\\+-request\\|help-g\\+\\+-request\\|info-g\\+\\+-request\\|hurd-ann-request\\|gnu-emacs-sources-request\\|bug-cfengine-request\\|emacs-netnews-distribution[@%]prep\\|owner-bug-\\|owner-info-\\|owner-help-\\|owner-source-\\|gnu\\.g\\+\\+\\.bug\\|gnu\\.g\\+\\+\\.announce\\|gnu\\.g\\+\\+\\|gnu\\.g\\+\\+\\.help\\|gnu\\.g\\+\\+\\.lib\\.bug\\|gnu\\.gcc\\.bug\\|gnu\\.gcc\\.announce\\|gnu\\.gcc\\|gnu\\.gcc\\.help\\|gnu\\.gdb\\.bug\\|gnu\\.ghostscript\\|gnu\\.hurd\\|gnu\\.announce\\|gnu\\.utils\\|gnu\\.bash\\.bug\\|gnu\\.smalltalk\\.bug\\|gnu\\.sql\\.bug\\|gnu\\.groff\\.bug\\|gnu\\.chess\\|gnu\\.shogi\\|gnu\\.fortran\\|gnu\\.emacs\\.bug\\|gnu\\.emacs\\.announce\\|gnu\\.emacs\\|gnu\\.emacs\\.help\\|gnu\\.emacs\\.sources\\|gnu\\.emacs\\.vms\\|gnu\\.emacs\\.lisp\\.manual\\|gnu\\.emacs\\.gnews\\|gnu\\.emacs\\.gnus\\|gnu\\.gnustep\\.bug\\|gnu\\.gnustep\\.announce\\|gnu\\.gnustep\\.help\\|gnu\\.gnustep\\.discuss\\|gnu\\.config\\|gnu\\.gnusenet\\.config\\|gnu\\.test\\|gnu\\.gnusenet\\.test"))
;; jinx's elegance:
;; (setq rmail-default-dont-reply-to-names
;;      (regexp-or
;;       "info-.+"
;;       (concat "^"
;;	       (regexp-or "scheme" "scheme-standard" "rrrs-authors"
;;			  "all-ai" "[46789]ai")
;;	       (regexp-or "$" "[@%].+"))))
;;
;;(defun regexp-or (&rest items)
;;  (regexp-or-aux items))
;;
;;(defun regexp-or-aux (items)
;;  (if (null (cdr items))
;;      (car items)
;;    (concat "\\("
;;	    (car items)
;;	    "\\)\\|\\("
;;	    (regexp-or-aux (cdr items))
;;	    "\\)")))

(defun sq-lossage ()
  "Handle communication paths that use C-s and C-q.
   Use C-\\ and C-^ instead."
  (interactive)
  (if (< emacs-version-major 19)
      (set-input-mode nil t)
    (set-input-mode nil t t));; args changed in v19
  (setq keyboard-translate-table (make-string 128 0))
  (let ((i 0))
    (while (< i 128)
      (aset keyboard-translate-table i i)
      (setq i (1+ i))))
  (aset keyboard-translate-table ?\^\\ ?\^s)
  (aset keyboard-translate-table ?\^^ ?\^q)
  (aset keyboard-translate-table ?\^s 0)
  (aset keyboard-translate-table ?\^q 0))

(defun restore-normality ()
  "Restore ^S/^Q to their rightful places"
  (interactive)
  (sq-lossage)
  (aset keyboard-translate-table ?\^s ?\^s)
  (aset keyboard-translate-table ?\^q ?\^q)
  (if (< emacs-version-major 19)
      (set-input-mode t nil)
    (set-input-mode t nil t));; args changed in v19
  )

;(if (and (getenv "DISPLAY")
;	 (getenv "WINDOWID")
;	 (equal (getenv "TERM") "xterm"))
;   (restore-normality)			;allows emacs to behave normally when
;  )					;invoked via an rsh'ed xterm at BosUniv

;; keep this load at end
(load-file-if-exists (expand-file-name "~/.emacs.gnulists.el"))

(cd start-up-directory)
;; turned off: also doing in .emacs.check.q.el now
; not happenning on nutrimat - mar95:
(load-file-if-exists "/usr/local/lib/emacs/site-lisp/default.el")

; not happenning on geech with emacs 18.59 - oct96:
(load-file-if-exists "/com/share/lib/elisp/default.el")

;; EOF
