;;==============================================================================
;;; modes.el
;;
;;; Emacs Modes
;;
;;; Author: Kyle W T Sherman
;;
;; Time-stamp: <2008-07-30 17:28:30 (kyle)>
;;==============================================================================

(message ";;; modes --> Start")

;;==============================================================================
;;; C Mode (c-mode and c++-mode)
;;==============================================================================

(message ";;; modes --> C Mode")

;; c mode
(custom-set-variables
 '(standard-indent 4)
 '(inverse-video t))
(custom-set-faces)

;; c hook
(defconst local-c-style
  '((c-tab-always-indent . t)
    (c-basic-offset . 4)
    (c-comment-only-line-offset . 0)
    (c-hanging-braces-alist . ((substatement-open after)
                               (brace-list-open)))
    (c-hanging-colons-alist . ((member-init-intro before)
                               (inher-intro)
                               (case-label after)
                               (label after)
                               (access-label after)))
    (c-cleanup-list . (scope-operator
                       empty-defun-braces
                       defun-close-semi))
    (c-offsets-alist . ((arglist-close . c-lineup-arglist)
                        (substatement-open . 0)
                        (substatement-label . 0)
                        (label . 0)
                        (case-label . +)
                        (block-open . 0)
                        (defun-block-intro . +)
                        (statement-block-intro . +)
                        (substatement . +)
                        (knr-argdecl-intro . -)
                        (inline-open . 0)
                        (defun-block-intro . 4)))
    (c-echo-syntactic-information-p . nil)
    ))

;; customizations for c-mode, c++-mode, objc-mode, java-mode, and idl-mode
(defun local-c-mode-common-hook ()
  ;; add my personal style and set it for the current buffer
  (c-add-style "local" local-c-style t)
  ;;(c-set-style 'stroustrup)

  ;; tab width
  (setq tab-width 4)

  ;; spaces are used instead of tabs
  (setq indent-tabs-mode nil)

  ;; auto-newline and hungry-delete turned off
  (c-toggle-auto-hungry-state nil)

  ;; keybindings for all supported languages
  ;; can put these in c-mode-base-map because c-mode-map, c++-mode-map,
  ;; objc-mode-map, java-mode-map, and idl-mode-map inherit from it
  (define-key c-mode-base-map [(control ret)] 'newline-and-indent)
  (define-key c-mode-base-map "\C-cc" 'mode-compile)
  (define-key c-mode-base-map "\C-ck" 'mode-compile-kill)
  (define-key c-mode-base-map [f7] 'mode-compile)

  ;; set default fill column for auto-fill mode and fill-paragraph
  (setq fill-column 78)

  ;; turn on auto-fill
  ;;(turn-on-auto-fill)

  ;; turn off auto newlines
  (setq c-auto-newline nil)

  ;; turn on flyspell
  (when (require-if-available 'flyspell)
    (flyspell-prog-mode))

  ;; compilation settings
  (setq compile-command "make -k")
  (setq compilation-window-height 10)
  (setq compilation-ask-about-save nil)
  ;; (defadvice compile-internal (after my-scroll act comp)
  ;;   "Forces compile buffer to scroll."
  ;;   (let* ((ob (current-buffer))
  ;;          (obw (get-buffer-window ob t))
  ;;          win)
  ;;     (save-excursion
  ;;       (unless (and (setq win (get-buffer-window ad-return-value t))
  ;;                    obw)
  ;;         (select-window win)
  ;;         (goto-char (point-max))
  ;;         (select-window obw)
  ;;         ))))
  (setq compilation-scroll-output t)

  ;; turn on else minor mode
  ;;(else-mode)

  ;; ;; flymake mode
  ;; (when (require-if-available 'flymake-mode)
  ;;   ;; turn on flymake mode
  ;;   (flymake-mode t))
  )
(add-hook 'c-mode-common-hook 'local-c-mode-common-hook)

;; remove trailing blanks
;;(add-hook 'c-mode-hook 'install-remove-trailing-blanks)
;;(add-hook 'c++-mode-hook 'install-remove-trailing-blanks)
(add-hook 'c-mode-common-hook 'install-remove-trailing-blanks)

;; remove tabs
;;(add-hook 'c-mode-hook 'install-remove-tabs)
;;(add-hook 'c++-mode-hook 'install-remove-tabs)
(add-hook 'c-mode-common-hook 'install-remove-tabs)

;; mode compile (smart compile)
(when (require-if-available 'mode-compile)
  (autoload 'mode-compile "mode-compile"
    "Command to compile current buffer file based on the major mode" t)
  ;;(global-set-key "\C-cc" 'mode-compile)
  (autoload 'mode-compile-kill "mode-compile"
    "Command to kill a compilation launched by `mode-compile'" t)
  ;;(global-set-key "\C-ck" 'mode-compile-kill)
  )

;;==============================================================================
;;; Calendar Mode (calendar-mode)
;;==============================================================================

(message ";;; modes --> Calendar Mode")

;; calendar hook
(defun local-calendar-load-hook ()
  ;; star current date
  (setq today-visible-calendar-hook 'calendar-star-date)
  ;; star today's date
  (setq today-visible-calendar-hook 'calendar-mark-today)
  ;; mark holidays
  (setq mark-holidays-in-calendar t)
  ;; scrolling keys
  (define-key calendar-mode-map ">" 'scroll-calendar-left)
  (define-key calendar-mode-map "<" 'scroll-calendar-right)
  (define-key calendar-mode-map "\C-x>" 'scroll-calendar-left)
  (define-key calendar-mode-map "\C-x<" 'scroll-calendar-right)
  )
(add-hook 'calendar-load-hook 'local-calendar-load-hook)

;; calendar remind
(when (require-if-available 'calendar-remind)
  (defun local-calendar-remind-load-hook ()
    ;; remind lookup
    (define-key calendar-mode-map "\r" 'calendar-remind-lookup)
    (define-key calendar-mode-map "r" 'calendar-remind-lookup)
    ;;(define-key calendar-mode-map [(space)] 'calendar-remind-lookup)
    ;; remind visit
    (define-key calendar-mode-map "v" 'calendar-remind-visit)
    (define-key calendar-mode-map "V" 'calendar-remind-visit-insert)
    )
  (add-hook 'calendar-load-hook 'local-calendar-remind-load-hook))

;;==============================================================================
;;; Crypt Mode (crypt++)
;;==============================================================================

;; (message ";;; modes --> Crypt Mode")

;; ;; crypt++ (file encryption support)
;; (setq crypt-encryption-type 'crypt
;;       crypt-encryption-file-extension "\\(Secure\\)$\\|\\(\\.enc\\)$"
;;       crypt-bind-insert-file nil
;;       crypt-freeze-vs-fortran nil)
;; (when (require-if-available 'crypt++)
;;   (modify-coding-system-alist 'file "\\.bz\\'" 'no-conversion)
;;   (modify-coding-system-alist 'file "\\.bz2\\'" 'no-conversion)
;;   (modify-coding-system-alist 'file "\\.gpg\\'" 'no-conversion)
;;   (modify-coding-system-alist 'file "\\.gz\\'" 'no-conversion)
;;   (modify-coding-system-alist 'file "\\.Z\\'" 'no-conversion)

;;   ;; redefine crypt-build-encryption-alist
;;   (defun crypt-build-encryption-alist ()
;;     ;; Returns the encryption alist
;;     (list
;;      ;; crypt
;;      (list 'crypt
;;            crypt-encryption-magic-regexp crypt-encryption-magic-regexp-inverse
;;            (or crypt-encryption-file-extension "\\.\\(e\\|enc\\)$")
;;            "mcrypt" "mcrypt"
;;            '("--algorithm" "enigma" "--mode" "stream" "--bare" "--quiet" "--key")
;;            '("--decrypt" "--algorithm" "enigma" "--mode" "stream" "--bare" "--quiet" "--key")
;;            "Crypt"
;;            nil
;;            t
;;            )
;;      ;; DES (Cipher Block Chaining - CBC) [DES' default]
;;      (list 'des
;;            crypt-encryption-magic-regexp crypt-encryption-magic-regexp-inverse
;;            (or crypt-encryption-file-extension "\\(\\.des\\)$")
;;            "mcrypt" "mcrypt"
;;            '("--bzip2" "--algorithm" "des" "--keymode" "pkdes" "--bare" "--force" "--quiet" "--key")
;;            '("--decrypt" "--bzip2" "--algorithm" "des" "--keymode" "pkdes" "--bare" "--force" "--quiet" "--key")
;;            "DES"
;;            nil
;;            t
;;            )
;;      ;; DES (Electronic Code Book - ECB)
;;      (list 'des-ecb
;;            crypt-encryption-magic-regexp crypt-encryption-magic-regexp-inverse
;;            (or crypt-encryption-file-extension "\\(\\.des\\)$")
;;            "des" "des"
;;            '("-e" "-b" "-k")
;;            '("-d" "-b" "-k")
;;            "DES-ECB"
;;            nil
;;            t
;;            )
;;      ;; PGP
;;      (list 'pgp
;;            crypt-encryption-magic-regexp crypt-encryption-magic-regexp-inverse
;;            (or crypt-encryption-file-extension "\\(\\.pgp\\)$")
;;            "pgp" "pgp"
;;            '("+batchmode" "+verbose=0" "-c" "-f" "-z")
;;            '("+batchmode" "+verbose=0" "-f" "-z")
;;            "PGP"
;;            nil
;;            t
;;            )
;;      ;; Add new elements here ...
;;      ))
;;   )

;;==============================================================================
;;; Erlang Mode (erlang-mode)
;;==============================================================================

(message ";;; modes --> Erlang Mode")

;; erlang-mode
;;(add-to-list 'load-path "/usr/lib/erlang/lib/tools-2.5.4/emacs/")
(add-to-list 'load-path "~/.elisp/erlang")
(add-to-list 'exec-path "/usr/lib/erlang/bin")
(setq erlang-root-dir "/usr/lib/erlang")
(setq erlang-electric-commands nil)
(require-if-available 'erlang-start)

;; erlang hook
(defun local-erlang-hook ()
  ;; turn on flyspell
  (when (require-if-available 'flyspell)
    (flyspell-prog-mode))
  )
(add-hook 'erlang-hook 'local-erlang-hook)

;; remove trailing blanks
(add-hook 'erlang-mode-hook 'install-remove-trailing-blanks)

;; remove tabs
(add-hook 'erlang-mode-hook 'install-remove-tabs)

;;==============================================================================
;;; Fundamental Mode (fundamental-mode)
;;==============================================================================

(message ";;; modes --> Fundamental Mode")

;; fundamental-mode

;; remove trailing blanks
(add-hook 'fundamental-mode-hook 'install-remove-trailing-blanks)

;; remove tabs
(add-hook 'fundamental-mode-hook 'install-remove-tabs)

;;==============================================================================
;;; GPG Mode (file encryption)
;;==============================================================================

;; (message ";;; modes --> GPG Mode")

;; (when (>= emacs-major-version 21)
;;   (defvar pgg-gpg-user-id "kyle")
;;   (autoload 'pgg-make-temp-file "pgg" "PGG")
;;   (autoload 'pgg-gpg-decrypt-region "pgg-gpg" "PGG GnuPG")
;;   (define-generic-mode 'gpg-file-mode
;;     (list ?#)
;;     nil nil
;;     '(".gpg\\'" ".gpg-encrypted\\'")
;;     (list (lambda ()
;;             (add-hook 'before-save-hook
;;                       (lambda ()
;;                         (let ((pgg-output-buffer (current-buffer)))
;;                           (pgg-gpg-encrypt-region (point-min) (point-max)
;;                                                   (list pgg-gpg-user-id))))
;;                       nil t)
;;             (add-hook 'after-save-hook
;;                       (lambda ()
;;                         (let ((pgg-output-buffer (current-buffer)))
;;                           (pgg-gpg-decrypt-region (point-min) (point-max)))
;;                         (set-buffer-modified-p nil)
;;                         (auto-save-mode nil))
;;                       nil t)
;;             (let ((pgg-output-buffer (current-buffer)))
;;               (pgg-gpg-decrypt-region (point-min) (point-max)))
;;             (auto-save-mode nil)
;;             (set-buffer-modified-p nil)))
;;     "Mode for gpg encrypted files.")
;;   )

;;==============================================================================
;;; HTML Mode (html-mode)
;;==============================================================================

;; (message ";;; modes --> HTML Mode")

;; ;; html-mode
;; ;;(when (require-if-available 'html-mode)
;;   (autoload 'html-mode "html-mode" "HTML editing mode." t)

;;   ;; set modes for various extensions
;;   (add-to-list 'auto-mode-alist '("\\.html$" . html-mode))
;;   (add-to-list 'auto-mode-alist '("\\.htm$" . html-mode))
;;   ;;(add-to-list 'auto-mode-alist '("\\.xhtml$" . html-mode))
;;   ;;(add-to-list 'auto-mode-alist '("\\.css$" . html-mode))
;;   (add-to-list 'auto-mode-alist '("\\.cfm$" . html-mode))
;;   (add-to-list 'auto-mode-alist '("\\.asp$" . html-mode))
;;   ;;(add-to-list 'auto-mode-alist '("\\.aspx$" . html-mode))

;;   ;; ;; turn on abbreviation mode
;;   ;; (abbrev-mode t)

;;   ;; remove trailing blanks
;;   (add-hook 'html-mode-hook 'install-remove-trailing-blanks)

;;   ;; remove tabs
;;   (add-hook 'html-mode-hook 'install-remove-tabs)
;; ;;  )

;; ;; html-helper-mode
;; (when (require-if-available 'html-helper-mode)
;;   (autoload 'html-helper-mode "html-helper-mode" "HTML editing mode." t)

;;   ;; set modes for various extensions
;;   (add-to-list 'auto-mode-alist '("\\.html$" . html-helper-mode))
;;   (add-to-list 'auto-mode-alist '("\\.htm$" . html-helper-mode))
;;   ;;(add-to-list 'auto-mode-alist '("\\.xhtml$" . html-helper-mode))
;;   ;;(add-to-list 'auto-mode-alist '("\\.css$" . html-helper-mode))
;;   (add-to-list 'auto-mode-alist '("\\.cfm$" . html-helper-mode))
;;   (add-to-list 'auto-mode-alist '("\\.asp$" . html-helper-mode))
;;   ;;(add-to-list 'auto-mode-alist '("\\.aspx$" . html-helper-mode))

;;   (defun local-html-helper-mode-hook ()
;;     ;; tag-region
;;     (defun tag-region (b e el)
;;       "Put \"<el>...</el>\" around text."
;;       (let ((tb (concat "<" el ">")) ((te (concat "</" el ">")))
;;             (insert-string
;;              (concat tb (delete-and-extract-region b e) te))
;;             (goto-char (- (point) (+ (length te) (- e b)))))))

;;     ;; tag-region-or-point
;;     (defun tag-region-or-point (el)
;;       "Tag the region, or the point if there is no region."
;;       (unless mark-active
;;         (set-mark (point)))
;;       (tag-region (region-beginning) (region-end) el))

;;     ;; set key bindings
;;     (local-set-key "\C-cb" '(tag-region-or-point "b"))
;;     (local-set-key "\C-ci" '(tag-region-or-point "i"))
;;     (local-set-key "\C-ce" '(tag-region-or-point "em"))
;;     (local-set-key "\C-cs" '(tag-region-or-point "strong"))
;;     (local-set-key "\C-cu" '(tag-region-or-point "u"))
;;     (local-set-key "\C-c-" '(tag-region-or-point "strike"))
;;     (local-set-key "\C-ct" '(tag-region-or-point "tt"))
;;     (local-set-key "\C-cp" '(tag-region-or-point "pre"))
;;     )
;;   (add-hook 'html-helper-mode-hook 'local-html-helper-mode-hook)
;;   )

;;==============================================================================
;;; Java Mode (java-mode) (jde-mode)
;;==============================================================================

(message ";;; modes --> Java Mode")

;; jde-mode
(add-to-list 'load-path "~/.elisp/cedet")
(add-to-list 'load-path "~/.elisp/cedet/cogre")
(add-to-list 'load-path "~/.elisp/cedet/common")
(add-to-list 'load-path "~/.elisp/ede")
(add-to-list 'load-path "~/.elisp/eieio")
(add-to-list 'load-path "~/.elisp/semantic")
(add-to-list 'load-path "~/.elisp/speedbar")
(add-to-list 'load-path "~/.elisp/elib")
(add-to-list 'load-path "~/.elisp/jde/lisp")
(when (require-if-available 'jde)
  ;;(autoload 'java-mode "java-mode" "Java editing mode." t)
  (autoload 'jde-mode "jde-mode" "Java editing mode." t)

  ;; set modes for various extensions
  ;; (add-to-list 'auto-mode-alist '("\\.java$" . java-mode))
  ;; (add-to-list 'auto-mode-alist '("\\.jml$" . java-mode))
  ;; (add-to-list 'auto-mode-alist '("\\.mj$" . java-mode))
  (add-to-list 'auto-mode-alist '("\\.java$" . jde-mode))
  (add-to-list 'auto-mode-alist '("\\.jml$" . jde-mode))
  (add-to-list 'auto-mode-alist '("\\.mj$" . jde-mode))

  ;; turn debugging on when errors occur
  ;;(setq debug-on-error t)

  ;; pretty formatting
  ;;(require-if-available 'hilit-java)

  ;; ;; camel case
  ;; (when (require-if-available 'camelCase)
  ;;   (autoload 'camelCase "camelCase" nil t)
  ;;   (defun local-jde-mode-hook ()
  ;;     (camelCase-mode 1)
  ;;     (local-set-key "\M-backspace" 'camelCase-backward-kill-word))
  ;;   (add-hook 'jde-mode-hook 'local-jde-mode-hook 'append))

  ;; initialize cedet
  ;;(add-to-list 'load-path "~/.elisp/cedet")
  ;;(add-to-list 'load-path "~/.elisp/cedet/cogre")
  ;;(add-to-list 'load-path "~/.elisp/cedet/common")
  (require-if-available 'cedet)

  ;; initialize semantic
  (require-if-available 'semantic-load)
  (global-semanticdb-minor-mode -1)
  ;;(setq semantic-load-turn-useful-things-on t)

  ;; initialize eldoc
  ;;(add-to-list 'load-path "~/.elisp/elib")
  (require-if-available 'eldoc)

  ;; increase the limit on number of lisp variable bindings and
  ;; unwind-protects; allows semantic to parse more complex java files
  ;;(setq max-specpdl-size 1080)

  ;; turn on flyspell
  (when (require-if-available 'flyspell)
    (add-hook 'java-mode-hook 'flyspell-prog-mode))

  ;; ;; flymake mode
  ;; (when (require-if-available 'flymake-mode)
  ;;   ;; turn on flymake mode
  ;;   (flymake-mode t))

  ;; remove trailing blanks
  (add-hook 'java-mode-hook 'install-remove-trailing-blanks)
  (add-hook 'jde-mode-hook 'install-remove-trailing-blanks)

  ;; remove tabs
  (add-hook 'java-mode-hook 'install-remove-tabs)
  (add-hook 'jde-mode-hook 'install-remove-tabs)

  ;; set jde variables
  (setq jde-ant-home "/usr/bin/ant")
  (setq jde-ant-buildfile "build.xml")
  (setq jde-build-function (quote (jde-ant-build)))
  (setq jde-check-version-flag nil)
  (setq jde-debugger (quote ("jdb")))
  ;; (setq jde-global-classpath (quote (
  ;;                                    "/usr/share/java/log4j-1.2.12.jar"
  ;;                                    "/opt/GigaSpacesEE/lib/jini/tools.jar"
  ;;                                    "/opt/GigaSpacesEE/lib/jini/jsk-lib.jar"
  ;;                                    "/opt/GigaSpacesEE/lib/jini/jsk-platform.jar"
  ;;                                    "/opt/GigaSpacesEE/lib/JSpaces.jar"
  ;;                                    "./bin" "./lib" "./src" "./classes" "./config")))
  ;; (setq jde-jdk-registry (quote (("1.5" . "/usr/lib/jvm/java-1.5.0-sun")
  ;;                                ("5.0" . "/usr/lib/jvm/java-1.5.0-sun")
  ;;                                ("1.6" . "/usr/lib/jvm/java-6-sun")
  ;;                                ("6.0" . "/usr/lib/jvm/java-6-sun"))))
  (setq jde-jdk-registry (quote (("1.5" . "/usr/lib/jvm/java-6-sun"))))
  (setq jde-jdk (quote ("1.5")))
  (setq quack-default-program "csi -:c")
  (setq quack-run-scheme-always-prompts-p nil)
  ;;(setq save-place t nil (saveplace))
  ;;(setq tool-bar-mode nil nil (tool-bar)))
  ;;(setq jde-enable-abbrev-mode t)
  ;;(setq jde-complete-function 'jde-complete-menu)
  (setq jde-complete-function 'jde-complete-minibuf)
  ;;(setq jde-complete-function 'jde-complete-in-line)

  ;; turn on else minor mode
  ;;(add-hook 'java-mode-hook 'else-mode)
  )

;;==============================================================================
;;; Lisp Mode (lisp-mode and emacs-lisp-mode)
;;==============================================================================

(message ";;; modes --> Lisp Mode")

;; set mode for various extensions
;;(add-to-list 'auto-mode-alist '("\\.el$" . lisp-mode))
(add-to-list 'auto-mode-alist '("\\.el$" . emacs-lisp-mode))
(add-to-list 'auto-mode-alist '("\\.lisp$" . lisp-mode))

;; lisp hook for more settings
(defun local-lisp-mode-hook ()
  ;; clear input method
  ;;(set-input-method nil)

  ;; set indent to 2 spaces
  ;;(setq lisp-indent-offset 2)

  ;; add underscore and dash to word boundaries
  (modify-syntax-entry ?_ "w" lisp-mode-syntax-table)
  (modify-syntax-entry ?- "w" lisp-mode-syntax-table)

  ;; map return key to `newline-and-indent'
  (local-set-key [(ret)] 'newline-and-indent)

  ;; turn on flyspell
  (when (require-if-available 'flyspell)
    (flyspell-prog-mode))

  ;; ;; turn on abbreviation mode
  ;; (abbrev-mode t)

  ;; turn on else minor mode
  ;;(else-mode)
  )

;; add hook to emacs-lisp and lisp modes
(add-hook 'emacs-lisp-mode-hook 'local-lisp-mode-hook)
(add-hook 'lisp-mode-hook 'local-lisp-mode-hook)

;; remove trailing blanks
(add-hook 'emacs-lisp-mode-hook 'install-remove-trailing-blanks)
(add-hook 'lisp-mode-hook 'install-remove-trailing-blanks)

;; remove tabs
(add-hook 'emacs-lisp-mode-hook 'install-remove-tabs)
(add-hook 'lisp-mode-hook 'install-remove-tabs)

;; slime (superior lisp interaction mode for emacs)
(add-to-list 'load-path "~/.elisp/slime")
;;(add-to-list 'load-path "/usr/share/common-lisp/source/slime/")
;; if loading slime errors out because swank-loader.lisp is not found, do:
;;   # cd /usr/share/emacs22/site-lisp/slime
;;   # for i in $(ls -1 /usr/share/common-lisp/source/slime/) ; do ln -s /usr/share/common-lisp/source/slime/$i ; done
(when (require-if-available 'slime)
  (autoload 'slime-mode "slime-mode" "Slime editing mode." t)

  ;; slime setup
  ;;(slime-setup)

  ;; set lisp program to clisp
  (setq inferior-lisp-program "clisp -K full")

  ;; evaluate current sexp
  (defun slime-eval-sexp ()
    "Slime evaluate current sexp."
    (interactive)
    (save-excursion
      (end-of-defun)
      (slime-interactive-eval (slime-last-expression))))

  ;; run slime setup (this does too much)
  ;;(slime-setup)

  ;; run custom version of slime setup to preserve lisp-indent-function
  (defun local-slime-lisp-mode-hook ()
    (slime-mode t)
    ;; auto documentation
    (slime-autodoc-mode t)
    ;; typeout frame
    ;;(add-hook 'slime-connected-hook 'slime-ensure-typeout-frame)
    ;; highlight edits
    ;;(add-hook 'slime-mode-hook 'slime-highlight-edits-mode)

    (define-key slime-mode-map "\C-x\C-e" 'slime-eval-sexp)

    ;; start inferior lisp job
    ;;(unless (comint-check-proc "*inferior-lisp*")
    ;;  (let ((buffer (current-buffer)))
    ;;    (slime)
    ;;    (switch-to-buffer buffer)
    ;;    ))

    ;; ;; auto connect to slime
    ;; (unless (slime-connected-p)
    ;;   (save-excursion (slime)))
    )
  (add-hook 'lisp-mode-hook 'local-slime-lisp-mode-hook)

  ;; cldoc (common lisp info in mini-buffer)
  (autoload 'turn-on-cldoc-mode "cldoc" nil t)
  (add-hook 'lisp-mode-hook 'turn-on-cldoc-mode)
  ;; wait 3 seconds before showing mini-buffer docs
  (setq cldoc-idle-delay 3)
  )

;; load slime-mode when lisp-mode is loaded
;(add-hook 'lisp-mode-hook (lambda () (slime-mode)))

;;==============================================================================
;;; Makefile Mode (make-mode)
;;==============================================================================

(message ";;; modes --> Makefile Mode")

;; C/C++ Makefile mode
(when (require-if-available 'make-mode)
  (autoload 'make-mode "makefile" "Makefile editing mode." t)

  ;; set mode for various extensions
  (add-to-list 'auto-mode-alist '("Makefile" . makefile-mode))

  ;; remove trailing blanks
  (add-hook 'auto-mode-hook 'install-remove-trailing-blanks)
  )

;;==============================================================================
;;; Muse Mode (muse-mode)
;;==============================================================================

(message ";;; modes --> Muse Mode")

;; authoring and publishing environment
(defconst muse-init-file "~/web/bin/muse-init.el")
(add-to-list 'load-path "~/.elisp/muse/lisp")
(when (require-if-available 'muse-mode)
  ;; call external muse initialization script in web project
  (when (file-exists-p muse-init-file)
    (safe-load muse-init-file)))

;; planner (the emacs planner)
(add-to-list 'load-path "~/.elisp/planner")
(require-if-available 'planner)
(require-if-available 'planner-multi)
(when (require-if-available 'planner-publish)
  (planner-option-customized 'planner-directory "~/plans")
  ;; (planner-option-customized 'planner-publishing-directory
  ;;                            "~/public_html/plans")
  (setq planner-carry-tasks-forward t)
  (define-key mode-specific-map [?n] 'planner-goto-today))

;; planner-calendar (integrate planner with the calendar)
(when (require-if-available 'calendar)
  ;;(load-library "planner-calendar")
  ;;(load-library "cal-desk-calendar")
  (require-if-available 'planner-calendar)
  (require-if-available 'cal-desk-calendar)
  (when (and (load "planner-calendar" t) (load "cal-desk-calendar" t))
    (add-hook 'diary-display-hook 'sort-diary-entries)
    (add-hook 'diary-display-hook 'fancy-schedule-display-desk-calendar t)))

;; remember (mode for quickly jotting down things to remember)
;;(autoload 'remember "remember" nil t)
;;(autoload 'remember-region "remember" nil t)
(add-to-list 'load-path "~/.elisp/remember")
(require-if-available 'remember)
(when (require-if-available 'remember-planner)
  (setq remember-handler-functions '(remember-planner-append))
  (setq remember-annotation-functions planner-annotation-functions))

;;==============================================================================
;;; Org Mode (org-mode)
;;==============================================================================

(message ";;; modes --> Org Mode")

;; org (advanced outline mode)
(add-to-list 'load-path "~/.elisp/org")
(when (require-if-available 'org)
  (autoload 'org-mode "org" "Org mode." t)
  (autoload 'org-diary "org" "Diary entries from Org mode.")

  ;; set mode for various extensions
  (add-to-list 'auto-mode-alist '("\\.org$" . org-mode))
  ;;(add-to-list 'auto-mode-alist '("\\.org\\.enc$" . org-mode))
  (add-to-list 'auto-mode-alist '("\\.org\\.cpt$" . org-mode))

  ;; set default directory and file
  (setq org-directory "~/org/")
  (setq org-default-notes-file "~/.notes")

  ;; hide leading stars
  (setq org-hide-leading-stars t)

  ;; skip levels
  (setq org-odd-levels-only t)

  ;; remember settings
  ;;(setq remember-handler-functions '(org-remember-handler))
  ;;(setq remember-annotation-functions '(org-remember-annotation))
  ;;(add-hook 'remember-mode-hook 'org-remember-apply-template)

  ;; org hook
  (defun local-org-mode-hook ()
    ;; key bindings
    (local-set-key [(control ?c) (control return)] 'org-insert-heading)
    ;;(local-set-key "\C-cl" 'org-store-link)
    ;;(local-set-key "\C-ca" 'org-agenda)

    ;; turn off auto-fill mode
    (turn-off-auto-fill)

    ;; ;; turn on longlines mode
    ;; (longlines-mode)

    ;; turn off auto-save mode
    (auto-save-mode nil))
  (add-hook 'org-mode-hook 'local-org-mode-hook)

  ;; sort current level
  (defun org-sort-current (&optional with-case sorting-type)
    "Sort the current org level."
    (interactive)
    (when (equal mode-name "Org")
      (unless sorting-type
        (setq sorting-type ?a))
      (save-excursion
        (outline-up-heading 1)
        (let ((start (point))
              end)
          (while (and (not (bobp)) (not (eobp)) (<= (point) start))
            (condition-case nil
                (outline-forward-same-level 1)
              (error (outline-up-heading 1))))
          (unless (> (point) start)
            (goto-char (point-max)))
          (setq end (point))
          (goto-char start)
          (org-sort-entries with-case sorting-type)
          (goto-char end)
          (when (eobp)
            (forward-line -1))
          (when (looking-at "^\\s-*$")
            (delete-line))
          ))))

  ;; key to sort current level
  (define-key org-mode-map "\C-cs" 'org-sort-current)
  )

;;==============================================================================
;;; Perl Mode (cperl-mode)
;;==============================================================================

(message ";;; modes --> Perl Mode")

(when (require-if-available 'cperl-mode)
  (autoload 'cperl-mode "cperl-mode" "Perl editing mode." t)

  ;; set mode for various extensions
  (add-to-list 'auto-mode-alist '("\\.\\([pP][Llm]\\|al\\)\\'" . cperl-mode))
  (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))
  (add-to-list 'interpreter-mode-alist '("perl5" . cperl-mode))
  (add-to-list 'interpreter-mode-alist '("miniperl" . cperl-mode))

  ;; perl hook
  (defun local-cperl-mode-hook ()
    ;; configure some options
    (setq cperl-indent-level 4)
    (setq cperl-continued-statement-offset 0)

    ;; turn on flyspell
    (when (require-if-available 'flyspell)
      (flyspell-prog-mode))
    )
  (add-hook 'cperl-mode-hook 'local-cperl-mode-hook)

  ;; determine if file is a perl script and switch to cperl-mode if it is
  (defun cperl-mode-maybe ()
    (interactive)
    (save-excursion
      (save-match-data
        (goto-char (point-min))
        (when (or
               (search-forward "#!/usr/bin/perl" (point-at-eol) t)
               (search-forward "#!/usr/bin/env perl" (point-at-eol) t))
          (cperl-mode)))))

  ;; run when a file is loaded
  (add-hook 'find-file-hooks 'cperl-mode-maybe)

  ;; remove trailing blanks
  (add-hook 'cperl-mode-hook 'install-remove-trailing-blanks)

  ;; remove tabs
  (add-hook 'cperl-mode-hook 'install-remove-tabs)
  )

;;==============================================================================
;;; Python Mode (python-mode)
;;==============================================================================

(message ";;; modes --> Python Mode")

;; python-mode
(when (require-if-available 'python)
  (autoload 'python-mode "python-mode" "Python editing mode." t)

  ;; set mode for various extensions
  ;(add-to-list 'auto-mode-alist '("\\.py$" . python-mode))
  ;(add-to-list 'auto-mode-alist '("\\.python$" . python-mode))

  ;; python hook
  (defun local-python-mode-hook ()
    ;; set indent
    (setq python-indent 4)
    )
  (add-hook 'python-mode-hook 'local-python-mode-hook))

;;==============================================================================
;;; Ruby Mode (ruby-mode)
;;==============================================================================

(message ";;; modes --> Ruby Mode")

;; ruby-mode
(when (require-if-available 'ruby-mode)
  (autoload 'ruby-mode "ruby-mode" "Ruby editing mode." t)

  ;; set mode for various extensions
  (add-to-list 'auto-mode-alist '("\\.rb$" . ruby-mode))
  (add-to-list 'auto-mode-alist '("\\.rhtml$" . ruby-mode))

  ;; ruby hook
  (defun local-ruby-mode-hook ()
    ;; configure some options
    ;;(setq ruby-indent-level 4)
    (setq ruby-indent-level 2)
    (define-key ruby-mode-map "\r" 'ruby-reindent-then-newline-and-indent)

    ;; turn on flyspell
    (when (require-if-available 'flyspell)
      (flyspell-prog-mode))
    )
  (add-hook 'ruby-mode-hook 'local-ruby-mode-hook t)

  ;; ;; turn on syntax highlighting (actually turns of syntax highlighting)
  ;; (add-hook 'ruby-mode-hook 'turn-on-font-lock)

  ;; ;; ruby-electric (auto closing tags)
  ;; (require-if-available 'ruby-electric)
  ;; (add-hook 'ruby-mode-hook 'ruby-electric-mode)
  ;; (setq ruby-electric-mode nil)

  ;; inf-ruby ???
  (when (require-if-available 'inf-ruby)
    (setq interpreter-mode-alist (append '(("ruby" . ruby-mode))
                                         interpreter-mode-alist))
    (autoload 'run-ruby "inf-ruby"
      "Run an inferior Ruby process.")
    (autoload 'inf-ruby-keys "inf-ruby"
      "Set local key defs for inf-ruby in ruby-mode.")
    (add-hook 'ruby-mode-hook '(lambda () (inf-ruby-keys))))

  ;; ;; turn on abbreviation mode
  ;; (abbrev-mode t)

  ;; determine if file is a ruby script and switch to ruby-mode if it is
  (defun ruby-mode-maybe ()
    (interactive)
    (save-excursion
      (save-match-data
        (goto-char (point-min))
        (when (or
               (search-forward "#!/usr/bin/ruby" (point-at-eol) t)
               (search-forward "#!/usr/bin/env ruby" (point-at-eol) t))
          (ruby-mode)))))

  ;; run when a file is loaded
  (add-hook 'find-file-hooks 'ruby-mode-maybe)

  ;; remove trailing blanks
  (add-hook 'ruby-mode-hook 'install-remove-trailing-blanks)

  ;; remove tabs
  (add-hook 'ruby-mode-hook 'install-remove-tabs)
  )

;;==============================================================================
;;; SH Mode (sh-mode)
;;==============================================================================

(message ";;; modes --> SH Mode")

;; sh-mode
(when (require-if-available 'sh-script)
  (autoload 'sh-mode "sh-mode" "Shell editing mode." t)

  ;; set mode for various extensions
  (add-to-list 'auto-mode-alist '("\\.sh$" . sh-mode))
  (add-to-list 'auto-mode-alist '("\\.shell$" . sh-mode))
  (add-to-list 'auto-mode-alist '("\\.bash$" . sh-mode))
  ;; using mode for ldif and schema files
  (add-to-list 'auto-mode-alist '("\\.ldif$" . sh-mode))
  (add-to-list 'auto-mode-alist '("\\.schema$" . sh-mode))
  ;; using mode for remind files
  (add-to-list 'auto-mode-alist '("\\.reminders$" . sh-mode))
  (add-to-list 'auto-mode-alist '("^reminders_" . sh-mode))

  ;; make comment lines indent
  (setq sh-indent-comment t)

  ;; determine if file is a shell script and switch to sh-mode if it is
  (defun sh-mode-maybe ()
    (interactive)
    (save-excursion
      (save-match-data
        (goto-char (point-min))
        (when (or
               (search-forward "#!/bin/sh" (point-at-eol) t)
               (search-forward "#!/bin/bash" (point-at-eol) t)
               (search-forward "#!/bin/csh" (point-at-eol) t)
               (search-forward "#!/bin/tsh" (point-at-eol) t)
               (search-forward "#!/usr/bin/env sh" (point-at-eol) t)
               (search-forward "#!/usr/bin/env bash" (point-at-eol) t)
               (search-forward "#!/usr/bin/env csh" (point-at-eol) t)
               (search-forward "#!/usr/bin/env tsh" (point-at-eol) t)
               (search-forward "#=========" (point-at-eol) t)
               (search-forward "#---------" (point-at-eol) t))
          (sh-mode)))))

  ;; run when a file is loaded
  (add-hook 'find-file-hooks 'sh-mode-maybe)

  ;; remove trailing blanks
  (add-hook 'sh-mode-hook 'install-remove-trailing-blanks)

  ;; remove tabs
  (add-hook 'sh-mode-hook 'install-remove-tabs)
  )

;;==============================================================================
;;; SQL Mode (sql-mode)
;;==============================================================================

(message ";;; modes --> SQL Mode")

;; sql
(when (require-if-available 'sql)
  (autoload 'sql-mode "sql-mode" "SQL editing mode." t)

  ;; set modes for various extensions
  (add-to-list 'auto-mode-alist '("\\.sql$" . sql-mode))
  (add-to-list 'auto-mode-alist '("\\.tbl$" . sql-mode))
  (add-to-list 'auto-mode-alist '("\\.sp$" . sql-mode))

  ;; mysql
  (require-if-available 'mysql)
  (setq sql-product 'mysql)

  ;; tsql
  ;;(require-if-available 'tsql)

  ;; sql-transform
  (when (require-if-available 'sql-transform)
    (defun local-sql-mode-hook ()
      (local-set-key "\C-cs" 'sql-to-select)
      (local-set-key "\C-ci" 'sql-to-insert)
      (local-set-key "\C-cu" 'sql-to-update)
      (local-set-key "\C-cd" 'sql-to-delete)
      )
    (add-hook 'sql-mode-hook 'local-sql-mode-hook)
    )

  ;; ;; turn on abbreviation mode
  ;; (abbrev-mode t)

  ;; remove trailing blanks
  (add-hook 'sql-mode-hook 'install-remove-trailing-blanks)

  ;; remove tabs
  (add-hook 'sql-mode-hook 'install-remove-tabs)

  ;; add databases
  )

;;==============================================================================
;;; Text Mode (text-mode)
;;==============================================================================

(message ";;; modes --> Text Mode")

(when (load "text-mode" t)
  (autoload 'sql-text "text-mode" "Text editing mode." t)

  ;; set modes for various extensions
  (add-to-list 'auto-mode-alist '("\\.txt$" . text-mode))
  (add-to-list 'auto-mode-alist '("\\.text$" . text-mode))
  (add-to-list 'auto-mode-alist '("README" . text-mode))
  (add-to-list 'auto-mode-alist '("INSTALL" . text-mode))
  (add-to-list 'auto-mode-alist '("CHANGELOG" . text-mode))

  (defun local-text-mode-hook ()
    ;; set tab
    ;; (setq tab-width 4)
    ;; (setq-default tab-stop-list
    ;;               '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76))
    (setq tab-width 8)
    (setq-default tab-stop-list
                  '(8 16 24 32 40 48 56 64 72 76))
    (setq indent-tabs-mode t)
    (define-key text-mode-map [(tab)] 'indent-relative)

    ;; set default fill column for auto-fill mode
    (setq fill-column 78)

    ;; turn on word wrap
    (turn-on-auto-fill)

    ;; add underscore and dash to word boundaries
    (modify-syntax-entry ?_ "w" text-mode-syntax-table)
    (modify-syntax-entry ?- "w" text-mode-syntax-table)

    ;; turn on flyspell
    (when (require-if-available 'flyspell)
      (flyspell-mode t))

    ;; ;; turn on abbreviation mode
    ;; (abbrev-mode t)

    ;; turn on pabbrev mode
    ;;(pabbrev-mode)

    ;; insert two spaces after a sentence
    (setq sentence-end-double-space t)

    ;; insert two spaces after a colon
    (setq colon-double-space t)
    )
  (add-hook 'text-mode-hook 'local-text-mode-hook)

  ;; remove trailing blanks
  (add-hook 'text-mode-hook 'install-remove-trailing-blanks)

  ;; remove tabs
  (add-hook 'text-mode-hook 'install-remove-tabs)
  )

;;==============================================================================
;;; XML Mode (xml-mode)
;;==============================================================================

;; (message ";;; modes --> XML Mode")

;; (add-to-list 'load-path "~/.elisp/psgml")
;; (load "~/.elisp/psgml/psgml.el")
;; (autoload 'sgml-mode "psgml" "SGML editing mode." t)
;; (autoload 'xml-mode "psgml" "XML editing mode." t)

;; (require-if-available 'sgml-mode)
;; (when (load "sgml-mode" t)

;;   ;; setup catalog files
;;   (setq sgml-catalog-files nil)
;;   (add-to-list 'sgml-catalog-files "~/dtd/xhtml1/xhtml1.soc")
;;   (add-to-list 'sgml-catalog-files "~/dtd/dita/dtd/dita.soc")
;;   (add-to-list 'sgml-catalog-files "~/dtd/hodmacro/hodmacro.soc")

;;   ;; set modes for various extensions
;;   (add-to-list 'auto-mode-alist '("\\.sgml$" . sgml-mode))
;;   (add-to-list 'auto-mode-alist '("\\.idd$" . sgml-mode))
;;   (add-to-list 'auto-mode-alist '("\\.ide$" . sgml-mode))
;;   ;;(add-to-list 'auto-mode-alist '("\\.htm$" . xml-mode))
;;   ;;(add-to-list 'auto-mode-alist '("\\.html$" . xml-mode))
;;   (add-to-list 'auto-mode-alist '("\\.xhtml$" . xml-mode))
;;   (add-to-list 'auto-mode-alist '("\\.xml$" . xml-mode))
;;   (add-to-list 'auto-mode-alist '("\\.xsl$" . xml-mode))
;;   (add-to-list 'auto-mode-alist '("\\.fo$" . xml-mode))
;;   (add-to-list 'auto-mode-alist '("\\.rdf$" . xml-mode))
;;   (add-to-list 'auto-mode-alist '("\\.rss$" . xml-mode))

;;   ;; sgml mode hook
;;   (defun local-sgml-mode-hook ()
;;     ;; create faces to assign to markup categories
;;     (make-face 'sgml-comment-face)
;;     (make-face 'sgml-start-tag-face)
;;     (make-face 'sgml-end-tag-face)
;;     ;; assign attributes to faces
;;     (set-face-foreground 'sgml-comment-face "SeaGreen")
;;     (set-face-foreground 'sgml-start-tag-face "OrangeRed")
;;     (set-face-foreground 'sgml-end-tag-face "OrangeRed")
;;     ;; assign faces to markup categories
;;     (setq sgml-markup-faces
;;           '((comment . sgml-comment-face)
;;             (start-tag . sgml-start-tag-face)
;;             (end-tag . sgml-end-tag-face)))
;;     ;; use the face settings
;;     (setq sgml-set-face t)
;;     ;; only allow valid elements to be inserted
;;     (setq sgml-omittag-transparent t)
;;     ;; automatically insert required elements
;;     (setq sgml-auto-insert-required-elements t)
;;     ;; enable abbreviations
;;     ;;(setq-default abbrev-mode t)
;;     ;;(read-abbrev-file "~/.abbrev_defs")
;;     ;;(setq save-abbrevs t)
;;     )
;;   (add-hook 'sgml-mode-hook 'local-sgml-mode-hook)

;;   ;;(make-face 'sgml-comment-face)
;;   ;;(make-face 'sgml-start-tag-face)
;;   ;;(make-face 'sgml-end-tag-face)
;;   ;;(make-face 'sgml-entity-face)
;;   ;;(make-face 'sgml-doctype-face)

;;   ;;(set-face-foreground 'sgml-comment-face "FireBrick")
;;   ;;(set-face-foreground 'sgml-start-tag-face "SlateBlue")
;;   ;;(set-face-foreground 'sgml-end-tag-face "SlateBlue")
;;   ;;(set-face-background 'sgml-entity-face "SlateBlue")
;;   ;;(set-face-foreground 'sgml-entity-face "Red")
;;   ;;(set-face-foreground 'sgml-doctype-face "FireBrick")

;;   ;;(setq sgml-set-face t)
;;   ;;(setq sgml-markup-faces
;;   ;;        '((comment . sgml-comment-face)
;;   ;;        (start-tag . sgml-start-tag-face)
;;   ;;        (end-tag . sgml-end-tag-face)
;;   ;;        (doctype . sgml-doctype-face)
;;   ;;        (entity . sgml-entity-face)))

;;   ;; ;; turn on abbreviation mode
;;   ;; (abbrev-mode t)
;;   )

;;==============================================================================
;;; XML Mode (nxml-mode)
;;==============================================================================

(message ";;; modes --> XML Mode")

;; nxml (nxml-mode)
(add-to-list 'load-path "~/.elisp/nxml-mode")
(require-if-available 'nxml-mode)
(when (load "nxml-mode" t)
  (autoload 'nxml-mode "nxml-mode" "XML editing mode." t)

  ;; set mode for various extensions
  (add-to-list 'auto-mode-alist '("\\.dtd$" . nxml-mode))
  ;;(add-to-list 'auto-mode-alist '("\\.fo$" . nxml-mode))
  (add-to-list 'auto-mode-alist '("\\.htm$" . nxml-mode))
  (add-to-list 'auto-mode-alist '("\\.html$" . nxml-mode))
  ;;(add-to-list 'auto-mode-alist '("\\.idd$" . nxml-mode))
  ;;(add-to-list 'auto-mode-alist '("\\.ide$" . nxml-mode))
  (add-to-list 'auto-mode-alist '("\\.rdf$" . nxml-mode))
  ;;(add-to-list 'auto-mode-alist '("\\.rng$" . nxml-mode))
  (add-to-list 'auto-mode-alist '("\\.rss$" . nxml-mode))
  ;;(add-to-list 'auto-mode-alist '("\\.sch$" . nxml-mode))
  (add-to-list 'auto-mode-alist '("\\.sgml$" . nxml-mode))
  ;;(add-to-list 'auto-mode-alist '("\\.svg$" . nxml-mode))
  (add-to-list 'auto-mode-alist '("\\.xhtml$" . nxml-mode))
  (add-to-list 'auto-mode-alist '("\\.xml$" . nxml-mode))
  (add-to-list 'auto-mode-alist '("\\.xsd$" . nxml-mode))
  (add-to-list 'auto-mode-alist '("\\.xsl$" . nxml-mode))

  ;; set magic modes
  (load "rng-auto")
  ;;(unify-8859-on-decoding-mode)
  (when (>= emacs-major-version 22)
    (add-to-list 'magic-mode-alist '("<\\?xml " . nxml-mode)))

  ;; nxml hook
  (defun local-nxml-mode-hook ()
    ;; turn on flyspell
    (when (require-if-available 'flyspell)
      (flyspell-prog-mode))

    ;; turn on auto-completion
    (setq nxml-slash-auto-complete-flag t)

    ;; turn on org minor mode
    ;; (when (string-match "\\.\\(x?html\\|php[34]?\\)$"
    ;;                     (file-name-sans-versions (buffer-file-name)))
    ;;   (local-nxml-mode-org))
    ;;(local-nxml-mode-org)
    )
  (add-hook 'nxml-mode-hook 'local-nxml-mode-hook)

  ;; ;;
  ;; (defun local-nxml-mode-org ()
  ;;   (make-local-variable 'outline-regexp)
  ;;   ;;(setq outline-regexp "\\s *<\\([h][1-6]\\|html\\|body\\|head\\)\\b")
  ;;   (setq outline-regexp "\\s *<")
  ;;   (make-local-variable 'outline-level)
  ;;   (setq outline-level 'local-nxml-mode-outline-level)
  ;;   (outline-minor-mode 1)
  ;;   (hs-minor-mode 1))

  ;; (defun local-nxml-mode-outline-level ()
  ;;   (save-excursion (re-search-forward html-outline-level))
  ;;   (let ((tag (buffer-substring (match-beginning 1) (match-end 1))))
  ;;     (if (eq (length tag) 2)
  ;;         (- (aref tag 1) ?0)
  ;;       0)))

  ;; (add-to-list 'hs-special-modes-alist
  ;;              '(nxml-mode
  ;;                "<!--\\|<[^/>]>\\|<[^/][^>]*[^/]>"
  ;;                ""
  ;;                "<!--" ;; won't work on its own; uses syntax table
  ;;                (lambda (arg) (local-nxml-mode-forward-element))
  ;;                nil))

  ;; (defun local-nxml-mode-forward-element ()
  ;;   (let ((nxml-sexp-element-flag))
  ;;     (setq nxml-sexp-element-flag (not (looking-at "<!--")))
  ;;     (unless (looking-at outline-regexp)
  ;;       (condition-case nil
  ;;           (nxml-forward-balanced-item 1)
  ;;         (error nil)))))

  ;; remove trailing blanks
  (add-hook 'nxml-mode-hook 'install-remove-trailing-blanks)

  ;; remove tabs
  (add-hook 'nxml-mode-hook 'install-remove-tabs)
  )

;; derive xml-mode and html-mode from nxml-mode
(defalias 'xml-mode 'nxml-mode)
(defalias 'html-mode 'nxml-mode)
;;(fset 'xml-mode 'nxml-mode) ???

;;==============================================================================
;;; Global Mode Settings
;;==============================================================================

(message ";;; modes --> Global Mode Settings")

;; global hook
(defun global-mode-hook ()
  ;; remove trailing blanks
  (install-remove-trailing-blanks)

  ;; remove tabs (all but makefile-mode)
  (unless (equal mode-name "Makefile")
    (install-remove-tabs))

  ;; turn on spell mode
  ;;(flyspell-mode t)

  ;; set local key bindings
  (safe-load "keys-local")
  )
(when (>= emacs-major-version 22)
  (add-hook 'after-change-major-mode-hook 'global-mode-hook))

(message ";;; modes --> End")

;;==============================================================================
;;; End of File
;;==============================================================================