Update.
[elisp.git] / emacs.el
index 99c5e54..037615f 100644 (file)
--- a/emacs.el
+++ b/emacs.el
@@ -598,6 +598,8 @@ 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
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -970,9 +972,9 @@ printer."
                              ,@(when (ff/battery-info-string)
                                  '((ff/battery-info-string)))
 
-                                 ;; '((propertize
-                                    ;; (ff/battery-info-string)
-                                    ;; 'face 'ff/battery-info-face)))
+                             ;; '((propertize
+                             ;; (ff/battery-info-string)
+                             ;; 'face 'ff/battery-info-face)))
 
                              " "
 
@@ -1183,45 +1185,71 @@ 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 () (interactive)
+       (message "git pull / push ...")
+       (shell-command "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 (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.
@@ -1231,35 +1259,36 @@ 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
-                                                   )))
-
   )
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1409,6 +1438,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
@@ -1700,17 +1764,34 @@ int main(int argc, char **argv) {
 
 require 'torch'
 require 'nn'
-require 'nnx'
-require 'optim'
 require 'image'
-require 'pl'
-require 'paths'
-require 'ffmpeg'
+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-for-pytorch
+
+import torch
+import math
+
+from torch import nn
+from torch.nn import functional as fn
+
+from torch import Tensor
+from torch.autograd import Variable
+from torch.nn.parameter import Parameter
+from torch.nn import Module
+
+")
+  (python-mode)
+  )
+
 
 (defun ff/start-html ()
   "Adds all that stuff to start a new HTML file."
@@ -1753,9 +1834,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 " << \" "
@@ -1780,17 +1859,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}{")
+        (save-excursion (insert "}{}
 
-  (save-excursion (insert "}{}
+"))
+        )
+
+    (insert "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\\begin{frame}{")
+
+    (save-excursion (insert "}{}
 
 \\end{frame}
 
 "))
+    )
   )
 
 (add-hook
@@ -1910,6 +2003,11 @@ a file in /tmp"
              (ff/start-lua)
              )
 
+           (when (string-match "\\.py$" filename)
+             (python-mode)
+             (ff/start-python)
+             )
+
            (when (string-match "\\.html$" filename)
              (html-mode)
              (ff/start-html)
@@ -2020,7 +2118,7 @@ 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 (universal) (interactive "P")
@@ -2505,12 +2603,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")
@@ -2534,6 +2635,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)
@@ -2591,6 +2700,7 @@ 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)
@@ -2773,10 +2883,9 @@ 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