;; Xft.antialias: true
;; Xft.rgba: rgb
+(set-default-font "Inconsolata 15")
+
+;; (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")
+;; (set-default-font "Opensans 10")
+
+(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)
)
;; Activate the dynamic completion of buffer names
-(iswitchb-mode 1)
+;; (iswitchb-mode 1)
+;; (load "lcomplete")
;; Save the minibuffer history
(setq savehist-file (concat ff/emacs-dir "/savehist"))
;; Stop this crazy blinking cursor
(blink-cursor-mode 0)
-;; (setq blink-cursor-delay 0.25
+;; (setq blink-cursor-delay 0.05
+;; blink-cursor-blinks 0
;; blink-cursor-interval 0.25)
;; (set-terminal-coding-system 'utf-8)
;; 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
;; What modes for what file extentions
(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
+(add-to-list 'auto-mode-alist '("\\.md\\'" . markdown-mode))
+
(require 'org-table)
(add-to-list 'auto-mode-alist '("\\.txt\\'" . (lambda()
;; "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)
;; Not the same in xterm (which is gray in my case) and in
;; X-window
+(when window-system
+
+ (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)
+ (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" :weight 'bold)
+ (diff-file-header :background "white" :foreground "black"
+ :weight 'bold)
+ (diff-header :background "white" :foreground "black")
+ (diff-hunk-header :background "white" :foreground "black")
+ (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 "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 :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")
+ (highlight :background "turquoise")
+ (message-cited-text-face :foreground "firebrick")
+ (isearch :background "yellow" :foreground "black")
+ (isearch-lazy-highlight-face' :background "yellow3" :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 "#b0b0ff" :foreground "black" :box nil
+ :inverse-video nil)
+ (header-line :background "cornflowerblue" :foreground "black" :box nil
+ :inverse-video nil)
+ (mode-line-inactive :background "gray80" :foreground "black" :box nil
+ :inverse-video nil)
+ ;; (fringe :background "black" :foreground "gray90")
+ (fringe :background "gray80")
+ (ff/date-info-face :foreground "white")
+ (ff/battery-info-face :foreground "black")
+ ;; (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)
+ ;; (xterm-mouse-mode 1)
(ff/configure-faces
'((italic :underline nil)
(info-title-2 :foreground "green")
:inverse-video nil)
(region :background "white" :foreground "black")
(ff/date-info-face :foreground "white" :weight 'bold)
- (ff/mail-alarm-face :foreground "red" :weight 'bold)
+ (ff/battery-info-face :foreground "black")
+ ;; (ff/mail-alarm-face :foreground "red" :weight 'bold)
(selector/selection :background "yellow")
(gui-button-face :background "green" :foreground "white")
(enotes/information-face :foreground "cyan")
))
)
-;; (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)
- (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" :weight 'bold)
- (diff-file-header :background "white" :foreground "black"
- :weight 'bold)
- (diff-header :background "white" :foreground "black")
- (diff-hunk-header :background "white" :foreground "black")
- (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 "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 :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")
- (highlight :background "turquoise")
- (message-cited-text-face :foreground "firebrick")
- (isearch :background "yellow" :foreground "black")
- (isearch-lazy-highlight-face' :background "yellow3" :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 "#b0b0ff" :foreground "black" :box nil
- :inverse-video nil)
- (header-line :background "cornflowerblue" :foreground "black" :box nil
- :inverse-video nil)
- (mode-line-inactive :background "gray80" :foreground "black" :box nil
- :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")
- ;; (alarm-vc-face :foreground "black" :background "yellow" :weight 'normal)
- (gui-button-face :background "green" :foreground "black")
- ))
- )
-
;; When we are root, put the modeline in red
(when (string= (user-real-login-name) "root")
(define-key global-map [(meta up)] 'ff/scroll-down)
(define-key global-map [(meta down)] 'ff/scroll-up)
+
+(define-key global-map [(meta shift up)]
+ (lambda () (interactive) (condition-case nil (scroll-down 10) (error nil))))
+
+(define-key global-map [(meta shift down)]
+ (lambda () (interactive) (condition-case nil (scroll-up 10) (error nil))))
+
+;; (define-key global-map [(meta shift up)] (lambda () (interactive) (ff/scroll-down 10)))
+;; (define-key global-map [(meta shift down)] 'ff/scroll-up)
+
(define-key global-map [(meta p)] 'ff/scroll-down)
(define-key global-map [(meta n)] 'ff/scroll-up)
(define-key global-map [(meta right)] 'ff/scroll-left)
;; 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)
ps-header-line-pad 0.3
ps-header-font-family 'Courier
ps-header-title-font-size '(8.5 . 10)
- ps-header-font-size '(6 . 7)
+ ;; ps-header-font-size '(6 . 7)
+ ps-header-font-size '(10 . 12)
ps-font-size '(7 . 8)
)
;; Dealing with the laptop battery
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-(defcustom ff/battery-dir "/sys/class/power_supply/BAT0"
+(defcustom ff/battery-dirs '("/sys/class/power_supply/BAT0"
+ "/sys/class/power_supply/BAT1")
"*Where to gather the battery information")
-(defcustom ff/temperature-file "/sys/class/thermal/thermal_zone0/temp"
+(defcustom ff/temperature-files '("/sys/class/thermal/thermal_zone0/temp"
+ "/sys/class/thermal/thermal_zone1/temp")
"*Where to gather the thermal information")
(defun ff/file-first-line (file)
(insert-file-contents-literally file)
(buffer-substring (point-at-bol) (point-at-eol))))
-(defun ff/battery-percent (prefix)
+(defun ff/battery-discharging (l)
+ (and l (or (string= (ff/file-first-line (concat (car l) "/status")) "Discharging")
+ (ff/battery-discharging (cdr l)))))
+
+;; If there is one "Discharging" among the states of all the
+;; batteries, the global state is 'discharging. Otherwise, if there is
+;; a "Charging", the state is 'charging. If none is true, it is
+;; 'unknown
+(defun ff/battery-state (l)
+ (if l
+ (let ((u (ff/file-first-line (concat (car l) "/status"))))
+ (if (string= u "Discharging") 'discharging
+ (let ((s (ff/battery-state (cdr l))))
+ (if (eq s 'discharging) 'discharging
+ (if (or (eq s 'charging) (string= u "Charging"))
+ 'charging
+ 'unknown))
+ )
+ )
+ )
+ 'unknown))
+
+(defun ff/sum-values-from-files (list-files prefix)
+ (apply '+
+ (mapcar
+ (lambda (f)
+ (condition-case nil
+ (string-to-number (ff/file-first-line (format "%s/%s" f prefix)))
+ (error 0))
+ )
+ list-files)))
+
+(defun ff/battery-percent ()
(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))))
+ (/ (* 100 (ff/sum-values-from-files ff/battery-dirs "energy_now"))
+ (ff/sum-values-from-files ff/battery-dirs "energy_full"))
(error -1))
)
-(defun ff/laptop-info-string () (interactive)
- (condition-case nil
- (concat
-
- ;; The temperature
-
- (let ((temp (/ (string-to-number (ff/file-first-line ff/temperature-file)) 1000)))
- (if (> temp 50)
- (concat
- (let ((s (format "%dC " temp)))
- (if (> temp 70) (propertize s 'face
- 'font-lock-warning-face)
- s))
- )
- )
- )
-
- ;; The battery
-
- (let ((battery-status (ff/file-first-line (concat ff/battery-dir "/status"))))
-
- (cond
- ((string= battery-status "Full") "L")
-
- ((string= battery-status "Charging")
- (format "L%d%%" (max (ff/battery-percent "charge")
- (ff/battery-percent "energy"))))
-
- ((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))))
-
- (t battery-status)
-
- ))
-
+(defun ff/temp-info-string () (interactive)
+ (condition-case nil
+ ;; 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)
+ )
+ )
+ )
+
+ (error nil))
)
- (error nil))
- )
+(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 (format "↑%d%%" (ff/battery-percent)))
+ (`discharging (format "↓%d%%" (ff/battery-percent)))
+ ;; (`unknown "✱")
+ (`unknown "F")
+ (_ "?"))
+ (error nil))
+ )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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 "#c0c0ff"))
- (with-temp-buffer (apply 'call-process x)
- (buffer-string))
- ))
- )
-
- '(
- ("hostname" nil t nil "-v")
- ("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
-
-;; (setq ff/already-boinged-for-mail nil)
-
-;; (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))
-;; )
-
-;; (add-hook 'display-time-hook 'ff/boing-if-new-mail)
+ (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)
+ ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Display time
(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
- (propertize (concat 24-hours ":" minutes
- " "
- dayname " "
- monthname " "
- day)
- 'face 'ff/date-info-face)
+ " "
- load
+ ,@(when (ff/battery-info-string)
+ '((ff/temp-info-string)))
+
+ ,@(when (ff/battery-info-string)
+ '((propertize
+ (ff/battery-info-string)
+ 'face 'ff/battery-info-face)))
- ,(if (ff/laptop-info-string)
- '(concat " " (ff/laptop-info-string)))
+ " "
+
+ (propertize
+ (concat ;;" ˌ"
+ 24-hours ":" minutes
+ " "
+ ;; dayname " "
+ monthname " " day
+ ;;"ˌ"
+ )
+ 'face 'ff/date-info-face)
)
(setq list (cdr list)))
(switch-to-buffer found)))
-(define-key global-map [?\C-x right] 'ff/next-buffer)
-(define-key global-map [?\C-x left] 'ff/prev-buffer)
+;; (define-key global-map [?\C-x right] 'ff/next-buffer)
+;; (define-key global-map [?\C-x left] 'ff/prev-buffer)
+;; (define-key global-map [?\M-\]] 'ff/next-buffer)
+;; (define-key global-map [?\M-\[] 'ff/prev-buffer)
+
+(define-key global-map [(meta right)] 'ff/next-buffer)
+(define-key global-map [(meta left)] 'ff/prev-buffer)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; There is actually a decent terminal emulator in emacs!
(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)))
+ (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)
- (kill-buffer buffer))
- (message "Process finished (%s)" (replace-regexp-in-string "\n$" "" str)))
+ (let ((buffer (process-buffer process)))
+ (delete-windows-on buffer)
+ (kill-buffer buffer))
+ (message "Process finished (%s)" (replace-regexp-in-string "\n$" "" str)))
(defun ff/shell-new-buffer (buffername program &rest param)
"Start a terminal-emulator in a new buffer with the shell PROGRAM,
)
(ff/configure-faces '((ff/robot-address-face :foreground "green4")
- (ff/personal-address-face :foreground "blue2" :weight 'bold)
+ (ff/personal-address-face :foreground "dark magenta" :weight 'bold)
(ff/important-address-face :foreground "red3"
- ;; :foreground "blue2"
- ;; :underline t
- ;; :background "white"
- ;; :foreground "green4"
:weight 'bold
- ;; :slant 'italic
)))
)
"The face to display the dates in the modeline.")
(defun ff/secure-note-add () (interactive)
- (find-file ff/secure-note-file)
- ;; Adds a new entry (i.e. date and a bunch of empty lines)
+ (unless
+ (let ((b (find-buffer-visiting ff/secure-note-file)))
+ (and b (switch-to-buffer b)))
+ (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")
+ (previous-line 1)
+ )
- (goto-char (point-min))
- (insert "-- "
- (format-time-string "%Y %b %d %H:%M:%S" (current-time))
- " --\n\n")
- (previous-line 1)
+ ;; Colorizes the dates
- ;; Colorizes the dates
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward
+ "^-- [0-9]+ [a-z]+ [0-9]+ [0-9]+:[0-9]+:[0-9]+ -+$"
+ nil t)
+ (add-text-properties
+ (match-beginning 0) (1+ (match-end 0))
+ '(face ff/secure-date rear-nonsticky t))))
- (save-excursion
- (goto-char (point-min))
- (while (re-search-forward
- "^-- [0-9]+ [a-z]+ [0-9]+ [0-9]+:[0-9]+:[0-9]+ -+$"
- nil t)
- (add-text-properties
- (match-beginning 0) (1+ (match-end 0))
- '(face ff/secure-date rear-nonsticky t))))
-
- (set-buffer-modified-p nil)
- (setq buffer-undo-list nil)
- )
+ (set-buffer-modified-p nil)
+ (setq buffer-undo-list nil)
+ )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Spelling
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun ff/snip () (interactive)
- (let ((start (condition-case nil (region-beginning) (error (point))))
- (end (condition-case nil (region-end) (error (point)))))
- (goto-char end)
- (insert "---------------------------- snip snip -------------------------------\n")
- (goto-char start)
- (insert "---------------------------- snip snip -------------------------------\n")
- ))
+ (let ((start (condition-case nil (region-beginning) (error (point))))
+ (end (condition-case nil (region-end) (error (point)))))
+ (goto-char end)
+ (insert "----------------------------- snip snip -----------------------------\n")
+ (goto-char start)
+ (insert "----------------------------- snip snip -----------------------------\n")
+ ))
(defun ff/start-latex ()
"Adds all that stuff to start a new LaTeX document."
(goto-char (point-min))
(insert "%% -*- mode: latex; mode: reftex; mode: flyspell; coding: utf-8; tex-command: \"pdflatex.sh\" -*-
-\\documentclass[12pt]{article}
+\\documentclass[12pt,a4paper,twoside]{article}
\\usepackage[a4paper,top=2.5cm,bottom=2cm,left=2.5cm,right=2.5cm]{geometry}
\\usepackage[utf8]{inputenc}
\\usepackage{amsmath}
\\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}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun ff/remove-ip-header () (interactive)
- (save-excursion
- (goto-char (point-min))
- (when (and (re-search-forward "START_IP_HEADER" nil t)
- (re-search-forward "END_IP_HEADER" nil t))
- (message "yep"))
- ))
+ (save-excursion
+ (goto-char (point-min))
+ (when (and (re-search-forward "START_IP_HEADER" nil t)
+ (re-search-forward "END_IP_HEADER" nil t))
+ (message "yep"))
+ ))
(defun ff/add-gpl ()
"Adds the GPL statements at the beginning of current buffer."
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
<title></title>
-<style>
+<style type=\"text/css\">
p {
color:#009900;
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun ff/code-to-html () (interactive)
- (save-restriction
- (narrow-to-region (region-beginning) (region-end))
- (replace-string "\"" """ nil (point-min) (point-max))
- (replace-string " " " " nil (point-min) (point-max))
- (replace-string ">" ">" nil (point-min) (point-max))
- (replace-string "<" "<" nil (point-min) (point-max))
- (replace-string "\e" "^[" nil (point-min) (point-max))
- (replace-string "\7f" "^?" nil (point-min) (point-max))
- (replace-string "\1f" "^_" nil (point-min) (point-max))
- (replace-regexp "$" "<br />" nil (point-min) (point-max))
- )
- )
+ (save-restriction
+ (narrow-to-region (region-beginning) (region-end))
+ (replace-string "\"" """ nil (point-min) (point-max))
+ (replace-string " " " " nil (point-min) (point-max))
+ (replace-string ">" ">" nil (point-min) (point-max))
+ (replace-string "<" "<" nil (point-min) (point-max))
+ (replace-string "\e" "^[" nil (point-min) (point-max))
+ (replace-string "\7f" "^?" nil (point-min) (point-max))
+ (replace-string "\1f" "^_" nil (point-min) (point-max))
+ (replace-regexp "$" "<br />" nil (point-min) (point-max))
+ )
+ )
(defun ff/downcase-html-tags () (interactive)
- (save-excursion
- (beginning-of-buffer)
- (while (re-search-forward "<\\([^>]+\\)>" nil t)
- (downcase-region (match-beginning 1) (match-end 1)))
- )
- )
+ (save-excursion
+ (beginning-of-buffer)
+ (while (re-search-forward "<\\([^>]+\\)>" nil t)
+ (downcase-region (match-beginning 1) (match-end 1)))
+ )
+ )
;; If we enter html mode and there is no makefile around, create a
;; compilation command with tidy (this is cool stuff)
;; Create the adequate embryo of a file if it does not exist
(defun ff/start-file () (interactive)
- (let ((filename (buffer-file-name)))
- (when filename
-
- (when (string-match "\\.sh$" filename)
- (sh-mode)
- (insert "#!/bin/bash\n\nset -e\nset -o pipefail\n\n")
- (save-excursion
- (ff/add-copyrights))
- )
-
- (when (string-match "\\.html$" filename)
- (html-mode)
- (ff/start-html)
- (previous-line 4)
- )
-
- (when (string-match "\\.h$" filename)
- (c++-mode)
- (ff/headerize)
- (save-excursion
- (ff/add-copyrights)
- (newline))
- (newline)
- (newline)
- (previous-line 1)
- )
-
- (when (string-match "\\.c$" filename)
- (c-mode)
- (ff/add-copyrights)
- (ff/start-c))
-
- (when (string-match "\.\\(cc\\|cpp\\)$" filename)
- (c++-mode)
- (ff/add-copyrights)
- (let ((headername (replace-regexp-in-string "\\.\\(cc\\|cpp\\)$" ".h"
- filename)))
- (if (file-exists-p headername)
- (insert (concat "\n#include \"" (file-name-nondirectory headername) "\"\n"))
- (ff/start-c++))
- ))
+ (let ((filename (buffer-file-name)))
+ (when filename
+
+ (when (string-match "\\.sh$" filename)
+ (sh-mode)
+ (insert "#!/bin/bash\n\nset -e\nset -o pipefail\n\n")
+ (save-excursion
+ (ff/add-copyrights))
+ )
+
+ (when (string-match "\\.html$" filename)
+ (html-mode)
+ (ff/start-html)
+ (previous-line 4)
+ )
+
+ (when (string-match "\\.h$" filename)
+ (c++-mode)
+ (ff/headerize)
+ (save-excursion
+ (ff/add-copyrights)
+ (newline))
+ (newline)
+ (newline)
+ (previous-line 1)
+ )
+
+ (when (string-match "\\.c$" filename)
+ (c-mode)
+ (ff/add-copyrights)
+ (ff/start-c))
+
+ (when (string-match "\.\\(cc\\|cpp\\)$" filename)
+ (c++-mode)
+ (ff/add-copyrights)
+ (let ((headername (replace-regexp-in-string "\\.\\(cc\\|cpp\\)$" ".h"
+ filename)))
+ (if (file-exists-p headername)
+ (insert (concat "\n#include \"" (file-name-nondirectory headername) "\"\n"))
+ (ff/start-c++))
+ ))
- (when (string-match "\\.tex$" filename)
- (latex-mode)
- (ff/start-latex)
- ))
- )
- (set-buffer-modified-p nil)
- )
+ (when (string-match "\\.tex$" filename)
+ (latex-mode)
+ (ff/start-latex)
+ ))
+ )
+ (set-buffer-modified-p nil)
+ )
(if (>= emacs-major-version 22)
(add-to-list 'find-file-not-found-functions 'ff/start-file)
(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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
)
(defun ff/universal-compile () (interactive)
- (funcall (or (cdr (assoc major-mode
- '(
- (latex-mode . tex-file)
- (html-mode . browse-url-of-buffer)
- ;; Here you can add other mode -> compile command
- )))
- 'ff/fast-compile ;; And this is the failsafe
- )))
+ (funcall (or (cdr (assoc major-mode
+ '(
+ (latex-mode . tex-file)
+ (html-mode . browse-url-of-buffer)
+ ;; Here you can add other mode -> compile command
+ )))
+ 'ff/fast-compile ;; And this is the failsafe
+ )))
(define-key global-map [f1] 'ff/universal-compile)
(define-key global-map [(shift f1)] 'compile)
;; (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)
- )
+ (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))
- (ispell-change-dictionary "francais")
- (ispell-change-dictionary "american"))
- ;; (flyspell-buffer)
- )
- )
+ (when (and (boundp 'flyspell-mode) flyspell-mode)
+ (if (and current-input-method (string-match "latin" current-input-method))
+ (ispell-change-dictionary "francais")
+ (ispell-change-dictionary "american"))
+ ;; (flyspell-buffer)
+ )
+ )
(defadvice toggle-input-method (after ff/switch-dictionnary nil activate)
(ff/pick-dictionnary))
;; Usefull to deal with results in latex files
(defun ff/round-floats-in-region () (interactive)
- (save-restriction
- (condition-case nil
- (narrow-to-region (region-beginning) (region-end))
- (error (thing-at-point 'word)))
- (save-excursion
- (goto-char (point-min))
- (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)))))))
+ (save-restriction
+ (condition-case nil
+ (narrow-to-region (region-beginning) (region-end))
+ (error (thing-at-point 'word)))
+ (save-excursion
+ (goto-char (point-min))
+ (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.3f" value)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Keymaping
;; Closes the current \begin{}
-(when (ff/load-or-alert "longlines")
-
- (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 ()
- ;; (when (save-excursion
- ;; (goto-char (point-min))
- ;; (re-search-forward "^.\\{81,\\}$" nil t))
- ;; (longlines-mode)
- ;; (message "Switched on the lonlines mode automatically")
- ;; ))
-
- ;; (add-hook 'latex-mode-hook 'ff/auto-longlines)
-
- )
-
;; Meta-/ remaped (completion)
(define-key global-map [(shift right)] 'dabbrev-expand)
;; Change the current window.
(defun ff/next-same-frame-window () (interactive)
- (select-window (next-window (selected-window)
- (> (minibuffer-depth) 0)
- nil)))
+ (select-window (next-window (selected-window)
+ (> (minibuffer-depth) 0)
+ nil)))
(defun ff/previous-same-frame-window () (interactive)
- (select-window (previous-window (selected-window)
- (> (minibuffer-depth) 0)
- nil)))
+ (select-window (previous-window (selected-window)
+ (> (minibuffer-depth) 0)
+ nil)))
(define-key global-map [(shift prior)] 'ff/next-same-frame-window)
(define-key global-map [(shift next)] 'ff/previous-same-frame-window)
;; (define-key global-map [(control shift next)] 'previous-multiframe-window)
;; I have two screens sometime!
+;; (define-key global-map [(meta next)] 'other-frame)
+;; (define-key global-map [(meta prior)] (lambda () (interactive) (other-frame -1)))
-(define-key global-map [(meta next)] 'other-frame)
-(define-key global-map [(meta prior)] (lambda () (interactive) (other-frame -1)))
-
-(define-key global-map [(shift home)] 'delete-other-windows-vertically)
+;; (load "winner")
+(winner-mode 1)
+;; (define-key global-map [(shift backspace)] 'winner-undo)
+;; (define-key global-map [(shift home)] 'delete-other-windows-vertically)
;; (define-key global-map [(control +)] 'enlarge-window)
;; (define-key global-map [(control -)] 'shrink-window)
-
;; Goes to next/previous buffer
-
-(define-key global-map [(control prior)] 'ff/next-buffer)
-(define-key global-map [(control next)] 'ff/prev-buffer)
+;; (define-key global-map [(control prior)] 'ff/next-buffer)
+;; (define-key global-map [(control next)] 'ff/prev-buffer)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; If M-. on a symbol, show where it is defined in another window
(when (ff/load-or-alert "etags")
(defun ff/find-tag-nofocus () (interactive)
- "Show in another window the definition of the current tag"
- (let ((tag (find-tag-default)))
- (display-buffer (find-tag-noselect tag (string= tag last-tag)))
- (message "Tag %s" tag)
- )
- )
+ "Show in another window the definition of the current tag"
+ (let ((tag (find-tag-default)))
+ (display-buffer (find-tag-noselect tag (string= tag last-tag)))
+ (message "Tag %s" tag)
+ )
+ )
(define-key global-map [(meta .)] 'ff/find-tag-nofocus)
)
(if (string-match ff/kill-this-buffer-and-delete-window-exceptions (buffer-name))
(ff/next-buffer)
(kill-this-buffer)))
- ;; (unless (one-window-p t) (delete-window))
+ (unless (one-window-p t) (delete-window))
)
(define-key global-map [(control backspace)] 'ff/kill-this-buffer-and-delete-window)
(message "elisp debug off")))
(defun ff/create-dummy-buffer (&optional universal) (interactive "P")
- (find-file (concat "/tmp/" (ff/non-existing-filename "/tmp/" "dummy" "")))
- (text-mode)
- (if universal (ff/insert-url (current-kill 0)))
- (message "New dummy text-mode buffer"))
+ (find-file (concat "/tmp/" (ff/non-existing-filename "/tmp/" "dummy" "")))
+ (text-mode)
+ (if universal (ff/insert-url (current-kill 0)))
+ (message "New dummy text-mode buffer"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Recentf to keep a list of recently visited files. I use it
)
(defun ff/selector-mail-from-bbdb () (interactive)
- (selector/select
- (mapcar
- (lambda (r) (cons (concat (elt r 0)
- " "
- (elt r 1)
- " ("
- (car (elt r 6))
- ")")
- r))
- (bbdb-records))
- (if (string= mode-name "Mail")
- 'ff/selector-insert-record-callback
- 'ff/selector-compose-mail-callback)
- "*bbdb-search*"
- )
- )
+ (selector/select
+ (mapcar
+ (lambda (r) (cons (concat (elt r 0)
+ " "
+ (elt r 1)
+ " ("
+ (car (elt r 6))
+ ")")
+ r))
+ (bbdb-records))
+ (if (string= mode-name "Mail")
+ 'ff/selector-insert-record-callback
+ 'ff/selector-compose-mail-callback)
+ "*bbdb-search*"
+ )
+ )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; My script to automatically count the number of words and characters
(add-hook 'text-mode-hook 'tc/add-text-counters-in-modeline)
+;; (add-hook 'text-mode-hook
+;; (lambda ()
+;; (setq comment-start " > ")))
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; A function to remove temporary alarm windows
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun ff/twin-horizontal-current-buffer () (interactive)
- (delete-other-windows)
- (split-window-horizontally)
- (balance-windows)
- )
+ (delete-other-windows)
+ (split-window-horizontally)
+ (balance-windows)
+ )
(defun ff/twin-vertical-current-buffer () (interactive)
- (delete-other-windows)
- (split-window-vertically)
- (balance-windows)
- )
+ (delete-other-windows)
+ (split-window-vertically)
+ (balance-windows)
+ )
(defun ff/flyspell-mode (arg) (interactive "p")
- (if flyspell-mode (flyspell-mode -1)
- (flyspell-mode 1)
- (flyspell-buffer))
-)
+ (if flyspell-mode (flyspell-mode -1)
+ (flyspell-mode 1)
+ (flyspell-buffer))
+ )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; The fridge!
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun ff/move-region-to-fridge () (interactive)
- "Cut the current region, paste it in a file called ./fridge
+ "Cut the current region, paste it in a file called ./fridge
with a time tag, and save this file"
- (unless (use-region-p) (error "No region selected"))
- (let ((bn (file-name-nondirectory (buffer-file-name))))
- (kill-region (region-beginning) (region-end))
- (with-current-buffer (find-file-noselect "fridge")
- (goto-char (point-max))
- (insert "\n")
- (insert "######################################################################\n")
- (insert "\n"
- (format-time-string "%Y %b %d %H:%M:%S" (current-time))
- " (from "
- bn
- ")\n\n")
- (yank)
- (save-buffer)
- (message "Region moved to fridge")
- )
- )
- )
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; Let's be zen. Remove the modeline and fringes.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(setq ff/zen-original-setting nil)
-
-(defun ff/zen () (interactive)
- (if ff/zen-original-setting
- (setq mode-line-format (car ff/zen-original-setting)
- fringe-mode (cdr ff/zen-original-setting)
- ff/zen-original-setting nil)
- (setq ff/zen-original-setting (cons mode-line-format fringe-mode)
- mode-line-format nil
- fringe-mode '(0 . 0))
- (delete-other-windows)
- )
- (fringe-mode fringe-mode)
- (if ff/zen-original-setting
- (message "Zen mode")
- (message "Cluttered mode"))
- )
-
-;; (define-key global-map [(control x) (x)] 'ff/zen)
+ (unless (use-region-p) (error "No region selected"))
+ (let ((bn (file-name-nondirectory (buffer-file-name))))
+ (kill-region (region-beginning) (region-end))
+ (with-current-buffer (find-file-noselect "fridge")
+ (goto-char (point-max))
+ (insert "\n")
+ (insert "######################################################################\n")
+ (insert "\n"
+ (format-time-string "%Y %b %d %H:%M:%S" (current-time))
+ " (from "
+ bn
+ ")\n\n")
+ (yank)
+ (save-buffer)
+ (message "Region moved to fridge")
+ )
+ )
+ )
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;; My own keymap
+;; My own keymap mapped to C-`
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(setq ff/map (make-sparse-keymap))
(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)
- (if (buffer-file-name)
- (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)))
- )
+ (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))))
+ )
(define-key ff/map [(control g)] 'ff/git-status)
(define-key ff/map [(control w)] 'server-edit)
(define-key ff/map [?\C-3] 'ff/twin-horizontal-current-buffer)
(define-key ff/map " " 'delete-trailing-whitespace)
-(define-key ff/map [(control x)] 'ff/zen)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Hacks so that all keys are functionnal in xterm and through ssh.