Update.
[elisp.git] / emacs.el
index 0d565f1..96874b0 100644 (file)
--- a/emacs.el
+++ b/emacs.el
 ;; Contact <francois@fleuret.org> for comments & bug reports             ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+;; (defadvice display-warning (before ff/blah (type message &optional level buffer-name) activate)
+  ;; (message "--- BLAH %s ---" message)
+  ;; (backtrace)
+;; )
+
 ;; It's better to set the preferences in the .Xresources so that the
 ;; window is not first displayed with the wrong options
 
 ;; Xft.antialias: true
 ;; Xft.rgba: rgb
 
-(set-default-font "Inconsolata 15")
+;;(set-frame-font "Inconsolata 14")
+
+;; (package-initialize)
 
-;; (set-default-font "Bitstream vera sans mono-12")
+;; (set-default-font "Bitstream vera sans mono 12")
 ;; (set-default-font "Liberation Mono-13")
 ;; (set-default-font "DejaVu sans mono 15")
 ;; (set-default-font "Droid sans mono 13")
@@ -56,8 +63,8 @@
 
 ;; Where I keep my own scripts
 
-(add-to-list 'load-path "~/sources/gpl/elisp")
-(add-to-list 'load-path "~/sources/elisp")
+(add-to-list 'load-path "~/src/gpl/elisp")
+(add-to-list 'load-path "~/src/elisp")
 (add-to-list 'load-path "~/local/elisp")
 
 ;; No, I do not like menus
@@ -86,6 +93,8 @@
 ;; use colorization for all modes
 (global-font-lock-mode t)
 
+;; (load "auctex")
+
 (setq font-lock-maximum-decoration 3
       ;;'((latex-mode . 2) (t . 2))
       )
@@ -121,11 +130,16 @@ uses `load-path' to find it."
       (ff/compile-when-needed (concat name ".el"))
     (mapc (lambda (dir)
             (let* ((src (concat dir "/" name)))
+              ;; (message "Compiling " scr) ;;***********
               (when (file-newer-than-file-p src (concat src "c"))
-                (if (let ((byte-compile-verbose nil))
-                      (condition-case nil
-                          (byte-compile-file src)
-                        (error nil)))
+                (if
+                    ;; (let ((byte-compile-verbose nil))
+                      ;; (condition-case nil
+                          ;; (byte-compile-file src)
+                        ;; (error nil)))
+
+                    (byte-compile-file src)
+
                     (message (format "Compiled %s" src ))
                   (message (format "Failed compilation of %s" src))))))
           load-path)))
@@ -182,7 +196,7 @@ load-warning buffer in case of failure."
  next-error-highlight t
 
  ;; blink the screen instead of beeping
;; visible-bell t
+ visible-bell t
 
  ;; take the CR when killing a line
  kill-whole-line t
@@ -229,6 +243,10 @@ load-warning buffer in case of failure."
  epa-file-cache-passphrase-for-symmetric-encryption t
  ;; And I like ascii files
  epa-armor t
+ ;; This goes with in your ~/.gnupg/gpg-agent.conf:
+ ;; allow-emacs-pinentry
+ ;; allow-loopback-pinentry
+ epa-pinentry-mode 'loopback
 
  ;; tramp-default-method "ssh"
  tramp-default-method "scp"
@@ -247,9 +265,11 @@ load-warning buffer in case of failure."
  ;; vertically, even when the said window is very wide
  split-height-threshold 0
  split-width-threshold nil
-
  )
 
+(custom-set-variables
+ '(query-replace-from-to-separator nil))
+
 ;; The backups
 
 (setq
@@ -340,8 +360,12 @@ load-warning buffer in case of failure."
                                                 (flyspell-mode))))
 
 (add-hook 'c++-mode-hook 'flyspell-prog-mode)
+;; (add-hook 'lua-mode-hook 'flyspell-prog-mode)
 (add-hook 'log-edit-mode-hook 'flyspell-mode)
 
+(add-hook 'markdown-mode-hook 'flyspell-mode)
+(add-hook 'markdown-mode-hook 'auto-fill-mode)
+
 ;; I am a power-user
 
 (put 'narrow-to-region 'disabled nil)
@@ -386,14 +410,6 @@ load-warning buffer in case of failure."
 ;; "tool" bar? Are you kidding?
 (when (fboundp 'tool-bar-mode) (tool-bar-mode -1))
 
-;; ;; 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)))))
-
 ;; 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
 ;; darker background)
@@ -408,76 +424,11 @@ load-warning buffer in case of failure."
 ;; Not the same in xterm (which is gray in my case) and in
 ;; X-window
 
-(unless window-system
-  ;;     (xterm-mouse-mode 1)
-  (ff/configure-faces
-   '((italic :underline nil)
-     (info-title-2 :foreground "green")
-     (font-lock-comment-delimiter-face :foreground "green")
-     (font-lock-comment-face :foreground "green")
-     (cperl-array-face :background "gray90" :foreground "blue" :weight 'bold)
-     (cperl-hash-face :background "gray90" :foreground "purple" :weight 'bold)
-     (diff-added :background "gray90" :foreground "green4" :weight 'bold)
-     (diff-removed :background "gray90" :foreground "red2" :weight 'bold)
-     (diff-changed :background "gray90" :foreground "blue" :weight 'bold)
-     (diff-file-header-face :background "white" :foreground "black"
-                            :weight 'bold)
-     (diff-header-face :background "white" :foreground "black")
-     (diff-hunk-header-face :background "white" :foreground "black")
-     (diff-indicator-removed :foreground "red" :weight 'bold)
-     (diff-removed :foreground "red" :weight 'bold)
-     (diff-indicator-added :foreground "blue" :weight 'bold)
-     (diff-added :foreground "blue" :weight 'bold)
-     (font-lock-string-face :foreground "green")
-     (font-lock-variable-name-face :foreground "blue")
-     (font-lock-constant-face :foreground "blue")
-     (font-lock-preprocessor-face :foreground "green")
-     (font-lock-function-name-face :foreground "cyan")
-     (flyspell-incorrect :foreground "red2")
-     (flyspell-duplicate :foreground "OrangeRed2")
-     (hl-line :background "white")
-     (sh-heredoc :foreground "black" :background "#fff0f0")
-     (sh-heredoc-face :foreground "black" :background "#fff0f0")
-     (font-lock-keyword-face :foreground "blue")
-     (highlight :background "darkseagreen3")
-     (isearch :background "orange" :foreground "black")
-     (isearch-lazy-highlight-face' :background "yellow" :foreground "black")
-     ;; (display-time-mail-face :background "white")
-     (show-paren-match-face :background "gold" :foreground "black")
-     (show-paren-mismatch-face :background "red" :foreground "black")
-     (trailing-whitespace :background "white")
-     (mode-line :background "cornflowerblue" :foreground "black" :box nil
-                :inverse-video nil)
-     (header-line :background "cornflowerblue" :foreground "black" :box nil
-                  :inverse-video nil)
-     (mode-line-inactive :background "gray60" :foreground "black" :box nil
-                         :inverse-video nil)
-     (region :background "white" :foreground "black")
-     (ff/date-info-face :foreground "white" :weight 'bold)
-     (ff/mail-alarm-face :foreground "red" :weight 'bold)
-     (selector/selection :background "yellow")
-     (gui-button-face :background "green" :foreground "white")
-     (enotes/information-face :foreground "cyan")
-
-     (file-name-shadow :foreground "black")
-     (shadow :foreground "black")
-     (warning :foreground "black" :background "red")
-     ))
-  )
-
-;; (list-colors-display (mapcar 'car color-name-rgb-alist))
-
-;; (ff/configure-faces '((default :background "black" :foreground "gray80")))
-;; (ff/configure-faces '((default :background "gray80" :foreground "black")))
-
 (when window-system
-  ;; (setq
-  ;; display-time-use-mail-icon t)
 
   (ff/configure-faces
    '(
      ;; (escape-glyph :foreground "#c0c0c0" :weight 'bold)
-
      (escape-glyph :foreground "green3" :weight 'bold)
      (default :background "gray90" :foreground "black")
      (cperl-array-face :background "gray90" :foreground "blue" :weight 'bold)
@@ -504,7 +455,7 @@ load-warning buffer in case of failure."
      (sh-heredoc :foreground "black" :background "#fff0f0")
      (sh-heredoc-face :foreground "black" :background "#fff0f0")
      (header-line :background "gray65")
-     (highlight :background "turquoise")
+     (highlight :background "white")
      (message-cited-text-face :foreground "firebrick")
      (isearch :background "yellow" :foreground "black")
      (isearch-lazy-highlight-face' :background "yellow3" :foreground "black")
@@ -523,13 +474,74 @@ load-warning buffer in case of failure."
                          :inverse-video nil)
      ;; (fringe :background "black" :foreground "gray90")
      (fringe :background "gray80")
-     (ff/date-info-face :foreground "white" :weight 'bold)
-     (ff/mail-alarm-face :foreground "white" :background "red2")
+     (ff/date-info-face :foreground "white")
+     (ff/battery-info-face :foreground "blue")
+     (ff/battery-info-alarm-face :foreground "red")
+     ;; (ff/mail-alarm-face :foreground "white" :background "red2")
      ;; (alarm-vc-face :foreground "black" :background "yellow" :weight 'normal)
      (gui-button-face :background "green" :foreground "black")
      ))
   )
 
+(unless window-system
+  ;; (xterm-mouse-mode 1)
+  (ff/configure-faces
+   '((italic :underline nil)
+     (info-title-2 :foreground "green")
+     (font-lock-comment-delimiter-face :foreground "green")
+     (font-lock-comment-face :foreground "green")
+     (cperl-array-face :background "gray90" :foreground "blue" :weight 'bold)
+     (cperl-hash-face :background "gray90" :foreground "purple" :weight 'bold)
+     (diff-added :background "gray90" :foreground "green4" :weight 'bold)
+     (diff-removed :background "gray90" :foreground "red2" :weight 'bold)
+     (diff-changed :background "gray90" :foreground "blue" :weight 'bold)
+     (diff-file-header-face :background "white" :foreground "black"
+                            :weight 'bold)
+     (diff-header-face :background "white" :foreground "black")
+     (diff-hunk-header-face :background "white" :foreground "black")
+     (diff-indicator-removed :foreground "red" :weight 'bold)
+     (diff-removed :foreground "red" :weight 'bold)
+     (diff-indicator-added :foreground "blue" :weight 'bold)
+     (diff-added :foreground "blue" :weight 'bold)
+     (font-lock-string-face :foreground "green")
+     (font-lock-variable-name-face :foreground "blue")
+     (font-lock-constant-face :foreground "blue")
+     (font-lock-preprocessor-face :foreground "green")
+     (font-lock-function-name-face :foreground "cyan")
+     (flyspell-incorrect :foreground "red2")
+     (flyspell-duplicate :foreground "OrangeRed2")
+     (hl-line :background "white")
+     (sh-heredoc :foreground "black" :background "#fff0f0")
+     (sh-heredoc-face :foreground "black" :background "#fff0f0")
+     (font-lock-keyword-face :foreground "blue")
+     (highlight :background "white")
+     (isearch :background "orange" :foreground "black")
+     (isearch-lazy-highlight-face' :background "yellow" :foreground "black")
+     ;; (display-time-mail-face :background "white")
+     (show-paren-match-face :background "gold" :foreground "black")
+     (show-paren-mismatch-face :background "red" :foreground "black")
+     (trailing-whitespace :background "white")
+     (mode-line :background "cornflowerblue" :foreground "black" :box nil
+                :inverse-video nil)
+     (header-line :background "cornflowerblue" :foreground "black" :box nil
+                  :inverse-video nil)
+     (mode-line-inactive :background "gray60" :foreground "black" :box nil
+                         :inverse-video nil)
+     (region :background "white" :foreground "black")
+     (ff/date-info-face :foreground "white" :weight 'bold)
+     (ff/battery-info-face :foreground "black")
+     (ff/battery-info-alarm-face :foreground "red")
+     ;; (ff/mail-alarm-face :foreground "red" :weight 'bold)
+     (selector/selection :background "yellow")
+     (gui-button-face :background "green" :foreground "white")
+     (enotes/information-face :foreground "cyan")
+
+     (file-name-shadow :foreground "black")
+     (shadow :foreground "black")
+     (warning :foreground "black" :background "red")
+     ))
+  )
+
 ;; When we are root, put the modeline in red
 
 (when (string= (user-real-login-name) "root")
@@ -607,17 +619,12 @@ load-warning buffer in case of failure."
 
 (define-key global-map [(control c) (control q)] 'ff/delete-trailing-whitespaces-and-indent)
 
+(define-key global-map [(control x) (control o)] 'other-window)
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Playing sounds
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;; (defun ff/esd-sound (file)
-;;   "Plays a sound with the Enlighted sound daemon."
-;;   (interactive)
-;;   (process-kill-without-query (start-process-shell-command "esdplay"
-;;                                                            nil
-;;                                                            "esdplay" file)))
-
 (defun ff/alsa-sound (file)
   "Plays a sound with ALSA."
   (interactive)
@@ -655,6 +662,18 @@ load-warning buffer in case of failure."
 (define-key global-map [(shift down)] 'ff/comment-and-go-down)
 (define-key global-map [(shift up)] 'ff/uncomment-and-go-up)
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun ff/show-compilation-buffer-split-window ()
+  "Split the window vertically and show the compilation buffer in the newly created right one"
+  (interactive)
+
+  (let ((b (get-buffer "*compilation*")))
+    (if b (show-buffer (split-window-right) b)
+      (error "Cannot find a compilation buffer"))
+    )
+)
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Counting various entities in text
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -819,12 +838,15 @@ printer."
 ;; Dealing with the laptop battery
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defcustom ff/battery-dirs '("/sys/class/power_supply/BAT0"
-                             "/sys/class/power_supply/BAT1")
+(defcustom ff/battery-dirs '("/sys/class/power_supply/BAT0")
   "*Where to gather the battery information")
 
 (defcustom ff/temperature-files '("/sys/class/thermal/thermal_zone0/temp"
-                                  "/sys/class/thermal/thermal_zone1/temp")
+                                  "/sys/class/thermal/thermal_zone1/temp"
+                                  "/sys/class/thermal/thermal_zone2/temp"
+                                  "/sys/class/thermal/thermal_zone3/temp"
+                                  "/sys/class/thermal/thermal_zone4/temp"
+                                  "/sys/class/thermal/thermal_zone5/temp")
   "*Where to gather the thermal information")
 
 (defun ff/file-first-line (file)
@@ -871,43 +893,55 @@ printer."
     (error -1))
   )
 
-(defun ff/temp-and-battery-info-string () (interactive)
+(defun ff/temp-info-string () (interactive)
        (condition-case nil
-           (concat
-
-            ;; The temperature
-
-            (let ((temp (/
-                         (apply 'max (mapcar
-                                      (lambda (f) (string-to-number (ff/file-first-line f)))
-                                      ff/temperature-files))
-                         1000)))
-
-              (if (> temp 50)
-                  (let ((s (format "%dC " temp)))
-                    (if (> temp 70)
-                        (propertize s 'face 'font-lock-warning-face)
-                      s)
-                    )
-                )
-              )
+           ;; The temperature
+
+           (let ((temp (/
+                        (apply 'max (mapcar
+                                     (lambda (f) (string-to-number (ff/file-first-line f)))
+                                     ff/temperature-files))
+                        1000)))
+
+             (if (> temp 50)
+                 (let ((s (format "%dC " temp)))
+                   (if (> temp 70)
+                       (propertize s 'face 'font-lock-warning-face)
+                     s)
+                   )
+               )
+             )
 
-            ;; The battery
+         (error nil))
+       )
 
-            (propertize
-             (pcase (ff/battery-state ff/battery-dirs)
-               ;; (`charging (format "c%d%%" (ff/battery-percent)))
-               ;; (`discharging (format "d%d%%" (ff/battery-percent)))
-               ;; (`unknown "f")
-               (`charging (format "↑%d%%" (ff/battery-percent)))
-               (`discharging (format "↓%d%%" (ff/battery-percent)))
-               (`unknown "◉")
-               ;; (`unknown "⚡")
-               (_ "?"))
-             'face '(:foreground "#ffffe0"))
+(defun ff/battery-info-string () (interactive)
+       (condition-case nil
+           (pcase (ff/battery-state ff/battery-dirs)
+             ;; (`charging (format "c%d%%" (ff/battery-percent)))
+             ;; (`discharging (format "d%d%%" (ff/battery-percent)))
+             ;; (`unknown "f")
+
+             (`charging
+              (let ((p (ff/battery-percent)))
+                (if (> p 10)
+                    (propertize (format "↑%d%%" p) 'face 'ff/battery-info-face)
+                  (propertize (format "↑%d%%" p) 'face 'ff/battery-info-alarm-face))
+                )
+              )
 
-            )
+             (`discharging
+              (let ((p (ff/battery-percent)))
+                (if (> p 10)
+                    (propertize (format "↓%d%%" p) 'face 'ff/battery-info-face)
+                  (propertize (format "↓%d%%" p) 'face 'ff/battery-info-alarm-face))
+                )
+              )
 
+             (`unknown (propertize "☼" 'face 'ff/battery-info-face))
+             ;; (`unknown "☼")
+             ;; (`unknown "F")
+             (_ "?"))
          (error nil))
        )
 
@@ -915,63 +949,53 @@ printer."
 
 (defun ff/system-info () (interactive)
 
-       (let ((buf (get-buffer-create "*system info*"))
-             (map (make-sparse-keymap)))
-
-         (define-key map "q" 'kill-this-buffer)
-         (display-buffer buf)
-         (set-buffer buf)
-         (setq show-trailing-whitespace nil)
-         (erase-buffer)
-
-         (let ((highlight nil))
-
-           (mapc (lambda (x)
-                   (insert
-                    (if (setq highlight (not highlight))
-                        (propertize
-                         (with-temp-buffer (apply 'call-process x)
-                                           (buffer-string))
-                         'face '(:background "#d0d0ff"))
-                      (with-temp-buffer (apply 'call-process x)
-                                        (buffer-string))
-                      ))
-                   )
-
-                 '(
-                   ("hostname" nil t nil "-f")
-                   ("acpi" nil t)
-                   ("df" nil t nil "-h")
-                   ;; ("mount" nil t)
-                   ("ifconfig" nil t)
-                   ("ssh-add" nil t nil "-l")
-                   )))
-
-         (goto-char (point-min))
-         (while (re-search-forward "^$" nil t) (backward-delete-char 1))
-
-         (fit-window-to-buffer (get-buffer-window buf))
-         (use-local-map map)
-         (set-buffer-modified-p nil)
-         ))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Make a sound when there is new mail
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;; I do not like sounds anymore
+       (let* ((buf (get-buffer-create "*system info*"))
+              (win (get-buffer-window buf))
+              (map (make-sparse-keymap)))
+
+         (if win
+             (progn
+               (delete-window win)
+               (kill-buffer buf))
+
+           (define-key map "q" 'kill-this-buffer)
+           (display-buffer buf)
+           (set-buffer buf)
+           (setq show-trailing-whitespace nil)
+           (erase-buffer)
+
+           (let ((highlight nil))
+
+             (mapc (lambda (x)
+                     (insert
+                      (if (setq highlight (not highlight))
+                          (propertize
+                           (with-temp-buffer (apply 'call-process x)
+                                             (buffer-string))
+                           'face '(:background "#d0d0ff"))
+                        (with-temp-buffer (apply 'call-process x)
+                                          (buffer-string))
+                        ))
+                     )
 
-;; (setq ff/already-boinged-for-mail nil)
+                   '(
+                     ("hostname" nil t nil "-f")
+                     ("acpi" nil t)
+                     ("df" nil t nil "-h")
+                     ;; ("mount" nil t)
+                     ("ifconfig" nil t)
+                     ("ssh-add" nil t nil "-l")
+                     )))
 
-;; (defun ff/boing-if-new-mail ()
-;; (if mail (when (not ff/already-boinged-for-mail)
-;; ;; (ff/play-sound-async "~/local/sounds/boing1.wav")
-;; ;; (ff/show-unspooled-mails)
-;; (setq ff/already-boinged-for-mail t))
-;; (setq ff/already-boinged-for-mail nil))
-;; )
+           (goto-char (point-min))
+           (while (re-search-forward "^$" nil t) (backward-delete-char 1))
 
-;; (add-hook 'display-time-hook 'ff/boing-if-new-mail)
+           (fit-window-to-buffer (get-buffer-window buf))
+           (use-local-map map)
+           (set-buffer-modified-p nil)
+           )
+         )
+       )
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Display time
@@ -979,28 +1003,35 @@ printer."
 
 (setq
 
- display-time-interval 15 ;; Check every 15s
+ display-time-interval 10 ;; Check every 10s
 
  display-time-string-forms `(
 
-                             ;; (if mail
-                             ;;     (concat " "
-                             ;;             (propertize " mail "
-                             ;;                         'face 'ff/mail-alarm-face)
-                             ;;             " ")
-                             ;;   )
+                             load
 
-                             ,(if (ff/temp-and-battery-info-string)
-                                  '(concat (ff/temp-and-battery-info-string) " "))
+                             " "
 
-                             (propertize (concat 24-hours ":" minutes
-                                                 " "
-                                                 dayname " "
-                                                 monthname " "
-                                                 day)
-                                         'face 'ff/date-info-face)
+                             ,@(when (ff/temp-info-string)
+                                 '((ff/temp-info-string)))
 
-                             load
+                             ,@(when (ff/battery-info-string)
+                                 '((ff/battery-info-string)))
+
+                             ;; '((propertize
+                             ;; (ff/battery-info-string)
+                             ;; 'face 'ff/battery-info-face)))
+
+                             " "
+
+                             (propertize
+                              (concat ;;" ˌ"
+                               24-hours ":" minutes
+                               " "
+                               ;; dayname " "
+                               monthname " " day
+                               ;;"ˌ"
+                               )
+                              'face 'ff/date-info-face)
 
                              )
 
@@ -1142,9 +1173,9 @@ of commands in `ff/default-bash-commands' is used for auto-completion"
 (when (ff/load-or-alert "alarm-vc" t)
   (setq alarm-vc-mode-exceptions "^VM"))
 
-(when (ff/load-or-alert "git")
-  (setq git-show-unknown nil)
-  )
+;; (when (ff/load-or-alert "git")
+  ;; (setq git-show-unknown nil)
+  ;; )
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Makes .sh and others files executable automagically
@@ -1199,45 +1230,72 @@ goback argument, go back where we were."
 (define-key global-map [(meta G)] (lambda () (interactive)
                                     (ff/goto-function-definition t)))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+;; (setq python-indent-offset 4)
+
+;; (define-key python-mode-map [(shift right)] 'python-indent-shift-right)
+;; (define-key python-mode-map [(shift left)] 'python-indent-shift-left)
+;; (define-key python-mode-map [(shift right)] 'indent-rigidly-right-to-tab-stop)
+;; (define-key python-mode-map [(shift left)] 'indent-rigidly-left-to-tab-stop)
+
+(load "vc-git")
+
+(defun ff/git-pull-push (universal) (interactive "P")
+       (when universal (shell-command "git commit -a -m \"Update.\"" nil))
+       (message "git pull / push ...")
+       (async-shell-command "git remote get-url origin && git pull && git push" nil)
+       )
+
+(defun ff/git-pull () (interactive)
+       (message "git pull ...")
+       (shell-command "git pull" nil)
+       )
+
+(define-key global-map [(control x) (v) (p)] 'ff/git-pull-push)
+(define-key global-map [(control x) (v) (P)] 'ff/git-pull)
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; The big stuff (bbdb, mailcrypt, etc.)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;; Failsafe version if we can't load bbdb
-(defun ff/explicit-name (email) email)
+(setq bbdb-file "~/private/bbdb")
 
-(load "vc-git")
+(when (file-exists-p bbdb-file)
 
-(when (ff/load-or-alert "bbdb")
-
-  (setq
-   ;; Stop asking (if not t or nil, will not ask)
-   bbdb-offer-save 'never
-   ;; I hate when bbdb decides to mess up my windows
-   bbdb-use-pop-up nil
-   ;; I have no problem with bbdb asking me if the sender email
-   ;; does not match exactly the address we have in the database
-   bbdb-quiet-about-name-mismatches 0
-   ;; I have european friends, too
-   bbdb-north-american-phone-numbers-p nil
-   ;; To cycle through all possible addresses
-   bbdb-complete-name-allow-cycling t
-   ;; Cycle with full names only, not through all net-addresses alone too
-   bbdb-dwim-net-address-allow-redundancy t
-   ;; Do not add new addresses automatically
-   bbdb-always-add-addresses nil
-   )
+  ;; Failsafe version if we can't load bbdb
+  (defun ff/explicit-name (email) email)
+
+  (when (with-no-warnings (ff/load-or-alert "bbdb"))
 
-  (defface ff/known-address-face
-    '((t (:foreground "blue2")))
-    "The face to display known mail identities.")
+    (setq
+     ;; Stop asking (if not t or nil, will not ask)
+     bbdb-offer-save 'never
+     ;; I hate when bbdb decides to mess up my windows
+     bbdb-use-pop-up nil
+     ;; I have no problem with bbdb asking me if the sender email
+     ;; does not match exactly the address we have in the database
+     bbdb-quiet-about-name-mismatches 0
+     ;; I have european friends, too
+     bbdb-north-american-phone-numbers-p nil
+     ;; To cycle through all possible addresses
+     bbdb-complete-name-allow-cycling t
+     ;; Cycle with full names only, not through all net-addresses alone too
+     bbdb-dwim-net-address-allow-redundancy t
+     ;; Do not add new addresses automatically
+     bbdb-always-add-addresses nil
+     )
 
-  (defface ff/unknown-address-face
-    '((t (:foreground "gray50")))
-    "The face to display unknown mail identities.")
+    (defface ff/known-address-face
+      '((t (:foreground "blue2")))
+      "The face to display known mail identities.")
 
-  (defun ff/explicit-name (email)
-    "Returns a string identity for the first address in EMAIL. The
+    (defface ff/unknown-address-face
+      '((t (:foreground "gray50")))
+      "The face to display unknown mail identities.")
+
+    (defun ff/explicit-name (email)
+      "Returns a string identity for the first address in EMAIL. The
 identity is taken from bbdb if possible or from the address itself
 with mail-extract-address-components. The suffix \"& al.\" is added if
 there are more than one address.
@@ -1247,47 +1305,50 @@ ff/unknown-address-face. If a record is found and contains a note
 'face, the associated face is used, otherwise
 ff/known-address-face is used."
 
-    (and email
-         (let* ((data (mail-extract-address-components email))
-                (name (car data))
-                (net (cadr data))
-                (record (bbdb-search-simple nil net)))
+      (and email
+           (let* ((data (mail-extract-address-components email))
+                  (name (car data))
+                  (net (cadr data))
+                  (record (bbdb-search-simple nil net)))
+
+             (concat
+
+              (condition-case nil
+                  (propertize (bbdb-record-name record)
+                              'face
+                              (or (cdr (assoc 'face
+                                              (bbdb-record-raw-notes record)))
+                                  'ff/known-address-face))
+                (error
+                 (propertize (or (and data (concat "<" net ">"))
+                                 "*undefined*")
+                             'face 'ff/unknown-address-face)
+                 ))
+              (if (string-match "," (mail-strip-quoted-names email)) " & al.")
+              )))
+      )
 
-           (concat
+    (ff/configure-faces '((ff/robot-address-face :foreground "green4")
+                          (ff/personal-address-face :foreground "dark magenta" :weight 'bold)
+                          (ff/important-address-face :foreground "red3"
+                                                     :weight 'bold
+                                                     )))
 
-            (condition-case nil
-                (propertize (bbdb-record-name record)
-                            'face
-                            (or (cdr (assoc 'face
-                                            (bbdb-record-raw-notes record)))
-                                'ff/known-address-face))
-              (error
-               (propertize (or (and data (concat "<" net ">"))
-                               "*undefined*")
-                           'face 'ff/unknown-address-face)
-               ))
-            (if (string-match "," (mail-strip-quoted-names email)) " & al.")
-            )))
     )
-
-  (ff/configure-faces '((ff/robot-address-face :foreground "green4")
-                        (ff/personal-address-face :foreground "dark magenta" :weight 'bold)
-                        (ff/important-address-face :foreground "red3"
-                                                   :weight 'bold
-                                                   )))
-
   )
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; An encrypted file to put secure stuff (passwords, ...)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(when (ff/load-or-alert "mailcrypt")
-  (mc-setversion "gpg")
-  ;; Keep the passphrase for 10min
-  (setq mc-passwd-timeout 600
-        ff/secure-note-file "~/private/secure-notes.gpg")
-  )
+(setq ff/secure-note-file "~/private/secure-notes.gpg")
+
+;; (when (ff/load-or-alert "mailcrypt")
+  ;; (mc-setversion "gpg")
+  ;; ;; Keep the passphrase for 10min
+  ;; (setq mc-passwd-timeout 600
+        ;; ff/secure-note-file "~/private/secure-notes.gpg")
+  ;; )
 
 (defface ff/secure-date
   '((t (:background "white" :weight bold)))
@@ -1388,7 +1449,7 @@ universal argument starts xfig even if the .fig does not exist"
                           '(("fig" . "xfig")
                             ("jpg" . "gimp" )
                             ("png" . "gimp") ("pgm" . "gimp") ("ppm" . "gimp")
-                            ("jpg" . "xv"))
+                            ("svg" . "inkscape"))
                           universal)
 
     (if (not (and (buffer-file-name) (string-match "\\(.*\\)\.tex$"
@@ -1406,18 +1467,27 @@ universal argument starts xfig even if the .fig does not exist"
     ))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Tex mode
 
-;; When working on a tex file with other people, I can just change
-;; ff/tex-command in the -*- part of the file so that I don't mess up
-;; other's people configuration.
+(defun ff/save-window-configuration (universal) (interactive "P")
+       (if universal
+           (progn
+             (setq ff/window-configuration (current-window-configuration))
+             (message "Window configuration stored")
+             )
+         (set-window-configuration ff/window-configuration))
+       )
+
+(define-key global-map [(control =)] 'ff/save-window-configuration)
 
-(defadvice tex-file (around ff/set-my-own-tex-command () activate)
-  (let ((tex-command
-         (or (and (boundp 'ff/tex-command)
-                  ff/tex-command)
-             tex-command)))
-    ad-do-it))
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Tex mode
+
+;; (defadvice tex-file (around ff/set-my-own-tex-command () activate)
+  ;; (let ((ff/window-configuration-before-compilation (current-window-configuration)))
+    ;; ad-do-it
+    ;; (set-window-configuration ff/window-configuration-before-compilation)
+    ;; )
+  ;; )
 
 ;; This is a bit hardcore, but really I can't bear the superscripts in
 ;; my emacs window and could not find another way to deactivate them.
@@ -1425,6 +1495,41 @@ universal argument starts xfig even if the .fig does not exist"
 (load "tex-mode")
 (defun tex-font-lock-suscript (pos) ())
 
+;; Automagically add the frame numbers in comments in a beamer file
+
+(defun ff/number-beamer-frames ()
+  "Add the frame numbers as comments after each \begin{frame}"
+  (interactive)
+
+  (save-excursion
+    (let ((total 0)
+          (n 1))
+
+      ;; First, clean-up existing numbering
+      (goto-char (point-min))
+      (while (re-search-forward "^ *\\\\begin{frame}.*\\( %% frame [0-9]* / [0-9]*\\)$" nil t)
+        (kill-region (match-beginning 1) (match-end 1))
+        )
+
+      ;; Then count the total number of frames
+      (goto-char (point-min))
+      (while (re-search-forward "^ *\\\\begin{frame}" nil t)
+        (setq total (+ total 1))
+        )
+
+      ;; Then, add the updated numbers
+      (goto-char (point-min))
+      (while (re-search-forward "^ *\\\\begin{frame}" nil t)
+        (move-end-of-line 1)
+        (insert " %% frame " (prin1-to-string n) " / " (prin1-to-string total))
+        (setq n (+ n 1))
+        )
+      )
+    )
+
+  (message "Added frame numbers in comments.")
+  )
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Prevents many errors from beeping and makes the others play a nifty
 ;; sound
@@ -1450,7 +1555,7 @@ universal argument starts xfig even if the .fig does not exist"
     ;; (ff/play-sound-async "~/local/sounds/short_la.wav")
     ))
 
-(setq ring-bell-function 'ff/ring-bell)
+;; (setq ring-bell-function 'ff/ring-bell)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Past the content of the url currently in the kill-ring with
@@ -1467,8 +1572,15 @@ universal argument starts xfig even if the .fig does not exist"
     (call-process "w3m" nil t nil "-dump" url))
   )
 
-(define-key global-map [(shift mouse-2)]
-  (lambda () (interactive) (ff/insert-url (current-kill 0))))
+;; (define-key global-map [(shift mouse-2)]
+  ;; (lambda () (interactive) (ff/insert-url (current-kill 0))))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Trying to deal with cut-paste
+
+(setq x-select-enable-clipboard t)
+(setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
+(define-key global-map [(shift mouse-2)] 'clipboard-yank)
 
 ;; lookup-dict is one of my own scripts, check my web page
 
@@ -1498,29 +1610,27 @@ universal argument starts xfig even if the .fig does not exist"
   (goto-char (point-min))
   (insert "%% -*- mode: latex; mode: reftex; mode: flyspell; coding: utf-8; tex-command: \"pdflatex.sh\" -*-
 
-\\documentclass[12pt,a4paper,twoside]{article}
+\\documentclass[11pt,a4paper,twoside]{article}
 \\usepackage[a4paper,top=2.5cm,bottom=2cm,left=2.5cm,right=2.5cm]{geometry}
 \\usepackage[utf8]{inputenc}
-\\usepackage{amsmath}
-\\usepackage{amssymb}
+\\usepackage{amsmath,amssymb,dsfont}
 \\usepackage[pdftex]{graphicx}
-\\usepackage{microtype}
 \\usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue,citecolor=blue]{hyperref}
+\\usepackage{tikz}
+\\usepackage[round]{natbib}
+\\usepackage{cmbright}
+%\\usepackage{showframe}
 
 \\setlength{\\parindent}{0cm}
 \\setlength{\\parskip}{12pt}
-\\renewcommand{\\baselinestretch}{1.3}
+%\\renewcommand{\\baselinestretch}{1.3}
+%\\setlength{\\tabcolsep}{0pt}
+%\\renewcommand{\\arraystretch}{1.0}
 
 \\def\\argmax{\\operatornamewithlimits{argmax}}
 \\def\\argmin{\\operatornamewithlimits{argmin}}
+\\def\\expect{\\mathds{E}}
 
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Open sans font
-%%\\usepackage[default]{opensans}
-%%\\usepackage{cmbright}
-%%\\renewcommand{\\familydefault}{fos}
-%%\\renewcommand{\\seriesdefault}{l}
-%%\\renewcommand{\\bfdefault}{sb}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% The \\todo command
 \\newcounter{nbdrafts}
@@ -1541,6 +1651,12 @@ universal argument starts xfig even if the .fig does not exist"
     (goto-char (point-max))
     (insert "
 
+\\bibliographystyle{abbrvnat}
+
+\\bibliography{dlc}
+
+\\checknbdrafts
+
 \\end{document}
 "))
   (latex-mode))
@@ -1708,6 +1824,39 @@ int main(int argc, char **argv) {
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+(defun ff/start-lua ()
+  "Adds all the stuff to start a new lua file"
+  (interactive)
+  (goto-char (point-min))
+  (insert "#!/usr/bin/env luajit
+
+require 'torch'
+require 'nn'
+require 'image'
+require 'optim'
+
+")
+  (lua-mode)
+  )
+
+(defun ff/start-python ()
+  "Adds all the stuff to start a new python file"
+  (interactive)
+  (goto-char (point-min))
+  (insert "#!/usr/bin/env python
+
+import math
+
+import torch, torchvision
+
+from torch import nn
+from torch.nn import functional as F
+
+")
+  (python-mode)
+  )
+
+
 (defun ff/start-html ()
   "Adds all that stuff to start a new HTML file."
   (interactive)
@@ -1749,9 +1898,7 @@ the function is invoked with a universal arg"
   (interactive "P")
   (let ((line (if arg "cerr" "cout")))
     (goto-char (point-at-bol))
-    ;; Regexp syntax sucks moose balls, honnest. To match '[', just
-    ;; put it as the first char in the [...] ... This leads to some
-    ;; obvious things like the following
+    ;; To match '[', put it as the first char in the [...]
     (while (re-search-forward "\\([][a-zA-Z0-9_.:\(\)]+\\)" (point-at-eol) t)
       (setq line
             (concat line " << \" "
@@ -1776,17 +1923,31 @@ and refilling all the paragraphs."
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defun ff/start-slide ()
-  (interactive)
-  (insert "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+(defun ff/start-slide (universal)
+  (interactive "P")
+
+  (if universal
+      (progn
+        (insert "\\end{frame}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-\\begin{frame}{")
+\\begin{frame}[fragile]{")
+        (save-excursion (insert "}{}
 
-  (save-excursion (insert "}{}
+"))
+        )
+
+    (insert "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\\begin{frame}[fragile]{")
+
+    (save-excursion (insert "}{}
 
 \\end{frame}
 
 "))
+    )
   )
 
 (add-hook
@@ -1901,6 +2062,16 @@ a file in /tmp"
                (ff/add-copyrights))
              )
 
+           (when (string-match "\\.lua$" filename)
+             (lua-mode)
+             (ff/start-lua)
+             )
+
+           (when (string-match "\\.py$" filename)
+             (python-mode)
+             (ff/start-python)
+             )
+
            (when (string-match "\\.html$" filename)
              (html-mode)
              (ff/start-html)
@@ -1961,19 +2132,6 @@ a file in /tmp"
 (define-key global-map [f8] 'ff-find-other-file)
 (define-key global-map [(shift f8)] (lambda () (interactive) (ff-find-other-file t)))
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Antiword, htmlize and boxquote
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(autoload 'no-word "no-word")
-(add-to-list 'auto-mode-alist '("\\.doc\\'" . no-word))
-;; (add-to-list 'auto-mode-alist '("\\.DOC\\'" . no-word))
-
-(autoload 'htmlize-buffer "htmlize" nil t)
-
-(setq boxquote-top-and-tail "------------------")
-(autoload 'boxquote-region "boxquote" nil t)
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; The compilation hacks
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2024,10 +2182,10 @@ a file in /tmp"
 
 (setq compilation-read-command t
       compile-command "make -j -k"
-      compile-history '("make clean" "make DEBUG=yes -j -k" "make -j -k")
+      ;; compile-history '("make clean" "make DEBUG=yes -j -k" "make -j -k")
       )
 
-(defun ff/universal-compile () (interactive)
+(defun ff/universal-compile (universal) (interactive "P")
        (funcall (or (cdr (assoc major-mode
                                 '(
                                   (latex-mode . tex-file)
@@ -2041,6 +2199,17 @@ a file in /tmp"
 (define-key global-map [(shift f1)] 'compile)
 (define-key global-map [f2] 'next-error)
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Horrible hack
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defun dont-delay-compile-warnings (fun type &rest args)
+  (if (eq type 'bytecomp)
+      (let ((after-init-time t))
+        (apply fun type args))
+    (apply fun type args)))
+(advice-add 'display-warning :around #'dont-delay-compile-warnings)
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Related to mail
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2130,7 +2299,7 @@ This may be a useful alternative binding for \\[delete-other-windows]
            (while (re-search-forward "[0-9\.]+" nil t)
              (let ((value (string-to-number (buffer-substring (match-beginning 0) (match-end 0)))))
                (delete-region (match-beginning 0) (match-end 0))
-               (insert (format "%0.2f" value)))))))
+               (insert (format "%0.1e" value)))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; Keymaping
@@ -2175,6 +2344,8 @@ This may be a useful alternative binding for \\[delete-other-windows]
 
 ;; Compiles the latex file in the current buffer
 
+
+
 (setq tex-start-commands "\\input")
 (define-key global-map [f3] 'tex-file)
 (define-key global-map [(shift f3)] 'tex-bibtex-file)
@@ -2329,7 +2500,7 @@ next one. With universal argument, kill all killable buffers."
                                 "svn-commit.tmp$" ".git/COMMIT_EDITMSG$"
                                 "\.bbl$" "\.aux$" "\.toc$"
                                 ))
-      recentf-max-saved-items 1000
+      recentf-max-saved-items 10000
       recentf-save-file (concat ff/emacs-dir "/recentf")
       )
 
@@ -2367,6 +2538,7 @@ next one. With universal argument, kill all killable buffers."
         media/duration-to-history 30
         media/history-size 1000
         media/playlist-file (concat ff/emacs-dir "/media-playlists")
+        media/continue-mode-hint (if window-system "⤸" "*")
         media/mplayer/args '(
                              "-framedrop"
                              "-zoom"
@@ -2377,6 +2549,7 @@ next one. With universal argument, kill all killable buffers."
                              )
         media/mplayer/timing-request-period 1.0
         )
+
   )
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2507,12 +2680,15 @@ proposes to visit them."
 ;; The fridge!
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defun ff/move-region-to-fridge () (interactive)
+(defun ff/move-region-to-fridge (&optional universal) (interactive "P")
        "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))
+         (if universal
+             (copy-region-as-kill (region-beginning) (region-end))
+           (kill-region (region-beginning) (region-end))
+           )
          (with-current-buffer (find-file-noselect "fridge")
            (goto-char (point-max))
            (insert "\n")
@@ -2536,6 +2712,14 @@ with a time tag, and save this file"
 (setq ff/map (make-sparse-keymap))
 (define-key global-map [(control \`)] ff/map)
 
+;; (defun ff/start-stop-macro-recording () (interactive)
+  ;; (if (or defining-kbd-macro executing-kbd-macro)
+      ;; (kmacro-end-macro)
+    ;; (kmacro-start-macro))
+  ;; )
+
+;; (define-key global-map [(shift return)] 'ff/start-stop-macro-recording)
+
 (unless window-system
   ;; (define-key global-map [(control @)] ff/map)
   (define-key global-map [(meta O) \`] ff/map)
@@ -2543,22 +2727,29 @@ with a time tag, and save this file"
 
 (define-key esc-map "`" ff/map)
 
+(defun ff/kill-downto-signature () (interactive)
+       (let ((s (point)))
+         (when (re-search-forward "^-- $")
+           (kill-region s (match-beginning 0))
+           (goto-char s))))
+
 (defun ff/git-status (&optional dir) (interactive)
        (if (buffer-file-name)
            (git-status (file-name-directory (buffer-file-name)))
          (error "No file attached to this buffer")))
 
 (defun ff/insert-date (&optional universal) (interactive "P")
-       ;; (insert (format-time-string "\n * %Y %b %d %H:%M:%S\n\n" (current-time)))
-       ;; (insert (format-time-string "%Y %b %d %H:%M:%S" (current-time)))
-       ;; (insert (format-time-string "%d.%m.%y" (current-time)))
-       (if universal
-           (insert (format-time-string "%d.%m.%Y %H:%M:%S" (current-time)))
-         (insert (format-time-string "%d.%m.%Y" (current-time))))
+       (insert (format-time-string "\n * %H:%M:%S %A %B %d, %Y\n\n" (current-time)))
+       ;; ;; (insert (format-time-string "%Y %b %d %H:%M:%S" (current-time)))
+       ;; ;; (insert (format-time-string "%d.%m.%y" (current-time)))
+       ;; (if universal
+           ;; (insert (format-time-string "%d.%m.%Y %H:%M:%S" (current-time)))
+         ;; (insert (format-time-string "%d.%m.%Y" (current-time))))
        )
 
-(define-key ff/map [(control g)] 'ff/git-status)
-(define-key ff/map [(control w)] 'server-edit)
+(define-key ff/map [(control g)] 'magit)
+;;(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)
@@ -2570,7 +2761,8 @@ with a time tag, and save this file"
 (define-key ff/map [(control a)] 'auto-fill-mode)
 (define-key ff/map [(control i)] 'ff/system-info)
 (define-key ff/map "w" 'ff/word-occurences)
-(define-key ff/map [(control c)] 'calendar)
+;; (define-key ff/map [(control c)] 'calendar)
+(define-key ff/map [(control c)] 'ff/show-compilation-buffer-split-window)
 ;; (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)
@@ -2587,12 +2779,14 @@ with a time tag, and save this file"
 (define-key ff/map [(control m)] 'woman)
 (define-key ff/map "b" 'bookmark-jump)
 (define-key ff/map [(control =)] 'calc)
+(define-key ff/map "=" 'ff/number-beamer-frames)
 (define-key ff/map [(control shift b)]
   (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 [(control k)] 'ff/kill-downto-signature)
 
 (define-key ff/map [?\C-0] 'ff/delete-annoying-windows)
 (define-key ff/map "1" 'delete-other-windows)
@@ -2768,28 +2962,26 @@ With argument ARG, do this that many times."
 ;; Privacy
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-;; Where to save the bookmarks and where is bbdb
+;; Where to save the bookmarks
 
 (setq bookmark-default-file (concat ff/emacs-dir "/bmk")
-      bbdb-file "~/private/bbdb"
       custom-file (concat ff/emacs-dir "/custom"))
 
 ;; enotes.el is one of my own scripts, check my web page
 
-(when (ff/load-or-alert "enotes" t)
-  (setq enotes/file "~/private/enotes"
-        enotes/show-help nil
-        enotes/full-display nil
-        enotes/default-time-fields "9:30")
-
-  (enotes/init)
-  ;; (add-hook 'enotes/alarm-hook
-  ;;  (lambda () (ff/play-sound-async "~/local/sounds/three_notes2.wav")))
+;; ** ;; (when (ff/load-or-alert "enotes" t)
+;; ** ;;   (setq enotes/file "~/private/enotes"
+;; ** ;;         enotes/show-help nil
+;; ** ;;         enotes/full-display nil
+;; ** ;;         enotes/default-time-fields "9:30")
+;; ** ;; 
+;; ** ;;   (enotes/init)
+;; ** ;;   )
+
+(when (ff/load-or-alert "goto-last-change.el")
+  (define-key global-map [(control -)] 'goto-last-change)
   )
 
-;; (when (ff/load-or-alert "goto-last-change.el")
-;; (define-key global-map [(control x) (control a)] 'goto-last-change))
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; My private stuff (email adresses, mail filters, etc.)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2801,15 +2993,15 @@ With argument ARG, do this that many times."
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 ;; Runs in server mode, so that emacsclient works
-(server-start)
+;; ;;(server-start)
 
-(defun ff/raise-frame-and-give-focus ()
-  (when window-system
-    (raise-frame)
-    (x-focus-frame (selected-frame))
-    (set-mouse-pixel-position (selected-frame) 4 4)
-    ))
+;; (defun ff/raise-frame-and-give-focus ()
+  ;; (when window-system
+    ;; (raise-frame)
+    ;; (x-focus-frame (selected-frame))
+    ;; (set-mouse-pixel-position (selected-frame) 4 4)
+    ;; ))
 
-;; Raises the window when the server is invoked
+;; ;; Raises the window when the server is invoked
 
-(add-hook 'server-switch-hook 'ff/raise-frame-and-give-focus)
+;; (add-hook 'server-switch-hook 'ff/raise-frame-and-give-focus)