;; Config emacs pour les etudiants/auditeurs

;; Pour utiliser ce fichier, inserez la ligne suivante (sans les ;; au
;; debut de la ligne) dans votre ficher .emacs:
;; (load-file "XXX/emacs-config.el")
;; ou XXX est le repertoire contenant ce fichier.
;;;;;;;;;;;;;;;;;;;;;; Initialisation ;;;;;;;;;;;;;;;;;;;;;;
(defun cnam-home-directory-fn ()
  "Used to set proof-home-directory."
  (let ((curdir
	 (or
	  (and load-in-progress (file-name-directory load-file-name))
	  (file-name-directory (buffer-file-name)))))
    (file-name-directory curdir)))

; Si cnam-load-path n'existe pas, ceci est la valeur par défaut
(defvar cnam-load-path (cnam-home-directory-fn))
(defvar cnam-lib-path (concat cnam-load-path "/emacslib"))
;; on met le repertoire emacslib dans le path:
(setq load-path (cons cnam-lib-path load-path))

;; ou bien:
;; (setq load-path (cons "XXX/emacslib" load-path))
;; si vous avez recopie cette config (y compris le repertoire
;; emacslib) dans un repertoire XXX.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; region visible
(unless (featurep 'xemacs) (transient-mark-mode t))

(line-number-mode 1)
(column-number-mode 1)
;la fleche vers le bas ne peut pas ajouter de ligne
(setq next-line-add-newlines nil)
(setq visible-bell 'top-bottom) ; marche pas sur toutes les plateforme
(when (functionp 'mouse-wheel-mode) (mouse-wheel-mode 1))

(if (featurep 'xemacs)
    (paren-set-mode 2)
    (show-paren-mode 1))

;; Colorisation
(if (featurep 'xemacs)
    (turn-on-font-lock)
  (global-font-lock-mode 1))

;;;;;;;;;;;;;; raccourcis a la Windows ;;;;;;;;;;;;;;;;;;;;;;

;; Pour avoir un comportement a la windows (voir cua.el dans emacslib/):
;; (1) C-c C-v C-x C-z  == copier coller couper annuler
;; (2) shift + delpacement == selection
;; (3) selection + frappe clavier = remplacer la selection

;; Les raccourcis standard d'emacs commencant par C-c ou C-x restent
;; si pas de selection active (autre facon de faire: appuyer 2 fois
;; tres vite sur C-c ou C-x a la place d'une fois.)

(if (featurep 'xemacs)
    (require 'cua-xemacs)
  (require 'cua))

(CUA-mode t)
;;(CUA-mode 'emacs)  ;; Si vous ne voulez que (3), sans (1) et (2)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;; Raccourcis de compilation ;;;;;;;;;;;;;;;;;;;;

;; C-f11 pour compiler (confirmer avec entree, ou modifier la commande d'abord)
;; C-shift-f11 pour recompiler sans confirmation (derniere commande utilisee)
;; C-f12 pour aller a la prochaine erreur
;; C-shift-f12 pour aller a l'erreur precedente


(global-set-key [(control f11)]  'compile)
(global-set-key [(control shift f11)]  'recompile)
(global-set-key [(control f12)]  'next-error)
(global-set-key [(control shift f12)]
  '(lambda () (interactive) (next-error -1))) ;previous-error

;; Vous pouvez changer les raccourcis si vous recopiez la config (voir
;; en haut)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


(setq principaux-raccourcis
      "* ***********  BIENVENU DANS EMACS (Config Cnam)  ***********

* TRES IMPORTANT:
** NE LANCEZ PAS PLUSIEURS EDITEURS!!!
  Ouvrez plusieurs fenetres (menu \"File/new frame\", ou bien C-x 5 2).
** UTILISER CTRL-G POUR QUITTER LE MODE COMMANDE
  Lorsque vous etes dans le minibuffer (la ligne en bas de la fenetre),
  vous ne devez pas revenir a la fenetre principale en cliquant dessus
  mais en faisant ctrl-g

** Les 3 commandes qui sauvent:
*** C-g		Annuler la commande en cours (et/ou annuler selection)
*** C-x 1	Fermer toutes les sous-fenetres sauf la courante
*** C-_		Annuler (voir aussi C-z ci-dessous)
** Raccourcis ajoutes dans la config CNAM:
*** shift-deplacer  Selectionner du texte
*** C-c		Copier
*** C-x		Couper
*** C-v		Coller
*** C-z		Annuler
*** C-f11       Compiler (modifier puis confirmer avec entree)
*** C-shift-f11	Recompiler sans confirmation (derniere commande utilisee)
*** C-f12       Prochaine erreur de compilation
*** C-shift-f12	Precedente erreur de compilation
** Raccourcis standards emacs:
*** C-x 5 2	Ouvrir une nouvelle fenetre (menu \"File/new frame\")
*** C-x 5 0	Fermer une fenetre (menu \"File/Delete frame\")
*** C-x C-f	Ouvrir un fichier (interactif, tab pour completer/lister)
*** C-x C-s	Sauvegarder
*** C-x C-w	Sauvegarder sous
*** ESC /	Completer un identificateur (plusieurs fois = defilement)
*** C-s toto	rechercher toto
*** C-r toto	rechercher toto en arriere
*** C-k		couper la fin de la ligne courante
*** ESC % toto ENTER titi
		remplacer toto par titi (taper y/n pour chaque
		occurrence, ou ! pour tout remplacer)")

(setq initial-major-mode 'outline-mode)
(setq initial-scratch-message principaux-raccourcis)

;; Si le fichier change, mettre a jour automatiquement
(global-auto-revert-mode)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Configuration tuareg (mode pour le langage ocaml)               ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(add-to-list 'load-path (concat cnam-load-path "/tuareg-mode"))
(setq auto-mode-alist (cons '("\\.ml\\w?" . tuareg-mode) auto-mode-alist))
(autoload 'tuareg-mode "tuareg" "Major mode for editing Caml code" t)
(autoload 'camldebug "camldebug" "Run the Caml debugger" t)

(if (and (boundp 'window-system) window-system)
    (when (string-match "XEmacs" emacs-version)
      (require 'font-lock)))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Configuration ProofGeneral (mode pour l'assistant de preuve Coq);;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(add-to-list 'load-path (concat cnam-lib-path "/ProofGeneral/generic"))
(add-to-list 'load-path (concat cnam-lib-path "/ProofGeneral/lib"))

;; Mes Raccourcis pour ProofGeneral
(add-hook
 'proof-mode-hook
 '(lambda ()
    (define-key proof-mode-map [(control meta down)]
      'proof-assert-next-command-interactive)
    (define-key proof-mode-map [(control meta up)]
      'proof-undo-last-successful-command)
    (define-key proof-mode-map [(control meta right)]
      'proof-assert-until-point-interactive)
    (define-key proof-mode-map [(control meta left)]
      'proof-retract-until-point-interactive)
    (define-key proof-mode-map [(control f3)] 'proof-three-window-toggle)))

(require 'proof-site)
