Various changes.
[elisp.git] / emacs.el
index 74119d2..64500c7 100644 (file)
--- a/emacs.el
+++ b/emacs.el
@@ -1,4 +1,4 @@
-;; -*-Emacs-Lisp-*-
+;; -*- mode: Emacs-Lisp; mode: rainbow; -*-
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; This program is free software; you can redistribute it and/or         ;;
@@ -42,6 +42,7 @@
 
 (add-to-list 'load-path "~/sources/gpl/elisp")
 (add-to-list 'load-path "~/sources/elisp")
+(add-to-list 'load-path "~/local/elisp")
 
 ;; No, I do not like menus
 (menu-bar-mode -1)
@@ -81,7 +82,7 @@
 (icomplete-mode 1)
 
 ;; (setq highlight-current-line-globally t
-      ;; highlight-current-line-ignore-regexp "Faces\\|Colors\\| \\*Mini\\|\\*media\\|INBOX")
+;; highlight-current-line-ignore-regexp "Faces\\|Colors\\| \\*Mini\\|\\*media\\|INBOX")
 
 ;; (highlight-current-line-minor-mode 1)
 ;; (highlight-current-line-set-bg-color "gray75")
@@ -198,6 +199,8 @@ load-warning buffer in case of failure."
  ;; And I like ascii files
  epa-armor t
 
+ tramp-default-method "ssh"
+
  ;; I have no problem with files having their own local variables
  enable-local-eval t
 
@@ -222,6 +225,15 @@ load-warning buffer in case of failure."
  backup-by-copying-when-linked t
  )
 
+(setq
+ user-emacs-directory "~/misc/emacs.d/")
+
+(setq
+ abbrev-file-name (concat user-emacs-directory "abbrev_defs")
+ server-auth-dir (concat user-emacs-directory "server/")
+ custom-theme-directory user-emacs-directory
+ )
+
 ;; Stop this crazy blinking cursor
 (blink-cursor-mode 0)
 
@@ -328,11 +340,11 @@ load-warning buffer in case of failure."
 
 ;; ;; If my own letter icon is here, use it and change its color
 ;; (when (file-exists-p "~/local/share/emacs/letter.xbm")
-  ;; (setq-default display-time-mail-icon
-                ;; (find-image
-                 ;; '((:type xbm
-                          ;; :file "~/local/share/emacs/letter.xbm"
-                          ;; :ascent center)))))
+;; (setq-default display-time-mail-icon
+;; (find-image
+;; '((:type xbm
+;; :file "~/local/share/emacs/letter.xbm"
+;; :ascent center)))))
 
 ;; My funky setting of face colors. Basically, we switch to a sober
 ;; look and darken a bit the colors which need to (because of the
@@ -374,6 +386,7 @@ load-warning buffer in case of failure."
      (font-lock-function-name-face :foreground "cyan")
      (flyspell-incorrect-face :foreground "red2")
      (flyspell-duplicate-face :foreground "OrangeRed2")
+     (hl-line :background "white")
      (sh-heredoc :foreground "blue")
      (sh-heredoc-face :foreground "blue")
      (font-lock-keyword-face :foreground "blue")
@@ -404,12 +417,12 @@ load-warning buffer in case of failure."
 ;; (ff/configure-faces '((default :background "gray80" :foreground "black")))
 
 (when window-system
-  (setq
-   display-time-use-mail-icon t)
+  ;; (setq
+  ;; display-time-use-mail-icon t)
 
   (ff/configure-faces
    '(
-     (escape-glyph :foreground "gray70" :weight 'bold)
+     (escape-glyph :foreground "#c0c0c0" :weight 'bold)
      (default :background "gray90" :foreground "black")
      (cperl-array-face :background "gray90" :foreground "blue" :weight 'bold)
      (cperl-hash-face :background "gray90" :foreground "purple" :weight 'bold)
@@ -425,9 +438,11 @@ load-warning buffer in case of failure."
      (font-lock-string-face :foreground "dark olive green")
      (font-lock-variable-name-face :foreground "sienna")
      (font-lock-function-name-face :foreground "blue4" :weight 'bold)
-     ;; (font-lock-comment-face :foreground "")
+     ;; (font-lock-comment-delimiter-face :foreground "dark violet")
+     ;; (font-lock-comment-face :foreground "dark violet")
      (flyspell-incorrect-face :foreground "red2")
      (flyspell-duplicate-face :foreground "OrangeRed2")
+     (hl-line :background "white")
      (header-line :background "gray65")
      (sh-heredoc :foreground "darkorange3")
      (sh-heredoc-face :foreground "darkorange3")
@@ -435,7 +450,7 @@ load-warning buffer in case of failure."
      (message-cited-text-face :foreground "firebrick")
      (isearch :background "yellow" :foreground "black")
      (isearch-lazy-highlight-face' :background "yellow3" :foreground "black")
-     (region :background "light sky blue" :foreground "black")
+     (region :background "#b8b8e0" :foreground "black")
      ;; (region :background "plum" :foreground "black")
      (show-paren-match-face :background "gold" :foreground "black")
      (show-paren-mismatch-face :background "red" :foreground "black")
@@ -567,8 +582,8 @@ load-warning buffer in case of failure."
   "Prints the number of characters between the first previous \"--\"
 and the firt next \"--\"."
   (interactive)
-  (let ((from (save-excursion (re-search-backward "^--$" nil t)))
-        (to (save-excursion (re-search-forward "^--$" nil t))))
+  (let ((from (save-excursion (re-search-backward "^--$\\|BEGIN_COUNT" nil t)))
+        (to (save-excursion (re-search-forward "^--$\\|END_COUNT" nil t))))
     (if (and to from) (message "%d character(s)" (- to from 6))
       (error "Can not find the -- delimiters"))))
 
@@ -645,15 +660,15 @@ occurrences "
 ;; Printing
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(require 'ps-print)
+(load "ps-print")
 
 (setq ps-print-color-p nil
       ;; ps-paper-type 'letter
       ps-paper-type 'a4
-      ps-top-margin (* 1.75 56.692)
-      ps-left-margin 56.692
-      ps-bottom-margin 56.692
-      ps-right-margin 56.692
+      ;; ps-top-margin (* 1.75 56.692)
+      ;; ps-left-margin 56.692
+      ;; ps-bottom-margin 56.692
+      ;; ps-right-margin 56.692
 
       ;; Simple header. Remove that silly frame shadow.
       ps-print-header nil
@@ -672,6 +687,26 @@ occurrences "
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+;; http://blog.tuxicity.se/elisp/emacs/2010/03/26/rename-file-and-buffer-in-emacs.htm
+
+(defun rename-file-and-buffer ()
+  "Renames current buffer and file it is visiting."
+  (interactive)
+  (let ((name (buffer-name))
+        (filename (buffer-file-name)))
+    (if (not (and filename (file-exists-p filename)))
+        (message "Buffer '%s' is not visiting a file!" name)
+      (let ((new-name (read-file-name "New name: " filename)))
+        (cond ((get-buffer new-name)
+               (message "A buffer named '%s' already exists!" new-name))
+              (t
+               (rename-file name new-name 1)
+               (rename-buffer new-name)
+               (set-visited-file-name new-name)
+               (set-buffer-modified-p nil)))))))
+
+(global-set-key (kbd "C-c r") 'rename-file-and-buffer)
+
 (defun ff/non-existing-filename (dir prefix suffix)
   "Returns a filename of the form DIR/PREFIX[.n].SUFFIX whose file does
 not exist"
@@ -727,103 +762,64 @@ printer."
 ;; Dealing with the laptop battery
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defcustom ff/battery-file "/proc/acpi/battery/BAT0"
+(defcustom ff/battery-dir "/sys/class/power_supply/BAT0"
   "*Where to gather the battery information")
 
-(defcustom ff/thermal-file "/proc/acpi/thermal_zone/THM1/"
+(defcustom ff/temperature-file "/sys/class/thermal/thermal_zone0/temp"
   "*Where to gather the thermal information")
 
-(defun ff/battery-info (path)
-
-  (let ((state nil)
-        (full nil)
-        (charge nil)
-        (rate nil))
+(defun ff/file-first-line (file)
+  (with-temp-buffer
+    (insert-file-contents-literally file)
+    (buffer-substring (point-at-bol) (point-at-eol))))
 
-    (with-temp-buffer
-      (insert-file-contents-literally (concat path "/state"))
-      (while (re-search-forward "^\\([a-z ]*\\): *\\(.*\\)$" nil t)
-        (let ((field (match-string 1))
-              (value (match-string 2)))
-
-          (cond ((string= field "charging state")
-                 (cond ((string= value "charged") (setq state 'charged))
-                       ((string= value "charging") (setq state 'charging))
-                       ((string= value "discharging")(setq state 'discharging))
-                       (t (setq state 'unknown))))
-
-                ((string= field "remaining capacity")
-                 (setq charge (string-to-number value)))
-
-                ((string= field "present rate")
-                 (setq rate (string-to-number value)))))))
-
-    (with-temp-buffer
-      (insert-file-contents-literally (concat path "/info"))
-      (while (re-search-forward "^\\([a-z ]*\\): *\\(.*\\)$" nil t)
-        (let ((field (match-string 1))
-              (value (match-string 2)))
-
-          (cond ((string= field "last full capacity")
-                 (setq full (string-to-number value)))))))
-
-    (list state full charge rate)))
-
-(defun ff/thermal-info (path)
-  (let ((temperature nil))
-    (with-temp-buffer
-      (insert-file-contents-literally (concat path "/temperature"))
-      (while (re-search-forward "^\\([a-z ]*\\): *\\(.*\\)$" nil t)
-        (let ((field (match-string 1))
-              (value (match-string 2)))
-
-          (cond ((string= field "temperature")
-                 (setq temperature (string-to-number value)))))))
-
-    (list temperature)))
+(defun ff/battery-percent (prefix)
+  (condition-case nil
+      (/ (* 100 (string-to-number (ff/file-first-line (format "%s/%s_now" ff/battery-dir prefix))))
+         (string-to-number (ff/file-first-line (format "%s/%s_full"  ff/battery-dir prefix))))
+    (error -1))
+    )
 
 (defun ff/laptop-info-string () (interactive)
   (condition-case nil
-      (let ((info (ff/battery-info ff/battery-file))
-            (temperature (car (ff/thermal-info ff/thermal-file))))
-
-        (concat
+      (concat
 
-         ;; The temperature
+       ;; The temperature
 
-         (if (> temperature 50)
+       (let ((temp (/ (string-to-number (ff/file-first-line ff/temperature-file)) 1000)))
+         (if (> temp 50)
              (concat
-              (let ((s (format "%dC" temperature)))
-                (if (> temperature 65) (propertize s 'face
-                                                   'font-lock-warning-face)
+              (let ((s (format "%dC " temp)))
+                (if (> temp 65) (propertize s 'face
+                                            'font-lock-warning-face)
                   s))
-              "/"
               )
            )
+         )
+
+       ;; The battery
 
-         ;; The battery
+       (let ((battery-status (ff/file-first-line (concat ff/battery-dir "/status"))))
 
          (cond
+          ((string= battery-status "Full") "L")
 
-          ((eq (nth 0 info) 'charged) "L")
+          ((string= battery-status "Charging")
+           (format "L%d%%" (max (ff/battery-percent "charge")
+                                (ff/battery-percent "energy"))))
 
-          ((eq (nth 0 info) 'discharging)
-           (let* ((time (/ (* (nth 2 info) 60) (nth 3 info)))
-                  (s (format "B%d:%02d" (/ time 60) (mod time 60))))
-             (if (< time 15)
-                 ;; Les than 15 minutes, let's write the remaining
-                 ;; time in red
-                 (propertize s 'face 'font-lock-warning-face)
-               s)))
+          ((string= battery-status "Discharging")
+           (format "B%d%%"  (max (ff/battery-percent "charge")
+                                 (ff/battery-percent "energy"))))
 
-          ((eq (nth 0 info) 'charging)
-           (format "L%2d%%" (/ (* 100 (nth 2 info)) (nth 1 info))))
+          (t battery-status)
 
-          (t (format "???"))
+          ))
 
-          )))
+       )
 
-    (error nil)))
+    (error nil))
+  )
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
@@ -846,7 +842,7 @@ printer."
                    (propertize
                     (with-temp-buffer (apply 'call-process x)
                                       (buffer-string))
-                    'face '(:background "gray80"))
+                    'face '(:background "#c0c0ff"))
                  (with-temp-buffer (apply 'call-process x)
                                    (buffer-string))
                  ))
@@ -918,8 +914,8 @@ printer."
 
                              )
 
- ;;  display-time-format "%b %a %e %H:%M"
- ;;  display-time-mail-face nil
+ ;; display-time-format "%b %a %e %H:%M"
+ ;; display-time-mail-face nil
  )
 
 ;; Show the time, mail and stuff
@@ -958,6 +954,11 @@ printer."
 
 (load "term")
 
+(defun ff/kill-associated-buffer (process str) (interactive)
+  (let ((buffer (process-buffer process)))
+    (kill-buffer buffer))
+  (message "Process finished (%s)" (replace-regexp-in-string "\n$" "" str)))
+
 (defun ff/kill-associated-buffer-and-delete-windows (process str) (interactive)
   (let ((buffer (process-buffer process)))
     (delete-windows-on buffer)
@@ -1004,9 +1005,12 @@ In line mode: M-p previous line, M-n next line.")
     (let ((process (get-buffer-process (current-buffer))))
       (process-kill-without-query process)
       (set-process-sentinel process
-                            'ff/kill-associated-buffer-and-delete-windows))
+                            ;; 'ff/kill-associated-buffer-and-delete-windows
+                            'ff/kill-associated-buffer
+                            ))
 
-    (switch-to-buffer-other-window (concat "*" bn "*"))
+    ;; (switch-to-buffer-other-window (concat "*" bn "*"))
+    (switch-to-buffer (concat "*" bn "*"))
     ))
 
 (defcustom ff/default-bash-commands '("ssh")
@@ -1035,7 +1039,7 @@ of commands in `ff/default-bash-commands' is used for auto-completion"
  vc-follow-symlinks t
  )
 
-(when (require 'vc-git nil t)
+(when (load "vc-git" nil t)
   (add-to-list 'vc-handled-backends 'GIT))
 
 ;; alarm-vc.el is one of my own scripts, check my web page
@@ -1053,21 +1057,24 @@ of commands in `ff/default-bash-commands' is used for auto-completion"
 
 ;; Please consider the security-related consequences of using it
 
-(defun ff/make-shell-scripts-executable (&optional filename)
-  (setq filename (or filename (buffer-name)))
-  (when (and (string-match "\\.sh$\\|\\.pl$\\|\\.rb" filename)
-             (not (file-executable-p filename))
-             )
-    (set-file-modes filename 493)
-    (message "Made %s executable" filename)))
+;; (defun ff/make-shell-scripts-executable (&optional filename)
+;; (setq filename (or filename (buffer-name)))
+;; (when (and (string-match "\\.sh$\\|\\.pl$\\|\\.rb" filename)
+;; (not (file-executable-p filename))
+;; )
+;; (set-file-modes filename 493)
+;; (message "Made %s executable" filename)))
+
+;; (add-hook 'after-save-hook 'ff/make-shell-scripts-executable)
 
-(add-hook 'after-save-hook 'ff/make-shell-scripts-executable)
+(add-hook 'after-save-hook
+          'executable-make-buffer-file-executable-if-script-p)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Cool stuff to navigate in emacs-lisp sources
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(require 'find-func)
+(load "find-func")
 
 (defun ff/goto-function-definition (&optional goback)
   "Go directly to the definition of the function at point. With
@@ -1129,7 +1136,7 @@ goback argument, go back where we were."
     "The face to display known mail identities.")
 
   (defface ff/unknown-address-face
-    '((t (:foreground "red3")))
+    '((t (:foreground "red4")))
     "The face to display unknown mail identities.")
 
   (defun ff/explicit-name (email)
@@ -1158,7 +1165,7 @@ ff/known-address-face is used."
                                             (bbdb-record-raw-notes record)))
                                 'ff/known-address-face))
               (error
-               (propertize (or (and data (concat "<" email ">"))
+               (propertize (or (and data (concat "<" net ">"))
                                "*undefined*")
                            'face 'ff/unknown-address-face)
                ))
@@ -1274,12 +1281,15 @@ universal argument starts xfig even if the .fig does not exist"
                   (or (re-search-forward "{\\([^{}]*.\\)eps}" (point-at-eol) t)
                       (re-search-forward "{\\([^{}]*.\\)pdf}" (point-at-eol) t)
                       (re-search-forward "{\\([^{}]*.\\)pdf_t}" (point-at-eol) t)
+                      (re-search-forward "{\\([^{}]*.\\)png}" (point-at-eol) t)
+                      (re-search-forward "{\\([^{}]*.\\)jpg}" (point-at-eol) t)
                       )))
            (and (<= (match-beginning 1) (point))
                 (>= (match-end 1) (- (point) 2))))
 
       (ff/run-eps-edition (match-string-no-properties 1)
                           '(("fig" . "xfig")
+                            ("jpg" . "gimp" )
                             ("png" . "gimp") ("pgm" . "gimp") ("ppm" . "gimp")
                             ("jpg" . "xv"))
                           universal)
@@ -1368,6 +1378,10 @@ universal argument starts xfig even if the .fig does not exist"
 (when (ff/load-or-alert "lookup-dict" t)
   (define-key global-map [(control \?)] 'lookup-dict))
 
+;; (defun ff/generate-password () (interactive)
+;; (let ((c "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-"))
+;; (nth (random (length c)) c))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Automatization of things I do often
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1388,26 +1402,37 @@ universal argument starts xfig even if the .fig does not exist"
   (insert "%% -*- mode: latex; mode: reftex; mode: flyspell; coding: utf-8; tex-command: \"pdflatex.sh\" -*-
 
 \\documentclass[12pt]{article}
-\\usepackage{epsfig}
-\\usepackage{a4}
+\\usepackage[a4paper,top=2.5cm,bottom=2cm,left=1.5cm,right=1.5cm]{geometry}
+\\usepackage[utf8]{inputenc}
 \\usepackage{amsmath}
 \\usepackage{amssymb}
-\\usepackage[utf8]{inputenc}
+\\usepackage{hyperref}
+
+%% \\usepackage[pdftex]{graphicx}
 %% \\usepackage{eurosym}
-%% \\usepackage{hyperref}
-%% \\usepackage{harvard}
 
+\\hypersetup{
+  colorlinks=true,
+  linkcolor=blue,
+  urlcolor=blue,
+  citecolor=blue
+}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% Sans serif fonts
 %% \\usepackage[T1]{fontenc}
 %% \\usepackage[scaled]{helvet}
 %% \\usepackage[cm]{sfmath}
 %% \\renewcommand{\\ttdefault}{pcr}
 %% \\renewcommand*\\familydefault{\\sfdefault}
-
-\\setlength{\\parindent}{0cm}
-\\setlength{\\parskip}{12pt}
-
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% \\def\\argmax{\\operatornamewithlimits{argmax}}
+%% \\def\\argmin{\\operatornamewithlimits{argmin}}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% \\setlength{\\parindent}{0cm}
+%% \\setlength{\\parskip}{12pt}
 %% \\renewcommand{\\baselinestretch}{1.3}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 \\begin{document}
 
@@ -1425,25 +1450,12 @@ universal argument starts xfig even if the .fig does not exist"
 (defun ff/add-copyrights ()
   "Adds two lines for the (C) at the beginning of current buffer."
   (interactive)
-  (let ((comment-style 'plain)
-        (gpl
-         (concat
-
-          "\nSTART_IP_HEADER\n"
-
-          (when (boundp 'user-full-name)
-            (concat "\nWritten by " user-full-name "\n"))
-
-          (when (boundp 'user-mail-address)
-            (concat "Contact <" user-mail-address "> for comments & bug reports\n"))
 
-          "\nEND_IP_HEADER\n"
-
-          )))
+  (let ((comment-style 'plain))
 
     (goto-char (point-min))
 
-    ;; If this is a script, put the gpl after the first line
+    ;; If this is a script, put the copyrights after the first line
 
     (when (re-search-forward "^#!" nil t)
       (beginning-of-line)
@@ -1451,13 +1463,34 @@ universal argument starts xfig even if the .fig does not exist"
 
     (let ((start (point))
           (comment-style 'box))
-      (insert gpl)
+      (insert
+       (concat
+
+        "\nSTART_IP_HEADER\n"
+
+        (when (boundp 'user-full-name)
+          (concat "\nWritten by " user-full-name "\n"))
+
+        (when (boundp 'user-mail-address)
+          (concat "Contact <" user-mail-address "> for comments & bug reports\n"))
+
+        "\nEND_IP_HEADER\n"
+        ))
+
       (comment-region start (point)))
 
     ))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(defun ff/remove-ip-header () (interactive)
+  (save-excursion
+    (goto-char (point-min))
+    (when (and (re-search-forward "START_IP_HEADER" nil t)
+               (re-search-forward "END_IP_HEADER" nil t))
+      (message "yep"))
+    ))
+
 (defun ff/add-gpl ()
   "Adds the GPL statements at the beginning of current buffer."
   (interactive)
@@ -1518,6 +1551,24 @@ END_IP_HEADER
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(defun ff/start-c ()
+  "Adds the header to start a C program."
+  (interactive)
+  ;;   (beginning-of-buffer)
+  (insert
+   "
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char **argv) {
+  exit(EXIT_SUCCESS);
+}
+")
+  (previous-line 2)
+  )
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
 (defun ff/start-c++ ()
   "Adds the header to start a C++ program."
   (interactive)
@@ -1546,7 +1597,7 @@ int main(int argc, char **argv) {
   (interactive)
   (let ((flag-name (replace-regexp-in-string
                     "[\. \(\)]" "_"
-                    (upcase (file-name-nondirectory (buffer-name))))))
+                    (upcase (file-name-nondirectory (buffer-file-name))))))
     (goto-char (point-max))
     (insert "\n#endif\n")
     (goto-char (point-min))
@@ -1588,8 +1639,8 @@ int main(int argc, char **argv) {
 
 (defun ff/cout-var (arg)
   "Invoked on a line with a list of variables names,
-it inserts a line which displays their values in cout
-(or cerr if the function is invoked with a universal arg)"
+it inserts a line which displays their values in cout, or cerr if
+the function is invoked with a universal arg"
   (interactive "P")
   (let ((line (if arg "cerr" "cout")))
     (goto-char (point-at-bol))
@@ -1633,12 +1684,29 @@ and refilling all the paragraphs."
 "))
   )
 
-(add-hook 'latex-mode-hook (lambda ()
-                             (define-key latex-mode-map
-                               [(meta S)] 'ff/start-slide)
-                             (define-key latex-mode-map
-                               [(control c) (control a)] 'align-current)
-                             ))
+(add-hook
+ 'latex-mode-hook
+ (lambda ()
+   (define-key latex-mode-map [(meta S)] 'ff/start-slide)
+   (define-key latex-mode-map [(control c) (control a)] 'align-current)
+   (define-key latex-mode-map [(control end)] 'tex-close-latex-block)
+   (define-key latex-mode-map [(control tab)] 'ispell-complete-word)
+   ;; Strange that I have to specify that
+   ;; (setq paragraph-separate "[%     \f]*$")
+   ;; (setq paragraph-separate
+         ;; (concat "[%]*\\|[\f%]\\|[ \t]*\\($\\|"
+                 ;; "\\\\[][]\\|"
+                 ;; "\\\\" (regexp-opt (append
+                                     ;; (mapcar 'car latex-section-alist)
+                                     ;; '("begin" "label" "end" )) t)
+                 ;; "\\>\\|\\\\\\(" (regexp-opt '("item" "bibitem" "newline"
+                                               ;; "noindent" "newpage" "footnote"
+                                               ;; "marginpar" "parbox" "caption"))
+                 ;; "\\|\\$\\$\\|[a-z]*\\(space\\|skip\\|page[a-z]*\\)"
+                 ;; "\\>\\)[ \t]*\\($\\|%\\)\\)"))
+   ;; (flyspell-mode 1)
+   ;; (reftex-mode 1)
+   ))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
@@ -1758,10 +1826,16 @@ a file in /tmp"
         (previous-line 1)
         )
 
-      (when (string-match "\\.cc$" filename)
+      (when (string-match "\\.c$" filename)
+        (c-mode)
+        (ff/add-copyrights)
+        (ff/start-c))
+
+      (when (string-match "\.\\(cc\\|cpp\\)$" filename)
         (c++-mode)
         (ff/add-copyrights)
-        (let ((headername  (replace-regexp-in-string "\.cc" ".h" filename)))
+        (let ((headername  (replace-regexp-in-string "\\.\\(cc\\|cpp\\)$" ".h"
+                                                     filename)))
           (if (file-exists-p headername)
               (insert (concat "\n#include \"" (file-name-nondirectory headername) "\"\n"))
             (ff/start-c++))
@@ -1836,7 +1910,7 @@ a file in /tmp"
     )
   )
 
-(setq compilation-finish-functions (cons 'ff/restore-windows-if-no-error compilation-finish-functions))
+(add-to-list 'compilation-finish-functions 'ff/restore-windows-if-no-error)
 
 (defun ff/fast-compile ()
   "Compiles without asking anything."
@@ -1946,7 +2020,7 @@ This may be a useful alternative binding for \\[delete-other-windows]
 ;; Keymaping
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(require 'info nil t)
+(load "info" nil t)
 
 (define-key global-map [(shift iso-lefttab)] 'ispell-complete-word)
 ;; shift-tab going backward is kind of standard
@@ -1997,13 +2071,11 @@ This may be a useful alternative binding for \\[delete-other-windows]
 
 ;; Closes the current \begin{}
 
-(add-hook 'latex-mode-hook (lambda () (define-key latex-mode-map [(control end)] 'tex-close-latex-block)))
-
 (when (ff/load-or-alert "longlines")
 
   (setq longlines-show-hard-newlines t
         longlines-auto-wrap t
-        longline-show-effect #(" -- |\n" 0 2 (face escape-glyph))
+        ;; longlines-show-effect #("|\n" 0 2 (face escape-glyph))
         )
 
   ;; (defun ff/auto-longlines ()
@@ -2018,11 +2090,6 @@ This may be a useful alternative binding for \\[delete-other-windows]
 
   )
 
-(add-hook 'latex-mode-hook
-          (lambda ()
-            (define-key latex-mode-map [(control tab)]
-              'ispell-complete-word)))
-
 ;; Meta-/ remaped (completion)
 
 (define-key global-map [(shift right)] 'dabbrev-expand)
@@ -2149,7 +2216,7 @@ next one. With universal argument, kill all killable buffers."
 ;; exclusively with my selector.el
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(require 'recentf)
+(load "recentf")
 
 (setq recentf-exclude
       (append recentf-exclude
@@ -2187,11 +2254,17 @@ next one. With universal argument, kill all killable buffers."
 (when (ff/load-or-alert "media")
 
   (unless window-system
-    (ff/configure-faces '(
-                          (media/mode-string-face :foreground "blue4" :weight 'bold)
-                          (media/current-tune-face :foreground "black" :background "yellow" :weight 'normal)
-                          (media/instant-highlight-face :foreground "black" :background "orange" :weight 'normal)
-                          ))
+    (ff/configure-faces
+     '(
+       (media/mode-string-face
+        :foreground "blue4" :weight 'bold)
+
+       (media/current-tune-face
+        :foreground "black" :background "yellow" :weight 'normal)
+
+       (media/instant-highlight-face
+        :foreground "black" :background "orange" :weight 'normal)
+       ))
     )
 
   (define-key global-map [(meta \\)] 'media)
@@ -2205,6 +2278,7 @@ next one. With universal argument, kill all killable buffers."
                              "-framedrop"
                              "-zoom"
                              "-subfont-osd-scale" "3"
+                             ;; "-stop-xscreensaver"
                              ;; "-osdlevel" "3"
                              )
         media/mplayer/timing-request-period 5.0
@@ -2218,7 +2292,7 @@ next one. With universal argument, kill all killable buffers."
 ;; selector.el is one of my own scripts, check my web page
 
 (when (ff/load-or-alert "selector" t)
-  (define-key global-map [(shift return)] 'selector/quick-move-in-buffer)
+  ;; (define-key global-map [(shift return)] 'selector/quick-move-in-buffer)
   (define-key global-map [(control x) (control b)] 'selector/switch-buffer)
 
   (defun ff/visit-debpkg-file (&optional regexp)
@@ -2319,6 +2393,32 @@ proposes to visit them."
   (flyspell-mode)
   (when flyspell-mode (flyspell-buffer)))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; The fridge!
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun ff/move-region-to-fridge () (interactive)
+  "Cut the current region, paste it in a file called ./fridge
+with a time tag, and save this file"
+  (unless (use-region-p) (error "No region selected"))
+  (let ((bn (file-name-nondirectory (buffer-file-name))))
+    (kill-region (region-beginning) (region-end))
+    (with-current-buffer (find-file-noselect "fridge")
+      (goto-char (point-max))
+      (insert "\n")
+      (insert "######################################################################\n")
+      (insert "\n"
+              (format-time-string "%Y %b %d %H:%M:%S" (current-time))
+              " (from "
+              bn
+              ")\n\n")
+      (yank)
+      (save-buffer)
+      (message "Region moved to fridge")
+      )
+    )
+  )
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; My own keymap
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2332,9 +2432,15 @@ proposes to visit them."
       (git-status (file-name-directory (buffer-file-name)))
     (error "No file attached to this buffer")))
 
+(defun ff/insert-date () (interactive)
+  (insert (format-time-string "\n * %Y %b %d %H:%M:%S\n\n" (current-time)))
+  )
+
 (define-key ff/map [(control g)] 'ff/git-status)
 (define-key ff/map [(control w)] 'server-edit)
 (define-key ff/map [(control d)] 'ff/elisp-debug-on)
+;; (define-key ff/map "d" 'diary)
+(define-key ff/map "d" 'ff/insert-date)
 (define-key ff/map [(control \`)] 'ff/bash-new-buffer)
 (define-key ff/map [(control n)] 'enotes/show-all-notes)
 (define-key ff/map [(control s)] 'ff/secure-note-add)
@@ -2346,6 +2452,7 @@ proposes to visit them."
 (define-key ff/map [(control c)] 'calendar)
 ;; (define-key ff/map [(control c)] (lambda () (interactive) (save-excursion (calendar))))
 (define-key ff/map [(control l)] 'goto-line)
+(define-key ff/map "l" 'longlines-mode)
 (define-key ff/map [(control o)] 'selector/quick-pick-recent)
 (define-key ff/map "s" 'selector/quick-move-in-buffer)
 (define-key ff/map "S" 'selector/search-sentence)
@@ -2362,6 +2469,7 @@ proposes to visit them."
   (lambda () (interactive)
     (bookmark-set)
     (bookmark-save)))
+(define-key ff/map "f" 'ff/move-region-to-fridge)
 (define-key ff/map [(control f)] 'ff/flyspell-mode)
 
 (define-key ff/map [?\C-0] 'ff/delete-annoying-windows)
@@ -2372,6 +2480,8 @@ proposes to visit them."
 (define-key ff/map "3" 'ff/twin-horizontal-current-buffer)
 (define-key ff/map [?\C-3] 'ff/twin-horizontal-current-buffer)
 
+(define-key ff/map " " 'delete-trailing-whitespace)
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Hacks so that all keys are functionnal in xterm and through ssh.
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2382,30 +2492,30 @@ proposes to visit them."
   ;; so that it works in xterm (yes), let's use xclip. This is a bit
   ;; ugly.
 
-  (defun ff/yank-with-xclip (&optional arg)
-    "Paste the content of the X clipboard with the xclip
-command. Without ARG converts some of the '\\uxxxx' characters."
-    (interactive "P")
-    (with-temp-buffer
-      (shell-command "xclip -o" t)
-      (unless arg
-        (mapc (lambda (x) (replace-string (concat "\\u" (car x)) (cdr x) nil (point-min) (point-max)))
-              '(("fffd" . "??")
-                ("2013" . "-")
-                ("2014" . "--")
-                ("2018" . "`")
-                ("2019" . "'")
-                ("201c" . "``")
-                ("201d" . "''")
-                ("2022" . "*")
-                ("2026" . "...")
-                ("20ac" . "EUR")
-                )))
-      (kill-ring-save (point-min) (point-max)))
-
-    (yank))
-
-  (define-key global-map [(meta y)] 'ff/yank-with-xclip)
+  ;; (defun ff/yank-with-xclip (&optional arg)
+    ;; "Paste the content of the X clipboard with the xclip
+;; command. Without ARG converts some of the '\\uxxxx' characters."
+    ;; (interactive "P")
+    ;; (with-temp-buffer
+      ;; (shell-command "xclip -o" t)
+      ;; (unless arg
+        ;; (mapc (lambda (x) (replace-string (concat "\\u" (car x)) (cdr x) nil (point-min) (point-max)))
+              ;; '(("fffd" . "??")
+                ;; ("2013" . "-")
+                ;; ("2014" . "--")
+                ;; ("2018" . "`")
+                ;; ("2019" . "'")
+                ;; ("201c" . "``")
+                ;; ("201d" . "''")
+                ;; ("2022" . "*")
+                ;; ("2026" . "...")
+                ;; ("20ac" . "EUR")
+                ;; )))
+      ;; (kill-ring-save (point-min) (point-max)))
+
+    ;; (yank))
+
+  ;; (define-key global-map [(meta y)] 'ff/yank-with-xclip)
 
   ;;   (set-terminal-coding-system 'iso-latin-1)
   ;; (set-terminal-coding-system 'utf-8)