Update.
[elisp.git] / emacs.el
index f871271..77626cf 100644 (file)
--- a/emacs.el
+++ b/emacs.el
 ;; Xft.antialias: true
 ;; Xft.rgba: rgb
 
+(when (fboundp 'horizontal-scroll-bar-mode)
+  (horizontal-scroll-bar-mode -1))
+
+;; This is where I put most of my emacs-related files
+(setq ff/emacs-dir "~/private/emacs")
+(unless (file-exists-p ff/emacs-dir)
+  (mkdir ff/emacs-dir t))
+
 ;; Give the focus to the emacs window if we are under a windowing
 ;; system
 
@@ -48,8 +56,9 @@
 (menu-bar-mode -1)
 
 ;; Nor fringes
-(when (functionp 'fringe-mode) (fringe-mode '(0 . 0)))
+;; (when (functionp 'fringe-mode) (fringe-mode '(0 . 0)))
 ;; (when (functionp 'fringe-mode) (fringe-mode '(0 . 1)))
+(when (functionp 'fringe-mode) (fringe-mode 10))
 
 ;; And I do not like scrollbar neither
 (when (functionp 'scroll-bar-mode) (scroll-bar-mode -1))
 ;; Make all "yes or no" prompts be "y or n" instead
 (fset 'yes-or-no-p 'y-or-n-p)
 
+;; The space bar acting as "yes" has been several times really
+;; problematic.
+(define-key query-replace-map (kbd "SPC") nil)
+
 ;; Show the matching parenthesis and do it immediately, we are in a
 ;; hurry
 (setq show-paren-delay 0)
@@ -73,7 +86,7 @@
 (iswitchb-mode 1)
 
 ;; Save the minibuffer history
-(setq savehist-file "~/private/emacs/savehist")
+(setq savehist-file (concat ff/emacs-dir "/savehist"))
 (when (functionp 'savehist-mode) (savehist-mode 1))
 
 ;; And allow minibuffer recursion
@@ -130,8 +143,12 @@ load-warning buffer in case of failure."
 
 ;; make emacs use the clipboard so that copy/paste works for other
 ;; x-programs. I have no clue how all that clipboard thing works.
+
 ;; (setq x-select-enable-clipboard t)
 ;; (setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
+;; (setq x-select-enable-primary t)
+;; (setq x-select-enable-clipboard t)
+;; (global-set-key "\C-y" 'clipboard-yank)
 
 (setq
 
@@ -204,7 +221,8 @@ load-warning buffer in case of failure."
  ;; And I like ascii files
  epa-armor t
 
- tramp-default-method "ssh"
+ ;; tramp-default-method "ssh"
+ tramp-default-method "scp"
 
  ;; I have no problem with files having their own local variables
  enable-local-eval t
@@ -215,6 +233,12 @@ load-warning buffer in case of failure."
  mc-use-default-recipients t
 
  ;; browse-url-new-window-flag t
+
+ ;; I do not like compilation to automatically split the active window
+ ;; vertically, even when the said window is very wide
+ split-height-threshold 0
+ split-width-threshold nil
+
  )
 
 ;; The backups
@@ -271,8 +295,12 @@ load-warning buffer in case of failure."
  ;; This is the default coding system when toggle-input-method is
  ;; invoked (C-\)
  default-input-method "latin-1-prefix"
+
  ;; do not put tabs when indenting
  indent-tabs-mode nil
+ ;; Stop indenting automatically, that's annoying
+ electric-indent-chars nil
+
  ;; And yes, we have a fast display / connection / whatever
  baud-rate 524288
  ;; baud-rate 10
@@ -291,10 +319,12 @@ load-warning buffer in case of failure."
 ;; What modes for what file extentions
 (add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
 
+(require 'org-table)
+
 (add-to-list 'auto-mode-alist '("\\.txt\\'" . (lambda()
                                                 (text-mode)
                                                 (orgtbl-mode)
-                                                (auto-fill-mode)
+                                                ;; (auto-fill-mode)
                                                 (flyspell-mode))))
 
 (add-hook 'c++-mode-hook 'flyspell-prog-mode)
@@ -371,6 +401,8 @@ load-warning buffer in case of failure."
   (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)
@@ -387,11 +419,10 @@ load-warning buffer in case of failure."
      (font-lock-string-face :foreground "green")
      (font-lock-variable-name-face :foreground "blue")
      (font-lock-constant-face :foreground "blue")
-     (font-lock-function-name-face :foreground "blue")
      (font-lock-preprocessor-face :foreground "green")
      (font-lock-function-name-face :foreground "cyan")
-     (flyspell-incorrect-face :foreground "red2")
-     (flyspell-duplicate-face :foreground "OrangeRed2")
+     (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")
@@ -409,11 +440,16 @@ load-warning buffer in case of failure."
                   :inverse-video nil)
      (mode-line-inactive :background "gray60" :foreground "black" :box nil
                          :inverse-video nil)
-     (region :background "springgreen2")
+     (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")
      ))
   )
 
@@ -429,6 +465,7 @@ load-warning buffer in case of failure."
   (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)
@@ -445,11 +482,12 @@ load-warning buffer in case of failure."
      (font-lock-builtin-face :foreground "deeppink3")
      (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-function-name-face :foreground "blue" :weight 'bold)
+     (font-lock-function-name-face :foreground "blue")
      ;; (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")
+     (flyspell-incorrect :background "#ff0000" :foreground "black")
+     (flyspell-duplicate :background "#ff9000" :foreground "black")
      (hl-line :background "white")
      (sh-heredoc :foreground "black" :background "#fff0f0")
      (sh-heredoc-face :foreground "black" :background "#fff0f0")
@@ -469,14 +507,14 @@ load-warning buffer in case of failure."
                 :inverse-video nil)
      (header-line :background "cornflowerblue" :foreground "black" :box nil
                   :inverse-video nil)
-     (mode-line-inactive :background "#b0b0b0" :foreground "black" :box nil
+     (mode-line-inactive :background "gray80" :foreground "black" :box nil
                          :inverse-video nil)
      ;; (fringe :background "black" :foreground "gray90")
-     (fringe :background "gray65")
-     (tex-verbatim :family "courrier")
+     (fringe :background "gray80")
      (ff/date-info-face :foreground "white" :weight 'bold)
      (ff/mail-alarm-face :foreground "white" :background "red2")
      ;; (alarm-vc-face :foreground "black" :background "yellow" :weight 'normal)
+     (gui-button-face :background "green" :foreground "black")
      ))
   )
 
@@ -599,31 +637,6 @@ load-warning buffer in case of failure."
 ;; Counting various entities in text
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
-(defun ff/count-char ()
-  "Prints the number of characters between the first previous \"--\"
-and the firt next \"--\"."
-  (interactive)
-  (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"))))
-
-(defun ff/count-words ()
-  "Print number of words 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))))
-    (if (and to from)
-        (save-excursion
-          (goto-char from)
-          (let ((count 0))
-            (while (< (point) to)
-              (re-search-forward "\\w+\\W+")
-              (setq count (1+ count)))
-            (message "%d word(s)" count)))
-      (error "Can not find the -- delimiters"))))
-
 (defun ff/word-occurences ()
   "Display in a new buffer the list of words sorted by number of
 occurrences "
@@ -811,7 +824,7 @@ printer."
          (if (> temp 50)
              (concat
               (let ((s (format "%dC " temp)))
-                (if (> temp 65) (propertize s 'face
+                (if (> temp 70) (propertize s 'face
                                             'font-lock-warning-face)
                   s))
               )
@@ -830,8 +843,10 @@ printer."
                                 (ff/battery-percent "energy"))))
 
           ((string= battery-status "Discharging")
-           (format "B%d%%"  (max (ff/battery-percent "charge")
-                                 (ff/battery-percent "energy"))))
+           (let* ((c (max (ff/battery-percent "charge")
+                          (ff/battery-percent "energy")))
+                  (s (format "B%d%%" c)))
+             (if (>= c 20) s (propertize s 'face 'font-lock-warning-face))))
 
           (t battery-status)
 
@@ -1197,9 +1212,9 @@ ff/known-address-face is used."
     )
 
   (ff/configure-faces '((ff/robot-address-face :foreground "green4")
-                        (ff/personal-address-face :foreground "dark magenta"
-                                                  :weight 'bold)
-                        (ff/important-address-face :foreground "blue2"
+                        (ff/personal-address-face :foreground "blue2" :weight 'bold)
+                        (ff/important-address-face :foreground "red3"
+                                                   ;; :foreground "blue2"
                                                    ;; :underline t
                                                    ;; :background "white"
                                                    ;; :foreground "green4"
@@ -1221,7 +1236,7 @@ ff/known-address-face is used."
   )
 
 (defface ff/secure-date
-  '((t (:background "gold" :weight bold)))
+  '((t (:background "white" :weight bold)))
   "The face to display the dates in the modeline.")
 
 (defun ff/secure-note-add () (interactive)
@@ -1232,7 +1247,7 @@ ff/known-address-face is used."
   (goto-char (point-min))
   (insert "-- "
           (format-time-string "%Y %b %d %H:%M:%S" (current-time))
-          " ------------------------------------------------\n\n")
+          " --\n\n")
   (previous-line 1)
 
   ;; Colorizes the dates
@@ -1240,10 +1255,11 @@ ff/known-address-face is used."
   (save-excursion
     (goto-char (point-min))
     (while (re-search-forward
-            "^-+ [0-9]+ [a-z]+ [0-9]+ [0-9]+:[0-9]+:[0-9]+.+$"
+            "^-- [0-9]+ [a-z]+ [0-9]+ [0-9]+:[0-9]+:[0-9]+ -+$"
             nil t)
       (add-text-properties
-       (match-beginning 0) (match-end 0) '(face ff/secure-date))))
+       (match-beginning 0) (1+ (match-end 0))
+       '(face ff/secure-date rear-nonsticky t))))
 
   (set-buffer-modified-p nil)
   (setq buffer-undo-list nil)
@@ -1426,7 +1442,7 @@ 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[a4paper,top=2.5cm,bottom=2cm,left=1.5cm,right=1.5cm]{geometry}
+\\usepackage[a4paper,top=2.5cm,bottom=2cm,left=2.5cm,right=2.5cm]{geometry}
 \\usepackage[utf8]{inputenc}
 \\usepackage{amsmath}
 \\usepackage{amssymb}
@@ -1442,12 +1458,12 @@ universal argument starts xfig even if the .fig does not exist"
 \\def\\argmin{\\operatornamewithlimits{argmin}}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Sans serif fonts
-%% \\usepackage[T1]{fontenc}
-%% \\usepackage[scaled]{helvet}
-%% \\usepackage[cm]{sfmath}
-%% \\renewcommand{\\ttdefault}{pcr}
-%% \\renewcommand*\\familydefault{\\sfdefault}
+%% Open sans font
+\\usepackage[default]{opensans}
+\\usepackage{cmbright}
+\\renewcommand{\\familydefault}{fos}
+\\renewcommand{\\seriesdefault}{l}
+\\renewcommand{\\bfdefault}{sb}
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% The \\todo command
 \\newcounter{nbdrafts}
@@ -1647,6 +1663,11 @@ int main(int argc, char **argv) {
 <head>
 <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
 <title></title>
+<style>
+p {
+ color:#009900;
+}
+</style>
 </head>
 
 <body>
@@ -1718,21 +1739,8 @@ and refilling all the paragraphs."
    (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)
+   (copy-face 'default 'tex-verbatim)
+   ;; (ff/configure-faces '((tex-verbatim :background "gray95")))
    ))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -1831,7 +1839,7 @@ a file in /tmp"
 
       (when (string-match "\\.sh$" filename)
         (sh-mode)
-        (insert "#!/bin/bash\n\nset -e\n\n")
+        (insert "#!/bin/bash\n\nset -e\nset -o pipefail\n\n")
         (save-excursion
           (ff/add-copyrights))
         )
@@ -1983,6 +1991,19 @@ a file in /tmp"
 ;; (when (ff/load-or-alert "flyspell-timer" t)
 ;;   (add-hook 'flyspell-mode-hook 'flyspell-timer-ensure-idle-timer))
 
+(defun ff/start-flyspell () (interactive)
+  (ff/configure-faces
+   '(
+     ;; (flyspell-incorrect :background "#ff0000" :foreground "black")
+     ;; (flyspell-duplicate :background "#ff9000" :foreground "black")
+     (flyspell-incorrect :foreground "#ff0000" :weight 'bold)
+     (flyspell-duplicate :foreground "#ff9000" :weight 'bold)
+     ))
+  ;; (flyspell-buffer)
+  )
+
+(add-hook 'flyspell-mode-hook 'ff/start-flyspell)
+
 (defun ff/pick-dictionnary () (interactive)
   (when (and (boundp 'flyspell-mode) flyspell-mode)
     (if (and current-input-method (string-match "latin" current-input-method))
@@ -2259,30 +2280,26 @@ next one. With universal argument, kill all killable buffers."
 
 (load "recentf")
 
-(setq recentf-exclude
-      (append recentf-exclude
-              '("enotes$" "secure-notes$" "media-playlists$"
-                "bbdb$"
-                "svn-commit.tmp$" ".git/COMMIT_EDITMSG$"
-                "\.bbl$" "\.aux$" "\.toc$"))
+;; If we just check for file-symlink-p, everytime we start emacs it
+;; will check all the remote files listed in recentf-list, so we check
+;; that they are not remote first
+(defun ff/file-not-remote-but-symlink (filename)
+  (and (not (file-remote-p filename)) (file-symlink-p filename)))
+
+(setq recentf-exclude (append recentf-exclude
+                              '(
+                                ff/file-not-remote-but-symlink
+                                "enotes$" "secure-notes$" "media-playlists$"
+                                "bbdb$"
+                                "svn-commit.tmp$" ".git/COMMIT_EDITMSG$"
+                                "\.bbl$" "\.aux$" "\.toc$"
+                                ))
       recentf-max-saved-items 1000
-      recentf-save-file "~/private/emacs/recentf"
+      recentf-save-file (concat ff/emacs-dir "/recentf")
       )
 
 (when (boundp 'recentf-keep) (add-to-list 'recentf-keep 'file-remote-p))
 
-;; Removes the link if we add the file itself (I am fed up with
-;; duplicates because of vc-follow-symlinks)
-
-(defadvice recentf-add-file (before ff/remove-links (filename) activate)
-  ;; If we are adding a filename corresponding to the last link we
-  ;; have added, remove the latter
-  (when (and recentf-list
-             (file-symlink-p (car recentf-list))
-             (string= filename (file-chase-links filename)))
-    (setq recentf-list (cdr recentf-list))
-    ))
-
 (recentf-mode 1)
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2314,7 +2331,7 @@ next one. With universal argument, kill all killable buffers."
         media/add-current-song-to-interrupted-when-killing t
         media/duration-to-history 30
         media/history-size 1000
-        media/playlist-file "~/private/emacs/media-playlists"
+        media/playlist-file (concat ff/emacs-dir "/media-playlists")
         media/mplayer/args '(
                              "-framedrop"
                              "-zoom"
@@ -2323,7 +2340,7 @@ next one. With universal argument, kill all killable buffers."
                              ;; "-stop-xscreensaver"
                              ;; "-osdlevel" "3"
                              )
-        media/mplayer/timing-request-period 5.0
+        media/mplayer/timing-request-period 1.0
         )
   )
 
@@ -2386,6 +2403,16 @@ proposes to visit them."
    )
   )
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; My script to automatically count the number of words and characters
+;; between two markers
+
+(ff/load-or-alert "text-counters.el")
+
+;; Display them in the modeline when in text-mode
+
+(add-hook 'text-mode-hook 'tc/add-text-counters-in-modeline)
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; A function to remove temporary alarm windows
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -2435,7 +2462,7 @@ proposes to visit them."
   (if flyspell-mode (flyspell-mode -1)
     (flyspell-mode 1)
     (flyspell-buffer))
-)
+  )
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;; The fridge!
@@ -2464,11 +2491,17 @@ with a time tag, and save this file"
   )
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; My own keymap
+;; My own keymap mapped to C-`
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (setq ff/map (make-sparse-keymap))
 (define-key global-map [(control \`)] ff/map)
+
+(unless window-system
+  ;; (define-key global-map [(control @)] ff/map)
+  (define-key global-map [(meta O) \`] ff/map)
+  )
+
 (define-key esc-map "`" ff/map)
 
 (defun ff/git-status (&optional dir) (interactive)
@@ -2693,9 +2726,9 @@ With argument ARG, do this that many times."
 
 ;; Where to save the bookmarks and where is bbdb
 
-(setq bookmark-default-file "~/private/emacs/bmk"
+(setq bookmark-default-file (concat ff/emacs-dir "/bmk")
       bbdb-file "~/private/bbdb"
-      custom-file "~/private/emacs/custom")
+      custom-file (concat ff/emacs-dir "/custom"))
 
 ;; enotes.el is one of my own scripts, check my web page