• les paquets emacs, emacs-color-themes, r-base (sans oublier r-base-dev !), ess, auctex, latex-ucs et css-mode, ainsi que la distribution texlive sont installés, avec toutes leurs dépendances (voir le sources.list adéquat).
  • Pour le mode ESS (code R) : indentation au fur et à mesure (sinon utiliser <TAB> en ligne par ligne, ou bien C-M-q sur une accolade de début de fonction), autocomplétion par <TAB> dans un buffer R ou bien C-c <TAB> dans un buffer ESS, C-C C-r pour copier une sélection dans le buffer R, C-c C-e pour placer le curseur sur le prompt d'un buffer R, utilisation possible de Sweave (fichiers .Rnw), etc.
  • Pour le mode LaTeX : correction d'orthographe à la volée avec flyspell, les accents correctement gérés, possibilité de mettre des registres (fonctionnant comme des ancres), AUCTeX et RefTeX utilisés, etc.

Pour le reste, tout (ou presque) se trouve dans les commentaires !

;; -------------------------------------------------------------------------- ;;
;;                          Variables d'environnement                         ;;
;; -------------------------------------------------------------------------- ;;

;; = .emacs par défaut
(custom-set-variables
 '(case-fold-search t)
 '(current-language-environment "UTF-8")
 '(default-input-method "rfc1345")
 '(global-font-lock-mode t nil (font-lock))
 '(show-paren-mode t nil (paren))
 ;; -------------------- pas par défaut --------------------------------------;;
 ;; Pour spécifier globalement (?)  l'indentation à 4 espaces,
 ;; nécéssaire pour la mise en page de R
 '(c-basic-offset 4)
 '(c-default-style "bsd")
 ;; -------------------- fin pas par défaut ----------------------------------;;
 )
(custom-set-faces)


;; Changement de mode majeur par touche fonction
(global-set-key [f1] 'html-mode)
(global-set-key [f2] 'sql-mode)
(global-set-key [f3] 'tex-mode)
(global-set-key [f4] 'text-mode)
(global-set-key [f5] 'php-mode)
(global-set-key [f6] 'perl-mode)
(global-set-key [f7] 'java-mode)
(global-set-key [f8] 'c-mode)
(global-set-key [f9] 'c++-mode)




;; -------------------------------------------------------------------------- ;;
;;                              Affichage - Sessions                          ;;
;; -------------------------------------------------------------------------- ;;

;; Choix du thème :
;(color-theme-bharadwaj-slate)
(color-theme-charcoal-black)
;(color-theme-classic)
;(color-theme-deep-blue )
;(color-theme-ld-dark)	
;(color-theme-midnight)
;(color-theme-pok-wog)
;(color-theme-resolve)	
;(color-theme-shaman)
;(color-theme-subtle-hacker)

;; Choix de la police :
(set-default-font "Monospace-10")
;(set-default-font "Bitstream Vera Sans Mono-11")

;; Pour enregistrer automatiquement la position du curseur quand on quitte un 
;; fichier, et y retourner automatiquement à la réouverture
(require 'saveplace)
(setq-default save-place t)

;; Correcteur orthographique : utiliser aspell
(setq-default ispell-program-name "aspell")
(setq-default ispell-extra-args '("--reverse"))

;; Pour utiliser la correction à la volée avec flyspell
(add-hook 'LaTeX-mode-hook 'flyspell-mode)
(autoload 'flyspell-mode "flyspell" "On-the-fly spelling checker." t)
(autoload 'flyspell-delay-command "flyspell" "Delay on command." t)
(autoload 'tex-mode-flyspell-verify "flyspell" "" t) 
(setq flyspell-sort-corrections nil)
;; Censé utiliser le langage de babel :
(autoload 'flyspell-babel-setup "flyspell-babel")
(add-hook 'latex-mode-hook 'flyspell-babel-setup)

;; Les 'beep' deviennent visibles (et non plus audibles)
(setq visible-bell t)

;; Circuler entre les vues par ctrl-tab 
(global-set-key [(ctrl tab)] 'bury-buffer) 
;; Annuler par ctrl-z
(global-set-key [(control z)] 'undo)
;; Remplacer par alt-r
(global-unset-key "\M-r")
(global-set-key "\M-r" 'replace-string)

;; Activer le mode 'PC' (sélection avec shift, ctrl-suppr/ins pour 
;; copier/coller, etc.)
(pc-selection-mode)

;; Désactive les différentes barres
;; barre de menu
;(menu-bar-mode -1)
;; barre d'outils
(tool-bar-mode -1)
;; la barre de défilement
(scroll-bar-mode -1)

;; Mettre un titre aux fenêtres plutôt que emacs21@localhost.localdomain
(setq frame-title-format '(buffer-file-name "Emacs: %b (%f)" "Emacs: %b"))

;; Afficher le numéro de colonne (la commande line-number ne sert à rien...)
(column-number-mode 1)
(line-number-mode 1)

;; Pas de message à l'ouverture d'une session
(setq inhibit-startup-message t)

;; Les buffers sur lesquels je ne veux pas "switcher"
;; Y a une faille... à trouver !
(defun yic-ignore (str)
  (or
   (string-match "\\*Buffer List\\*" str)
   (string-match "^TAGS" str)
   (string-match "^\\*Messages\\*$" str)
   (string-match "^\\*Completions\\*$" str)
   (string-match "^\\*scratch\\*$" str)
   (string-match "^\\*ESS\\*$" str)
   (string-match "^ " str)
   (string-match "Mew message" str)
   (string-match "output\\*$" str)
   (string-match "compilation" str)
   (string-match "^\\*TeX silent\\*$" str)
   (string-match "+inbox" str)
   ))

(defun yic-next (ls)
  "Switch to next buffer in ls skipping unwanted ones."
  (let* ((ptr ls)
	 bf bn go
	 )
    (while (and ptr (null go))
	   (setq bf (car ptr)  bn (buffer-name bf))
	   (if (null (yic-ignore bn))        ;skip over
	     (setq go bf)
	     (setq ptr (cdr ptr))
	     )
	   )
    (if go
      (switch-to-buffer go))))

(defun yic-prev-buffer ()
  "Switch to previous buffer in current window."
  (interactive)
  (yic-next (reverse (buffer-list))))

(defun yic-next-buffer ()
  "Switch to the other buffer (2nd in list-buffer) in current window."
  (interactive)
  (bury-buffer (current-buffer))
  (yic-next (buffer-list)))



;; -------------------------------------------------------------------------- ;;
;;                                     Edition                                ;;
;; -------------------------------------------------------------------------- ;;

;; Make the mode-line display the standard EOL-TYPE symbols (used above)...
(setq eol-mnemonic-undecided "(?)"  ;; unknown EOL type
      eol-mnemonic-unix  "(unix)"   ;; LF
      eol-mnemonic-dos  "(dos)"	    ;; CRLF
      eol-mnemonic-mac  "(mac)")    ;; CR

;; Supprime tous les espaces en fin de ligne
;; http://www.splode.com/users/friedman/software/emacs-lisp/
(autoload 'nuke-trailing-whitespace "whitespace" nil t)

;; Activer la coloration syntaxique
(global-font-lock-mode t)
;; Mettre un maximum de couleurs
(setq font-lock-maximum-size nil)

;; Surlignage d'une région sélectionnée
(setq-default transient-mark-mode t)
(transient-mark-mode t)

;; Parenthese matching, permet de verifier au fur et à mesure de la frappe que 
;; l'on ferme bien ce que l'on ouvre, aussi bien pour les parenthèses que les 
;; crochets ou les accolades. 
(require 'paren)
(show-paren-mode 1) 
(setq-default hilight-paren-expression t) 

;; Ferme automatiquement parenthèses, crochets, guillemets
;; au cours de la frappe
(setq skeleton-pair t)
(global-set-key "(" 'skeleton-pair-insert-maybe)
(global-set-key "[" 'skeleton-pair-insert-maybe)
(global-set-key "\"" 'skeleton-pair-insert-maybe)
(global-set-key "'" 'skeleton-pair-insert-maybe)
(global-set-key "{" 'skeleton-pair-insert-maybe)





;; -------------------------------------------------------------------------- ;;
;;                     Registres ( = ancres) avec F1-12                       ;;
;; -------------------------------------------------------------------------- ;;

(global-set-key [(f1)] '(lambda () (interactive) ( jump-to-register 31 nil)))
(global-set-key [(control f1)] '(lambda () 
                                 (interactive) (point-to-register 31 nil)))
(global-set-key [(f2)] '(lambda () (interactive) ( jump-to-register 32 nil)))
(global-set-key [(control f2)] '(lambda () 
                                 (interactive) (point-to-register 32 nil)))
(global-set-key [(f3)] '(lambda () (interactive) ( jump-to-register 33 nil)))
(global-set-key [(control f3)] '(lambda ()
				 (interactive) (point-to-register 33 nil)))
(global-set-key [(f4)] '(lambda () (interactive) ( jump-to-register 34 nil)))
(global-set-key [(control f4)] '(lambda ()
				 (interactive) (point-to-register 34 nil)))
(global-set-key [(f5)] '(lambda () (interactive) ( jump-to-register 35 nil)))
(global-set-key [(control f5)] '(lambda ()
				 (interactive) (point-to-register 35 nil)))
(global-set-key [(f6)] '(lambda () (interactive) ( jump-to-register 36 nil)))
(global-set-key [(control f6)] '(lambda ()
				 (interactive) (point-to-register 36 nil)))
(global-set-key [(f7)] '(lambda () (interactive) ( jump-to-register 37 nil)))
(global-set-key [(control f7)] '(lambda ()
				 (interactive) (point-to-register 37 nil)))
(global-set-key [(f8)] '(lambda () (interactive) ( jump-to-register 38 nil)))
(global-set-key [(control f8)] '(lambda ()
				 (interactive) (point-to-register 38 nil)))
(global-set-key [(f9)] '(lambda () (interactive) ( jump-to-register 39 nil)))
(global-set-key [(control f9)] '(lambda ()
				 (interactive) (point-to-register 39 nil)))
(global-set-key [(f10)] '(lambda () (interactive) ( jump-to-register 40 nil)))
(global-set-key [(control f10)] '(lambda ()
				 (interactive) (point-to-register 40 nil)))
(global-set-key [(f11)] '(lambda () (interactive) ( jump-to-register 41 nil)))
(global-set-key [(control f11)] '(lambda ()
				 (interactive) (point-to-register 41 nil)))
(global-set-key [(f12)] '(lambda () (interactive) ( jump-to-register 42 nil)))
(global-set-key [(control f12)] '(lambda ()
				 (interactive) (point-to-register 42 nil)))



;; -------------------------------------------------------------------------- ;;
;;                                      Divers                                ;;
;; -------------------------------------------------------------------------- ;;

;; Pour ne pas avoir à taper en entier la réponse yes/no
(fset 'yes-or-no-p 'y-or-n-p)

;; Affichage des images et fichiers compressés
(setq auto-image-file-mode t)
(setq auto-compression-mode t)

;; Molette de la souris
(defun up-slightly () (interactive) (scroll-up 5))
(defun down-slightly () (interactive) (scroll-down 5))
(global-set-key [mouse-4] 'down-slightly)
(global-set-key [mouse-5] 'up-slightly)
(defun up-one () (interactive) (scroll-up 1))
(defun down-one () (interactive) (scroll-down 1))
(global-set-key [S-mouse-4] 'down-one)
(global-set-key [S-mouse-5] 'up-one)
(defun up-a-lot () (interactive) (scroll-up))
(defun down-a-lot () (interactive) (scroll-down))
(global-set-key [C-mouse-4] 'down-a-lot)
(global-set-key [C-mouse-5] 'up-a-lot)

;; visualisation fichiers compresses
(auto-compression-mode 1)

;; pour utiliser le format européen pour la calendrier. 
(setq european-calendar-style 't)
;; on va dire que les semaines commencent le lundi, et non le dimanche.
(setq calendar-week-start-day 1)
;;calendar en Français 
(setq calendar-day-name-array ["Dimanche" "Lundi" "Mardi" "Mercredi" "Jeudi"
			       "Vendredi" "Samedi"]) 
(setq calendar-month-name-array ["Janvier" "Février" "Mars" "Avril" "Mai" "Juin"
				 "Juillet" "Août" "Septembre" "Octobre"
				 "Novembre" "Décembre"])

;; Quand on reçoit un fichier .txt d'une machine dos/windows, 
;; il est très énervant de voir les ^M à chaque fin de ligne.
;; Utiliser M-x dos-unix pour vous en debarrasser.
;; dos-unix
(defun dos-unix ()
(interactive)
(goto-char (point-min))
(while (search-forward "\r" nil t) (replace-match "")))

;; C'est l'inverse du precedent.
;; unix2dos
(defun unix-dos ()
(interactive)
(goto-char (point-min))
(while (search-forward "\n" nil t) (replace-match "\r\n"))) 


;; -------------------------------------------------------------------------- ;;
;;                                PHP - HTML - CSS                            ;;
;; -------------------------------------------------------------------------- ;;

;; Manuel php en français
(setq php-manual-url "http://www.nexen.net/docs/php/annotee/manual.php")

;; Utiliser le html-helper-mode, http://www.gest.unipd.it/~saint/hth.html
(autoload 'php-html-helper-mode "html-helper-mode" "html-helper-mode" t)

;; Ajoute un mode pour éditer du php
;; http://www.ontosys.com/reports/PHP.html
(autoload 'php-mode "php-mode" "PHP editing mode" t)
(add-to-list 'auto-mode-alist '("\\.php\\'" . php-mode))
(add-to-list 'auto-mode-alist '("\\.php3\\'" . php-mode))
(add-to-list 'auto-mode-alist '("\\.php4\\'" . php-mode))

;; Utiliser le menu expert
(setq html-helper-use-expert-menu t)
;; Indenter automatiquement lorsque l'on appuie sur entrée
(defun my-html-helper-load-hook ()
(define-key html-mode-map (kbd "RET") 'newline-and-indent)
)
(add-hook 'html-helper-load-hook 'my-html-helper-load-hook)

;; Utiliser PSGML pour les fichiers SGML, HTML, XML
(autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t)
(autoload 'xml-mode "psgml" "Major mode to edit XML files." t)

;; Ajoute un mode CSS
;; nécéssite d'installer le paquet css-mode
(autoload 'css-mode "css-mode")
(setq auto-mode-alist       
     (cons '("\\.css\\'" . css-mode) auto-mode-alist))



;; -------------------------------------------------------------------------- ;;
;;                                    LaTeX                                   ;;  
;; -------------------------------------------------------------------------- ;;

;; Pour écrire un .tex en utf-8, installer le package latex-ucs.
;; Ajouter dans le préambule des fichiers LaTeX :
;; \usepackage{ucs}
;; \usepackage[utf8x]{inputenc}


;; Mode LaTeX + AUCTeX
(require 'tex-site)
;; Commande par défaut pour le visionnage : xdvi
(setq tex-dvi-view-command "xdvi")
;; Charger RefTeX
(add-hook 'LaTeX-mode-hook 'turn-on-reftex)

;; Définir le répertoire de la bibliographie
(setq reftex-bibpath-environment-variables
      '("/home/mathieu/Travail/Bibliographie/"))

;; Pour que la compilation en tex se fasse directement en pdf
;(set-variable (quote latex-run-command) "pdflatex")

;; Mode LaTeX : retour automatique à la ligne au bout du 90e caractère
(setq LaTex-mode-hook
      (lambda ()
	(auto-fill-mode t)
	(setq fill-column 90)
	))
(setq latex-mode-hook
      (lambda ()
	(auto-fill-mode t)
 	(setq fill-column 90)
 	))
(setq TeX-mode-hook
      (lambda ()
 	(auto-fill-mode t)
 	(setq fill-column 90)
 	))
(setq tex-mode-hook
      (lambda ()
	(auto-fill-mode t)
 	(setq fill-column 90)
 	))



;; -------------------------------------------------------------------------- ;;
;;                                     ESS                                    ;;  
;; -------------------------------------------------------------------------- ;;


;; Pour avoir R en anglais, y compris sous Emacs
;; Dans un terminal, enlever les ;; puis lancer d'un coup 
;; echo -e "#\041/bin/sh
;; #
;; 
;; echo -e \042
;; ### Pour avoir les messages sous R en anglais
;; LANGUAGE=en\042 >> /usr/lib/R/etc/Renviron\n\nexit 0" > R_en.sh
;; sudo sh R_en.sh
;; rm R_en.sh


;; Ne demande pas le répertoire de démarrage, utilise les valeurs par défaut
(setq ess-ask-for-ess-directory nil)

;; Lance les processus R dans le buffer du bas (pas besoin d'en créer un)
(setq inferior-ess-same-window nil)

;; Pour spécifier le style d'écriture de R
;; nécessite les deux lignes spécifiées dans "Variables d'environnement"
(add-hook 'ess-mode-hook
	  '(lambda()
	     (ess-set-style 'C++ 'quiet)
	     (add-hook 'local-write-file-hooks
		       '(lambda()
			  (delete-trailing-whitespace))))) 

;; Pour ajouter à la liste d'association les .Rhistory pour les traîter comme
;; des fichiers sources R
(setq auto-mode-alist
      (append
       '(("\\.[rR]history\\'" . R-mode))
       auto-mode-alist))

;; Pour avoir la liste des arguments d'une fonction
;; http://www.svenhartenstein.de/emacs-ess.php
(defun my-r-show-args ()
  "Show arguments and their default values of function in minibuffer."
  (interactive "*")
  (let ((pointposition (point)))
    (up-list -1)
    (let ((posend (point)))
	(backward-sexp 1)
	(setq object (buffer-substring-no-properties posend (point)))
	(ess-command (concat "try(args(" object "), silent=TRUE)\n")
		     (get-buffer-create "*my-r-args-completion*"))
	)
    (goto-char pointposition)
    )
  (with-current-buffer "*my-r-args-completion*"
    (goto-char (point-min))
    (if (equal nil (search-forward "function" 10 t))
	  (message my-r-noargsmsg)
	(goto-char (point-min))
	(zap-to-char 1 (string-to-char "("))
	(goto-char (point-max))
	(zap-to-char -1 (string-to-char ")"))
	(delete-trailing-whitespace)
	(if (equal my-r-show-as "tooltip")
	    (tooltip-show (concat "ARGS: " (buffer-string)))
	  (message (concat "ARGS: " (buffer-string)))
	  )))
  (kill-buffer "*my-r-args-completion*")
  )
(defvar my-r-noargsmsg ""
  "The message that is returned if my-r-show-args does not find a list
of arguments.")
(defvar my-r-show-as nil
  "How my-r-show-args should show the argument list. Possible values
are: 'message' (the default) or 'tooltip'.")
(setq my-r-noargsmsg "") ; no message when no arguments found
(setq my-r-show-as "message") ; show arguments as message
;(setq my-r-show-as "tooltip") ; show arguments as tooltip
;; bind my-r-show-args to F2
(define-key ess-mode-map [f2] 'my-r-show-args)
;; call my-r-show-args automatically
(define-key ess-mode-map "(" '(lambda nil "" (interactive)
				  (skeleton-pair-insert-maybe nil)
				  (my-r-show-args)))





;; -------------------------------------------------------------------------- ;;
;;                                   Lilypond                                 ;;  
;; -------------------------------------------------------------------------- ;;


(autoload 'LilyPond-mode "lilypond-mode")
(setq auto-mode-alist
      (cons '("\\.ly$" . LilyPond-mode) auto-mode-alist))

(add-hook 'LilyPond-mode-hook (lambda () (turn-on-font-lock)))