unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Sébastien Vauban" <zthjwsqqafhv@spammotel.com>
To: cyd@stupidchicken.com, <re.2YV9XX9BLMAAX@spammotel.com>
Cc: rms@gnu.org, emacs-devel@gnu.org
Subject: Re: Color-theme problems in Emacs 22+ (Ubuntu, Windows)
Date: 30 Jan 2007 13:21:27 +0100	[thread overview]
Message-ID: <87ps8wvh6g.fsf_-_@missioncriticalit.com> (raw)
In-Reply-To: <873b63os0c.fsf@stupidchicken.com>

[-- Attachment #1: Type: text/plain, Size: 4415 bytes --]

Hello Chong,

>>     I just installed Ubuntu Edgy 6.10, and still experiences
>>     problems with `color-theme' (versions 6.5.4, 6.5.5 and
>>     6.6.0) under Emacs Snapshot (GTK).
>>
>>     I see some of my colors sometimes (for example, when
>>     editing my .emacs file), but it's never ever applied to
>>     my Group buffer. In other words, I cannot tell anymore
>>     which groups contain or not unread mails (as I expect
>>     them to become bold if they contain unread material).
>
> I can't reproduce this.  I did the following:
>
> - downloaded the latest version of color-theme (color-theme-6.6.0.tar.gz)
> - moved all the elisp files in the tarfile into ~/.emacs.d/lisp
>   (which is in my load-path)
> - M-: (setq color-theme-libraries "~/.emacs.d/lisp") RET
> - M-x load-file RET ~/color-theme-sva.el RET
>   (the color-theme file provided in the original bug report)
> - M-x gnus RET
>
> The resulting group buffer is displayed in purple and black, with
> groups containing unread messages in bold, as expected.

It's weird you tell me you see it in purple. Following my
color-theme, you should see `gnus-group-mail-3-*-face' in dark
green.

See http://www.mygooglest.com/sva/Emacs21.png.


> This is on GNU Emacs 22.0.92.36 (i686-pc-linux-gnu, GTK+
> Version 2.8.20), on Ubuntu Dapper.

To be sure to be better sync'ed with your configuration, I made
another checkout of Emacs 22 a couple of days ago, and I rebuilt
everything yesterday.

The resulting version string is:

    This is GNU Emacs 22.0.93.1 (i686-pc-linux-gnu)
    of 2007-01-29 on mundaneum.


> Please make sure you have color-theme.el installed correctly, and try
> to simplify your color-theme file to the smallest possible testcase
> that can produce this bug.

I've done the following:

    o   ultra-simplified my .emacs file - see attachment;

    o   ultra-simplified my .gnus file - see attachment;

    o   triple-checked that I'm loading the last version of
        color-theme - see the Messages buffers attached.

What I did:

    o   launched emacs21 with the simplified config file (this
        calls color-theme, and uses my own theme - see
        attachment);

    o   launched gnus (the default one, here 5.9) with the
        simplified config file;

    o   opened an article;

    o   added a window with `M-x list-colors-display'.

You see the resulting view in the screenshot to be found at:

    http://www.mygooglest.com/sva/Emacs21.png

You can see that everything is pretty normal, with `GNU Emacs
21.4.1 (i486-pc-linux-gnu, X toolkit, Xaw3d scroll bars) of
2006-09-15 on rothera, modified by Debian'.

Next steps:

    o   launched the version of Emacs 22 that I built yesterday
        with the *same config file*;

    o   launched gnus (the default one, here 5.11) with the *same*
        *config file*;

    o   opened an article;

    o   added a window with `M-x list-colors-display'.

Now, while everything was the same from my point of view (my
Emacs and Gnus config files, my color-theme) - with the
exception of the version of Gnus [but, from older tests, I can
say this is not the problem], you can see that the layout is
very very different, on the following screenshot:

    http://www.mygooglest.com/sva/Emacs22.png

You can notice that even the `list-colors-display' buffer is
completely "black on white only" (with the exception of the
tabulations that I always visualize in yellow, as asked in my
.emacs file).

Though, as I already said, I cannot say that nothing is applied
from my color-theme. For example:

    o   the subject title is well displayed in bold orange, but
        that's more or less the only thing...

    o   the contents of my Emacs file is correctly displayed,
        with my favorite colors (but this is not shown here on
        the screenshot).

To summarize, why I tend to say that there is a problem inside
Emacs 22+, it's because the only real change is the version of
Emacs. None of my config files are changing between the
different tests. And, to remind you, I also have the exact same
problems under Windows, with versions 22+.

But I guess we tackle here a very complex interaction between
many different components...

Thank you for all the support you already have and will
provide to me!

Seb

-- 
Sébastien Vauban

[-- Attachment #2: .emacs-sva --]
[-- Type: application/octet-stream, Size: 163685 bytes --]

;;; .emacs --- my Emacs Init File

;; Copyright (C) 1999-2006 Fabrice Niessen
;; Time-stamp: "Tue 2007-01-30 11:09 sva on mundaneum"

;; Author: Fabrice Niessen <fni@missioncriticalit.com>
;; Keywords: emacs, dotfile, config

;; $Revision: 743 $
;; $Date: 2007-01-25 10:17:09 +0100 (Thu, 25 Jan 2007) $

;;
;;    ___ _ __ ___   __ _  ___ ___
;;   / _ \ '_ ` _ \ / _` |/ __/ __|
;;  |  __/ | | | | | (_| | (__\__ \
;; (_)___|_| |_| |_|\__,_|\___|___/
;;

;; This file is NOT part of GNU Emacs.

;; This file 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 2 of
;; the License, or (at your option) any later version.

;; This file 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 this file; if not, write to the Free
;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
;; MA 02111-1307, USA.

;;; Commentary:

;;  Pre-Requisites
;;
;;      You should use the `folding.el' package to see this file properly.
;;      `folding.el' hides sections by folding them into a single line.
;;
;;  Sequence of Files Loaded at GNU Emacs Start Up
;;
;;      1.  Library `site-start.el' (site-run-file)
;;          `M-: (find-file (locate-library site-run-file)) RET'
;;
;;      2.  File `~/.emacs' (user-init-file)
;;
;;      3.  Library `default.el' ("default init file" for local site
;;          customizations)
;;
;;  Help
;;
;;      For help on The Emacs Editor, see:
;;          (info "(emacs)")
;;      Place the cursor right after `)' and press `C-x C-e'
;;
;;  TODO
;;
;;      o   Look at the following packages
;;          * which.el
;;          * nt-bash.el
;;          * cgi.el
;;          * httpd.el (run Emacs as a Web server)

;;; Code:

;; Emacs is like a laser guided missile. It only has to be slight
;; mis-configured to ruin your whole day. [Sean McGrath]

;; modify to taste!

(message "{{{ --[ Loading my Emacs init file ]--")

;; Les gros bosseurs préféreront sans doute démarrer Emacs dès le début de
;; la session de travail sous X11, par exemple grâce au `~/.xinitrc' ou bien
;; aux fonctions de mise en place de l'environnement offertes par le
;; gestionnaire de fenêtres.


;;{{{ --[ Environment determination ]---------------------------------------

;; OS type -- are we running Microsoft Windows?
(defvar running-ms-windows (eq system-type 'windows-nt))

;; Emacs type -- are we running XEmacs (or GNU Emacs)?
(defvar running-xemacs (string-match "XEmacs\\|Lucid" emacs-version))

(if running-xemacs
    ;; don't offer migration of the init file
    (setq load-home-init-file t))

;;}}}


;;{{{ --[ Variables ]-------------------------------------------------------

;; limit on number of Lisp variable bindings & unwind-protects
;; (30 times its default value)
(setq max-specpdl-size (* 30 1000))

;; limit serving to catch infinite recursions for you before they
;; cause actual stack overflow in C, which would be fatal for Emacs
(setq max-lisp-eval-depth (* 100 300))

;;}}}


;;{{{ --[ Macros ]----------------------------------------------------------

(defmacro GNUEmacs (&rest body)
  "Execute any number of forms if running under GNU Emacs."
  (list 'if (not running-xemacs) (cons 'progn body)))

(defmacro XEmacs (&rest body)
  "Execute any number of forms if running under XEmacs."
  (list 'if running-xemacs (cons 'progn body)))

;;}}}


;;{{{ --[ Loading Libraries of Lisp Code for Emacs ]------------------------

;; make loaded files give a message
(defadvice load (before debug-log activate)
  (message "Loading %s..." (locate-library (ad-get-arg 0))))

;; load-path enhancement
(defun my-add-to-load-path (this-directory &optional with-subdirs recursive)
  "Add THIS-DIRECTORY at the beginning of the load-path, if it exists.
Add all its subdirectories not starting with a '.' if the
optional argument WITH-SUBDIRS is not nil.
Do it recursively if the third argument is not nil."
  (when this-directory
    (when (file-directory-p this-directory)
      (let* ((this-directory (expand-file-name this-directory))
             (files (directory-files this-directory t "^[^\\.]")))

        ;; completely canonicalize the directory name
        (while (not (string= this-directory (expand-file-name this-directory)))
          (setq this-directory (expand-file-name this-directory)))

        (message "Adding `%s' to load-path..." this-directory)
        (add-to-list 'load-path this-directory)

        (if with-subdirs
            (progn
              (while files
                (setq dir-or-file (car files))
                (when (file-directory-p dir-or-file)
                  (if recursive
                      (my-add-to-load-path dir-or-file 'with-subdirs)
                    (my-add-to-load-path dir-or-file)))
                (setq files (cdr files)))))))))

;; `M-x list-load-path-shadows RET'


;;; ----[ Library Search

(defvar my-site-lisp-directory "~/emacs/site-lisp/"
  "Name of directory where my personal additional Emacs Lisp files reside.")

(defvar other-local-site-lisp-directory
  (concat (or (getenv "LOCAL_SHARE") "/home/sva/media/Downloads") "/emacs/site-lisp/")
  "Name of directory where additional Emacs goodies Lisp files (from the
Internet) reside.")

;; local site-lisp is there so that you have an easy way of installing your
;; own (possibly not distro packaged) Emacs add ons which are specific to
;; the version of Emacs your running. This keeps your local add-ons apart
;; from distro supplied ones. If your have a /usr/local partition, it also
;; means you can do a complete re-install of Emacs (or even your Linux
;; distro) without impacting on stuff you have added by hand.
;;
;; If you put stuff you have installed from tar balls etc within the same
;; directory hierarchy as the distro packaged Emacs, you can get problems
;; when upgrading the distro version as many package systems will assume
;; once all the packaged stuff is removed, directories are empty. If they
;; are not, the package management scripts can fail or possibly get into a
;; "confused" state.

(defvar other-site-lisp-directory
  (concat (or (getenv "SHARE") "/usr/share") "/emacs/site-lisp/")
  "Name of directory where additional Emacs goodies Lisp files (from the
distro optional packages) reside.")

;; ATTENTION!
;; My lisp directories should go before the Emacs installation ones.
;; Example with the outdated org mode file (that's called instead of my
;; version):
;; c:/Program Files/Emacs/emacs/lisp/textmodes/org.elc

;; Lisp libraries (most important directories last)
;; 1.
(my-add-to-load-path other-site-lisp-directory
                     'with-subdirs)

(GNUEmacs
   (my-add-to-load-path
    (concat (or (getenv "SHARE") "/usr/share") "/emacs21/site-lisp/")
    'with-subdirs))

(XEmacs
 (when running-ms-windows
   (my-add-to-load-path
    (concat (or (getenv "SHARE") "/usr/share") "/emacs/site-lisp/")
    'with-subdirs 'recursive)))

;; 2.
(my-add-to-load-path other-local-site-lisp-directory
                     'with-subdirs 'recursive)

;; 3.
(my-add-to-load-path my-site-lisp-directory
                     'with-subdirs)

;; Where to find Emacs packages installed by Ubuntu?
;;     o   /usr/share/emacs/site-lisp/    (source version)
;;     o   /usr/share/emacs21/site-lisp/  (byte-compiled version for GNU Emacs)
;;     o   /usr/share/xemacs21/site-lisp/ (byte-compiled version for XEmacs)

(defun my-create-directory-if-needed (dir)
  "Make sure the directory DIR exists; otherwise, create it."
  (if dir
      (if (not (file-directory-p dir))
          (if (yes-or-no-p (concat "The directory `" dir
                                   "' does not exist. Create it? "))
              (make-directory dir t)
            (error
             (concat "Cannot continue without directory `" dir "'"))))
    (error "my-create-directory-if-needed: Void directory")))

(defun my-file-executable-p (file)
  "Make sure the file FILE exists and is executable."
  (if file
      (unless (file-executable-p file)
        (message "Can't find `%s'" file)
        ;; sleep 3 s so that you can read the warning
        (sit-for 3))
    (error "my-file-executable-p: Void file")))

;; useful Common Lisp macros (`push', `case', ...)
(require 'cl)


;;; ----[ Bin Search

;; external programs from Emacs
(setenv "PATH" (concat (getenv "PATH")
                       ";"
                       "D:/users/share/emacs/bin"))


;;; ----[ Features

;; ;; redefine require to leave a trace of packages being loaded
;; (if (not (fboundp 'orig-require))
;;     (fset 'orig-require (symbol-function 'require))
;;   (message "The code to redefine `require' should not be loaded twice"))
;;
;; (defvar my-require-depth 0)
;;
;; (defun require (feature &optional file)
;;   "Leave a trace of packages being loaded."
;;   (cond ((member feature features)
;;          (message "%sRequiring `%s' (already loaded)"
;;                   (concat (make-string (* 2 my-require-depth) ?-) "> ")
;;                   feature)
;;          (sit-for 0))
;;         (t
;;          (message "%sRequiring `%s'"
;;                   (concat (make-string (* 2 my-require-depth) ?-) "> ")
;;                   feature)
;;          (sit-for 0)
;;          (let ((my-require-depth (+ 1 my-require-depth)))
;;            (cond (file
;;                   (orig-require feature file))
;;                  (t
;;                   (orig-require feature))))
;;          (message "%sRequiring `%s'...done"
;;                   (concat (make-string (* 2 my-require-depth) ?-) "> ")
;;                   feature)
;;          (sit-for 0))))


(defvar missing-packages-list nil
  "List of packages that `try-require' can't find.")

;; attempt to load a feature/library, failing silently
(defun try-require (feature)
  "Attempt to load a library or module. Return true if the
library given as argument is successfully loaded. If not, instead
of an error, just add the package to a list of missing packages."
  (condition-case err
      ;; protected form
      (progn
        (message "Checking for library `%s'..." feature)
        (if (stringp feature)
            (load-library feature)
          (require feature))
        (message "Checking for library `%s'... Found" feature))
    ;; error handler
    (file-error  ; condition
     (progn
       (message "Checking for library `%s'... Missing" feature)
       (add-to-list 'missing-packages-list feature))
     nil)))

;;}}}


;;{{{ --[ Debugging ]-------------------------------------------------------

;; get the resulting backtrace when bugs such as `Wrong type argument' occur
(setq debug-on-error t)  ; will be cleared at end of buffer

(XEmacs
    (setq stack-trace-on-error t))

;; ;; hit C-g while it's frozen to get an ELisp backtrace
;; (setq debug-on-quit t)

;;}}}


;;{{{ Important General Concepts ###########################################

;;{{{ --[ 1 The Organization of the (info "(emacs)Screen") ]----------------

(message "1 The Organization of the Screen...")

;;; ----[ 1.2 The Echo Area

;; maximum number of lines to keep in the message log buffer
(setq message-log-max (* 30 50))

;; the `*Messages*' buffer is called the ` *Message-Log*' on XEmacs (note
;; the initial space). To display the message log, execute the command
;; `show-message-log'

(message "1 The Organization of the Screen... Done")

;;}}}


;;{{{ --[ 2 Kinds of User Input ]-------------------------------------------

(message "2 Kinds of User Input...")

(message "2 Kinds of User Input... Done")

;;}}}


;;{{{ --[ 3 Keys ]----------------------------------------------------------

(message "3 Keys...")

(message "3 Keys... Done")

;;}}}


;;{{{ --[ 4 Keys and Commands ]---------------------------------------------

(message "4 Keys and Commands...")

(message "4 Keys and Commands... Done")

;;}}}


;;{{{ --[ 5 Character Set for Text ]----------------------------------------

(message "5 Character Set for Text...")

(message "5 Character Set for Text... Done")

;;}}}


;;{{{ --[ 6 Entering and Exiting Emacs ]------------------------------------

(message "6 Entering and Exiting Emacs...")

(message "6 Entering and Exiting Emacs... Done")

;;}}}


;;{{{ --[ 7 Exiting Emacs ]-------------------------------------------------

(message "7 Exiting Emacs...")

(message "7 Exiting Emacs... Done")

;;}}}

;;}}}


;;{{{ Fundamental Editing Commands #########################################

;;{{{ --[ 8 (info "(emacs)Basic") Editing Commands ]------------------------

(message "8 Basic Editing Commands...")

;;; ----[ 8.2 Changing the Location of Point

;; don't add newlines to end of buffer when scrolling
(setq next-line-add-newlines nil)

;; XEmacs default for moving point to a given line number
(GNUEmacs
    (global-set-key [(meta g)] 'goto-line))

(global-set-key [(meta G)] 'what-line)

;;{{{ screen-lines

;; point motion by screen lines (as opposed to text lines)
(when (try-require 'screen-lines)
    ;; following lines commented out for keeping the original `kill-line'
    ;; in `screen-lines' minor mode
    (add-hook 'screen-lines-load-hook
              '(lambda ()
                 (ad-disable-advice 'kill-line 'around 'screen-lines)
                 (ad-activate 'kill-line)))

    ;; screen lines mode enabled by default for all buffers
    ;; HOW ???  (Right now, it's done via `custom.el')

    ;; nothing should appear in the mode line, when the `screen-lines' mode
    ;; is enabled in a buffer
    (setq screen-lines-minor-mode-string ""))

;;}}}


;;; ----[ 8.4 Undoing Changes

;; undo some previous changes
(global-set-key [(f11)] 'undo)

;;{{{ redo

;; redo the most recent undo
(when (try-require 'redo)
    (global-set-key [(shift f11)] 'redo))

;;}}}


;;; ----[ 8.8 Continuation Lines

;; (setq default-truncate-lines nil)
;; (setq truncate-partial-width-windows nil)

(defun my-wrap-mode-on ()
  "Minor mode for making buffer not wrap long lines to next line."
  (interactive)
  (setq truncate-lines nil))

(defun my-wrap-mode-off ()
  "Minor mode for making buffer wrap long lines to next line."
  (interactive)
  (setq truncate-lines t))

(defun my-toggle-wrap-mode ()
  "Switch wrap mode from wrap to non-wrap, or vice-versa."
  (interactive)
  (if (eq truncate-lines nil)
      (wrap-mode-off)
    (wrap-mode-on)))

(message "8 Basic Editing Commands... Done")

;;}}}


;;{{{ --[ 9 The (info "(emacs)Minibuffer") ]--------------------------------

(message "9 The Minibuffer...")

;;; ----[ 9.1 (info "(emacs)Minibuffer File") Names

;; ignore case when reading a file name completion
(setq read-file-name-completion-ignore-case t)

;; ;; dim the ignored part of the file name
;; (file-name-shadow-mode)


;;; ----[ 9.2 (info "(emacs)Minibuffer Edit")ing

;; minibuffer window expands vertically as necessary to hold the text that
;; you put in the minibuffer
(setq resize-mini-windows t)

;; resize-minibuffer-mode makes the minibuffer automatically resize as
;; necessary when it's too big to hold its contents
(XEmacs
    (autoload 'resize-minibuffer-mode "rsz-minibuf" nil t)
    (resize-minibuffer-mode)
    (setq resize-minibuffer-window-exactly nil))


;;; ----[ 9.3 (info "(emacs)Completion")

;; minibuffer completion incremental feedback
(icomplete-mode)

;; do not consider case significant in completion (GNU Emacs default)
(setq completion-ignore-case t)

;; To execute in Emacs 22+
;; ;; restore old behavior of SPC in minibuffer to complete file names
;; (define-key minibuffer-local-filename-completion-map " "
;;   'minibuffer-complete-word)
;; (define-key minibuffer-local-must-match-filename-map " "
;;   'minibuffer-complete-word)

(message "9 The Minibuffer... Done")

;;}}}


;;{{{ --[ 10 Running Commands by Name ]-------------------------------------

(message "10 Running Commands by Name...")

(message "10 Running Commands by Name... Done")

;;}}}


;;{{{ --[ 11 (info "(emacs)Help") ]-----------------------------------------

(message "11 Help...")

;; > I'm trying to teach myself Emacs Lisp, but can't figure out how to
;; > prompt for a string. I found the "read-key-sequence-vector" function,
;; > but that only takes in one character. Does anyone know how to prompt
;; > for a string? Thanks.
;; I don't know.  Or do you think I'm a super genius?
;; Let's see:
;; M-x apropos RET read RET
;; C-v
;; C-s read-string RET C-s C-s C-s
;; Yep, seems like this could be useful:
;; read-string
;;   Function: Read a string from the minibuffer, prompting with string PROMPT.
;; C-h f read-string RET
;; Yep, sounds promising.


;; term
;; (eval-after-load "term"
;;   '(defadvice term-char-mode (after swap-del-and-backspace activate)
;;      (define-key term-raw-map [delete] 'term-send-backspace)
;;      (define-key term-raw-map [backspace] 'term-send-del)))
;;
;; (define-key function-key-map "\e[7~" [home])
;; (define-key function-key-map "\e[8~" [end])

;; (defun bug-evil-term-process-coding-system ()
;;   "Fix a term bug; the `process-coding-system' should always be `binary'."
;;   (set-buffer-process-coding-system 'binary 'binary))
;;
;; (add-hook 'term-exec-hook 'bug-evil-term-process-coding-system)


;;; ----[ 11.4 Apropos

;; check all variables and non-interactive functions as well
(setq apropos-do-all t)

;; add apropos help about variables (bind `C-h A' to `apropos-variable')
(GNUEmacs
    (define-key help-map [(shift a)] 'apropos-variable))


;;; ----[ 11.8 Other Help Commands

;; Info documentation browse
(when (try-require 'info)

    ;; enter Info
    (global-set-key [(f1)] 'info)

    ;; list of directories to search for Info documentation files
    ;; (in the order they are listed)
    (if running-ms-windows
        (setq Info-directory-list
              (append Info-default-directory-list
                      `(,(concat (getenv "SHARE") "/info/")
                        "C:/cygwin/usr/info/"))))

    ;; display symbol definitions, as found in the relevant manual
    ;; (for C, Lisp, and other languages that have documentation in Info)
    (global-set-key [(control f1)] 'info-lookup-symbol))

(try-require 'info+)

;; get a Unix manual page and put it in a buffer
(global-set-key [(shift f1)] 'man-follow)

;; (defun jump-man-page ()
;;   (interactive)
;;   (manual-entry (current-word)))

;; same behavior as woman when manpage is ready
(setq Man-notify-method 'newframe)

;;{{{ WoMan

;; browse Unix manual pages "W.o. (without) Man"
(autoload 'woman "woman"
  "Decode and browse a UN*X man page." t)

(autoload 'woman-find-file "woman"
  "Find, decode and browse a specific UN*X man-page file." t)

;; list of directory trees to search for Unix manual files
(setq woman-manpath
      (if running-ms-windows
          `(,(concat (getenv "SHARE") "/man/")
            "C:/cygwin/usr/man/"
            "C:/cygwin/usr/share/man"
            "C:/cygwin/usr/local/man")
        '("/usr/share/man/"
          "/usr/local/man/")))

;;}}}


;;; ----[ Documentation Basics

;; jump to section in XEmacs Lisp Reference manual
(autoload 'lispref-search "lispref")
(define-key help-map [(L)] 'lispref-search)

(message "11 Help... Done")

;;}}}

;;}}}


;;{{{ Important Text-Changing Commands #####################################

;;{{{ --[ 12 The (info "(emacs)Mark") and the Region ]----------------------

(message "12 The Mark and the Region...")

;;; ----[ 12.2 Transient Mark Mode

;; when the mark is active, the region is highlighted
(GNUEmacs
    (when window-system
      (transient-mark-mode 1)))

(message "12 The Mark and the Region... Done")

;;}}}


;;{{{ --[ 13 Deletion and (info "(emacs)Killing") ]-------------------------

(message "13 Killing and Moving Text...")

(message "13 Killing and Moving Text... Done")

;;}}}


;;{{{ --[ 14 (info "(emacs)Yanking") ]--------------------------------------

(message "14 Yanking...")

(message "14 Yanking... Done")

;;}}}


;;{{{ --[ 15 (info "(emacs)Accumulating Text") ]----------------------------

(message "15 Accumulating Text...")

(message "15 Accumulating Text... Done")

;;}}}


;;{{{ --[ 16 (info "(emacs)Rectangles") ]-----------------------------------

(message "16 Rectangles...")

(message "16 Rectangles... Done")

;;}}}


;;{{{ --[ 17 (info "(emacs)Registers") ]------------------------------------

(message "17 Registers...")

;;; ----[ 17.1 Saving Positions in Registers

(when (try-require 'saveplace)

    ;; automatically save place in each file
    (setq save-place t)

    ;; name of the file that records `save-place-alist' value
    (setq save-place-file (convert-standard-filename "~/.emacs.d/places.txt"))

    ;; do not make backups of master save-place file
    (setq save-place-version-control "never"))


;;; ----[ 17.7 Bookmarks

;; where to save the bookmarks
(setq bookmark-default-file "~/.emacs.d/bookmarks.txt")

;; each command that sets a bookmark will also save your bookmarks
(setq bookmark-save-flag 1)

(message "17 Registers... Done")

;;}}}


;;{{{ --[ 18 Controlling the (info "(emacs)Display") ]----------------------

(message "18 Controlling the Display...")

;;; ----[ 18.2 Font Lock

;; make buffer size irrelevant for fontification
(setq font-lock-maximum-size nil)

;; use the maximum decoration
(setq font-lock-maximum-decoration t)

;; turn Font Lock mode on in many modes
(GNUEmacs
    (global-font-lock-mode t))

;; stop showing that annoying progress bar (in separate widget) when fontifying
(XEmacs
    (setq progress-feedback-use-echo-area t))

;; color syntax highlighting definitions
;; TODO Make it work with XEmacs
;;! TODO Enable it only in some buffers (not in dired, not in cvs annotate)
(defface my-font-lock-tab-face
  '((t (:background "Gold")))
  "Face for highlighting tab characters.")

(defface my-font-lock-trailing-space-face
  '((t (:background "LemonChiffon")))
  "Face for highlighting trailing spaces.")

(defface my-font-lock-long-line-face
  '((t (:background "lavender")))
  "Face for highlighting long lines.")

;; warning font lock (80 columns, tabs, trailing spaces)
(defvar font-lock-keywords nil)
(add-hook 'font-lock-mode-hook
          '(lambda ()
             (setq font-lock-keywords
                   (append font-lock-keywords
                           '(
;;                              ("^.\\{81,\\}$"
;;                               (0 'my-font-lock-long-line-face t))
                             ("\t+"
                              (0 'my-font-lock-tab-face t))
                             ("[ \t]+$"
                              (0 'my-font-lock-trailing-space-face t)))))))

;; (my-add-to-load-path
;;  "D:/users/share/emacs/site-lisp/x-symbol/lisp/x-symbol/")


;;; ----[ 18.5 (info "(emacs)Scrolling")

;; scroll line by line
(setq scroll-step 1)

;; better scrolling in Emacs
(when (try-require 'pager)
    (global-set-key [(meta v)] 'pager-page-up)
    (global-set-key [prior] 'pager-page-up)
    (global-set-key [(control v)] 'pager-page-down)
    (global-set-key [next] 'pager-page-down)
    (global-set-key [(meta up)] 'pager-row-up)
    (GNUEmacs (global-set-key '[(meta kp-8)] 'pager-row-up))
    (global-set-key [(meta down)] 'pager-row-down)
    (GNUEmacs (global-set-key '[(meta kp-2)] 'pager-row-down)))


;;; ----[ 18.8 (info "(emacs)Useless Whitespace")

(defun my-delete-trailing-whitespaces-and-untabify ()
  "Delete all the trailing white spaces, and convert all tabs to multiple
spaces across the current buffer."
  (interactive "*")
  (delete-trailing-whitespace (point-min) (point-max))
  (untabify (point-min) (point-max)))


;;; ----[ 18.11 (info "(emacs)Optional Mode Line") Features

;; show the line number in each mode line
(line-number-mode 1)

;; show the column number in each mode line
(column-number-mode 1)

;; enable display of time (0 <= hh <= 23) in mode line
(setq display-time-24hr-format t)
(display-time)

;; use inactive face for mode-line in non-selected windows
(setq mode-line-in-non-selected-windows t)

;; code for including abbreviated file paths in mode line
(GNUEmacs
    (when (try-require 'mode-line)
        (mode-line-toggle-display nil)))


;;; ----[ 18.12 How (info "(emacs)Text Display")ed

;; convert a buffer from DOS ^M end of lines to Unix end of lines
(defun dos-to-unix ()
  "Cut all visible ^M."
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (search-forward "\r" nil t)
      (replace-match ""))))

(global-set-key [(control c) (d)] 'dos-to-unix)

;; convert a buffer from Unix end of lines to DOS ^M end of lines
(defun unix-to-dos ()
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (while (search-forward "\n" nil t)
      (replace-match "\r\n"))))

;; Bad interaction with CVSNT/diff/... (not yet understood)
;; ;; Remove or convert trailing ctrl-M
;; (defun remove-trailing-ctrl-M ()
;;   "Propose to remove trailing ^M from a file."
;;   (interactive)
;;   (save-excursion
;;     (goto-char (point-min))
;;     (if (and (not (string-match ".gz$" (buffer-file-name)))
;;              (search-forward-regexp "\015$" nil t))
;;                                         ;: a ^M is found
;;         (if (or (= (preceding-char) ?\^J)
;;                 (= (following-char) ?\^J) )
;;             (if (y-or-n-p (format "Remove trailing ^M from %s? "
;;                                   (buffer-file-name)))
;;                 (progn (goto-char (point-min))
;;                        (perform-replace "\015" "" nil nil nil)
;;                        (pop-mark)
;;                        (save-buffer))
;;               (message "No transformation."))))))
;; (add-hook 'find-file-hooks 'remove-trailing-ctrl-M)


;;; ----[ 18.14 The (info "(emacs)Cursor Display")

(GNUEmacs
    ;; using cursor color to indicate some modes (read-only, insert and
    ;; overwrite modes)
    (setq hcz-set-cursor-color-color "")
    (setq hcz-set-cursor-color-buffer "")

    (defun hcz-set-cursor-color-according-to-mode ()
      "Change cursor color according to some minor modes."
      (let ((color
             (if buffer-read-only "blue"
               (if overwrite-mode "red"
                 "rgb:15/FF/00"))))  ;; insert mode
        (unless (and (string= color hcz-set-cursor-color-color)
                     (string= (buffer-name) hcz-set-cursor-color-buffer))
          (set-cursor-color (setq hcz-set-cursor-color-color color))
          (setq hcz-set-cursor-color-buffer (buffer-name)))))

    (add-hook 'post-command-hook 'hcz-set-cursor-color-according-to-mode))

;; ;; conflicts with the above!
;; (when (try-require 'wide-column)
;;     (setq wide-column-start-width 60)
;;     (setq wide-column-default-cursor-colour "rgb:15/FF/00"))
;; ;;    (add-hook 'text-mode-hook 'wide-column-mode)


;;; ----[ Temporary Displays

(GNUEmacs
    (temp-buffer-resize-mode t))

;; enhanced display of temporary windows (such as help buffers)
;; (try-require 'show-temp-buffer)  [bug with XEmacs 21.5]

(message "18 Controlling the Display... Done")

;;}}}


;;{{{ --[ 19 (info "(emacs)Search")ing and Replacement ]--------------------

(message "19 Searching and Replacement...")

;;; ----[ 19.4 (info "(emacs)Regexp Search")

;; list the input line, followed by the first nine substrings matches,
;; to debug regexp searches (in IELM)
;; example: ELISP> (save-excursion (set-buffer "BUFFER")
;;                                 (re-search-forward "REGEXP" nil t)
;;                                 (my-buffer-matched-strings))
(defun my-buffer-matched-strings ()
  (interactive)
  (mapcar 'my-buffer-matched-string-nth '(0 1 2 3 4 5 6 7 8 9)))

(defun my-buffer-matched-string-nth (n)
  "Return the Nth pattern-matched string from the current buffer"
  (if (and (match-beginning n) (match-end n))
      (if (> (match-end n) (match-beginning n))
          (buffer-substring (match-beginning n) (match-end n))
        "")
    nil))

;; to build Regexps with visual feedback, use `re-builder'
;; or KiKi, a Python RegEx Editor under Windows


;;; ----[ 19.6 (info "(emacs)Search Case")

;; searches and matches should ignore case
(setq case-fold-search t)

(message "19 Searching and Replacement... Done")

;;}}}


;;{{{ --[ 20 Commands for (info "(emacs)Fixit") Typos ]---------------------

(message "20 Commands for Fixing Typos...")

;;; ----[ 20.4 Checking and Correcting (info "(emacs)Spelling")

;; use GNU Aspell instead of (port of) ispell
(setq ispell-program-name
      (if running-ms-windows
          "C:/Program Files/Aspell/bin/aspell.exeTMP"
        "/usr/bin/aspell"))
(my-file-executable-p ispell-program-name)

(when (and ispell-program-name
           (file-executable-p ispell-program-name))

    (require 'ispell)

    ;; aspell extensions should be used
    (setq ispell-really-aspell t)

    ;; remove un-installed dictionaries from the default list
    ;; DOES NOT WORK IN ALL CONTEXTS YET!
    ;; as it does not always consider my list, I created .alias files for
    ;; nederlands and castellano
    (setq ispell-dictionary-alist
          '((nil                    ; default (English.aff)
             "[A-Za-z]" "[^A-Za-z]" "[']" nil ("-B") nil iso-8859-1)
            ("american"             ; Yankee English
             "[A-Za-z]" "[^A-Za-z]" "[']" nil ("-B") nil iso-8859-1)
            ("british"              ; British version
             "[A-Za-z]" "[^A-Za-z]" "[']" nil ("-B" "-d" "british") nil iso-8859-1)
            ("castellano"           ; Spanish mode
             "[A-Z\301\311\315\321\323\332\334a-z\341\351\355\361\363\372\374]"
             "[^A-Z\301\311\315\321\323\332\334a-z\341\351\355\361\363\372\374]"
             "[-]" nil ("-B" "-d" "spanish") nil iso-8859-1)
    ;;                        ^^^^^^ name of .alias file
            ("english"                      ; make English explicitly selectable
             "[A-Za-z]" "[^A-Za-z]" "[']" nil ("-B") nil iso-8859-1)
            ("francais"                     ; Francais.aff
             "[A-Za-z\300\302\306\307\310\311\312\313\316\317\324\331\333\334\340\342\347\350\351\352\353\356\357\364\371\373\374]"
             "[^A-Za-z\300\302\306\307\310\311\312\313\316\317\324\331\333\334\340\342\347\350\351\352\353\356\357\364\371\373\374]"
             "[-']" t nil "~list" iso-8859-1)
            ("nederlands"                   ; Nederlands.aff
             "[A-Za-z\300-\305\307\310-\317\322-\326\331-\334\340-\345\347\350-\357\361\362-\366\371-\374]"
             "[^A-Za-z\300-\305\307\310-\317\322-\326\331-\334\340-\345\347\350-\357\361\362-\366\371-\374]"
             "[']" t ("-C" "-d" "dutch") nil iso-8859-1)))

    ;; ispell
    (autoload 'ispell-word "ispell" "Check the spelling of word in buffer." 't)
    (autoload 'ispell-region "ispell" "Check the spelling of region." 't)
    (autoload 'ispell-buffer "ispell" "Check the spelling of buffer." t)

    ;; save the personal dictionary without confirmation
    (setq ispell-silently-savep t)


;;     ;; consider using the `ispell-parser' to check your text
;;     ;; Warning! Assignment to free variable ispell-parser!!
;;     (add-hook 'tex-mode-hook
;;               '(lambda ()
;;                  (setq ispell-parser 'tex)))

;;     ;; TODO Problems in *mail*: checking all the headers!!
;;     ;; turn on flyspell for all text modes
;;     (add-hook 'text-mode-hook
;;               '(lambda ()
;;                  (flyspell-mode 1)))

;;     ;; start Flyspell when editing LaTeX source files
;;     (add-hook 'LaTeX-mode-hook 'flyspell-mode)

;;     ;; ignore the \citep and \citet commands of the NatBib bibliography style
;;     (eval-after-load "ispell"
;;       '(let ((list (car ispell-tex-skip-alists)))
;;          (add-to-list 'list '("\\\\cite[tp]" ispell-tex-arg-end))
;;          (setcar ispell-tex-skip-alists list)))

    ;; on-the-fly spelling checking
    (autoload 'flyspell-mode "flyspell" "On-the-fly spelling checking" t)

    ;; enable the likeness criteria
    (setq flyspell-sort-corrections nil)

    ;;
    (setq flyspell-auto-correct-previous-word t)

    ;; dash character (`-') is considered as a word delimiter
    (setq flyspell-consider-dash-as-word-delimiter-flag t)

    ;; solve the problem of words separated by `-' flagged as erroneous
    ;; by removing the `-' from the value of otherchars
    (defun ispell-get-otherchars ()
      (replace-regexp-in-string "-" "" (ispell-get-decoded-string 3)))

    (defun my-turn-on-flyspell-french ()
      "Unconditionally turn on Flyspell mode (in French)."
      (interactive)
      (flyspell-mode 1) ;; extra
      (ispell-change-dictionary "francais")
      (flyspell-buffer)) ;; extra

    (global-set-key [(shift f7)] 'my-turn-on-flyspell-french)

    (defun my-turn-on-flyspell-english ()
      "Unconditionally turn on Flyspell mode (in English)."
      (interactive)
      (flyspell-mode 1)
      (ispell-change-dictionary "english")
      (flyspell-buffer))

    (global-set-key [(control f7)] 'my-turn-on-flyspell-english)

    ;; turn flyspell-mode on [instead of just toggling the mode
    ;; by calling it like: (add-hook 'text-mode-hook 'flyspell-mode)]
    (add-hook 'message-mode-hook 'my-turn-on-flyspell-french)


;;     (defun activate-flyspell ()
;;       "Turn on flyspell-mode and call flyspell-buffer."
;;       (interactive)
;;       ;; This next line REALLY slows buffer switching.
;;       (flyspell-mode)
;;       (flyspell-buffer))

;;     (defvar customised-hooks-alist
;;       '(emacs-lisp-mode-hook
;;         nxml-mode-hook
;;         python-mode-hook
;;         sh-mode-hook
;;         text-mode-hook)
;;       "An alist of hooks that require customisations.")

;;     (unless noninteractive
;;       ;; Activate flyspell for various major modes.
;;       (add-hook-list customised-hooks-alist 'activate-flyspell))

    ;; turn on flyspell-prog-mode instead, in emacs-lisp-mode, python-mode,
    ;; and sh-mode?


    (defun my-turn-off-flyspell ()
      "Unconditionally turn off Flyspell mode."
      (interactive)
      (flyspell-mode -1))

    ;; from Alex Schroeder
    (defun my-change-dictionary ()
      "Change the dictionary."
      (interactive)
      (let ((dict (or ispell-local-dictionary ispell-dictionary)))
        (setq dict (if (string= dict "francais") "american" "francais"))
        (message "Switched to %S" dict)
        (sit-for 0.4)
        (ispell-change-dictionary dict)
        (when flyspell-mode
          (flyspell-delete-all-overlays))))

    ;; key bindings
    (global-set-key [(meta $)] 'ispell-word)
    (global-set-key [(f7)] 'ispell-word)
    (global-set-key [(shift f7)] 'my-change-dictionary)
    (global-set-key [(control f7)] 'ispell-change-dictionary)

;; ;;* flyspell comments and strings in programming modes
;; ;; From: "Stefan Monnier <foo @ acm.com>"
;; (defun flyspell-generic-progmode-verify ()
;;   "Used for `flyspell-generic-check-word-p' in programming modes."
;;   (let ((f (get-text-property (point) 'face)))
;;     (memq f '(font-lock-comment-face font-lock-string-face))))
;; (defun flyspell-prog-mode ()
;;   "Turn on `flyspell-mode' for comments and strings."
;;   (interactive)
;;   (setq flyspell-generic-check-word-p 'flyspell-generic-progmode-verify)
;;   (flyspell-mode 1))
;; (add-hook 'c-mode-common-hook 'flyspell-prog-mode t)
;; (add-hook 'java-mode-common-hook 'flyspell-prog-mode t)

    (add-hook 'emacs-lisp-mode-hook 'flyspell-prog-mode)

;; LaTeX-sensitive spell checking
(setq ispell-enable-tex-parser t)

;; > J'ai ispell-maybe-find-aspelle-dictionnaries « Symbol definition
;; > function is void » à chaque lancement de flyspell...
;; Oui, c'est le package dictionaries-common de Debian qui installe un
;; ispell.el trop vieux dans emacs-snapshot, et ça provoque ce bug.


    ;; TODO Take a look at diction (grammar)
)


;;  (add-to-list 'mm-charset-synonym-alist '(iso8859-15 . iso-8859-15))

;;{{{ Dictionary

(when (try-require 'dictionary)
    (load "dictionary-init")

    ;; connect via a HTTP proxy (using the CONNECT command)
    (setq dictionary-use-http-proxy nil)

    ;; name of the HTTP proxy to use
    (setq dictionary-proxy-server "proxy")

    ;; port of the proxy server
    (setq dictionary-proxy-port 80)

    ;; key bindings to invoke the dictionary client
    (global-set-key [(control c) (s)] 'dictionary-search)
    (global-set-key [(control c) (m)] 'dictionary-match-words)

    ;; ;; popup menu
    ;; (GNUEmacs
    ;;     (global-set-key [mouse-3] 'dictionary-mouse-popup-matching-words))
    ;; (XEmacs
    ;;     (global-set-key [(control button3)]
    ;;                     'dictionary-mouse-popup-matching-words))
    ;;
    ;; ;; WordNet tool-tip support (for GNU Emacs 21)
    ;; (setq dictionary-tooltip-dictionary "wn")
    ;;
    ;; ;; global dictionary-mode
    ;; (GNUEmacs
    ;;     (global-dictionary-tooltip-mode 1))
    ;;
    ;; ;; activate for all text-based modes
    ;; (add-hook 'text-mode-hook 'dictionary-tooltip-mode)
)

(defun my-leo (word)
  (interactive "sWord: ")
  (browse-url (format "http://dict.leo.org/?search=%s" word)))

;;}}}

(message "20 Commands for Fixing Typos... Done")

;;}}}


;;{{{ --[ 21 Keyboard Macros ]---------------------------------------------

(message "21 Keyboard Macros...")

;;; ----[ 21.1 Basic Use

;; execute the most recent keyboard macro
(global-set-key [(f8)] 'call-last-kbd-macro)

;; assign a name to the last keyboard macro defined
(global-set-key [(shift f8)] 'name-last-kbd-macro)

;; insert in visited buffer the definition of a named kbd macro
(global-set-key [(control f8)] 'insert-kbd-macro)

(message "21 Keyboard Macros... Done")

;;}}}

;;}}}


;;{{{ Major Structures of Emacs ############################################

;;{{{ --[ 22 (info "(emacs)Files") Handling ]-------------------------------

(message "22 Files Handling...")

;;; ----[ 22.2 Visiting Files

;; change the default directory (if it exists)
;; (it is also the default directory when attaching files to mails)
(setq my-default-dir
      (cond (t
             "~/")))

(if (file-directory-p my-default-dir)
    (cd my-default-dir)
  (cd (getenv "HOME")))

;; open my Emacs init file
(defun my-open-dot-emacs ()
  "Opening ~/.emacs"
  (interactive)
  (find-file "~/.emacs"))
(global-set-key [(shift f3)] 'my-open-dot-emacs)

;; open my Gnus Configuration File
(defun my-open-dot-gnus ()
  "Opening ~/.gnus"
  (interactive)
  (find-file "~/.gnus"))
(global-set-key [(control f3)] 'my-open-dot-gnus)


;;; ----[ 22.3 Saving Files

;; make your changes permanent
(global-set-key [(f2)] 'save-buffer)

;; (add-hook 'after-save-hook
;;           'executable-make-buffer-file-executable-if-script-p)

;; offer save of *scratch* buffer on exit
(save-excursion
  (set-buffer "*scratch*")
  (setq buffer-file-name "~/*scratch*"))
  ;; (setq buffer-offer-save t) does not have its intended effect in my
  ;; .emacs file (i.e. `buffer-offer-save' still has its global default
  ;; value of nil in the *scratch* buffer). But if I immediately evaluate it
  ;; in the *scratch* buffer, it works.
  ;; That is because at startup, Emacs sets the major mode of `*scratch*'
  ;; according to `initial-major-mode', _after_ my .emacs is read.  Changing
  ;; major modes kills all local variables that are not permanently local,
  ;; including `buffer-offer-save'.

;; ensure a file ends in a newline when it is saved
(setq require-final-newline t)

;; directory used for temporary files
(XEmacs
    (setq temporary-file-directory (or (getenv "TEMP") "/tmp/")))

;; one annoyance is that Emacs scatters autosave files (#foo#) and backup
;; files (foo~) all over the filesystem.

;; put autosave files (ie #foo#) in one place, *not* scattered all over the
;; file system! (The `make-autosave-file-name' function is invoked to
;; determine the filename of an autosave file.)


;; put backup files (i.e. foo~ or foo.~i~) in one place too
(GNUEmacs
    ;; regexp => directory mappings
    ;; filenames matching a regexp are backed up in the corresponding directory
    (setq backup-directory-alist
          '(("." . "~/.emacs_backups/"))))  ;; '(("." . "~/.saves"))
          ;; Emacs will mkdir it if necessary

(XEmacs
    (require 'backup-dir)
    (make-variable-buffer-local 'backup-inhibited)
    (setq bkup-backup-directory-info
          '((t "~/.saves" ok-create full-path prepend-name))))

;; ;; The auto-save.el and backup.el packages collect files in one place
;; ;; I added the following to my crontab:
;; ;; # Cleanup the autosave and backup directories (24 * 7 = 168)
;; ;; 0 4 * * * /usr/sbin/tmpwatch 168 $HOME/.autosave $HOME/.backup
;; (when (try-require 'auto-save)
;;   (setq auto-save-directory "~/.autosave/")
;;   ;; Now that we have auto-save-timeout, let's crank this up
;;   ;; for better interactive response.
;;   (setq auto-save-interval 2000))
;; (try-require 'backup)

;; always use copying to create backup files (don't clobber symlinks)
(setq backup-by-copying t)

;; make numeric backup versions unconditionally
(setq version-control t)

;; delete excess backup versions silently
(setq delete-old-versions t)

;; automatically update the time stamp string (either Time-stamp: <>
;; or Time-stamp: "" occurring within the first 8 lines of a file) every
;; time you save a buffer
(add-hook 'write-file-hooks 'time-stamp)
(setq time-stamp-format
      "%3a %:y-%02m-%02d %02H:%02M %u on %s")
      ;; weekday yyyy-mm-dd hh:mm user on system

;; insert a time stamp string
(defun my-insert-time-stamp ()
  "Insert a time stamp."
  (interactive "*")
  (insert (format "%s %s - %s %s"
                  comment-start
                  (current-time-string)
                  (user-login-name)
                  comment-end)))

;;{{{ PCL-CVS

;; allow commit on whole directories
(setq cvs-allow-dir-commit t)

;; when to reuse an existing cvs buffer
(setq cvs-reuse-cvs-buffer 'always)  ;; subdir

;; examine
(global-set-key [(control x) (v) (e)] 'cvs-examine)

;; examine without asking for a directory
(global-set-key [(control f9)]
                '(lambda ()
                   (interactive)
                   (cvs-examine (file-name-directory (buffer-file-name))
                                nil)))

;; messages that should be ignored by the parser
;; should only ADD the last one to the default value of cvs-parse-...
(setq cvs-parse-ignored-messages
      '("Executing ssh-askpass to query the password.*$"
        ".*Remote host denied X11 forwarding.*$"
        ".*-m wrapper option is not supported remotely.*$"))

;; change the CVS Id marker to reflect that a source file was edited
;; (from Brady Montz)
(defun my-mark-cvs-modified ()
  "Called when a file has changed. Updates any RCS Id and Header keywords it
finds to show that the file is modified."
  (let ((buffer-undo-list t))
    ; don't let this change get into the undo list
    ; because of this, we must ensure that the edit is in-place, and doesn't
    ; move any text
    (when (and (buffer-modified-p) (boundp 'vc-mode) vc-mode)
      (save-excursion
        (goto-char (point-min))
        (while (re-search-forward
                (concat "\\(\\$\\(?:Id\\|Header\\): "
                        "[^\"'#;$]* \\)\\(Exp \\$\\)")
              nil t)
          (replace-match "\\1Mod $" t))))))

(defadvice basic-save-buffer (before my-basic-save-buffer first activate)
  (my-mark-cvs-modified))

(defun run (command &optional to-buffer)
  "A variation of shell-command.
With no optional argument this runs the command creating
a special buffer to put the output in. The buffer is named
after the first word in the command.

The optional argument to-buffer allows the target
buffer to be specified.

With the interactive-prefix the target buffer is the
current buffer (as in shell-command)."
  (interactive (list (read-from-minibuffer "Shell command: "
                                           nil nil nil 'shell-command-history)
                     current-prefix-arg))
  (shell-command command (or to-buffer
                             (get-buffer-create
                              (car (split-string command " "))))))

(defun run-eval (command &optional func)
  "Evaluate the shell command optionally passing results to a function.
Without the optional func this returns the result of
running the command, as a string.

With the function the results of the shell command are passed as
a string to the function, the value of calling the function is
returned.

If you supply func then it must either be a function taking
one string argument or a string which can be evaluated to a
function taking one string argument.

Interactively the prefix argument will cause a function to be
prompted for."
  (interactive (list (read-from-minibuffer "Shell command: "
                                           nil nil nil 'shell-command-history)
                     (if current-prefix-arg
                         (read-from-minibuffer "Function: "))))
  (with-temp-buffer
    ;; This turns off the open window behavior of shell-command
    (let ((pop-up-windows nil))
      (shell-command command (current-buffer)))
    (let ((str (buffer-substring-no-properties (point-min) (- (point-max) 1))))
      (cond
       ((functionp func)
        (funcall func str))
       ((stringp func)
        (funcall (eval (read func)) str))
       ('t
        str)))))

(defun map-files (thunk filename-list)
  "Read in each file as a buffer and execute thunk on them.
If any file does not already exist in the buffer list then that
buffer is destroyed after thunk has been executed.

If filename-list is a list then it's used directly, if it's
a string we run string-to-words on it."
  (mapcar (lambda (filename)
            (if (not (get-file-buffer filename))
                (let ((buf (find-file filename)))
                  (with-current-buffer buf
                    (funcall thunk)
                    (kill-buffer buf)))
              (with-current-buffer (get-buffer filename)
                (funcall thunk))))
          (if (listp filename-list)
              filename-list
            (split-string filename-list))))

;; switch the entire module from one location to another, using the same
;; code base when being at different physical sites
(defun my-cvs-hack ()
  "Toggle the CVS between local and remote"
  (interactive)
  (run-eval "find . -name 'Root'"
            (lambda (list-of-files)
              (map-files (lambda ()
                           (if (re-search-forward ":localhost:" nil 't)
                               (replace-match ":netfinity:")
                             (progn
                               (re-search-forward ":netfinity:" nil 't)
                               (replace-match ":localhost:")))
                           (save-buffer))
                         list-of-files))))

;;}}}

;;{{{ Subversion

;; Subversion interface for Emacs
(when (try-require 'psvn)

    ;; hide unmodified files
    (setq svn-status-hide-unmodified t)

    ;; use longer phrases
    (setq svn-status-short-mod-flag-p nil)

    (define-key svn-log-edit-mode-map [f6] 'svn-log-edit-svn-diff)

    ;; examine
    (global-set-key [(control x) (v) (e)] 'svn-status))

;;}}}


;;; ----[ 22.4 Reverting a Buffer

;; replace current buffer text with the text of the visited file on disk
(defun my-revert-buffer ()
  "Unconditionally revert buffer"
  (interactive)
  (flet ((yes-or-no-p (msg) t))
    (revert-buffer)))

;; key binding
(global-set-key [(control f12)] 'my-revert-buffer)


;;; ----[ 22.5 Auto Saving: Protection Against Disasters

;; how to get Emacs to auto-save to your local disk [#file#]

;; auto-save every 150 input events
(setq auto-save-interval 150)

;; auto-save after 15 seconds idle time
(setq auto-save-timeout 15)

;; Check out Kevin's ebackup.el
;; for saving in a specified common directory (not in local dir)
;; and handling saving of buffers with spaces in their name...
;; (otherwise, problems when composing *mail replies to ...* )


;;; ----[ 22.9 Comparing Files

;; ediff, a comprehensive visual interface to diff & patch
;; setup for Ediff's menus and autoloads
(require 'ediff-hook)

;; run `diff' in compilation-mode
(autoload 'diff-mode "diff-mode" "Diff major mode" t)

;; allow use of the ComponentSoftware Diff tool
;; (GNUEmacs
;;     (when (try-require 'csdiff-setup)
;;         (setq csdiff-program
;;               "C:/Program Files/ComponentSoftware/HTMLDiff/HTMLDiff.exe")))

;; begin in side by side split
;; (setq ediff-split-window-function 'split-window-horizontally)


;;; ----[ 22.11 Accessing Compressed Files

;; easy editing of arc/zip/zoo/lhz archives
(GNUEmacs
    (require 'arc-mode)

    ;; use the Cygwin gzip utility
    (setq archive-zip-use-pkzip nil)) ;; no effect???

;; simple editing of tar files as a dired-like listing of its contents
(require 'tar-mode)

;;{{{ crypt++

;; code for handling all sorts of compressed and encrypted files
(try-require 'crypt++)

;; allows you to encrypt/decrypt files within Emacs. I use it regularly and
;; it works very reliably. When I use C-x C-f to access an encrypted file,
;; Emacs asks me for the passphrase and then decrypts the file before
;; displaying it. When I save the file, Emacs automatically encrypts it
;; again.

;;}}}

(custom-set-variables
 '(auto-compression-mode t nil (jka-compr)))


;;; ----[ 22.13 Remote Files

;;{{{ Tramp - Transparent Remote Access, Multiple Protocols

;; (others than just FTP)

;; Tramp works very well in NTEmacs v22, with PuTTY (see `plink' and `pscp')

;; On me l'avait conseillé ici il y a quelques mois pour un autre usage :
;; travailler en remote avec une liaison n'offrant pas la possibilité de
;; l'export du DISPLAY... Je l'ai largement adopté tant ce machin est
;; pratique...
;;
;; On peut avoir autant de tampons que d'utilisateurs ou de machines et dès
;; que la session ssh (je l'utilise à travers cela) est terminée, il
;; redemande simplement le mot de passe et cela repart...

;; examples: C-x C-f /ssh:guestuser@shiva:/home/guestuser/.bash_history
;;                   /sudo:root@localhost:/home/others/.bashrc
;; use scpwrapper on win32 to get around NTEmacs paths vs. cygwin paths

(when (try-require 'tramp)
    ;; default transfer method (issues with Cygwin ssh)
    (setq tramp-default-method "ssh")  ; sshx

    ;; default user
    (setq tramp-default-user "fni")

    ;; faster auto saves
    (setq tramp-auto-save-directory temporary-file-directory)

    ;; help debugging
    (setq tramp-verbose 9)
    (setq tramp-debug-buffer t)

;; After adding
;; (setq coding-system-for-read 'utf-8)
;; (setq coding-system-for-write 'utf-8)
;; to my .emacs, tramp works correctly with UTF-8 files.

;; new proxy system (instead of the old multi-hop filename syntax)
;; For instance, there are two machines ("jail1", "web2") that I can only
;; access by first ssh'ing to a third ("janus").
;;
;;      (add-to-list 'tramp-default-proxies-alist
;;                   '("jail1\\|web2" "kirk" "/ssh:kirk@janus:"))
;;
;; Then you can simply access "/jail1:" or "/web2:", given
;; tramp-default-method is set to "ssh", and tramp-default-user is set to
;; "kirk".
;; The trick is to think from the end.

;;{{{ Open a file as root, easily [from Alex Schroder]

    (defvar find-file-root-prefix "/sudo:root@localhost:"
      "*The filename prefix used to open a file with `find-file-root'.
      This should look something like \"/sudo:root@localhost:\" (new style
      TRAMP) or \"/[sudo:root@localhost]/\" (XEmacs or old style TRAMP).")

    (defvar find-file-root-history nil
      "History list for files found using `find-file-root'.")

    (defvar find-file-root-hook nil
      "Normal hook for functions to run after finding a \"root\" file.")

    (defun find-file-root ()
      "*Open a file as the root user.
      Prepends `find-file-root-prefix' to the selected file name so that it
      maybe accessed via the corresponding tramp method."

      (interactive)
      (require 'tramp)
      (let* (;; We bind the variable `file-name-history' locally so we can
             ;; use a separate history list for "root" files.
             (file-name-history find-file-root-history)
             (name (or buffer-file-name default-directory))
             (tramp (and (tramp-tramp-file-p name)
                         (tramp-dissect-file-name name)))
             path dir file)

        ;; If called from a "root" file, we need to fix up the path.
        (when tramp
          (setq path (tramp-file-name-path tramp)
                dir (file-name-directory path)))

        (when (setq file (read-file-name "Find file (UID = 0): " dir path))
          (find-file (concat find-file-root-prefix file))
          ;; If this all succeeded save our new history list.
          (setq find-file-root-history file-name-history)
          ;; allow some user customization
          (run-hooks 'find-file-root-hook))))

    (defface find-file-root-header-face
      '((t (:foreground "white" :background "red3")))
      "*Face use to display header-lines for files opened as root.")

    (defun find-file-root-header-warning ()
      "*Display a warning in header line of the current buffer.
      This function is suitable to add to `find-file-root-hook'."
      (let* ((warning "WARNING: EDITING FILE AS ROOT!")
             (space (+ 6 (- (frame-width) (length warning))))
             (bracket (make-string (/ space 2) ?-))
             (warning (concat bracket warning bracket)))
        (setq header-line-format
              (propertize  warning 'face 'find-file-root-header-face))))

    (add-hook 'find-file-root-hook 'find-file-root-header-warning)

    (global-set-key [(control x) (control g)] 'find-file-root))

;;}}}

;;}}}


;;; ----[ 22.16 Convenience Features for Finding Files

;; show image files as images (not as semi-random bits)
(GNUEmacs
    (auto-image-file-mode 1))

;; visit a file
(global-set-key [(f3)] 'find-file)

;; setup a menu of recently opened files
(when (try-require 'recentf)

    ;; to protect from tramp not correctly supported (yet) under Win32
    (setq recentf-auto-cleanup 'never)

    (recentf-mode 1)

    ;; maximum number of items in the recentf menu
    (setq recentf-max-menu-items 20)

    ;; save file names relative to my current home directory
    (setq recentf-filename-handlers '(abbreviate-file-name))

    ;; add key binding
    (global-set-key  [(control x) (control r)] 'recentf-open-files))

(message "22 Files Handling... Done")

;;}}}


;;{{{ --[ 23 Using Multiple (info "(emacs)Buffers") ]-----------------------

(message "23 Using Multiple Buffers...")

;;; ----[ 23.2 (info "(emacs)List Buffers")

;; rebind `C-x C-b'
;; `buffer-menu' (moves point in the window which lists your buffers)
;; `electric-buffer-list' (pops up a buffer describing the set of buffers)
(global-set-key [(control x) (control b)] 'electric-buffer-list)

;; customizable buffer-selection with multiple menus
(GNUEmacs
    (when window-system
      (require 'msb)))

;; buffer selection
(GNUEmacs
    (try-require 'ibs))

;; cyclebuffer.el

;; put the current buffer at the end of the list of all buffers
(global-set-key [(shift f12)] 'bury-buffer)


;;; ----[ 23.4 (info "(emacs)Kill Buffer")

;; kill buffer without confirmation (if not modified)
(defun my-kill-this-buffer ()
  "Kill the current buffer without confirmation"
  (interactive)
  (kill-buffer nil))

;; key binding
(global-set-key [(f12)] 'my-kill-this-buffer)


;;; ----[ 23.7 (info "(emacs)Buffer Convenience") and Customization of Buffer Handling

(when (require 'uniquify)
    (setq uniquify-buffer-name-style 'forward))
    ;; (setq uniquify-after-kill-buffer-p t)
    ;; (setq uniquify-non-file-buffer-names t)
    ;; (setq uniquify-ignore-buffers-re " \\`\\ <file://\\`\\>*")

(message "23 Using Multiple Buffers... Done")

;;}}}


;;{{{ --[ 24 Multiple (info "(emacs)Windows") ]-----------------------------

(message "24 Multiple Windows...")

;; turn off this horrible tab thingy in XEmacs
(XEmacs
    (when (boundp 'default-gutter-visible-p)
      (set-specifier default-gutter-visible-p nil)))

;; look at ido

;;; ----[ 24.3 Using (info "(emacs)Other Window")

;; cycle through all windows on current frame
;; (global-set-key [(control tab)] 'other-window)
(global-set-key [(f6)] 'other-window)


;; ----[ 24.6 Deleting and (info "(emacs)Change Window")

;; delete all windows in the selected frame except the selected window
(global-set-key [(f5)] 'delete-other-windows)

;; delete the selected window and kill the buffer that was showing in it
;;(global-set-key [(f12)] 'kill-buffer-and-window)

;; enlarge or shrink windows more easily
(global-set-key [(control shift up)] 'enlarge-window)
(global-set-key [(control shift down)] 'shrink-window)
(global-set-key [(control shift left)] 'enlarge-window-horizontally)
(global-set-key [(control shift right)] 'shrink-window-horizontally)

;; make all visible windows the same height (approximately)
(global-set-key [(control f6)] 'balance-windows)

(message "24 Multiple Windows... Done")

;;}}}


;;{{{ --[ 25 (info "(emacs)Frames") and X Windows ]-------------------------

(message "25 Frames and X Windows...")

;;; ----[ 25.1 (info "(emacs)Mouse Commands") for Editing

;;{{{ Copy/Paste with Gnome desktop

(GNUEmacs
    ;; make Cut, Copy and Paste (keys and menu bar items) use the clipboard
    (menu-bar-enable-clipboard)

    ;; cutting and pasting uses the clipboard
    (setq x-select-enable-clipboard t))

;;}}}


;;; ----[ 25.7 (info "(emacs)Creating Frames")


;; o   resize the frame to the size you want
;; o   enter `(frame-parameters)' in the `*scratch*' buffer
;; o   evaluate the form: place the cursor after the closing paren, and
;;     type `C-j', so that the output goes right into the `*scratch*' buffer

;; put Emacs exactly where you want it, every time it starts up, by
;; auto-detecting the screen dimensions and computing where it should be
(when window-system
  ;; list of default values for frame creation (in font 9pt)
  (setq default-frame-alist
        (cond ((= (x-display-pixel-height) 1200)
               '((left . 610) (height . 74)))

              ((= (x-display-pixel-height) 1024)
               '((left . 610) (height . 63)))

              ((= (x-display-pixel-height) 800)
               (if running-ms-windows
                   '((left . 610) (height . 48))
                 '((left . 610) (height . 53)
                   (vertical-scroll-bars . right))))  ;; under Ubuntu

              ((= (x-display-pixel-height) 768)
               '((left . 610) (height . 46)))))

  ;; list of frame parameters for creating the initial frame
  (setq initial-frame-alist '((top . 0) (left . 0))))

(XEmacs
 (set-frame-width (buffer-dedicated-frame) 80)
 (set-frame-height (buffer-dedicated-frame) 42)
 (set-frame-position (buffer-dedicated-frame) 0 0))

;; title bar display of visible frames
(setq frame-title-format "Emacs - %b")


;; background color is frame-specific (not window!)
;; (setq special-display-buffer-names
;;        (cons "*shell*" special-display-buffer-names))

;; (let ((special-display-frame-alist
;;         (cons '(background-color . "dark") special-display-frame-alist)))
;;    (shell))


;;; From sample .emacs
;;; local Emacs background:  default
;;; remote Emacs background: palegreen1
;;; root Emacs background:   coral2

;(cond
; ((and (string-match "XEmacs" emacs-version)
;       (eq window-system 'x)
;       (boundp 'emacs-major-version)
;       (= emacs-major-version 19)
;       (>= emacs-minor-version 12))
;  (let* ((root-p (eq 0 (user-uid)))
;        (dpy (or (getenv "DISPLAY") ""))
;        (remote-p (not
;                   (or (string-match "^\\(\\|unix\\|localhost\\):" dpy)
;                       (let ((s (system-name)))
;                         (if (string-match "\\.\\(netscape\\|mcom\\)\\.com" s)
;                             (setq s (substring s 0 (match-beginning 0))))
;                         (string-match (concat "^" (regexp-quote s)) dpy)))))
;        (bg (cond (root-p "coral2")
;                  (remote-p "palegreen1")
;                  (t nil))))
;    (cond (bg
;          (let ((def (color-name (face-background 'default)))
;                (faces (face-list)))
;            (while faces
;              (let ((obg (face-background (car faces))))
;                (if (and obg (equal def (color-name obg)))
;                    (set-face-background (car faces) bg)))
;              (setq faces (cdr faces)))))))))


;;; ----[ 25.9 Making and Using a (info "(emacs)Speedbar") Frame

(require 'speedbar)

;; number of spaces used for indentation
(setq speedbar-indentation-width 2)

;; expand/collapse latex sections
(speedbar-add-supported-extension '(".tex" ".bib" ".w"))

;; jump to speedbar frame
(global-set-key [(f4)] 'speedbar-get-focus)

;; bind the arrow keys in the speedbar tree
;; [http://www.uweb.ucsb.edu/~dreamtheorist/emacs.html]
(define-key speedbar-key-map [(right)] 'speedbar-expand-line)
(define-key speedbar-key-map [(left)] 'speedbar-contract-line)

;; parameters to use when creating the speedbar frame in Emacs
(setq speedbar-frame-parameters '((width . 30)
                                  (height . 45)
                                  (foreground-color . "green")
                                  (background-color . "white")))


;;; ----[ 25.16 (info "(emacs)Menu Bars")

;; turn menus off
(unless window-system
    (menu-bar-mode 0))


;;; ----[ 25.20 (info "(emacs)Mouse Avoidance")

;; make mouse pointer stay out of the way of editing
(when window-system
    (mouse-avoidance-mode 'animate))

;; mouse gestures
(when (try-require 'strokes)
    (strokes-mode 1))

;; mouse wheel support
(GNUEmacs
    (mwheel-install))


;;; ----[ Add-ons

(GNUEmacs
    (when running-ms-windows
        (defun w32-minimize-frame ()
          "Minimize the current frame"
          (interactive)
          (w32-send-sys-command 61472))

        (defun w32-maximize-frame ()
          "Maximize the current frame"
          (interactive)
          (w32-send-sys-command 61488)
          (global-set-key [(meta return)] 'w32-restore-frame))

        (global-set-key [(meta return)] 'w32-maximize-frame)

        (defun w32-restore-frame ()
          "Restore a minimized frame"
          (interactive)
          (w32-send-sys-command 61728)
          (global-set-key [(meta return)] 'w32-maximize-frame))

        (defun w32-simulate-alt-tab ()
          (interactive)
          (w32-send-sys-command 61696))

        (defun w32-start-screen-saver ()
          (interactive)
          (w32-send-sys-command 61760))

        (defun w32-simulate-pressing-start-button ()
          (interactive)
          (w32-send-sys-command 61744))))

(message "25 Frames and X Windows... Done")

;;}}}


;;{{{ --[ 26 (info "(emacs)International") Character Set Support ]----------

(message "26 International Character Set Support...")

;; When using Latin-1, Windows (and Mac users) should stick to Official ISO
;; Latin-1 and not use the Windows CP 1252 codepage, which is (lamentably)
;; sometimes called "Latin-1". In real ISO Latin-1, character codes in the
;; range 127-159 are undefined. The Microsoft CP 1252 ("Windows Latin-1")
;; has assigned these undefined codes to glyphs listed on their codepage CP
;; 1252. For example, in Windows Latin-1, the Euro symbol has the code
;; 128. As long as the user creates and applies networks on his own machine
;; or some other Windows machine, everything seems to work fine, but the
;; networks cannot be shared with users on other platforms and cannot be
;; used in Xerox utf8-mode. In Latin-1 mode, xfst does not map the Microsoft
;; euro symbol to its proper Unicode representation \u20AC. This is the same
;; problem that happens with users whose environment is ISO-8859-15 (also
;; known as Latin-9).

;; Bottom Line: Users of the Xerox finite-state software need to understand
;; that ISO-8859-1 in xfst and the other applications means the REAL TRUE
;; ISO-8859-1 STANDARD and not some altered variant such as Latin-9 or CP
;; 1252 ("Windows Latin-1"). For any user who needs symbols that are not in
;; the 7-bit ASCII set, our recommendation is to move to Unicode UTF-8. That
;; is the only encoding that is the same across all platforms and operating
;; systems that support it.


;;; ----[ 26.3 (info "(emacs)Language Environments")

(set-language-environment "French")


;;; ----[ 26.5 (info "(emacs)Select Input Method")

;; M-x describe-coding-system RET RET

;; ;; default input method for multilingual text
;; (setq default-input-method "latin-1-prefix")


;;; ----[ 26.8 (info "(emacs)Recognize Coding") Systems

(add-to-list 'file-coding-system-alist
             '("\\.owl\\'" utf-8 . utf-8))
             ;; and all the rest is utf-8:
             ;; '("" . utf-8)

;; In GNU Emacs, when you specify the coding explicitly in the file, that
;; overrides `file-coding-system-alist'. Not in XEmacs?

;; The variable `auto-coding-alist' is the strongest way to specify the
;; coding system for certain patterns of file names, or for files containing
;; certain patterns; this variable even overrides `-*-coding:-*-' tags in
;; the file itself.

;; default coding system (for new files),
;; also moved to the front of the priority list for automatic detection
(GNUEmacs
    (prefer-coding-system 'iso-latin-1))
    ;; or set environment variables like LC_CTYPE, LANG or LC_ALL


;;; ----[ 26.9 (info "(emacs)Specify Coding") System

;; ;; priority order for recognizing coding systems when reading files
;; (GNUEmacs
;;     (set-coding-priority (list 'coding-category-utf-8)))

(GNUEmacs
    ;; to copy and paste to and from Emacs through the clipboard
    (set-selection-coding-system 'iso-latin-1))
    ;; (set-selection-coding-system 'compound-text-with-extensions)


;;; ----[ 26.13 (info "(emacs)Single-Byte Character Support")

;; unify the Latin-N charsets, so that Emacs knows that the é in Latin-9
;; (with the euro) is the same as the é in Latin-1 (without the euro)
;; [avoid the small accentuated characters]
(when (try-require 'ucs-tables)
    (unify-8859-on-encoding-mode 1)  ;; harmless
    (unify-8859-on-decoding-mode 1)) ;; may unexpectedly change files if they
                                     ;; contain different Latin-N charsets
                                     ;; which should not be unified

;; (when window-system
;;   ;; functions for dealing with char tables
;;   (require 'disp-table))

;; (XEmacs
;;     (require 'iso-syntax))

(message "26 International Character Set Support... Done")

;;}}}

;;}}}


;;{{{ Advanced Features ####################################################

;;{{{ --[ 27 (info "(emacs)Major Modes") ]----------------------------------

(message "27 Major Modes...")

;;; ----[ 27.1 How Major Modes are Chosen

;; list of filename patterns
;; vs corresponding major mode functions

;;{{{ DTD mode

(autoload 'dtd-mode "tdtd" "Major mode for SGML and XML DTDs." t)
(autoload 'dtd-etags "tdtd"
  "Execute etags on FILESPEC and match on DTD-specific regular expressions."
  t)
(autoload 'dtd-grep "tdtd" "Grep for PATTERN in files matching FILESPEC." t)

;; Turn on font lock when in DTD mode
(add-hook 'dtd-mode-hooks 'turn-on-font-lock)

(setq auto-mode-alist
      (append
       (list
        '("\\.dcl$" . dtd-mode)
        '("\\.dec$" . dtd-mode)
        '("\\.dtd$" . dtd-mode)
        '("\\.ele$" . dtd-mode)
        '("\\.ent$" . dtd-mode)
        '("\\.mod$" . dtd-mode))
       auto-mode-alist))

;;}}}

(autoload 'html-helper-mode "html-helper-mode" "Yay HTML" t)

(autoload 'sql-mode "sql" nil)

;;{{{ css-mode

(autoload 'css-mode "css-mode")
(push '("\\.css\\'"                    . css-mode)           auto-mode-alist)

;;}}}

;; use the (add-to-list 'auto-mode-alist '("\\.F\\'" . f90-mode)) form?

(push '("\\.\\(diffs?\\|patch\\|rej\\)\\'" . diff-mode)      auto-mode-alist)
(push '("\\(\\.htm\\(l\\)?\\|.xsl\\)$" . html-helper-mode)   auto-mode-alist)
(push '(".*\\.txt$"                    . indented-text-mode) auto-mode-alist)
(push '("\\.tex$"                      . LaTeX-mode)         auto-mode-alist)
(push '("[mM]akefile"                  . makefile-mode)      auto-mode-alist)
(push '("\\.cgi$"                      . perl-mode)          auto-mode-alist)
(push '("\\.bash$"                     . shell-script-mode)  auto-mode-alist)
(push '("\\.sql$"                      . sql-mode)           auto-mode-alist)
(push '("\\.expect$"                   . tcl-mode)           auto-mode-alist)
(push '("\\.js$"                       . java-mode)          auto-mode-alist)

;; list of interpreters specified in the first line (starts with `#!')
;; vs corresponding major mode functions
(push '("expect"                       . tcl-mode)    interpreter-mode-alist)

(autoload 'ssh-config-mode "ssh-config-mode" t)
(add-to-list 'auto-mode-alist '(".ssh/config\\'"  . ssh-config-mode))
(add-to-list 'auto-mode-alist '("sshd?_config\\'" . ssh-config-mode))
(add-hook 'ssh-config-mode-hook 'turn-on-font-lock)

(autoload 'owl-mode "owl-mode" "OWL mode." t)
(push '("\\.owl$"                      . owl-mode)           auto-mode-alist)
;; (push (cons "\\.owl$" 'owl-mode) auto-mode-alist)

;; ;;
;; ;; MMM mode, multimode stuff  sdf
;; ;; Java - XML/JSP
;; ;;
;; (require 'mmm-auto)
;; (setq mmm-global-mode 'maybe)
;; (mmm-add-mode-ext-class nil "\\.xml?\\'" 'xml-java)
;; (mmm-add-mode-ext-class nil "\\.jsp\\'" 'java-html)
;; (mmm-add-classes
;;  '((xml-java
;;     :submode java-mode
;;     :front "<xsp:logic>"
;;     :back "</xsp:logic>")))
;; (mmm-add-classes
;;  '((java-html
;;     :submode java-mode
;;     :front "<%"
;;     :back "%>")))

;; load generic modes which support e.g. batch files
(try-require 'generic-x)

(message "27 Major Modes... Done")

;;}}}


;;{{{ --[ 28 (info "(emacs)Indentation") ]----------------------------------

(message "28 Indentation...")

;; indentation can't insert tabs
(setq-default indent-tabs-mode nil)

(message "28 Indentation... Done")

;;}}}


;;{{{ --[ 29 Commands for (info "(emacs)Text") Human Languages ]------------

(message "29 Commands for Human Languages...")

;;; ----[ 29.1 Words

;; GNU Emacs default for killing back to the beginning of a word
(XEmacs
    (global-set-key [(control backspace)] 'backward-kill-word))


;;; ----[ 29.5 Filling Text

;; try longlines.el

;; turn on my text setup
(add-hook 'text-mode-hook 'my-text-mode-setup)

(defun my-text-mode-setup ()
  "Turn on filling modes in text mode."
  (turn-on-auto-fill)

  ;; adaptative filling
  (when (try-require 'filladapt)
      (setq-default filladapt-mode nil)

      ;; turn on filladapt mode everywhere but in ChangeLog files
      (cond ((equal mode-name "Change Log")
             t)
            (t
             (turn-on-filladapt-mode)))))

;; string for filling to insert at front of new line
(setq fill-prefix "        ")

;; default value of `fill-column' for buffers that do not override it
(setq default-fill-column 76)

;; automatic line-wrapping beyond that column
(setq fill-column 76)

;; auto-refilling minor modes
(GNUEmacs
    ;; restrict refilling only when you insert characters, so
    ;; paragraphs will not get reformatted if the cursor moves over it
    (try-require 'refill))

(XEmacs
    ;; refill.el does not work with XEmacs
    (try-require 'maniac))


;;; ----[ 29.6 Case Conversion Commands

;; enable the use of the commands `downcase-region' and `upcase-region'
;; without confirmation
(put 'downcase-region 'disabled nil)
(put 'upcase-region 'disabled nil)


;;; ----[ 29.8 Outline Mode

;; bind the outline minor mode functions to an easy to remember prefix key
;; (more accessible than the horrible prefix C-c @)
(setq outline-minor-mode-prefix [(control o)])

;; bind the function `open-line' to M-o instead of C-o (by default)
(global-set-key [(meta o)] 'open-line)

;; outline mode commands for Emacs
(require 'outline)

;; makes other outline-minor-mode files feel like org files
(when (try-require 'outline-magic)
    (add-hook 'outline-minor-mode-hook
              (lambda ()
                (define-key outline-minor-mode-map
                  (kbd "<backtab>") 'outline-cycle)
                (define-key outline-minor-mode-map
                  [(meta left)] 'outline-promote)
                (define-key outline-minor-mode-map
                  [(meta right)] 'outline-demote)
                (define-key outline-minor-mode-map
                  [(meta up)] 'outline-move-subtree-up)
                (define-key outline-minor-mode-map
                  [(meta down)] 'outline-move-subtree-down))))

;;{{{ Folding Editing

(when (try-require 'folding)
    (folding-mode-add-find-file-hook))

(when (try-require 'fold-dwim)
    (global-set-key [(control c) (f) (t)] 'fold-dwim-toggle)
    (global-set-key [(control c) (f) (h)] 'fold-dwim-hide-all)
    (global-set-key [(control c) (f) (s)] 'fold-dwim-show-all))

;;}}}


;;; ----[ (info "(emacs-goodies-el)boxquote")

;; to quote text with a semi-box
(when (try-require 'boxquote)
    (global-set-key [(control c) (b) (r)] 'boxquote-region)
    (global-set-key [(control c) (b) (t)] 'boxquote-title))


;;; ----[ Chapter 21 - Annex

;; http://users.bigpond.net.au/sryoungs/XEmacs/init-files/latex-sy.html
;; = useful examples for XEmacs
;; Having a toolbar only makes sense if we're in a windowing environment.
(XEmacs
    (eval-and-compile
      (when (device-on-window-system-p)
        (try-require 'latex-toolbar))))

;; Take a look at Peter Gacs's macros for italic, ...

(defun my-LaTeX-insert-underscore ()
  "Inserts an underscore depending on the close context (tbd)
If needed a backslash is inserted before"
  (interactive)
  (insert "\\_"))

(defun my-LaTeX-mode-setup ()
  "Customize my LaTeX-mode."
  (local-set-key "_" 'my-LaTeX-insert-underscore))

(add-hook 'LaTeX-mode-hook 'my-LaTeX-mode-setup)


;;; ----{ Emacs latex mode
;; (Emacs built-in latex-mode, not related to AUCTeX)

;; Use a saner viewer.  Try xpdf, for example.  It won't reload
;; automatically, but a quick tap on the R key will force it to reload the
;; file.  No need to close & reopen.
;; (setq tex-dvi-view-command "xpdf")


;;; ----[ (info "(auctex)Top")

;; Note -- AUCTeX aliases tex-mode to TeX-mode

;; NB: invoking (la)tex-mode also runs text-mode-hook

;;{{{ 2 - (info "(auctex)Installation") of AUCTeX

;; (eval-after-load "latex"  ;; or "tex"?
;;   '(progn
;;      (add-to-list 'TeX-expand-list
;;                   '("%a"
;;                     (lambda nil
;;                       asy-command-location)) t)
;;      (add-to-list 'TeX-command-list
;;                   '("asy-LaTeX" "%l \"%(mode)\\input{%t}\" && %aasy ..."
;;                     TeX-run-interactive nil (latex-mode)
;;                     :help "Run LaTeX && Asymptote && LaTeX"))))

;; Press C-c C-c FILE <Return> <Return> to run dvips (Note that the command
;; is FILE and not Dvips as one might expect)
;; Press C-c C-c Print <Return> <Return> to run GSview (Also somewhat
;; misleading name)
;; If you want to print the document, do it from GSview.

    ;; list of commands to execute on the current document
    (setq TeX-command-list
          ;; to avoid the `! I can't find file `'.tex'' message, I had to
          ;; replace the single quotes ' by " (the cause is that I was using
          ;; a shell that does not understand single quotes)
          (list (list "2UpLF"
                      "dvips -t landscape -Php4000n %s -f | psnup -2 -r > %s-2up.ps"
                      'TeX-run-LaTeX nil t)
                (list "2UpF" "dvips -Php4000n %s -f | psnup -2  > %s-2up.ps"
                      'TeX-run-LaTeX nil t)
                (list "Z" "latex \"\\nonstopmode\\input{%s}\"& dvips %d -o %f"
                      'TeX-run-LaTeX nil t)
                (list "TeX" "tex \"\\nonstopmode\\input %t\""
                      'TeX-run-TeX nil t)
                (list "TeX Interactive" "tex \"%t\""
                      'TeX-run-interactive nil t)
                (list "LaTeX" "%l --src \"\\nonstopmode\\input{%t}\""
                      'TeX-run-LaTeX nil t)
                (list "Pdf" "pdflatex \"\\nonstopmode\\input{%s}\""
                      'TeX-run-LaTeX nil t)
                (list "LaTeX Interactive" "%l \"%t\""
                      'TeX-run-interactive nil t)
                (if (or window-system (getenv "DISPLAY"))
                    (list "View" "%v "
                          'TeX-run-background t nil)
                  (list "View" "dvi2tty -q -w 132 %s "
                        'TeX-run-command t nil))
                (list "Print" "%p "
                      'TeX-run-command t nil)
                (list "Queue" "%q"
                      'TeX-run-background nil nil)
                (list "File" "dvips %d -o %f "
                      'TeX-run-command t nil)
                (list "BibTeX" "bibtex \"%s\""  ;; Very Important Package
                                                ;; avec Reftex
                      'TeX-run-BibTeX nil nil)
                (list "Index" "makeindex \"%s\""
                      'TeX-run-command nil t)
                (list "Check" "lacheck %s"
                      'TeX-run-compile nil t)
                (list "Spell" "<ignored>"
                      'TeX-run-ispell nil nil)
                (list "Other" ""
                      'TeX-run-command t t)
                ;; Not part of standard TeX.
                (list "Makeinfo" "makeinfo %t"
                      'TeX-run-compile nil t)
                (list "AmSTeX" "amstex \"\\nonstopmode\\input %t\""
                      'TeX-run-TeX nil t)))

;;}}}

;;{{{ 5 - (info "(auctex)Advanced Features")

;;{{{ 5.2 (info "(auctex)Completion")

    ;; if this is non-nil when AUC TeX is loaded, the TeX escape character `\'
    ;; will be bound to `TeX-electric-macro'
    (setq TeX-electric-escape t)

;;}}}

;;{{{ 5.4 (info "(auctex)Indenting")

    ;; number of spaces to add to the indentation for each `\begin' not matched
    ;; by a `\end'
    (setq LaTeX-indent-level 4)

    ;; number of spaces to add to the indentation for `\item''s in list
    ;; environments
    (setq LaTeX-item-indent -4)

    ;; number of spaces to add to the indentation for each `{' not matched
    ;; by a `}'
    (setq TeX-brace-indent-level 4)

    ;; function to be called upon pressing `RET'
    ;; `return' indents the current line, then inserts a new line and moves
    ;; the cursor to an appropriate position by the left margin
    (setq TeX-newline-function 'newline-and-indent)

;;}}}

;;}}}

;;{{{ 7 - (info "(auctex)Running TeX and friends") Processors, Viewers and Other Programs

;;{{{ 7.1 Executing Commands

;; enable Tex-Pdf mode
(setq TeX-PDF-mode t)


;; (setq TeX-view-format "pdf")
;; ;--  (remove ".pdf" completion-ignored-extensions))
;; (setq pdf-previewer-program "texdoc")
;;   '(dired-view-command-alist (quote (("\\.\\(ps\\|ps_pages\\|eps\\)\\'" .
;;   "texdoc %s") ("\\.pdf\\'" . "texdoc %s") ("\\.\\(jpe?g\\|gif\\|png\\)\\'"
;;   . "xv %s") ("\\.dvi\\'" . "texdoc %s"))))

;; (setq latex-run-command "pdflatex")

;;}}}

;;{{{ 7.2 Viewing the formatted output

    ;; list of style options and view options
    (setq TeX-view-style '(("^epsf$" "ghostview %f")
                           ("^ncs$" "ghostview %f")
                           ("^a5$" "yap %d")
                           ("^landscape$" "yap %d")
                           ("." "yap %d")))

;;}}}

;;{{{ 7.3 Catching the errors

    ;; don't show output of TeX compilation in other window
    (setq TeX-show-compilation nil)

;;}}}

;;}}}

;;{{{ 8 - (info "(auctex)Multifile") Documents

    ;; AUC TeX will will assume the file is a master file itself
    (setq-default TeX-master t)

;;}}}

;;{{{ 9 - Automatic (info "(auctex)Parsing Files")

    ;; enable parse on load (if no style hook is found for the file)
    (setq TeX-parse-self t)

    ;; enable automatic save of parsed style information when saving
    ;; the buffer
    (setq TeX-auto-save t)

;;}}}

;;{{{ 11 - (info "(auctex)Automatic") Customization

;;{{{ 11.1 (info "(auctex)Automatic Global") Customization for the Site

    ;; (try-require 'tex-site) should not be used with current AUCTeX releases

    ;; directory containing automatically generated TeX information. Must end
    ;; with a slash
    (setq TeX-auto-global
          "~/.emacs.d/auctex-auto-generated-info/")

;;}}}

;;{{{ 11.3 (info "(auctex)Automatic Local") Customization for a Directory

    ;; directory containing automatically generated TeX information. Must end
    ;; with a slash
    (setq TeX-auto-local
          "~/.emacs.d/auctex-auto-generated-info/")

;;}}}

;;}}}

;; support for LaTeX documents
(try-require 'latex)

;; extra support for outline minor mode
(try-require 'out-xtra)


;;{{{ (info "(preview-latex)Top")

;; (add-hook 'LaTeX-mode-hook 'LaTeX-preview-setup)
;; (autoload 'LaTeX-preview-setup "preview")

;; how to call gs for conversion from EPS
(setq preview-gs-command "C:/Program Files/gs/gs8.54/bin/gswin32c.exe")
(my-file-executable-p preview-gs-command)

;;}}}


;;{{{ nuweb

;; define what's needed to properly call nuweb
(make-variable-buffer-local 'outline-prefix-char)
(make-variable-buffer-local 'outline-regexp)
(make-variable-buffer-local 'outline-level-function)

(setq AucTeX-used t)  ;; defined in major mode to edit nuweb files with AucTex
(setq nuweb-comment-leader "@%")

(autoload 'nuweb-mode "nuweb" nil t)

(add-hook 'nuweb-mode-hook 'nuweb-compute-d-u)
(add-hook 'nuweb-mode-hook
          '(lambda()
             (imenu-add-to-menubar "Nuweb")))

(push '("\\.w$" . nuweb-mode) auto-mode-alist)

(when (try-require 'nuweb)  ;; depends on TeX-lisp-directory
    (push (list "PWeb"
                "nuweb %s & pdflatex \"\\nonstopmode\\input{%s}\""
                'TeX-run-LaTeX nil t) TeX-command-list)
    (push (list "Web"
                "nuweb %s & latex --src \"\\nonstopmode\\input{%s}\""
                'TeX-run-LaTeX nil t) TeX-command-list)
    ;; Weave generates Tex output then runs LaTeX
    (push (list "Weave"
                "nuweb -o %s"
                'TeX-run-LaTeX nil t) TeX-command-list)
    ;; Tangle generates only the source file compile not done
    (push (list "Tangle"
                "nuweb -t %s & echo \"Sources updated\""
                'TeX-run-LaTeX nil t) TeX-command-list))

;;}}}

(message "29 Commands for Human Languages... Done")

;;}}}


;;; ----[ Chapter 17 - Annex

;; LaTeX fontification for Font Lock mode
(if window-system
    (when (try-require 'font-latex)
        (add-hook 'latex-mode-hook 'turn-on-font-lock 'append)
        (add-hook 'LaTeX-mode-hook 'turn-on-font-lock 'append)))
;;;;;;;; MUST BE AFTER LaTeX stuff to work, right now...


;;{{{ latex add-ons (reftex, ...)

;; get more appropriate values for MikTeX
;; (default configuration of AUCTeX is not the best fit for Windows systems)
(when running-ms-windows
    (try-require 'tex-mik))

(try-require 'reftex)

;; ;; reftex
;; (autoload 'reftex-mode     "reftex" "RefTeX Minor Mode" t)
;; (autoload 'turn-on-reftex  "reftex" "RefTeX Minor Mode" nil)
;; (autoload 'reftex-citation "reftex-cite" "Make citation" nil)
;; (autoload 'reftex-index-phrase-mode "reftex-index" "Phrase mode" t)
;; (add-hook 'LaTeX-mode-hook 'turn-on-reftex)   ; with AUCTeX LaTeX mode
;; (add-hook 'latex-mode-hook 'turn-on-reftex)   ; with Emacs latex mode
;; (setq reftex-plug-into-AUCTeX t)
;; ;  M-x customize-variable RET reftex-plug-into-AUCTeX RET

;;}}}


;;{{{ --[ 30 Editing (info "(emacs)Programs") ]-----------------------------

(message "30 Editing Programs...")

;;; ----[ 30.1 Major Modes for Programming Languages

(autoload 'awk-mode "cc-mode" "Awk editing mode." t)
;; or use a new AWK Mode for AWK files, rather than the older mode contained
;; in the file awk-mode.el [from http://people.smu.edu/zwang/awk-mode.html]??

;; (try-require 'graphviz-dot-mode)


;;; ----[ 30.3 Indentation for Programs

;; turn on auto-fill mode in Lisp modes
(add-hook 'lisp-mode-hook 'turn-on-auto-fill)
(add-hook 'emacs-lisp-mode-hook 'turn-on-auto-fill)

;; use one of several different indentation styles for C-like modes
(setq c-default-style
      '((awk-mode . "stroustrup")
        (other . "stroustrup")))

(defun my-c-mode-setup ()
  "Customize my c/c++-mode and awk-mode."
  ;; indent properly source and non-source buffers
  (local-set-key [(return)] 'newline-and-indent)  ; (control m)
  (local-set-key [(linefeed)] 'newline))          ; (control j)

(add-hook 'c-mode-hook 'my-c-mode-setup)
(add-hook 'c++-mode-hook 'my-c-mode-setup)
(add-hook 'awk-mode-hook 'my-c-mode-setup)

(defun back-to-indentation-or-beginning ()
  (interactive)
  (if (/= (point) (line-beginning-position))
      (beginning-of-line)
    (back-to-indentation)))


;;; ----[ 30.4 Commands for Editing with Parentheses

;; highlight matching parenthesis
(GNUEmacs
    (require 'paren)
    (show-paren-mode t)
    (setq show-paren-ring-bell-on-mismatch t))
(XEmacs
    (paren-set-mode 'paren))

;; if the matching paren is offscreen, show the matching line in the echo
;; area + many other useful things
(when window-system
  (when (try-require 'mic-paren)
      ;; activating
      (paren-activate)))

;; from hall@grumpy.nl.nuwc.navy.mil
;; goto-matching-paren


;;; ----[ 30.5 Manipulating Comment

(XEmacs
    (defun my-comment-region (beg end)
      "Comment a region of text"
      (interactive "r")
      (comment-region beg end)
      (global-set-key [(meta \;)] 'my-uncomment-region))

    (defun my-uncomment-region (beg end)
      "Uncomment a region of text"
      (interactive "r")
      (comment-region beg end -1)
      (global-set-key [(meta \;)] 'my-comment-region))

    (global-set-key [(meta \;)] 'my-comment-region))

(defun my-?comment-region ()
  (save-excursion
    (let ((r-b (region-beginning))
          (r-e (region-end)))
      (funcall
      (if (progn
            (goto-char r-b)
            (beginning-of-line)
            (looking-at (format "\\s-*%s" (regexp-quote comment-start))))
          (function uncomment-region)
        (function comment-region))
      r-b r-e))))

(defun my-?comment ()
  (interactive)
  (save-excursion
    (if mark-active
        (my-?comment-region)
          (funcall
           (if (progn
                 (beginning-of-line)
                 (looking-at (format "\\s-*%s" (regexp-quote comment-start))))
               (function uncomment-region)
             (function comment-region))
       (progn  (beginning-of-line) (point))
       (progn (end-of-line) (point))))))


;;; ----[ 30.8 Completion for Symbol Names

;; dynamic word-completion code
(load "completion")  ;; a.o., add completion-c-mode-hook
(initialize-completions)
;; (global-set-key [(control return)] 'complete)

;; > Does Emacs support keyword autocompletion like VI's
;; > Control+P ? If yes, what is the key combo?
;; > Would you perhaps be referring to M-/ , for certain modes (css-mode
;; > for instance there also is M-TAB which is a little more intelligent)

;; M-/ runs the command dabbrev-expand [dabbrev]
;; = cycling behavior

;; C-M-/ runs the command dabbrev-completion [dabbrev]
;; = completion buffer behavior

;; > I'm trying to have code completion in Emacs, but i don't know what to
;; > do. In eclipse, when we writing a java code line, for example:
;; > System.out., we do C^SPACE to show a window with several methods
;; > associated (printl, print,etc).
;; > I would like to have something similar in Emacs. Can anybody help me?
;; Try M-TAB with cursor on the symbol; is that what you are looking for?


;;; ----[ 30.9 Glasses

;; face to be put on capitals of an identifier looked through glasses
(setq glasses-face 'bold)

;; string to be displayed as a visual separator in unreadable identifiers
(setq glasses-separator "")


;;{{{ Collection of Emacs Development Environment Tools

;; ;; add Semantic Bovinator's directory to the load path
;; (my-add-to-load-path
;;  "D:/users/share/emacs/site-lisp/semantic-1.4.4/")

;; ;; add speedbar's directory to the load path
;; (my-add-to-load-path
;;  "D:/users/share/emacs/site-lisp/speedbar-0.14beta4/")

;; ;; add Enhanced Integration of Emacs Interpreted Objects' directory to the
;; ;; load path
;; (my-add-to-load-path
;;  "D:/users/share/emacs/site-lisp/eieio-0.17/")

;; ;; must be before the command that actually loads semantic
;; (setq semantic-load-turn-everything-on t)

;; (require 'semantic-load)


;; ;;!! Package speedbar does not define speedbar-version
;; ;; Source parsing/code browsing
;;;; (my-add-to-load-path "y:/site-lisp/cedet/")
;; (my-add-to-load-path "y:/site-lisp/cedet/common/")
;; (try-require 'cedet)
;; (GNUEmacs
;;     (semantic-load-enable-code-helpers))

;; (my-add-to-load-path "y:/site-lisp/ecb/")
(try-require 'ecb-autoloads)
;; (try-require 'ecb)

;; FROM DDW
;; ;;Source parsing/codebrowsing
;; (load-library "cedet/common/cedet.el")
;; (semantic-load-enable-code-helpers)
;; (push (concat site-lisp "/ecb-2.31") load-path)
;; (try-require 'ecb)


;; (custom-set-variables
;;  '(ecb-directories-menu-user-extension-function nil)
;;  '(ecb-history-menu-user-extension-function nil)
;;  '(ecb-methods-menu-user-extension-function nil)
;;  '(ecb-options-version "2.31")
;;  '(ecb-sources-menu-user-extension-function nil))

;; If you've installed CEDET and ECB, eassist is worth trying out:
;;     http://www.mail-archive.com/gnu-emacs-sources@gnu.org/msg00292.html
;;
;; It uses CEDET to provide a handy symbols browser for the current file, that
;; narrows down the list as you type substrings. Tastes differ, but I for one
;; really like this.

;;}}}

(message "30 Editing Programs... Done")

;;}}}


;;{{{ --[ 31 (info "(emacs)Building") Compiling and Testing Programs ]------

(message "31 Compiling and Testing Programs...")

;; >> It's possible to see, while we are programming, if we did a mistake. In
;; >> eclipse, when we do an error, for example, forget a ; , an underline
;; >> appears in the line indicating that something is wrong. It's possible to
;; >> have something like this in Emacs?
;; >
;; > There's a CWarn mode for C and C++, but I don't know about similar
;; > features for Java.  Anyone?

;; flymake can compile in the background and colorize lines with errors/warnings
;; http://flymake.sourceforge.net/
;; http://www.emacswiki.org/cgi-bin/wiki/JdeeFlymake


;;; ----[ 31.1 Running Compilations under Emacs

;; invoke a compiler with the same command as in the last invocation of
;; `compile'
(global-set-key [(f9)] 'recompile)

;; scroll the *compilation* buffer window as output appears
(setq compilation-scroll-output t)

;; compile the program including the current buffer
(setq compilation-window-height 4)

(defvar make-clean-command "make clean all"
  "*Command used by the `make-clean' function.")

(defun make-clean (&optional arg)
  "Run a make clean."
  (interactive "P")
  (require 'compile) ;; needed for compile-internal
  (if arg
      (setq make-clean-command (read-string "Command: " make-clean-command)))
  (save-some-buffers (not compilation-ask-about-save) nil)
  (compile-internal make-clean-command "No more errors"))

(global-set-key [(shift f9)] 'make-clean)


;;; ----[ 31.2 Searching with Grep under Emacs

;; ignore case distinctions in the default grep command
(setq grep-command "grep -n -i -e ")

;; grep+emacs 22 + cygwin does not follow file links
;; try adding "-nH" to your grep options.


;;; ----[ 31.3 Compilation Mode

;; display the next compiler error message
(global-set-key [(f10)] 'next-error)

;; display the previous compiler error message
(global-set-key [(shift f10)] 'previous-error)

;; display the first compiler error message
(global-set-key [(control f10)] 'first-error)

;; highlight and parse the whole compilation output as soon as it arrives
(setq compile-auto-highlight t)


;;; ----[ 31.5 Running Debuggers Under Emacs

;;{{{ Debugging Mercury programs

;; 1. Put these lines in your .emacs file:

;; (setq mercury-dir (getenv "MERCURY_DIR"))
;; (load-file (concat mercury-dir "/lib/mercury/elisp/gud.el"))
;; (setq mdb-command-name "bash.exe mdb ./mas_server.exe -c 
;; ../online/mas_server/mas_config_local.xml -d ../data"))

;; 2. To start the debugger, open a file in your build directory,
;;    e.g. build/Makefile

;; 3. Run M-x and then type mdb

;; 4. At the prompt you should see the command from the .emacs file:
;; "bash.exe mdb ./mas_server.exe -c 
;; ../online/mas_server/mas_config_local.xml -d ../data"

;; Change if necessary and hit the 'Return' key

;; 5. Find your bugs.

;; Known problems:
;;   - tab completion doesn't work

;;}}}

;;{{{ Debugging Lisp programs

;; Emacs has the basic debugger/stack trace, but it also has edebug, which
;; is very powerful, for the more complex situation.

;; You can cause the debugger to be called at a certain point in your
;; program by writing the expression `(debug)' at that point.  To do this,
;; visit the source file, insert the text `(debug)' at the proper place,
;; and type `C-M-x'.

;; `c'  Exit the debugger and continue execution
;; `d'  Continue execution, but enter the debugger the next time any Lisp
;;      function is called.

(define-key emacs-lisp-mode-map [(control x) (x)] 'edebug-eval-top-level-form)
(define-key emacs-lisp-mode-map [(control x) (x)] 'edebug-defun)

(autoload 'edebug-eval-top-level-form "edebug")

(setq edebug-global-prefix "\C-xX")

(add-hook 'cl-load-hook
          '(lambda ()
             (add-hook 'edebug-setup-hook
                       '(lambda ()
                          (load-library "cl-specs")))))

;; toggle whether to enter Lisp debugger when an error is signaled
;; (global-set-key [(super c) (d)] 'toggle-debug-on-error)

;;}}}


;;; ----[ 31.6 Executing Lisp Expressions

;; show function arglist or variable docstring in echo area
(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
(add-hook 'lisp-interaction-mode-hook 'turn-on-eldoc-mode)
(add-hook 'ielm-mode-hook 'turn-on-eldoc-mode)


;;; ----[ 31.8 Evaluating Emacs-Lisp Expressions

;; enable the use of the command `eval-expression' without confirmation
(put 'eval-expression 'disabled nil)


;;; ----[ 31.9 Lisp Interaction Buffers

;; to evaluate a non-interactive command, simply use IELM!

;; interaction mode for Emacs Lisp
(autoload 'ielm "ielm" "Start an inferior Emacs Lisp session" t)
;; !if `comint-min-history-size' is not initialised, IELM will fail!?
(setq comint-min-history-size 5)
(make-variable-buffer-local 'comint-min-history-size)


;;; ----[ 31.10 Running an External Lisp

;; Just as in C, C++, Java, Perl, Python, etc, Lisp code is kept in
;; files. All the normal editing operations are performed on files. In this
;; respect, hacking in Lisp is like hacking in any other language that you
;; are used to. What's different is that what you are hacking is a running
;; Lisp program. When you edit a function definition or add a new one, you
;; compile it into a running program. There is no compile, link, run, debug
;; cycle as you know it from C or Java.
;; Ponder that for a minute.
;; When you fix a bug in a C function, you have to recompile, relink, and
;; reload your program before you can test the fix. You don't do that in
;; Lisp. You make the fix and then go straight to testing it. This process
;; can be even faster than fixing a bug in a scripting language like Perl.

;; superior lisp inferior mode extension
(when (try-require 'slimeXXX)

    ;; indentation
    (slime-setup)

    (add-hook 'lisp-mode-hook
              '(lambda ()
                 (slime-mode t)))
    (add-hook 'inferior-lisp-mode-hook
              '(lambda ()
                 (inferior-slime-mode t)))

    ;; Gnu CLISP - Inferior Lisp Mode & ILISP (switches for ANSI & no banner)
    (defvar clisp-dir
      (if running-ms-windows
          "e:/vmware-home/bin/win32/clisp-2.31/full/"
        "/usr/bin"))

    (defvar clisp-exe
      (if running-ms-windows
          (concat clisp-dir "lisp.exe")
        (concat clisp-dir "/" "clisp")))

    ;; optionally, specify the lisp program you are using. Default is "lisp".
    ;; include the full linking set with `-K full'
    (setq inferior-lisp-program
          (if running-ms-windows
              (concat clisp-exe
                      " -B " clisp-dir
                      " -M " clisp-dir "lispinit.mem"
                      " -ansi -q")
            (concat clisp-exe
                    " -B " clisp-dir
                    " -ansi -q")))  ;; "clisp -K full"

    ;; connect automatically to my lisp when opening a lisp file
    (defun cliki:start-slime ()
      (unless (slime-connected-p)
        (save-excursion (slime))))
    (add-hook 'slime-mode-hook 'cliki:start-slime)

    ;; automatically show documentation for code near the point
    (add-hook 'slime-mode-hook
              (lambda ()
                (slime-autodoc-mode t)))

;;   ;; GNU CLISP - http://clisp.cons.org/
;;   (defun clisp-start ()
;;     (interactive)
;;     (shell-command (concat "c:/bin/clisp-2.32/full/lisp.exe "
;;                            "-B c:/bin/clisp-2.32/full/ "
;;                            "-M c:/bin/clisp-2.32/full/lispinit.mem "
;;                            "-i c:/usr/home/.slime.lisp "
;;                            "-ansi -q&"))))


; Functions and key bindings for getting Emacs to interact with GCL.
; Thomas R. Ioerger, Dept of Computer Science, Texas A&M University
; see http://www.cs.tamu.edu/faculty/ioerger/emacs-gcl.html for more details

(global-set-key "\C-t" (make-keymap))

(defun run-gcl ()
  (interactive)
  (split-window)
  (other-window 1)
  (inferior-lisp "gcl"))

(defun gcl-debug-quit ()
  (interactive)
  (comint-send-string "*inferior-lisp*" ":q\C-M"))

(defun gcl-quit ()
  (interactive)
  (comint-send-string "*inferior-lisp*" "(bye)\C-M"))

(defun gcl-eval-buffer ()
  (interactive)
  (set-mark 0)
  (end-of-buffer)
  (lisp-eval-region 1 (point))
  (exchange-point-and-mark))

(global-set-key "\C-tl" 'run-gcl)
(global-set-key "\C-te" 'lisp-eval-defun)
(global-set-key "\C-tw" 'switch-to-lisp) ; split screen!
(global-set-key "\C-tq" 'gcl-debug-quit)
(global-set-key "\C-tb" 'gcl-eval-buffer)
(global-set-key "\C-tx" 'gcl-quit)

; commands (after prefix of control-t)
; l = start lisp
; e = eval current expression
; w = switch to lisp buffer
; q = quit from debugger back to top-level
; b = eval buffer
; x = kill lisp process

)

(message "31 Compiling and Testing Programs... Done")

;;}}}


;;{{{ --[ 32 (info "(emacs)Maintaining") Programs ]-------------------------

(message "32 Maintaining Programs...")

;;; ----[ 32.1 Change Logs

;; don't make a new entry, when the last entry was made by you and on the
;; same date
(setq add-log-always-start-new-record nil)

;; adds the file's version number to the change log entry
(setq change-log-version-info-enabled t)


;;; ----[ 32.2 Tags Tables

;; find the definition of the Emacs Lisp function or variable near point
(GNUEmacs
    (find-function-setup-keys))


;;; ----[ 32.3 Merging Files with Emerge

;; merge file diffs under Emacs control
(try-require 'emerge)

(message "32 Maintaining Programs... Done")

;;}}}


;;{{{ --[ 33 (info "(emacs)Abbrevs") ]--------------------------------------

(message "33 Abbrevs...")

;;; ----[ 33.7 Customizing Dynamic Abbreviation

;; preserve case when expanding the abbreviation
(setq dabbrev-case-replace nil)

(message "33 Abbrevs... Done")

;;}}}


;;{{{ --[ 34 Editing (info "(emacs)Picture") ]------------------------------

(message "34 Editing Pictures...")

(message "34 Editing Pictures... Done")

;;}}}


;;{{{ --[ 35 (info "(emacs)Sending Mail") (with Gnus) ]---------------------

(message "35 Sending Mail...")

;; perform Caesar ciphers
(when (try-require 'rot13)
    (defvar rot13-translate-table
      (let ((str (make-string 127 0)) (i 0))
        (while (< i 127)
          (aset str i i) (setq i (1+ i)))
        (setq i 0)
        (while (< i 26)
          (aset str (+ i ?a) (+ (% (+ i 13) 26) ?a))
          (aset str (+ i ?A) (+ (% (+ i 13) 26) ?A))
          (setq i (1+ i))) str)
      "String table for rot 13 translation.")

    (defun rot13-string (string)
      "Return Rot13 encryption of STRING."
      (with-temp-buffer
        (insert string)
        (rot13-region (point-min) (point-max))
        (buffer-string)))

    (defun rot13-region (start end)
      "Rot13 encrypt the region between START and END in current buffer."
      (interactive "r")
      (translate-region start end rot13-translate-table))

    ;; full name of this user
    (setq user-full-name "Fabrice Niessen")

    ;; full mailing address of this user
    ;; (used in MAIL envelope FROM, and to select the default personality ID)
    (setq user-mail-address (rot13-string "sav@zvffvbapevgvpnyvg.pbz")))

(when (try-require 'gnus)

    ;; Gnus startup file name
    (setq gnus-init-file "~/.gnus")

    (global-set-key [(control f5)] 'gnus)

    (setq mail-user-agent 'gnus-user-agent)
    (XEmacs
        (setq toolbar-mail-reader 'gnus)))

;;{{{ rs-info

;; to insert such link: (info "(message)Insertion Variables")
(when (try-require 'rs-info)
    (autoload 'rs-info-insert-current-node "rs-info"
      "Insert reference to current Info node using STYPE in buffer." t nil)
    (autoload 'rs-info-boxquote "rs-info"
      "Yank text (from an info node), box it and use current info node as title."
      t nil)
    (autoload 'rs-info-reload "rs-info" "Reload current info node." t nil)
    (autoload 'rs-info-insert-node-for-variable "rs-info"
      "Insert a custom style info node for the top level form at point." t nil)
    (defalias 'boxquote-info 'rs-info-boxquote))

;;}}}

(message "35 Sending Mail... Done")

;;}}}


;;{{{ --[ 36 (info "(emacs)Rmail") Reading Mail (with Gnus) ]---------------

(message "36 Reading Mail with Gnus...")

(when (try-require 'gnus)

    ;; reading mail with Gnus
    (setq read-mail-command 'gnus))

(message "36 Reading Mail with Gnus... Done")

;;}}}


;;{{{ --[ 37 (info "(emacs)Dired"), the Directory Editor ]------------------

(message "37 Dired, the Directory Editor...")

;; directory-browsing commands
(require 'dired)

;; ;; switches passed to `ls' for dired
;; (setq dired-listing-switches "-alt --time-style=long-iso")

;; enable the use of the command `dired-find-alternate-file'
;; without confirmation
(put 'dired-find-alternate-file 'disabled nil)

;; recursive deletes allowed, after asking for each directory at top level
(setq dired-recursive-deletes 'top)

;; copy recursively without asking
(setq dired-recursive-copies 'always)

;;{{{ limit each dired buffer to 1 buffer instead of opening a million buffers

(defun dired-follow-file ()
  "In dired, visit the file or directory on this line.
 If a directory is on the current line, replace the current
 dired buffer with one containing the contents of the directory.
 Otherwise, invoke `dired-find-file' on the file."
  (interactive)
  (let ((filename (dired-get-filename)))
    ;; if the file is a directory, replace the buffer with the
    ;;  directory's contents
    (if (file-directory-p filename)
        (find-alternate-file filename)
      ;; otherwise simply perform a normal `dired-find-file'
      (dired-find-file))))

(add-hook 'dired-mode-hook
          '(lambda ()
             (local-set-key [(control m)] 'dired-follow-file)
             (local-set-key [(e)] 'dired-follow-file)
             (local-set-key [(f)] 'dired-follow-file)))

;;}}}

(add-hook 'dired-mode-hook
          '(lambda ()
             (try-require 'dired-x)
             (define-key dired-mode-map [(V)] 'cvs-examine)
             (turn-on-font-lock)))

(try-require 'dired-x)
;; C-x C-j runs the command dired-jump
;; Jump to dired buffer corresponding to current buffer.
;; If in a file, dired the current directory and move to file's line.
;; If in Dired already, pop up a level and goto old directory's line.


;; Subject: Re: Mouse selection in dired
;; > > just like <return> does in dired. Right now it opens a new window, so
;; > > I'm constantly doing a C-x-1 which gets old real fast.
;; > >
;; > > Is there a command I can add to my .emacs file for this?
;; >
;; > (add-hook 'dired-mode-hook
;; >              (lambda ()
;; >                (local-set-key [mouse-2] 'dired-advertised-find-file)))


;;; ----[ 37.15 Dired and `find'

;; search for files with names matching a wild card pattern and dired the
;; output
(global-set-key [(control c) ?1] 'find-name-dired)

;; search for files with contents matching a wild card pattern and dired the
;; output
(global-set-key [(control c) ?2] 'find-grep-dired)

;; run grep via find, with user-specified arguments
(global-set-key [(control c) ?3] 'grep-find)


;;; ----[ Add-Ons

;; dired stuff to open files a la Windows (from Howard Melman):
;; execute file using windows associations
(GNUEmacs (when running-ms-windows
   (defun dired-is-dir()
     (file-directory-p (dired-get-filename)))

   (defun dired-execute-file (&optional arg)
     (interactive "P")
     (mapcar #'(lambda (file)
                 (w32-shell-execute "open" (convert-standard-filename file)))
             (dired-get-marked-files nil arg)))

   (defun dired-mouse-execute-file (event)
     "In dired, execute the file or goto directory name you click on."
     (interactive "e")
     (set-buffer (window-buffer (posn-window (event-end event))))
     (goto-char (posn-point (event-end event)))
     (if (dired-is-dir)
         (dired-find-file)
       (dired-execute-file)))
   (global-set-key [?\C-x mouse-2] 'dired-mouse-execute-file)

   (defun hrm-dired-mode-hook ()
     "Hook run when entering dired-mode."
     (define-key dired-mode-map [(X)] 'dired-execute-file)
     (define-key dired-mode-map [M-down-mouse-1] 'dired-mouse-execute-file))

   (add-hook 'dired-mode-hook 'hrm-dired-mode-hook)))


;;{{{ dired-find-w3m

;; add a binding "w" -> `dired-find-w3m' to dired
(defun dired-find-w3m () (interactive)
  "In dired, visit (with find-w3m) the file named on this line."
  (w3m-find-file (file-name-sans-versions (dired-get-filename) t)))

(eval-after-load "dired"
  '(progn (define-key dired-mode-map "w" 'dired-find-w3m)))

;;}}}

;; On top of the traditional ways, there's also an add-on called Extview
;; which opens files using outside programs, such as XPDF, based on their
;; extension. It does this both from Dired and with `find-file'. One
;; advantage is that using the traditional ! switch with dired locks up
;; Emacs until you close the other program. Extview does not and leaves
;; Emacs free for continued used.

;; If you need to open a file in Emacs that has an extension that Extview
;; will open in another viewer, like HTML, you use `find-file-literally' to
;; open it in Emacs.
(try-require 'extview)

;;;;;;; problem with Emacs 22
;;;;;;;(try-require 'dired+)

;; sort directories first in any ordering
(when (try-require 'ls-lisp)
    (setq ls-lisp-dirs-first t))

;; emulate famos ms-dog file browser (norton commander)
(GNUEmacs
    (autoload 'nc "nc" "Emulate MS-DOG file shell" t))

;; See news "Opening html-File in Dired with w3m" for extra info

;;{{{ dircolors

;; provide the same facility of ls --color inside Emacs
(try-require 'dircolors)

;;}}}

;;{{{ (info "(emacs-goodies-el)wdired") - Rename files editing their names in dired buffers

;; wdired mode lets you treat a directory listing like a text file and edit
;; it at will. Great when you have a lot of filenames to modify (just
;; search-and-replace!)

;; It's great for renaming files in a directory, as it allows editing the
;; dired buffer using all the power of Emacs. That is, one can use keyboard
;; macros, search and replace, rectangle mode (great for adding prefixes to
;; file names), flip mode bits with the mouse,etc.

;; (when (try-require 'wdired)
;;     (autoload 'wdired-change-to-wdired-mode "wdired")
;;     (add-hook 'dired-load-hook
;;               '(lambda ()
;;                  (define-key dired-mode-map "r" 'wdired-change-to-wdired-mode)
;;                  (define-key dired-mode-map
;;                    [menu-bar immediate wdired-change-to-wdired-mode]
;;                    '("Edit File Names" . wdired-change-to-wdired-mode)))))

;;}}}

;; file-props.el --- Add tags to your files

(message "37 Dired, the Directory Editor... Done")

;;}}}


;;{{{ --[ 38 The (info "(emacs)Calendar/Diary") ]---------------------------

(message "38 The Calendar and the Diary...")

;;; ----[ 38.1 Movement in the Calendar

;; interpret the date 1/2/1990 as February 1, 1990
(setq european-calendar-style t)  ; before using any calendar or diary command

;; week in the calendar begins on Monday
(setq calendar-week-start-day 1)

;; mark all visible dates that have diary entries
(setq mark-diary-entries-in-calendar t)
;; (add-hook 'initial-calendar-window-hook 'mark-diary-entries)

;; marks the current date, by changing its face
(add-hook 'today-visible-calendar-hook 'calendar-mark-today)

;; fix foolish calendar-mode scrolling
(add-hook 'calendar-load-hook
          '(lambda ()
             (setq mark-holidays-in-calendar t)
             (define-key calendar-mode-map [(>)] 'scroll-calendar-left)
             (define-key calendar-mode-map [(<)] 'scroll-calendar-right)
             (define-key calendar-mode-map [(control x) (>)]
               'scroll-calendar-left)
             (define-key calendar-mode-map [(control x) (<)]
               'scroll-calendar-right)))

;; bind calendar to C-c c
(global-set-key [(control c) (c)] 'calendar)


;;; ----[ 38.6 Holidays

;; remove some holidays
(setq general-holidays nil)   ; get rid of too U.S.-centric holidays
(setq hebrew-holidays nil)    ; get rid of religious holidays
(setq islamic-holidays nil)   ; get rid of religious holidays
(setq oriental-holidays nil)

;; add Belgian holidays
(setq local-holidays
      '(
        (holiday-fixed 01 01 "New Year's Day")
        (holiday-fixed 02 14 "Valentine's Day")
        (holiday-fixed 04 01 "April Fools' Day")
        (holiday-fixed 05 01 "Labor Day")
        (holiday-fixed 07 21 "Independence Day")
        (holiday-fixed 08 15 "Assumption")
        (holiday-fixed 10 31 "Halloween")
        (holiday-fixed 11 01 "Toussaint")
        (holiday-fixed 11 11 "Armistice 1918")
        (holiday-fixed 12 25 "Christmas")

        ;; holidays with variable dates
        (holiday-float 5 0 2 "Mother's Day")
        (holiday-float 6 0 3 "Father's Day")))

;;        (easter-monday)

;; mark dates of holidays in the calendar
(setq mark-holidays-in-calendar t)


;;; ----[ 38.7 Times of Sunrise and Sunset

(setq calendar-latitude [50 88 north])
(setq calendar-longitude [4 71 east])
(setq calendar-location-name "Leuven, BE")

;; (setq calendar-latitude [43 41 north])
;; (setq calendar-longitude [6 81 east])
;; (setq calendar-location-name "Boulouris, FR")


;;; ----[ 38.10 The Diary

(when (try-require 'diary-lib)

    ;; copy the diary entries into a special buffer
    (add-hook 'diary-display-hook 'fancy-diary-display)

    ;; sort each day's diary entries by their time of day ???
    (add-hook 'diary-display-hook 'sort-diary-entries)
    (add-hook 'list-diary-entries-hook 'sort-diary-entries t)

    ;; allow #includes in ~/diary
    (add-hook 'list-diary-entries-hook 'include-other-diary-files)

    ;; desk calendar style extensions to Emacs' Calendar/Diary
    (when (try-require 'cal-desk-calendar)
        (add-hook 'diary-display-hook 'fancy-schedule-display-desk-calendar t))

    ;; generate the diary window for 4 days starting with the current date
    (diary 4)

    ;; snarf MS Outlook appointments into Emacs diary
    (try-require 'diary-outlook)  ;; DOES NOT WORK?

    ;; How do you arrange the entries of diary? Can they be automatically
    ;; arranged according to date and not just according to when they were
    ;; entered into the diary?
)

;;; ----[ 38.11 Appointments

;; enable appointment notification, several minutes beforehand
(add-hook 'diary-hook 'appt-make-list)


;;; ----[ 38.14 Summing Time Intervals

;; if you want to log your daily schedules for review, you need schedule.el
;; and timeclock.el to record your daily works

;; timeclock.el
(when (try-require 'timeclock)

    (setq timeclock-file "~/.timeclock/default.log")

    (global-set-key [(control x) (t) (i)] 'timeclock-in)
    (global-set-key [(control x) (t) (o)] 'timeclock-out)
    (global-set-key [(control x) (t) (c)] 'timeclock-change)

    (if (try-require 'timeclock-x)
        (progn
          ;; bind interactive timeclock functions to a "C-x t-" prefix
          (timeclock-setup-keys)

          ;; ask if the user wants to clock out before exiting Emacs
          (add-hook 'kill-emacs-query-functions 'timeclock-query-out)

          ;; ask the user if they wish to clock in
          (timeclock-query-in))

      ;; clock in, recording the current time moment in the timelog
      (timeclock-in))

    ;; display of the amount of time left today in the mode line
    (timeclock-modeline-display 1))


;; Tracker.  This mode keeps a list of projects and associated billing
;; entity. A single project can be selected and it will be marked in a file
;; as active until a new command is made to stop it. A project is
;; automatically terminated when Emacs exits. If somehow this fails, the
;; tracking data file is touched at regular intervals, so the next time the
;; tracker is started if there is an open project a reasonable guess can be
;; made as to when to mark it as closed. Each session can have multiple
;; comments associated with it, in which you can mark accomplishments or
;; whatever. It will generate informal daily summary reports and a report of
;; total hours for a particular billee.


;;; ----[ Add-Ons

;; Getting Things Done

;;{{{ (info "(org)Top") Mode

;; After all the configuration has been done, you can easily manage your
;; daily work and tasks with org-mode.
;; Press `C-c a a' to jump you to this week's task page from anywhere.

;; Use "M-x planner-create-task-from-buffer" to link buffers to your daily
;; planner files. Soon you'll find that your daily work files are
;; conveniently linked together in daily tasks. Just use it to improve your
;; efficiency.

;; Comme planner, org-mode peut s'intégrer/interfacer avec d'autres
;; modes comme bbdb, remember, gnus, vm, calendar, diary et planner
;;
;; Le gros avantage par rapport à planner ? Il fait parti depuis
;; quelques temps déjà de la distribution standard GNU Emacs (pas
;; besoin donc de l'installer à part). Son second point fort est la
;; facilité d'utilisation. C'est vraiment très simple à prendre en
;; main et la documentation permet de vite s'y retrouver en cas de
;; pépin.
;;
;; Une des raisons de la complexité de Planner provient du fait que planner
;; est étroitement associé à emacs-wiki, et que emacs-wiki a basculé vers
;; muse.

(when (try-require 'org)
    (add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
    (define-key global-map [(control c) (l)] 'org-store-link)
    (define-key global-map [(control c) (a)] 'org-agenda)

;;{{{ 2 (info "(org)Document Structure")

    ;; don't switch to OVERVIEW at startup
    (setq org-startup-folded nil)

;;}}}

;;{{{ 5 (info "(org)Hyperlinks")

    ;; directory with org files (used by the hooks for remember.el)
    (setq org-directory "~/Notes/")

    ;; remember
    (when (try-require 'remember)
        (define-key global-map [(control c) (r)] 'remember)
        (setq org-default-notes-file "~/Notes/Remember.org")
        (autoload 'org-remember-annotation "org")
        (autoload 'org-remember-handler "org")
        (setq remember-annotation-functions '(org-remember-annotation))
        (setq remember-handler-functions '(org-remember-handler)))

;;}}}

;;{{{ 6 (info "(org)Timestamps")

    ;; insert a special time stamp each time a TODO entry is marked done
    (setq org-log-done t)

;;}}}

;;{{{ 7 Timeline and (info "(org)Agenda Views")

    ;; set which files to search for TODOs and scheduled items
    ;; (avoiding hidden files)
    (setq org-agenda-files (directory-files "~/Notes" t "^[^\\.].*\\.org$"))

    ;; include entries from the Emacs diary into Org-mode's agenda
    (setq org-agenda-include-diary t)

    ;; generate the agenda buffer for this week
    (org-agenda-list)
    (delete-other-windows))

;;}}}

;; timeclock integration for the Emacs OrgMode
(when (try-require 'org-timeclock)
    (global-set-key [(shift f4)] 'org-timeclock-in)
    (global-set-key [(shift f5)] 'org-timeclock-out))

;; open my work org file
(defun my-open-org-work ()
  "Opening ~/Notes/Work.org"
  (interactive)
  (find-file "~/Notes/Work.org"))
(global-set-key [(shift f2)] 'my-open-org-work)

;; open my home org file
(defun my-open-org-home ()
  "Opening ~/Notes/Home.org"
  (interactive)
  (find-file "~/Notes/Home.org"))
(global-set-key [(control f2)] 'my-open-org-home)

;;}}}

;;{{{ Muse

;; http://www.xshi.org/notes/WebPage.html

(when (try-require 'muse)        ; load generic module
    (try-require 'muse-mode)     ; load authoring mode

    (try-require 'muse-html)     ; load (X)HTML publishing style
    (try-require 'muse-latex)    ; load LaTeX/PDF publishing styles
    (try-require 'muse-texinfo)  ; load Info publishing style
    (try-require 'muse-docbook)  ; load DocBook publishing style

    ;; initialize
    (try-require 'outline)       ; I like outline-style faces

    (try-require 'muse-colors)   ; load coloring/font-lock module
    (try-require 'muse-blosxom)  ; load blosxom module
    (try-require 'muse-wiki)     ; load Wiki support
    (try-require 'muse-xml)      ; load XML support

    ;; listing of all directories that should be published with muse
    ;; (customize your directory, head and foot files, etc.)
    (setq muse-project-alist
          `(
            ("Home"
             ("~/Personal/website/source/front/" :default "index")
             (:base "xhtml"
              :path "~/Personal/website/public_html/"
 ;;             :header "~/Personal/website/source/front/header.html"
              :footer "~/Personal/website/source/front/footer.html"))
            )))

(setq base-dir "")
(setq server "www.mygooglest.com")

(defun muse-xhtml-menu (items)
;; was using menu, menuhead, menubody and menuitem div classes
  (concat "<ul id=\"menu\">Website sections"
          (mapconcat (function (lambda (x) (concat "<li>\n"
                                                   (cadr (cdr x))
                                                   "<a href=\"http://"
                                                   server
                                                   (cadr x)
                                                   "\">\n"
                                                   (car x)
                                                   "</a>"
                                                   "</li>")))
                     items
                     "\n"
                     )
          "</ul>"))

(setq muse-project-menu-list
      `(("Home"          ,(concat base-dir "/blog/index.html") "")
        ("Projects"      ,(concat base-dir "/projects/index.html") "")
        ("Personal Wiki" ,(concat base-dir "/wiki/index.html") "")
        ("Private"       ,(concat base-dir "/tools/private.html") "")
        ("Contact me"    ,(concat base-dir "/blog/contact") "")))

(defun muse-publish-content ()
  (let ((depths (muse-publishing-directive "contentdepth")))
    (when depths
      (let ((depth (string-to-number depths)))
        (when (not (eq depth 0))
          (insert "<td class='contents'><div class='contenthead'>
                  Table of contents</div><div class='contentbody'>")
          (set (make-local-variable 'muse-publish-generate-contents)
               (cons (copy-marker (point) t) depth))
          (forward-char)
          (insert "</div></td>"))))))

(setq muse-xhtml-header  ;; was xhtml
"
<lisp>muse-xhtml-doctype</lisp>

<html xmlns=\"http://www.w3.org/1999/xhtml\">

  <lisp>muse-xhtml-head</lisp>

  <body>
    <div id=\"header\">
      <h1>
        <lisp>muse-xhtml-headline</lisp>
      </h1>
    </div>
    <table id=\"body\"><tr>
      <td id=\"left\">
        <lisp>(muse-xhtml-menu muse-project-menu-list)</lisp>
      </td>
      <td id=\"content\">
        <table class=\"headline\">
        <tr class=\"headline\">
          <td class=\"leftheadline\">
            <div class=\"info\">
              <div class=\"title\">
                <lisp>(muse-publishing-directive \"title\")</lisp>
              </div>
              <div class=\"lastchange\">
                Last changed: <lisp>(muse-publishing-directive \"lastchange\")</lisp>
              </div>
              <div class=\"about\">
                <strong>Content:</strong><br /><hr />
                <lisp>(muse-publishing-directive \"about\")</lisp>
              </div>
              <div class=\"backto\">&nbsp;
                <lisp>(muse-publish-backto \"backlink\" base-dir)</lisp>
              </div>
            </div>
          </td>
          <lisp>(muse-publish-content)</lisp>
       </tr>
     </table>
    <!-- Page -->\n
")

(setq muse-xhtml-doctype
"<?xml version=\"1.0 encoding=\"<lisp>(muse-html-encoding)</lisp> \"?>

<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">")

(setq muse-html-style-sheet
      (concat "<link rel=\"stylesheet\" type=\"text/css\" charset=\"utf-8\" media=\"all\" href=\""
              base-dir
              "css/common.css\"/>"))

(setq muse-xhtml-head
" <head>

    <title><lisp>(muse-publishing-directive \"title\")</lisp></title>

    <meta name=\"generator\" content=\"muse.el\" />

    <meta http-equiv=\"<lisp>muse-html-meta-http-equiv</lisp>\"
          content=\"<lisp>muse-html-meta-content-type</lisp>\" />

    <lisp>
      (let ((maintainer (muse-style-element :maintainer)))
        (when maintainer
          (concat \"<link rev=\\\"made\\\" href=\\\"\" maintainer \"\\\" />\")))
    </lisp>

    <lisp>muse-html-style-sheet</lisp>

  </head>")

(defun muse-publish-backto (class base-dir)
  (let ((backto  (muse-publishing-directive "backto")))
    (when backto
      (let ((primary (split-string backto ","))
            backlink)
        (dolist
            (secondary primary backlink)
          (setq tmp (split-string secondary "|"))
          (setq backlink
                (concat backlink (concat "<div class='"
                                         class
                                         "'><img src='"
                                         base-dir
                                         "/base/images/list_item.gif' /> Back to <a href="
                                         (pop tmp)
                                         ".html>"
                                         (pop tmp)
                                         "</a></div>"))))
        backlink))))

(setq muse-xhtml-headline "Fabrice Niessen")

;;}}}

(message "38 The Calendar and the Diary... Done")

;;}}}


;;{{{ --[ 39 (info "(emacs)Gnus") ]-----------------------------------------

(message "39 Gnus...")

;;; ----[ Insidious (info "(bbdb)Top")

(when (try-require 'bbdb)

    ;; avoid BBDB getting confused by 8 bit characters
    (add-to-list 'file-coding-system-alist
                 '("\\.bbdb\\'" iso-latin-9 . iso-latin-9))

    ;; since BBDB 2.35
    (setq bbdb-file-coding-system 'iso-latin-9)

;;{{{ (info "(bbdb)Installation")

    ;; enable the various package-specific BBDB functions
    (bbdb-initialize 'gnus 'message)

    ;; add bindings for the default keys to Gnus and configure Gnus to
    ;; notify the BBDB when new messages are loaded (required if the BBDB is
    ;; to be able to display BBDB entries for messages displayed in Gnus)
    (add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)

    ;; add a binding for M-TAB to Message mode
    ;; this will enable completion of addresses based on BBDB records
    (add-hook 'gnus-startup-hook 'bbdb-insinuate-message)

    ;; customizable completion in message headers
    ;; (to avoid conflict between flyspell and BBDB)
    (try-require 'message-x)

;;}}}

;;{{{ (info "(bbdb)Interfaces")

    ;; mail aliases (local mailing lists)
    (add-hook 'message-setup-hook 'bbdb-define-all-aliases)

    ;; always use full name when sending mail
    ;; (even if User Name has an address of the form <user.name@somedomain>)
    (setq bbdb-dwim-net-address-allow-redundancy t)

    ;; no popup on auto-complete
    (setq bbdb-completion-display-record nil)

    ;; completion is done across the set of all full-names and user-ids
    (setq bbdb-completion-type nil)

;;}}}

;;{{{ (info "(bbdb)Reader-specific Features")

    ;; marking posters with records in the BBDB
    (setq bbdb/gnus-summary-mark-known-posters t)

    ;; mark authors in the Summary Buffer who have records in the BBDB
    (setq bbdb/gnus-summary-known-poster-mark "B")

    ;; display the poster's name from the BBDB if we have one
    (setq bbdb/gnus-summary-prefer-real-names t)

    ;; replace the information provided in the From header with data from
    ;; the BBDB if we have one
    (setq bbdb/gnus-summary-prefer-bbdb-data t)

(setq bbdb/gnus-summary-show-bbdb-names t)

;;}}}

;;{{{ (info "(bbdb)Options")Options

    ;; name of the file which contains your personal database
    (setq bbdb-file "~/.bbdb")

    ;; no default area code to use when prompting for a new phone number
    (setq bbdb-default-area-code nil)

    ;; default country to use if none is specified
    (setq bbdb-default-country "")

    ;; disable syntax-checking of telephone numbers
    (setq bbdb-north-american-phone-numbers-p nil)

    ;; restoration of the window configuration
    (setq bbdb-electric-p t)

    ;; ;; to add the author of a mail or posting to the BBDB, hit `:'
    ;; (setq bbdb/mail-auto-create-p t)

    ;; don't display a continuously-updating BBDB window while in GNUS
    ;; (setq bbdb-use-pop-up nil)

    ;; desired number of lines in a GNUS pop-up BBDB window
    (setq bbdb-pop-up-target-lines 1)

    ;; default display layout
    (setq bbdb-display-layout 'multi-line)

    ;; default display layout pop-up BBDB buffers
    (setq bbdb-pop-up-display-layout 'one-line)

    ;; omit creation-date and timestamp from BBDB display
    (setq bbdb-display-layout-alist
          '((one-line          (order     . (phones notes))
                               (name-end  . 24)
                               (toggle    . t)
                               (omit      . (net AKA mail-alias gnus-private
                                             creation-date timestamp)))
            (multi-line        (indention . 14)
                               (toggle    . t)
                               (omit      . (AKA creation-date timestamp)))
            (pop-up-multi-line (indention . 14))))

    ;; allow cycling of email addresses while completing them
    (setq bbdb-complete-name-allow-cycling t)

    ;; save the database without asking (any time it would ask)
    (setq bbdb-offer-save 'auto)

    ;; automatically add some text to the notes field of the BBDB record
    (add-hook 'bbdb-notice-hook 'bbdb-auto-notes-hook)

    ;; capture auto-notes
    (setq bbdb-auto-notes-alist
          ;; organization
          `(("Organization" (".*" Organization 0))

            ;; mailer
            ("User-Agent" (".*" mailer 0 t))  ;; t = overwrite
            ("X-Mailer" (".*" mailer 0 t))
            ("X-Newsreader" (".*" mailer 0 t))

            ;; X-Face bitmaps of the people
            ("x-face" ,(list (concat "[ \t\n]*\\([^ \t\n]*\\)"
                                     "\\([ \t\n]+\\([^ \t\n]+\\)\\)?"
                                     "\\([ \t\n]+\\([^ \t\n]+\\)\\)?"
                                     "\\([ \t\n]+\\([^ \t\n]+\\)\\)?")
                             'face
                             "\\1\\3\\5\\7"))))

;;}}}

;;{{{ (info "(bbdb)Utilities")

    ;; search the bbdb
    (global-set-key [(control f11)] 'bbdb)

    ;; search the bbdb by regexp
    (when (try-require 'bbdb-query)
        (global-set-key [(control f11)] 'bbdb-query))

    ;; use BBDB to store PGP preferences
    (when (try-require 'bbdb-pgp)
        ;; what to do if the recipient is not in the BBDB
        (setq bbdb/pgp-default-action nil)))

;;}}}

(message "39 Gnus... Done")

;;}}}


;;{{{ --[ 40 Running (info "(emacs)Shell") Commands from Emacs ]------------

(message "40 Running Shell Commands from Emacs...")

;; >  I was wondering if it is possible to run a bash shell inside an Emacs
;; > buffer (where the up and down keys recall commands executed
;; > in .bash_history and do not move the cursor around -- the problem with the
;; > native shell available in Emacs, tab results in command completion, etc.).

;; (term "/bin/bash") does this.

;; If you do `M-x term' /bin/bash is offered as the default as well.

;; You're debugging bash code? I normally use mode-compile.el for
;; this. Basically, it runs bash with lots of debug output.


;; See w32-settings.el for more!

;; M-s             comint-next-matching-input
;; M-r             comint-previous-matching-input
;; M-n             comint-next-input
;; M-p             comint-previous-input
;; C-up            last command

;; coding system to use for a process I/O operation (end-of-line handling)
(setq process-coding-system-alist
      (cons '("bash" . (raw-text-dos . raw-text-unix))
            process-coding-system-alist))
;; (setq process-coding-system-alist '(("bash" . undecided-unix))) ???

;; quote process arguments to ensure correct parsing on Windows
(setq w32-quote-process-args t)   ;; if needed, set it to `?\"'

;; for single shell commands
(setq shell-file-name "bash")  ;; must be in the PATH

;; use `shell-file-name' as the default shell
(setenv "SHELL" shell-file-name)

;; name of shell used to parse TeX commands
(GNUEmacs
    (setq TeX-shell shell-file-name))
(XEmacs
    ;; for the preview-latex package
    (setq TeX-shell "C:/Program Files/Emacs/emacs/bin/cmdproxy.exe"))

;; switch used to have the shell execute its command line argument
;; ("/c" does not work with XEmacs)
(setq shell-command-switch "-c")

;; shell argument indicating that next argument is the command
(setq TeX-shell-command-option shell-command-switch)

;; for the interactive (sub)shell
(setq explicit-shell-file-name shell-file-name)

;; regexp to match prompts in the inferior shell
(setq shell-prompt-pattern (concat "^" (system-name) " [^ ]+ \\[[0-9]+\\] "))

;; general command interpreter in a window stuff
(when (require 'comint)

    ;; don't add input matching the last on the input ring
    (setq-default comint-input-ignoredups t)

    ;; input to interpreter causes (only) the selected window to scroll
    (setq-default comint-scroll-to-bottom-on-input "this")

    ;; output to interpreter causes (only) the selected window to scroll
    (setq-default comint-scroll-to-bottom-on-output "this")

    ;; show the maximum output when the window is scrolled
    (setq-default comint-scroll-show-maximum-output t)

    ;; ignore short commands as well as duplicates
    (setq-default comint-input-filter
                  (function
                   (lambda (str)
                     (and (not (string-match "\\`\\s *\\'" str))
                          (> (length str) comint-min-history-size)))))

    ;; functions to call after output is inserted into the buffer
    (setq-default comint-output-filter-functions
                  '(comint-postoutput-scroll-to-bottom))
                  ;; go to the end of buffer

    ;; get rid of the control-M characters
    (add-hook 'comint-output-filter-functions 'comint-strip-ctrl-m)

    ;; prompt in the minibuffer for password and send without echoing
    ;; (for example, with `su' command)
    (add-hook 'comint-output-filter-functions 'comint-watch-for-password-prompt))

;; translate ANSI escape sequences into faces
(GNUEmacs
    (autoload 'ansi-color-for-comint-mode-on "ansi-color" nil t)
    (add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on))

;; buffer-specific colors
;; seems incompatible with the escape codes translation
(XEmacs
    (add-hook 'shell-mode-hook
              '(lambda () (interactive)
                 (set-face-background 'default "black" (current-buffer))
                 (set-face-foreground 'default "green" (current-buffer)))))

;; run a telnet session from within an Emacs buffer
(when (try-require 'telnet)

    ;; program to run to open a telnet connection
    ;; simple public domain telnet client for Windows console (from Igor
    ;; Milavec)
    (setq telnet-program
          (if running-ms-windows
              (concat other-site-lisp-directory "../bin/telnet.exe")
            "/usr/bin/telnet"))

    ;; open a network login connection to a host
    (defun telnet (host)
      "Open a network login connection to host named HOST (a string).
    Communication with HOST is recorded in a buffer `*telnet-HOST*'.
    Normally input is edited in Emacs and sent a line at a time."
      (interactive "sOpen telnet connection to host: ")
      (let* ((comint-delimiter-argument-list '(?\  ?\t))
             (name (concat "telnet-" (comint-arguments host 0 nil) ))
             (buffer (get-buffer (concat "*" name "*")))
             process)
        (cond ((string-equal system-type "windows-nt")
               (setq telnet-new-line "\n")))
        (if (and buffer (get-buffer-process buffer))
            (pop-to-buffer (concat "*" name "*"))
          (pop-to-buffer (make-comint name telnet-program nil host))
          (setq process (get-buffer-process (current-buffer)))
          (set-process-filter process 'telnet-initial-filter)
          (accept-process-output process)
          (telnet-mode)
          (setq comint-input-sender 'telnet-simple-send)
          (setq telnet-count telnet-initial-count)))))

;; run an inferior shell, with I/O through buffer *shell*
(global-set-key [(control !)] 'shell)
(when (try-require 'multishell)
    (global-set-key [(control !)] 'multishell))

(when (try-require 'cygwin-mount)
    (cygwin-mount-activate))

(message "40 Running Shell Commands from Emacs... Done")

;;}}}


;;{{{ --[ 41 Using (info "(emacs)Emacs Server")  ]--------------------------

(message "41 Using Emacs as a Server...")

;; use Emacs as a server
;; on GNU/Linux, you should use server-start/emacsclient
;; Emacsclient is now as well available under EmacsW32
(server-start)


;; This is a shell function I use to manually start an edit server.
;; It has to be run only once, and survives between logins.
;;
;;    function startxemacs {
;;     (cd ~/    #put nohup.out file in home directory
;;      nohup /usr/local/bin/xemacs -l ~/.semacs \
;;         -unmapped -g 100x30+60+60 \
;;         -T "GNUserver" 2>/dev/null &)
;;    }
;;
;; The above uses a special init file, ~/.semacs, which starts up the
;; gnuserv process.  It looks like this,
;;
;;   ;; for GNU Emacs only
;;   (unless (featurep 'xemacs)
;;     (setq gnuserv-frame (current-frame)))
;;
;;   (gnuserv-start)  ;Start up the gnu edit server process
;;
;;   ;;  disallow exiting from a command  (menu option only)
;;   (defun do-exit ()
;;     "Exits Emacs or an Emacs client"
;;       (interactive)
;;       (if   (gnuserv-running-p)
;;       (if (eq gnuserv-clients nil) (delete-frame) (gnuserv-edit))))
;;
;;   (define-key ctl-x-map "\C-c" 'do-exit)
;;
;;   ;; end of file
;;
;; There are of course times when the edit server is *not* what you
;; want to run.  You can run (X)Emacs as a non server process too.
;; I keep two of those running all the time on my workstation.  One
;; essentially works as a "notepad" that I have open all the time;
;; it is "sticky" and shows up in any virtual desktop that I move
;; to.  The other is full screen in one desktop, and run /gnus/ for
;; Usenet an email.  (It has so many buffers open that I want to
;; keep it entirely separate from the edit server.)
;;
;; Floyd L. Davidson            <http://www.apaflo.com/floyd_davidson>


;; To associate file types with Emacs, go back to the File Types window
;; and edit a suitable association. Under Actions, put:
;;    gnuclientw.exe "%1"

;; Look at GNU_SECURE

;; > I'd like to be able to reconnect to the running Emacs process and have
;; > it display on my X server at home.  Is this possible?
;;
;; In the X11 forwarded ssh shell:
;;
;; $ emacsclient -e "(make-frame-on-display \"$DISPLAY\")"
;;
;; Of course you should have started the Emacs server with (server-start)

(message "41 Using Emacs as a Server... Done")

;;}}}


;;{{{ --[ 42 (info "(emacs)Hardcopy") Output ]------------------------------

(message "42 Hardcopy Output...")

;; print Emacs buffer on line printer
;; for {lpr,print}-{buffer,region}
(when (try-require 'lpr)

    ;; name of program for printing a file
    (setq lpr-command "enscript")

    ;; list of strings to pass as extra options for the printer program
    (setq lpr-switches (list "--font=Courier8"
                             "--header-font=Courier10"
                             (format "--header=%s" (buffer-name))))

    ;; name of a printer to which data is sent for printing
    (setq printer-name
          (if running-ms-windows
              "//NETFINITY/C510_APS"
            t)))

(message "42 Hardcopy Output... Done")

;;}}}


;;{{{ --[ 43 (info "(emacs)PostScript") Hardcopy ]--------------------------

(message "43 PostScript Hardcopy...")

;; print text from the buffer as PostScript
(when (try-require 'ps-print)

    (let ((gsprint-program "C:/Program Files/Ghostgum/gsview/gsprint.exe"))
      (my-file-executable-p gsprint-program)

      (if (and gsprint-program
               (file-executable-p gsprint-program))
          (progn
            ;; name of a local printer for printing PostScript files
            ;; adjusted to run Ghostscript
            (setq ps-printer-name t)

            ;; name of program for printing a PostScript file
            ;; tell Emacs where ghostscript print utility is located
            (setq ps-lpr-command gsprint-program)

            ;; list of extra switches to pass to `ps-lpr-command'
            ;; tell Ghostscript to query which printer to use
            (setq ps-lpr-switches '("-query")))

        (progn
          (setq ps-printer-name "//NETFINITY/LexmarkC510")
          (setq ps-lpr-command "")
          (setq ps-lpr-switches '("raw"))))

    ;; size of paper to format for
    (setq ps-paper-type 'a4)

    ;; print in portrait mode
    (setq ps-landscape-mode nil)

    ;; number of columns
    (setq ps-number-of-columns 1)))

;; generate and print a PostScript image of the buffer
(GNUEmacs
    (when running-ms-windows
      (w32-register-hot-key [snapshot]) ; override `Print Screen' globally used
                                        ; as a hotkey by Windows
      (global-set-key [(snapshot)] 'ps-print-buffer-with-faces)))
(XEmacs
    (setq toolbar-print-function 'ps-print-buffer-with-faces))

(global-set-key [(meta p)] 'ps-print-buffer-with-faces)

;; ???
(add-hook 'Info-mode-hook 'ps-info-mode-hook)

(message "43 PostScript Hardcopy... Done")

;;}}}


;;{{{ --[ 44 (info "(emacs)PostScript Variables") for Hardcopy  ]-----------

(message "44 Variables for PostScript Hardcopy...")

(message "44 Variables for PostScript Hardcopy... Done")

;;}}}


;;{{{ --[ 45 (info "(emacs)Sorting") Text ]---------------------------------

(message "45 Sorting Text...")

;; key binding
(global-set-key [(meta \#)] 'sort-lines)

(message "45 Sorting Text... Done")

;;}}}


;;{{{ --[ 46 (info "(emacs)Narrowing") ]------------------------------------

(message "46 Narrowing...")

;; enable the use of the command `narrow-to-region' without confirmation
(put 'narrow-to-region 'disabled nil)

(message "46 Narrowing... Done")

;;}}}


;;{{{ --[ 47 (info "(emacs)Two-Column") Editing ]---------------------------

(message "47 Two-Column Editing...")

(message "47 Two-Column Editing... Done")

;;}}}


;;{{{ --[ 48 (info "(emacs)Editing Binary Files") ]-------------------------

(message "48 Editing Binary Files...")

(message "48 Editing Binary Files... Done")

;;}}}


;;{{{ --[ 49 (info "(emacs)Saving Emacs Sessions") ]------------------------

(message "49 Saving Emacs Sessions...")

(message "49 Saving Emacs Sessions... Done")

;;}}}


;;{{{ --[ 50 (info "(emacs)Recursive Edit")ing Levels ]---------------------

(message "50 Recursive Editing Levels...")

(message "50 Recursive Editing Levels... Done")

;;}}}


;;{{{ --[ 51 (info "(emacs)Emulation") ]------------------------------------

(message "51 Emulation...")

(message "51 Emulation... Done")

;;}}}


;;{{{ --[ 52 (info "(emacs)Hyperlinking") and Navigation Features ]---------

(message "52 Hyperlinking and Navigation Features...")

;; I use an excellent package called webjump to store my bookmarks. It
;; also has provisions for generating search strings for the search sites
;; as well.

;;{{{ HTML Tidy

(autoload 'tidy-buffer "tidy" "Run Tidy HTML parser on current buffer" t)
(autoload 'tidy-parse-config-file "tidy" "Parse the `tidy-config-file'" t)
(autoload 'tidy-save-settings "tidy" "Save settings to `tidy-config-file'" t)
(autoload 'tidy-build-menu  "tidy" "Install an options menu for HTML Tidy." t)
;; For other modes (like html-helper-mode) simple change the variables
;; `html-mode-hook' and `html-mode-map' to whatever is appropriate e.g.

(defun my-html-helper-mode-setup ()
  "Customize my html-helper-mode."
  (tidy-build-menu html-helper-mode-map)
  (local-set-key [(control c) (control c)] 'tidy-buffer)
  (setq sgml-validate-command "tidy"))

(add-hook 'html-helper-mode-hook 'my-html-helper-mode-setup)

;;}}}

;;{{{ pass a URL to a WWW browser

;; display the current buffer in the default Windows WWW browser
(require 'browse-url)
(autoload 'browse-url-at-mouse "browse-url")

;; default browser started when you click on some URL in the buffer
(if window-system
    (if running-ms-windows
        (setq browse-url-browser-function 'browse-url-default-windows-browser)
      (setq browse-url-browser-function 'browse-url-generic
            browse-url-generic-program (executable-find "firefox")))
  (setq browse-url-browser-function 'w3m-browse-url))

;; (setq browse-url-browser-function
;;       '(("file:///usr/share/doc/hyperspec/" . w3m-browse-url)
;;         ("emacswiki.org" . w3m-browse-url)
;;         ("lispdoc.com" . w3m-browse-url)
;;         ( "." . browse-url-firefox)))
;; that let me use w3m for emacswiki/common lisp documentation and
;; Firefox otherwise.

;;}}}

;;{{{ w3m

;; w3m is a terrific text-based web and file browser
;; (for win32, use the Cygwin version of the executable)
(setq w3m-command (executable-find "w3m"))
;; (my-file-executable-p w3m-command)
;; SHOULD trap when w3m-command is nil
(when (and w3m-command
           (file-executable-p w3m-command))
(when (try-require 'w3mXXX)

    ;; proxy settings
    (when (string= (upcase (system-name)) "PC3701")
      (eval-after-load "w3m"
        '(setq w3m-command-arguments
               (nconc w3m-command-arguments
                      '("-o" "http_proxy=http://msprx001p.be.winterthur.com:8080/"))))
      (setq w3m-no-proxy-domains '("local.com" "sysdoc")))

;;{{{ General Variables

    ;; never send referrers
    (setq w3m-add-referer nil)

    ;; home page
    (setq w3m-home-page "http://www.mygooglest.com/")

    ;;
    (setq w3m-horizontal-shift-columns 1)  ; 2

;;}}}

;;{{{ Image Variables

    ;; always display images
    (setq w3m-default-display-inline-images t)

    ;;
    (setq w3m-use-favicon nil)

;;}}}

;;{{{ Cookie Variables

    ;; ask user whether accept bad cookies or not
    (setq w3m-cookie-accept-bad-cookies 'ask)

    ;; list of trusted domains
    (setq w3m-cookie-accept-domains
          '("google.com" "google.be"
            "yahoo.com" ".yahoo.com" "groups.yahoo.com"
            "www.dyndns.org"))

    ;; enable cookies
    (setq w3m-use-cookies t)

;;}}}

;;{{{ Other Variables

    ;;
    (setq w3m-tab-width 8)  ; 16

    (defun w3m-new-tab ()
      (interactive)
      (w3m-copy-buffer nil nil nil t))

    ;; fix inappropriate key bindings
    (define-key w3m-mode-map [(up)] 'previous-line)
    (define-key w3m-mode-map [(down)] 'next-line)
    (define-key w3m-mode-map [(left)] 'backward-char)
    (define-key w3m-mode-map [(right)] 'forward-char)
    (define-key w3m-mode-map [(shift left)] 'w3m-shift-right)
    (define-key w3m-mode-map [(shift right)] 'w3m-shift-left)

    (define-key w3m-mode-map [(tab)] 'w3m-next-anchor)
    (define-key w3m-mode-map [(shift tab)] 'w3m-previous-anchor)

    (define-key w3m-mode-map [(g)] 'w3m-goto-url)
    (define-key w3m-mode-map [(i)] 'w3m-toggle-inline-image)
    (define-key w3m-mode-map [(I)] 'w3m-toggle-inline-images)
    (define-key w3m-mode-map [(n)] 'w3m-next-anchor)
    (define-key w3m-mode-map [(control t)] 'w3m-new-tab)

    ;; Mozilla-like navigation
    (define-key w3m-mode-map [(meta right)] 'w3m-view-this-url)
    (define-key w3m-mode-map [(meta left)]  'w3m-view-previous-page)
    (define-key w3m-mode-map [(control return)] 'w3m-view-this-url-new-session)

    ;; add key bindings
    (global-set-key [(control c) (w) (w)] 'w3m)
    (global-set-key [(control c) (w) (s)] 'w3m-search)))

;;}}}

;;}}}

;;{{{ Web search

(when (and (try-require 'browse-url) t)
;;           (try-require 'url))

;;{{{ from Glenn Morris

    (defvar my-google-maxlen 50
      "Maximum string length of search term.")

    (defvar my-google-url "www.google.com"
      "Base URL for Google search.")

    (defvar my-google-groups-url "groups.google.com"
      "Base URL for groups Google search.")

    (defun my-google-search-region (prefix start end)
      "Create a search URL and send it to the web browser.
    With prefix argument, use groups URL."
      (interactive "P\nr")
      (if (> (- end start) my-google-maxlen)
          (message "Search string too long!")
        (let ((query (buffer-substring-no-properties start end)))
          (browse-url
           (concat "http://"
                   (if prefix (concat my-google-groups-url "/groups")
                     (concat my-google-url "/search"))
                   "?q=" (url-hexify-string query))))))

    (defvar my-url-maxlen 100
      "Maximum length of string to send to browser as URL.")

    ;; `find-file-at-point' does this, essentially.
    (defun my-url-at-point (start end)
      "Send the highlighted URL to the web browser."
      (interactive "r")
      (if (> (- end start) my-url-maxlen)
          (message "URL too long!")
        (browse-url (buffer-substring-no-properties start end))))

;; (require 'url)
;;
;; (defvar google-search-maxlen 50
;;   "Maximum string length of search term.  This prevents you from accidentally 
;; sending a five megabyte query string to Netscape.")
;;
;; (defun google-it (search-string)
;;   "Search for SEARCH-STRING on google."
;;   (interactive "sSearch for: ")
;;   (browse-url (concat "http://www.google.com/search?client=xemacs&q="
;; 		      (url-hexify-string
;; 		       (encode-coding-string search-string 'utf-8)))))
;;
;; (defun google-search-selection ()
;;   "Create a Google search URL and send it to your web browser."
;;   (interactive)
;;   (let (start end term url)
;;     (if (or (not (fboundp 'region-exists-p)) (region-exists-p))
;;         (progn
;;           (setq start (region-beginning)
;;                 end   (region-end))
;;           (if (> (- start end) google-search-maxlen)
;;               (setq term (buffer-substring start (+ start google-search-maxlen)))
;;             (setq term (buffer-substring start end)))
;;           (google-it term))
;;       (beep)
;;       (message "Region not active"))))

;;}}}

    (global-set-key [(meta s)] 'my-google-search-region)

    (defun my-google-search ()
      "Prompt for a query in the minibuffer, launch the web browser and query
    Google."
      (interactive)
      (let ((query (read-from-minibuffer "Google Search: ")))
        (browse-url (concat "http://" my-google-url "/search?q="
                            (url-hexify-string query)))))

    (defun my-google-search-word-at-point ()
      "Google the word at point."
      (interactive)
      (browse-url (concat "http://" my-google-url "/search?q="
                          (word-at-point))))

    (defun my-google-search-file (file)
      "Use google to search for a file named FILE."
      (interactive "sSearch for file: ")
      (w3m-browse-url
       (concat "http://" my-google-url "/search?q="
               (w3m-url-encode-string
                (concat "+intitle:\"index+of\" "
                        "-inurl:htm -inurl:html -inurl:php "
                        file)))))

    (defvar my-google-prefix-map (make-sparse-keymap)
      "Keymap for my Google commands.")

    (global-set-key [(control c) (g)] my-google-prefix-map)
    (define-key my-google-prefix-map "g" 'my-google-search)
    (define-key my-google-prefix-map (kbd "RET") 'my-google-search)
    (define-key my-google-prefix-map "w" 'my-google-search-word-at-point)
    (define-key my-google-prefix-map "r" 'my-google-search-region)
    (define-key my-google-prefix-map "u" 'my-url-at-point))

;;}}}


;;{{{ Del.icio.us

(when (try-require 'delicious)
    (setq delicious-api-user "fni")
    (setq delicious-api-password "default")
    (setq delicious-api-from user-mail-address)

;;     (setq delicious-api-host "msprx001p.be.winterthur.com")
;;     (setq delicious-api-port "8080")

    (delicious-api-register-auth))

;;}}}


;;{{{ Babel

;;;;;;; Use SysTran (only nearly functional translation service)...
;;; relies on w3...
(autoload 'babel "babel"
  "Use a web translation service to translate the message MSG." t)
(autoload 'babel-region "babel"
  "Use a web translation service to translate the current region." t)
(autoload 'babel-as-string "babel"
  "Use a web translation service to translate MSG, returning a string." t)
(autoload 'babel-buffer "babel"
  "Use a web translation service to translate the current buffer." t)
(setq babel-preferred-to-language "English")

;;}}}


;;{{{ AccuWeather

(when (try-require 'http-get)
    (when (try-require 'htmlr)

      ;; from http://www.emacswiki.org/cgi-bin/wiki/RainOrShine
      (defun accuweather-sentinel (proc string)
        (switch-to-buffer (process-buffer proc))
        (goto-char (point-min))
        ;; dirty parsing....
        (search-forward "<!-- content table 3 --->")
        (search-forward "</tr>")
        (let ((inhibit-read-only t)
              (start (point))
              (end  (search-forward " <!-- Right Nav -->")))
          (kill-region end (point-max))
          (kill-region (point-min) start)
          (goto-char (point-min))
          (htmlr-render)
          (goto-char (point-min))))

      (defun accuweather (city region country)
        "use wwwa.accuweather.com http-get.el and htmlr.el to display weather
    city is a city name i.e. ATHENS, PARIS....
     REGION is one of:
      AF;AFRICA AS;ASIA AU;AUSTRALIA CA;CANADA CL;CENTRAL AMERICA & CARIBBEAN
      EU;EUROPE AW;MIDDLE EAST NA;NORTH AMERICA SA;SOUTH AMERICA
    COUNTRY is a two letter code : GR greece FR france...."

        (http-get
         (format
          "http://www.accuweather.com/adcbin/public/intlocal_index.asp?wxcity2=%s&wxcountry=%s;%s"
          city
          region
          country)
         nil 'accuweather-sentinel 1.0
         (concat "Weather in: " city)))

      (defun my-weather-in-brussels nil
        (interactive)
        (accuweather "BRUSSELS" "EU" "BX"))

      (defun my-weather-in-frejus nil
        (interactive)
        (accuweather "FREJUS" "EU" "FR"))))

;;}}}

;;{{{ (info "(emacs-goodies-el)htmlize")

;; HTML-ize font-lock buffers
(when (try-require 'htmlize)
    (global-set-key [(meta P)] 'htmlize-buffer))

;;}}}


;; ;; automatically update web copy
;; (write-region
;;  (point-min) (point-max)
;;  "/scorpios@ftp.scorpioscotedazur.com:/public_html/emacs/mydotemacs.el")


;;{{{ FFAP

;; find file (or URL) at point
(when (try-require 'ffap)

    ;; don't use default key bindings, as I want some of them to be defined
    ;; differently (C-x C-r, for example)

    ;; visit a file
    (global-set-key [(f3)] 'find-file-at-point))

;;}}}

(message "52 Hyperlinking and Navigation Features... Done")

;;}}}


;;{{{ --[ 53 Dissociated Press ]-------------------------------------------

(message "53 Dissociated Press...")

(message "53 Dissociated Press... Done")

;;}}}


;;{{{ --[ 54 Other Amusements ]--------------------------------------------

(message "54 Other Amusements...")

(message "54 Other Amusements... Done")

;;}}}


;;{{{ --[ 55 (info "(emacs)Customization") ]--------------------------------

(message "55 Customization...")

;; inhibit the initial startup message in *scratch* buffer
(setq inhibit-startup-message t)
(XEmacs
    (setq initial-scratch-message nil))

;; speed up things by preventing garbage collections
(setq gc-cons-threshold (* 50 1024 1024))


;;; ----[ 55.3 Variables

;; file local variables specifications are obeyed, without query - RISKY!!
(setq enable-local-variables t)

;; obey `eval' variables - RISKY!!
(setq enable-local-eval t)

;; record safe values for some local variables
(setq safe-local-variable-values
      '((TeX-master . t)
        (balloon-help-mode . -1)
        (nuweb-auto-index-scrap)
        (nuweb-source-mode . "mercury")
        (nuweb-source-mode . "sql")))


;;; ----[ 55.4 Customizing Key Bindings

;; the keys C-c LETTER are reserved for user functions

;; print the key bindings in a tabular form
;; [from http://www-xray.ast.cam.ac.uk/~gmorris/dotemacs.html]
(defun my-keytable (arg)
  "Print the key bindings in a tabular form."
  (interactive "sEnter a modifier string:")
  (with-output-to-temp-buffer "*Key table*"
    (let* ((i 0)
           (keys (list "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
                       "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
                       "<return>" "<down>" "<up>" "<right>" "<left>"
                       "<home>" "<end>" "<f1>" "<f2>" "<f3>" "<f4>" "<f5>"
                       "<f6>" "<f7>" "<f8>" "<f9>" "<f10>" "<f11>" "<f12>"
                       "1" "2" "3" "4" "5" "6" "7" "8" "9" "0"
                       "`" "~" "!" "@" "#" "$" "%" "^" "&" "*" "(" ")" "-" "_"
                       "=" "+" "\\" "|" "{" "[" "]" "}" ";" "'" ":" "\""
                       "<" ">" "," "." "/" "?"))
           (n (length keys))
           (modifiers (list "" "C-" "M-" "S-" "M-C-" "S-C-")))
      (or (string= arg "") (setq modifiers (list arg)))
      (setq k (length modifiers))
      (princ (format " %-10.10s |" "Key"))
      (let ((j 0))
        (while (< j k)
          (princ (format " %-31.31s |" (nth j modifiers)))
          (setq j (1+ j))))
      (princ "\n")
      (princ (format "_%-10.10s_|" "__________"))
      (let ((j 0))
        (while (< j k)
          (princ (format "_%-31.31s_|"
                         "_______________________________"))
          (setq j (1+ j))))
      (princ "\n")
      (while (< i n)
        (princ (format " %-10.10s |" (nth i keys)))
        (let ((j 0))
          (while (< j k)
            (let* ((binding
                    (key-binding (read-kbd-macro (concat (nth j modifiers)
                                                         (nth i keys)))))
                   (binding-string "_"))
              (when binding
                (if (eq binding 'self-insert-command)
                    (setq binding-string (concat "'" (nth i keys) "'"))
                  (setq binding-string (format "%s" binding))))
              (setq binding-string
                    (substring binding-string 0 (min (length
                                                      binding-string) 31)))
              (princ (format " %-31.31s |" binding-string))
              (setq j (1+ j)))))
        (princ "\n")
        (setq i (1+ i)))
      (princ (format "_%-10.10s_|" "__________"))
      (let ((j 0))
        (while (< j k)
          (princ (format "_%-31.31s_|"
                         "_______________________________"))
          (setq j (1+ j))))))
  (delete-window)
  (hscroll-mode)
  (setq truncate-lines t))              ; for Emacs 21


;;; ----[ 55.6 The Syntax Table

;; lorsque j'essaye de ispeller des mots avec accents, il semble
;; carrément ignorer les accents par ex un ispell sur éléphant
;; essaye de me corriger `phant', il vire le élé (en fait mon ex
;; est mal choisi il ne vire que les é, il n'essaye pas de
;; corriger une lettre seule - le l en l'occurence).
;;
;; ce qui compte ici c'est la syntax-case des caractères concernés. Pour
;; ton Emacs ils ne sont pas word-constituent; ça doit poser d'autres
;; problèmes avec les commandes de déplacement orienté mot (`M-f'), les
;; commandes d'expansion des abbrevs etc.

;; fix completion syntax for `text-mode-syntax-table'
(defun my-change-word-constituent ()
  (map nil
       (function
        (lambda (char)
          (modify-syntax-entry char "w" text-mode-syntax-table)))
;;        (modify-syntax-entry char "_" cmpl-standard-syntax-table)))
       ;; include accented characters in completion syntax
       "áéíóúàèìòùâêîôûäëïöüñåç"))

(my-change-word-constituent)

;; now '-' is not considered a word-delimiter
;; (add-hook 'emacs-lisp-mode-hook
;;           '(lambda ()
;;              (modify-syntax-entry ?- "w")))

;;; ----[ 55.X Disabling

;; To get a list of all the disabled functions:
;; M-: (let(lst)(mapatoms(lambda(x)(if(get x 'disabled)(push x lst))))lst) RET

(message "55 Customization... Done")

;;}}}


;;{{{ --[ App G Emacs and (info "(emacs)MS-DOS") ]---------------------------

(message "Appendix G Emacs and MS-DOS...")

;; numeric keypad (needed in XEmacs for Windows)
(XEmacs
    ;; keys to the right of the regular keyboard
    (define-key key-translation-map [kp-divide]     [?/])
    (define-key key-translation-map [kp-multiply]   [?*])
    (define-key key-translation-map [kp-subtract]   [?-])
    (define-key key-translation-map [kp-add]        [?+])
    (define-key key-translation-map [kp-enter]     [?\r])
    (define-key key-translation-map [kp-decimal]    [?.])

    ;; keys with digits
    (define-key key-translation-map [kp-0]          [?0])
    (define-key key-translation-map [kp-1]          [?1])
    (define-key key-translation-map [kp-2]          [?2])
    (define-key key-translation-map [kp-3]          [?3])
    (define-key key-translation-map [kp-4]          [?4])
    (define-key key-translation-map [kp-5]          [?5])
    (define-key key-translation-map [kp-6]          [?6])
    (define-key key-translation-map [kp-7]          [?7])
    (define-key key-translation-map [kp-8]          [?8])
    (define-key key-translation-map [kp-9]          [?9])

    ;; additional keypad duplicates of keys ordinarily found elsewhere
    (define-key key-translation-map [kp-left]     [left])
    (define-key key-translation-map [kp-right]   [right])
    (define-key key-translation-map [kp-up]         [up])
    (define-key key-translation-map [kp-down]     [down])
    (define-key key-translation-map [kp-begin]   [begin])
    (define-key key-translation-map [kp-home]     [home])
    (define-key key-translation-map [kp-end]       [end])
    (define-key key-translation-map [kp-next]     [next])
    (define-key key-translation-map [kp-prior]   [prior])
    (define-key key-translation-map [kp-insert] [insert])
    (define-key key-translation-map [kp-delete] [delete]))

;; divide key (needed in GNU Emacs for Windows)
(GNUEmacs
    (global-set-key (kbd "<kp-divide>") (kbd "/")))

(message "Appendix G Emacs and MS-DOS... Done")

;;}}}


;;{{{ --[ Emacs Display ]---------------------------------------------------

;;; ----[ Faces

;; avoid Emacs hanging for a while changing default font
(modify-frame-parameters nil '((wait-for-wm . nil)))

;; set default color theme
(when (try-require 'color-theme)
    (if (fboundp 'color-theme-initialize)
        (color-theme-initialize))
    (setq color-theme-is-global t)
    (when (try-require 'color-theme-fni)
       (color-theme-fni)))

;; allow any scalable font
(when running-ms-windows
    (setq scalable-fonts-allowed t))

;; set default font family and font size
(assq-delete-all 'font default-frame-alist)
(defvar my-default-font
  ;; To check if some font is available in Emacs do following:
  ;;    1.   Switch to `*scratch*' buffer.
  ;;    2.   Type `(prin1-to-string (x-list-fonts "font-you-want-to-check or
  ;;         pattern"))'.
  ;;    3.   Place the cursor after the last closing paren and hit
  ;;         `C-j'. List of the names of available fonts matching given
  ;;         pattern will appear in the current buffer (`*scratch*').
  ;;    4.   For listing of all available fonts, use
  ;;         `(prin1-to-string (x-list-fonts "*"))'.
  ;; Format: "-maker-family-weight-slant-widthtype-style...
  ;;         ...-pixels-height-horiz-vert-spacing-width-charset"
  (if running-ms-windows
      "-*-Courier New-*-*-*-*-12-90-*-*-*-*-*-*"
      ;; (insert (format "\n%S" (w32-select-font))) followed by C-x C-e
      ;; returns the current font string

;;     "-monotype-courier new-semilight-r-*-*-12-90-*-*-m-*-*-*"
    "-Misc-Fixed-Medium-R-SemiCondensed-*-13-*-*-*-*-*-*-*"
))
    ;; this face supports bold (in Gnus) while
    ;; "-misc-*-*-*-*-*-12-90-*-*-*-*-*-*" does not!!

    ;; use xfontsel utility to try out different fonts. After choosing
    ;; font click select button in xfontsel window. This will copy font
    ;; name you choose to copy & paste buffer.
    ;; ne pas oublier de faire un xrdb -merge derrière pour valider la
    ;; modif...

(add-to-list 'default-frame-alist (cons 'font my-default-font))
;; Note that I replaced some of the fields in the font name with asterisks.
;; This is because the font spec lists both a point size and a pixel height for
;; the font -- this combination will be particular to the resolution settings
;; of your monitor.  If you just use one (the 90 in the example above means 9.0
;; points), and leave the other settings with *, that will make your setting
;; work better across different monitor settings.
;; [http://mail.gnu.org/archive/html/help-emacs-windows/2002-07/msg00102.html]

(XEmacs
    (setq options-save-faces t))
    ;; You can also change the font size within XEmacs (options/size). Be
    ;; sure to put (setq options-save-faces t) in your .emacs then.

;; convenience functions for face customization
(try-require 'face-list)


;;; ----[ Display Tables

;; display page delimiter ^L as a horizontal line
(or standard-display-table (setq standard-display-table (make-display-table)))
(aset standard-display-table ?\f (vconcat (make-vector 78 ?-) "^L"))

;;}}}

;;}}}


;;{{{ Recovery from Problems ###############################################

;;{{{ --[ 56 Quitting and Aborting ]----------------------------------------

(message "56 Quitting and Aborting...")

(message "56 Quitting and Aborting... Done")

;;}}}

;;}}}


;;{{{ --[ Debugging ]-------------------------------------------------------

;; ;; get the resulting backtrace when bugs such as `Wrong type argument' occur
;; (setq debug-on-error nil)  ; was set to `t' at beginning of buffer

;; warn that some packages were missing
(if missing-packages-list
    (progn (message "Packages not found: %S"
                    (nreverse missing-packages-list))))

;;}}}

(autoload 'say-minor-mode "festival" "Menu for using Festival." t)
(say-minor-mode t)
(setq auto-mode-alist 
      (append '(("\\.festivalrc$" . scheme-mode)) auto-mode-alist))

(setq festival-program-name "/usr/bin/festival")

;; insert version info into `*scratch*' buffer
(set-buffer "*scratch*")
(insert (concat "This is " (emacs-version) "."))



(message "}}}\n")

;; This is for the sake of Emacs.
;; Local Variables:
;; coding: iso-latin-9
;; End:

;;; .emacs ends here

[-- Attachment #3: .gnus-sva --]
[-- Type: application/octet-stream, Size: 6015 bytes --]

;;; .gnus --- my Gnus Init File

;; Time-stamp: "Tue 2007-01-30 11:04 sva on mundaneum"
;; $Revision: 742 $
;; $Date: 2007-01-25 10:16:36 +0100 (Thu, 25 Jan 2007) $

;;; Code:

(message "{{{ --[ Loading my Gnus init file ]--")


;;{{{ --[ Loading ]---------------------------------------------------------

(defvar my-gnus-root-dir "~/"
  "The root directory for my Gnus stuff.")

;; substitute environment variables, if any, in the directory name
(setq my-gnus-root-dir
      (substitute-in-file-name my-gnus-root-dir))

;; list of packages that `try-require' can't find
(setq missing-packages-list nil)

;;}}}


;;{{{ --[ 1 (info "(gnus)Starting Up") Gnus ]-------------------------------

(message "1 Starting Gnus...")

;;{{{ ----[ 1.1 (info "(gnus)Finding the News")

;; using Gnus for news
(setq gnus-select-method
      (cond (t
             '(nntp "easynet" (nntp-address "news.easynet.be")))))

;; .netrc-like file that holds nntp authinfo passwords
(setq nntp-authinfo-file "~/.authinfo-news")

;; using Gnus for mail (with the one-file-one-message back-end)
(setq gnus-secondary-select-methods `(
      (nnimap ""
              (nnimap-address
               ,(cond (t
                       "81.188.7.133")))

              ;; authorization information (user account and password)
              (nnimap-authinfo-file "~/.authinfo"))

      (nnslashdot "")))

;;}}}

;; do not prompt the user for his mail address
(setq query-user-mail-address nil)


;;{{{ ----[ 1.5 (info "(gnus)New Groups")

;; don't save the list of killed groups
;; WARNING as Gnus has no record of which groups are new and which are old,
;; the automatic new newsgroups subscription methods becomes meaningless
(setq gnus-save-killed-list nil)


;;{{{ ----[ 1.7 (info "(gnus)Startup Files")

;; don't save a `.newsrc' file (for using other newsreaders) on exit
(setq gnus-save-newsrc-file nil)

;; ignore the `.newsrc' file
(setq gnus-read-newsrc-file nil)

;; my `.newsrc' file
(setq gnus-startup-file (concat my-gnus-root-dir "Mail/.newsrc"))

;;}}}

;;{{{ ----[ 1.8 (info "(gnus)Auto Save")

;; unconditionally read the dribble file
(setq gnus-always-read-dribble-file t)

;;}}}

;;{{{ ----[ 1.9 (info "(gnus)The Active File")

;;  Gnus will only know about the groups in my `.newsrc' file
(setq gnus-read-active-file nil)

;;}}}

(message "1 Starting Gnus... Done")

;;}}}


;;{{{ --[ 2 (info "(gnus)The Group Buffer") ]-------------------------------

(message "2 Group Buffer...")

;;{{{ ----[ 2.1 (info "(gnus)Group Buffer Format")

;; format of the group buffer
(setq gnus-group-line-format (concat "%M%m%P %O "
                                     "%(%-45,45g%) "
                                     "%5N Unread/ %5t Items"
                                     "\n"))

;;}}}

;;{{{ ----[ 2.16 (info "(gnus)Group Topics")

(add-hook 'gnus-group-mode-hook 'gnus-topic-mode)

;;}}}

(message "2 Group Buffer... Done")

;;}}}


;;{{{ --[ 3 (info "(gnus)The Summary Buffer") ]-----------------------------

(message "3 Summary Buffer...")

;;{{{ ----[ 3.1 (info "(gnus)Summary Buffer Format")

;; format specification of the lines in the summary buffer
;; for the record, the default string is `%U%R%z%I%(%[%4L: %-20,20n%]%) %s\n'
(setq gnus-summary-line-format (concat "%U%R"
                                       "%z "
                                       "%-15,15n  "
                                       "%4,4~(cut 0)o-"
                                       "%2,2~(cut 4)o-"
                                       "%2,2~(cut 6)o "
                                       "%2,2~(cut 9)o:"
                                       "%2,2~(cut 11)o  "
                                       (if (string-match "v5.1[01].*$"
                                                         (gnus-version))
                                           "%4k %B")
                                       "%I%(%0,80s%)\n"))

;; strings indicating that the current article has the same subject as
;; the previous
(if (and window-system
         (string-match "v5.1[01].*$" (gnus-version)))
    (progn
      (setq gnus-summary-same-subject "")
      (setq gnus-sum-thread-tree-root "\x4912f ")
      (setq gnus-sum-thread-tree-false-root "\x490f8 ")
      (setq gnus-sum-thread-tree-single-indent "\x4912b ")
      (setq gnus-sum-thread-tree-leaf-with-other "\x4903c\x49020\x490fa ")
      (setq gnus-sum-thread-tree-single-leaf "\x49034\x49020\x490fa ")
      (setq gnus-sum-thread-tree-vertical "\x49022"))
  (setq gnus-summary-same-subject "\\-> ..."))

;; format specification for the summary mode line
(setq gnus-summary-mode-line-format "%V: %%b")

;;}}}

;;{{{ ----[ (info "(gnus)Sorting") the Summary Buffer

;; sort threads by reverse date (of the root node)
;; [primary sort key should be the last function in the list]
(setq gnus-thread-sort-functions
      '((not gnus-thread-sort-by-number)
        gnus-thread-sort-by-date))

;;}}}

;;{{{ ----[ 3.12 (info "(gnus)Article Caching")

;; entering of articles from the cache
(setq gnus-cache-enter-articles '(ticked dormant unread read))
    ;; simple setup for your convenience, if you are using nnimap from
    ;; home, over a dialup connection

;; removing of articles from the cache
(setq gnus-cache-remove-articles nil)

;; cache your nnimap groups
(setq gnus-cacheable-groups "^nnimap")

;; avoid caching your nnml and nnfolder groups
(setq gnus-uncacheable-groups "^nnml\\|^nnfolder")

;;}}}

;;{{{ ----[ 3.26 (info "(gnus)Various Summary Stuff")

;; highlight current line in summary buffer
(defun my-setup-highlight-line ()
  (hl-line-mode 1))

(add-hook 'gnus-summary-mode-hook 'my-setup-highlight-line)

;;}}}

(message "3 Summary Buffer... Done")

;;}}}


;; warn that some packages were missing
(if missing-packages-list
    (progn (message "Packages not found: %S"
                    (nreverse missing-packages-list))))

(message "}}}\n")


;; This is for the sake of Emacs.
;; Local Variables:
;; mode: emacs-lisp
;; coding: iso-latin-9
;; End:

;;; .gnus ends here

[-- Attachment #4: color-theme-sva.el --]
[-- Type: application/emacs-lisp, Size: 18403 bytes --]

[-- Attachment #5: Emacs21-Messages.txt --]
[-- Type: text/plain, Size: 1844 bytes --]

Loading image...done
Loading tooltip...done
Loading 00debian-vars...
No /etc/mailname. Reverting to default...
Loading 00debian-vars...done
Loading 20apel (source)...done
Loading 49url (source)...done
Loading 50bbdb (source)...done
Loading 50dictionaries-common (source)...
Loading debian-ispell...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...done
Loading debian-ispell...done
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...done
Loading 50dictionaries-common (source)...done
Loading 50emacs-color-themes (source)...done
Loading 50emacs-goodies-el (source)...done
Loading 50festival (source)...done
Loading 50muse-el (source)...
Loading muse-autoloads.el (source)...done
Loading 50muse-el (source)...done
Loading 50namazu2 (source)...done
Loading 50psvn (source)...done
Loading 50w3 (source)...done
Loading 50w3m-el (source)...done
{{{ --[ Loading my Emacs init file ]--
Loading advice...done
Adding `/home/sva/media/Downloads/emacs/site-lisp/' to load-path...
Adding `/home/sva/media/Downloads/emacs/site-lisp/color-theme-6.6.0' to load-path...
Adding `/home/sva/media/Downloads/emacs/site-lisp/color-theme-6.6.0/themes' to load-path...
Adding `/home/sva/emacs/site-lisp/' to load-path...
18 Controlling the Display...
Loading font-lock...
Loading regexp-opt...done
Loading font-lock...done
18 Controlling the Display... Done
35 Sending Mail...
Checking for library `gnus'...
Loading mule-util...done
Checking for library `gnus'... Found
35 Sending Mail... Done
36 Reading Mail with Gnus...
Checking for library `gnus'... Found
36 Reading Mail with Gnus... Done
Checking for library `color-theme'... Found
Checking for library `color-theme-sva'... Found
Checking for library `face-list'... Missing
}}}

Loading nil...
For information about the GNU Project and its goals, type C-h C-p.

[-- Attachment #6: Emacs22-Messages.txt --]
[-- Type: text/plain, Size: 1519 bytes --]

(emacs)
{{{ --[ Loading my Emacs init file ]--
Loading advice...done
Adding `/home/sva/media/Downloads/emacs/site-lisp/' to load-path...
Adding `/home/sva/media/Downloads/emacs/site-lisp/color-theme-6.6.0' to load-path...
Adding `/home/sva/media/Downloads/emacs/site-lisp/color-theme-6.6.0/themes' to load-path...
Adding `/home/sva/emacs/site-lisp/' to load-path...
18 Controlling the Display... Done
35 Sending Mail...
Checking for library `gnus'... Found
35 Sending Mail... Done
36 Reading Mail with Gnus...
Checking for library `gnus'... Found
36 Reading Mail with Gnus... Done
Checking for library `color-theme'...
Loading regexp-opt...done
Loading edmacro...done
Checking for library `color-theme'... Found
Loading cl-macs...done
Loading /home/sva/media/Downloads/emacs/site-lisp/color-theme-6.6.0/themes/color-theme-example.el...
Loading /home/sva/media/Downloads/emacs/site-lisp/color-theme-6.6.0/themes/color-theme-example.el (source)...done
Loading /home/sva/media/Downloads/emacs/site-lisp/color-theme-6.6.0/themes/color-theme-library.el...
Loading /home/sva/media/Downloads/emacs/site-lisp/color-theme-6.6.0/themes/color-theme-library.el (source)...done
Checking for library `color-theme-sva'... Found
Checking for library `face-list'... Missing
}}}

Loading nil...
For information about the GNU Project and its goals, type C-h C-p. [2 times]
Quit
Making completion list...
Loading /usr/local/share/emacs/22.0.93/lisp/vc-svn.elc...
Loading vc-svn...done
Loading vc...done
Wrote /home/sva/Emacs22-Scratch.txt

[-- Attachment #7: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

  parent reply	other threads:[~2007-01-30 12:21 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-01-21  6:49 Color-theme problems in Emacs 22+ (Ubuntu, Windows) Richard Stallman
2007-01-22 18:06 ` Chong Yidong
2007-01-25  8:49   ` Sébastien Vauban
2007-01-30 12:21   ` Sébastien Vauban [this message]
2007-01-30 17:21     ` Chong Yidong
2007-01-31  8:27       ` Sébastien Vauban
     [not found]       ` <1170232136.ZTHJWSQQAFHV@spammotel.com>
2007-01-31 15:23         ` Chong Yidong
2007-02-01  8:42           ` Sébastien Vauban

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87ps8wvh6g.fsf_-_@missioncriticalit.com \
    --to=zthjwsqqafhv@spammotel.com \
    --cc=cyd@stupidchicken.com \
    --cc=emacs-devel@gnu.org \
    --cc=re.2YV9XX9BLMAAX@spammotel.com \
    --cc=rms@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).