X-Git-Url: https://www.fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=elisp.git;a=blobdiff_plain;f=emacs.el;h=77626cf05e59de2a923421b58923a194eecad9f0;hp=70b05522288082dbad60d32a41a0a218d48ba97f;hb=3435c1b2ecff7b6c318809b9f316a6b3e9ac4a02;hpb=3aa8b7a112760ffd882d6444088ba1ed95350a60 diff --git a/emacs.el b/emacs.el index 70b0552..77626cf 100644 --- a/emacs.el +++ b/emacs.el @@ -18,15 +18,6 @@ ;; Contact for comments & bug reports ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Ugly hack because 23.2 is not installed properly in my Debian - -(when (and (>= emacs-major-version 23) - (>= emacs-minor-version 2)) - (add-to-list 'load-path "/usr/share/emacs/site-lisp/vm/") - (add-to-list 'load-path "/usr/share/emacs/site-lisp/bbdb/lisp/") - (add-to-list 'load-path "/usr/share/emacs/site-lisp/mailcrypt/") - ) - ;; It's better to set the preferences in the .Xresources so that the ;; window is not first displayed with the wrong options @@ -40,6 +31,14 @@ ;; 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 @@ -51,12 +50,15 @@ (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) ;; 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)) @@ -64,6 +66,10 @@ ;; 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) @@ -72,7 +78,7 @@ ;; use colorization for all modes (global-font-lock-mode t) -(setq font-lock-maximum-decoration 2 +(setq font-lock-maximum-decoration 3 ;;'((latex-mode . 2) (t . 2)) ) @@ -80,9 +86,13 @@ (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 +(setq enable-recursive-minibuffers t) +(minibuffer-depth-indicate-mode 1) + ;; I do not like tooltips (when (functionp 'tooltip-mode) (tooltip-mode nil)) @@ -133,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 @@ -207,6 +221,9 @@ load-warning buffer in case of failure." ;; And I like ascii files epa-armor t + ;; tramp-default-method "ssh" + tramp-default-method "scp" + ;; I have no problem with files having their own local variables enable-local-eval t @@ -216,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 @@ -231,6 +254,16 @@ load-warning buffer in case of failure." backup-by-copying-when-linked t ) +(setq tramp-backup-directory-alist backup-directory-alist) + +(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) @@ -262,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 @@ -282,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) @@ -333,7 +372,7 @@ load-warning buffer in case of failure." )) ;; "tool" bar? Are you kidding? -(when (boundp 'tool-bar-mode) (tool-bar-mode -1)) +(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") @@ -362,11 +401,13 @@ 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-face :foreground "blue" :weight 'bold) - (diff-changed-face :foreground "green" :weight 'bold) - (diff-removed-face :foreground "red" :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") @@ -378,13 +419,13 @@ 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") - (sh-heredoc :foreground "blue") - (sh-heredoc-face :foreground "blue") + (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") @@ -399,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") )) ) @@ -418,14 +464,17 @@ load-warning buffer in case of failure." (ff/configure-faces '( - (escape-glyph :foreground "#c0c0c0" :weight 'bold) + ;; (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) (cperl-hash-face :background "gray90" :foreground "purple" :weight 'bold) (message-cited-text :foreground "red4") + (diff-mode :background "gray90" :weight 'bold) (diff-added :background "gray90" :foreground "green4" :weight 'bold) (diff-removed :background "gray90" :foreground "red2" :weight 'bold) - (diff-changed :background "gray90" :foreground "blue") + (diff-changed :background "gray90" :foreground "blue" :weight 'bold) (diff-file-header :background "white" :foreground "black" :weight 'bold) (diff-header :background "white" :foreground "black") @@ -433,37 +482,39 @@ 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") (header-line :background "gray65") - (sh-heredoc :foreground "darkorange3") - (sh-heredoc-face :foreground "darkorange3") (highlight :background "turquoise") (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") (trailing-whitespace :background "gray65") (cursor :inverse-video t) (enotes/list-title-face :foreground "blue" :weight 'bold) - (mode-line :background "#9090f0" :foreground "black" :box nil + (mode-line :background "#b0b0ff" :foreground "black" :box nil :inverse-video nil) (header-line :background "cornflowerblue" :foreground "black" :box nil :inverse-video nil) - (mode-line-inactive :background "#606080" :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") )) ) @@ -475,6 +526,19 @@ load-warning buffer in case of failure." :inverse-video nil)) )) +;; Why should I have to do this? +(add-hook 'sh-mode-hook + (lambda () + (set-face-attribute 'sh-heredoc nil + :foreground "#604000" + :background "white" + :italic t) + (set-face-attribute 'sh-heredoc-face nil + :foreground "#604000" + :background "white" + :italic t) + )) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Move the window on the buffer without moving the cursor ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -573,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 "^--$" nil t))) - (to (save-excursion (re-search-forward "^--$" 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 " @@ -655,11 +694,11 @@ occurrences " ;; Printing ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(require 'ps-print) +(load "ps-print") (setq ps-print-color-p nil - ;; ps-paper-type 'letter - ps-paper-type 'a4 + 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 @@ -757,103 +796,66 @@ 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)) - - (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))) +(defun ff/file-first-line (file) + (with-temp-buffer + (insert-file-contents-literally file) + (buffer-substring (point-at-bol) (point-at-eol)))) - (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 70) (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") + (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)))) - ((eq (nth 0 info) 'charging) - (format "L%2d%%" (/ (* 100 (nth 2 info)) (nth 1 info)))) + (t battery-status) - (t (format "???")) + )) - ))) + ) - (error nil))) + (error nil)) + ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -876,7 +878,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)) )) @@ -944,7 +946,7 @@ printer." load ,(if (ff/laptop-info-string) - '(concat " /" (ff/laptop-info-string) "/")) + '(concat " " (ff/laptop-info-string))) ) @@ -988,6 +990,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) @@ -1034,9 +1041,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") @@ -1065,7 +1075,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 @@ -1083,21 +1093,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 @@ -1134,6 +1147,8 @@ goback argument, go back where we were." ;; Failsafe version if we can't load bbdb (defun ff/explicit-name (email) email) +(load "vc-git") + (when (ff/load-or-alert "bbdb") (setq @@ -1159,7 +1174,7 @@ goback argument, go back where we were." "The face to display known mail identities.") (defface ff/unknown-address-face - '((t (:foreground "red4"))) + '((t (:foreground "gray50"))) "The face to display unknown mail identities.") (defun ff/explicit-name (email) @@ -1197,7 +1212,9 @@ ff/known-address-face is used." ) (ff/configure-faces '((ff/robot-address-face :foreground "green4") - (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" @@ -1205,7 +1222,6 @@ ff/known-address-face is used." ;; :slant 'italic ))) - ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1220,18 +1236,18 @@ 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) - (find-file "~/private/secure-notes.gpg") + (find-file ff/secure-note-file) ;; Adds a new entry (i.e. date and a bunch of empty lines) (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 @@ -1239,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) @@ -1425,38 +1442,41 @@ 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=2.5cm,right=2.5cm]{geometry} +\\usepackage[utf8]{inputenc} \\usepackage{amsmath} \\usepackage{amssymb} -\\usepackage[utf8]{inputenc} -%% \\usepackage{eurosym} -%% \\usepackage{hyperref} -%% \\usepackage{harvard} +\\usepackage[pdftex]{graphicx} +\\usepackage{microtype} +\\usepackage[colorlinks=true,linkcolor=blue,urlcolor=blue,citecolor=blue]{hyperref} \\setlength{\\parindent}{0cm} \\setlength{\\parskip}{12pt} +\\renewcommand{\\baselinestretch}{1.3} + +\\def\\argmax{\\operatornamewithlimits{argmax}} +\\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} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% Draft layout -%% \\setlength{\\parindent}{1cm} -%% \\renewcommand{\\baselinestretch}{2.0} -%% \\setlength{\\oddsidemargin}{-0.6cm} -%% \\setlength{\\evensidemargin}{0cm} -%% \\setlength{\\textwidth}{17.5cm} -%% \\setlength{\\textheight}{23cm} -%% \\setlength{\\topmargin}{-1.5cm} +%% The \\todo command +\\newcounter{nbdrafts} +\\setcounter{nbdrafts}{0} +\\makeatletter +\\newcommand{\\checknbdrafts}{ +\\ifnum \\thenbdrafts > 0 +\\@latex@warning@no@line{*WARNING* The document contains \\thenbdrafts \\space draft note(s)} +\\fi} +\\newcommand{\\todo}[1]{\\addtocounter{nbdrafts}{1}{\\color{red} #1}} +\\makeatother %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% \\renewcommand{\\baselinestretch}{1.3} - \\begin{document} ") @@ -1473,25 +1493,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) @@ -1499,7 +1506,20 @@ 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))) )) @@ -1643,6 +1663,11 @@ int main(int argc, char **argv) { + @@ -1714,8 +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) - ;; (flyspell-mode 1) - ;; (reftex-mode 1) + (copy-face 'default 'tex-verbatim) + ;; (ff/configure-faces '((tex-verbatim :background "gray95"))) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1814,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)) ) @@ -1863,6 +1888,17 @@ a file in /tmp" (add-to-list 'find-file-not-found-functions 'ff/start-file) (add-to-list 'find-file-not-found-hooks 'ff/start-file)) +(when (>= emacs-major-version 24) + (define-obsolete-function-alias 'make-local-hook 'ignore "21.1") + (setq send-mail-function 'sendmail-send-it) ;; emacs 24.x stuff + + (custom-set-faces + '(diff-added ((default (:background "gray90" :foreground "green4" :weight bold)))) + '(diff-removed ((default (:background "gray90" :foreground "red2" :weight bold)))) + '(diff-changed ((default (:background "gray90" :foreground "blue" :weight bold)))) + ) + ) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-key global-map [f8] 'ff-find-other-file) @@ -1955,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)) @@ -2024,13 +2073,13 @@ 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.0f" value))))))) + (insert (format "%0.2f" value))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 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 @@ -2086,6 +2135,9 @@ This may be a useful alternative binding for \\[delete-other-windows] (setq longlines-show-hard-newlines t longlines-auto-wrap t ;; longlines-show-effect #("|\n" 0 2 (face escape-glyph)) + ;; longlines-show-effect #("∴\n" 0 2 (face escape-glyph)) + longlines-show-effect #("•\n" 0 2 (face escape-glyph)) + ;; longlines-show-effect #("↵\n" 0 2 (face escape-glyph)) ) ;; (defun ff/auto-longlines () @@ -2226,32 +2278,28 @@ next one. With universal argument, kill all killable buffers." ;; exclusively with my selector.el ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(require 'recentf) +(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) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2283,15 +2331,16 @@ 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" + "-cache" "512" "-subfont-osd-scale" "3" ;; "-stop-xscreensaver" ;; "-osdlevel" "3" ) - media/mplayer/timing-request-period 5.0 + media/mplayer/timing-request-period 1.0 ) ) @@ -2302,7 +2351,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) @@ -2354,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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2400,8 +2459,10 @@ proposes to visit them." ) (defun ff/flyspell-mode (arg) (interactive "p") - (flyspell-mode) - (when flyspell-mode (flyspell-buffer))) + (if flyspell-mode (flyspell-mode -1) + (flyspell-mode 1) + (flyspell-buffer)) + ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; The fridge! @@ -2415,6 +2476,8 @@ with a time tag, and save this file" (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 " @@ -2428,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) @@ -2440,10 +2509,15 @@ with a time tag, and save this file" (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" '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) @@ -2459,6 +2533,7 @@ with a time tag, and save this file" (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) +(define-key ff/map "t" (lambda () (interactive) (find-file "~/private/TODO.txt"))) (define-key ff/map "h" 'ff/tidy-html) (define-key ff/map "c" 'ff/count-char) (define-key ff/map [(control p)] 'ff/print-to-file) @@ -2495,30 +2570,30 @@ with a time tag, and save this file" ;; 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) @@ -2651,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