X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=emacs.el;h=7dc64bb33bca2089fd1461a6f5b0a6c4ead7b3d9;hb=63b258502e402c0d577ed24ee18b36b86cdaba75;hp=1bc13642676212851bb16bebb78d336c8c54a6be;hpb=477f09d6d69a4efcdc5c5f558ca4934008808c35;p=elisp.git diff --git a/emacs.el b/emacs.el index 1bc1364..7dc64bb 100644 --- a/emacs.el +++ b/emacs.el @@ -1,4 +1,4 @@ -;; -*-Emacs-Lisp-*- +;; -*- mode: Emacs-Lisp; mode: rainbow; -*- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; This program is free software; you can redistribute it and/or ;; @@ -18,6 +18,15 @@ ;; 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 @@ -42,6 +51,7 @@ (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) @@ -81,7 +91,7 @@ (icomplete-mode 1) ;; (setq highlight-current-line-globally t - ;; highlight-current-line-ignore-regexp "Faces\\|Colors\\| \\*Mini\\|\\*media\\|INBOX") +;; highlight-current-line-ignore-regexp "Faces\\|Colors\\| \\*Mini\\|\\*media\\|INBOX") ;; (highlight-current-line-minor-mode 1) ;; (highlight-current-line-set-bg-color "gray75") @@ -328,11 +338,11 @@ load-warning buffer in case of failure." ;; ;; 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))))) +;; (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 @@ -374,6 +384,7 @@ load-warning buffer in case of failure." (font-lock-function-name-face :foreground "cyan") (flyspell-incorrect-face :foreground "red2") (flyspell-duplicate-face :foreground "OrangeRed2") + (hl-line :background "white") (sh-heredoc :foreground "blue") (sh-heredoc-face :foreground "blue") (font-lock-keyword-face :foreground "blue") @@ -404,12 +415,12 @@ load-warning buffer in case of failure." ;; (ff/configure-faces '((default :background "gray80" :foreground "black"))) (when window-system - (setq - display-time-use-mail-icon t) + ;; (setq + ;; display-time-use-mail-icon t) (ff/configure-faces '( - (escape-glyph :foreground "gray70" :weight 'bold) + (escape-glyph :foreground "#c0c0c0" :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) @@ -425,9 +436,11 @@ load-warning buffer in case of failure." (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-comment-face :foreground "") + ;; (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") + (hl-line :background "white") (header-line :background "gray65") (sh-heredoc :foreground "darkorange3") (sh-heredoc-face :foreground "darkorange3") @@ -650,10 +663,10 @@ occurrences " (setq ps-print-color-p nil ;; 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 - ps-right-margin 56.692 + ;; ps-top-margin (* 1.75 56.692) + ;; ps-left-margin 56.692 + ;; ps-bottom-margin 56.692 + ;; ps-right-margin 56.692 ;; Simple header. Remove that silly frame shadow. ps-print-header nil @@ -672,6 +685,26 @@ occurrences " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; http://blog.tuxicity.se/elisp/emacs/2010/03/26/rename-file-and-buffer-in-emacs.htm + +(defun rename-file-and-buffer () + "Renames current buffer and file it is visiting." + (interactive) + (let ((name (buffer-name)) + (filename (buffer-file-name))) + (if (not (and filename (file-exists-p filename))) + (message "Buffer '%s' is not visiting a file!" name) + (let ((new-name (read-file-name "New name: " filename))) + (cond ((get-buffer new-name) + (message "A buffer named '%s' already exists!" new-name)) + (t + (rename-file name new-name 1) + (rename-buffer new-name) + (set-visited-file-name new-name) + (set-buffer-modified-p nil))))))) + +(global-set-key (kbd "C-c r") 'rename-file-and-buffer) + (defun ff/non-existing-filename (dir prefix suffix) "Returns a filename of the form DIR/PREFIX[.n].SUFFIX whose file does not exist" @@ -846,7 +879,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)) )) @@ -918,8 +951,8 @@ printer." ) - ;; display-time-format "%b %a %e %H:%M" - ;; display-time-mail-face nil + ;; display-time-format "%b %a %e %H:%M" + ;; display-time-mail-face nil ) ;; Show the time, mail and stuff @@ -1053,15 +1086,18 @@ 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 @@ -1129,7 +1165,7 @@ goback argument, go back where we were." "The face to display known mail identities.") (defface ff/unknown-address-face - '((t (:foreground "red3"))) + '((t (:foreground "red4"))) "The face to display unknown mail identities.") (defun ff/explicit-name (email) @@ -1158,7 +1194,7 @@ ff/known-address-face is used." (bbdb-record-raw-notes record))) 'ff/known-address-face)) (error - (propertize (or (and data (concat "<" email ">")) + (propertize (or (and data (concat "<" net ">")) "*undefined*") 'face 'ff/unknown-address-face) )) @@ -1274,12 +1310,15 @@ universal argument starts xfig even if the .fig does not exist" (or (re-search-forward "{\\([^{}]*.\\)eps}" (point-at-eol) t) (re-search-forward "{\\([^{}]*.\\)pdf}" (point-at-eol) t) (re-search-forward "{\\([^{}]*.\\)pdf_t}" (point-at-eol) t) + (re-search-forward "{\\([^{}]*.\\)png}" (point-at-eol) t) + (re-search-forward "{\\([^{}]*.\\)jpg}" (point-at-eol) t) ))) (and (<= (match-beginning 1) (point)) (>= (match-end 1) (- (point) 2)))) (ff/run-eps-edition (match-string-no-properties 1) '(("fig" . "xfig") + ("jpg" . "gimp" ) ("png" . "gimp") ("pgm" . "gimp") ("ppm" . "gimp") ("jpg" . "xv")) universal) @@ -1368,6 +1407,10 @@ universal argument starts xfig even if the .fig does not exist" (when (ff/load-or-alert "lookup-dict" t) (define-key global-map [(control \?)] 'lookup-dict)) +;; (defun ff/generate-password () (interactive) +;; (let ((c "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-")) +;; (nth (random (length c)) c)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Automatization of things I do often ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1397,15 +1440,26 @@ universal argument starts xfig even if the .fig does not exist" %% \\usepackage{hyperref} %% \\usepackage{harvard} +\\setlength{\\parindent}{0cm} +\\setlength{\\parskip}{12pt} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Sans serif fonts %% \\usepackage[T1]{fontenc} %% \\usepackage[scaled]{helvet} %% \\usepackage[cm]{sfmath} %% \\renewcommand{\\ttdefault}{pcr} %% \\renewcommand*\\familydefault{\\sfdefault} - -\\setlength{\\parindent}{0cm} -\\setlength{\\parskip}{12pt} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% 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} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% \\renewcommand{\\baselinestretch}{1.3} @@ -1458,6 +1512,14 @@ universal argument starts xfig even if the .fig does not exist" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(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")) + )) + (defun ff/add-gpl () "Adds the GPL statements at the beginning of current buffer." (interactive) @@ -1518,6 +1580,24 @@ END_IP_HEADER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun ff/start-c () + "Adds the header to start a C program." + (interactive) + ;; (beginning-of-buffer) + (insert + " +#include +#include + +int main(int argc, char **argv) { + exit(EXIT_SUCCESS); +} +") + (previous-line 2) + ) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (defun ff/start-c++ () "Adds the header to start a C++ program." (interactive) @@ -1588,8 +1668,8 @@ int main(int argc, char **argv) { (defun ff/cout-var (arg) "Invoked on a line with a list of variables names, -it inserts a line which displays their values in cout -(or cerr if the function is invoked with a universal arg)" +it inserts a line which displays their values in cout, or cerr if +the function is invoked with a universal arg" (interactive "P") (let ((line (if arg "cerr" "cout"))) (goto-char (point-at-bol)) @@ -1633,12 +1713,16 @@ and refilling all the paragraphs." ")) ) -(add-hook 'latex-mode-hook (lambda () - (define-key latex-mode-map - [(meta S)] 'ff/start-slide) - (define-key latex-mode-map - [(control c) (control a)] 'align-current) - )) +(add-hook + 'latex-mode-hook + (lambda () + (define-key latex-mode-map [(meta S)] 'ff/start-slide) + (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) + )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1758,10 +1842,16 @@ a file in /tmp" (previous-line 1) ) - (when (string-match "\\.cc$" filename) + (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" ".h" filename))) + (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++)) @@ -1836,7 +1926,7 @@ a file in /tmp" ) ) -(setq compilation-finish-functions (cons 'ff/restore-windows-if-no-error compilation-finish-functions)) +(add-to-list 'compilation-finish-functions 'ff/restore-windows-if-no-error) (defun ff/fast-compile () "Compiles without asking anything." @@ -1940,7 +2030,7 @@ This may be a useful alternative binding for \\[delete-other-windows] (while (re-search-forward "[0-9\.]+" nil t) (let ((value (string-to-number (buffer-substring (match-beginning 0) (match-end 0))))) (delete-region (match-beginning 0) (match-end 0)) - (insert (format "%0.2f" value))))))) + (insert (format "%0.0f" value))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Keymaping @@ -1997,13 +2087,11 @@ This may be a useful alternative binding for \\[delete-other-windows] ;; Closes the current \begin{} -(add-hook 'latex-mode-hook (lambda () (define-key latex-mode-map [(control end)] 'tex-close-latex-block))) - (when (ff/load-or-alert "longlines") (setq longlines-show-hard-newlines t longlines-auto-wrap t - longline-show-effect #(" -- |\n" 0 2 (face escape-glyph)) + ;; longlines-show-effect #("|\n" 0 2 (face escape-glyph)) ) ;; (defun ff/auto-longlines () @@ -2018,11 +2106,6 @@ This may be a useful alternative binding for \\[delete-other-windows] ) -(add-hook 'latex-mode-hook - (lambda () - (define-key latex-mode-map [(control tab)] - 'ispell-complete-word))) - ;; Meta-/ remaped (completion) (define-key global-map [(shift right)] 'dabbrev-expand) @@ -2187,11 +2270,17 @@ next one. With universal argument, kill all killable buffers." (when (ff/load-or-alert "media") (unless window-system - (ff/configure-faces '( - (media/mode-string-face :foreground "blue4" :weight 'bold) - (media/current-tune-face :foreground "black" :background "yellow" :weight 'normal) - (media/instant-highlight-face :foreground "black" :background "orange" :weight 'normal) - )) + (ff/configure-faces + '( + (media/mode-string-face + :foreground "blue4" :weight 'bold) + + (media/current-tune-face + :foreground "black" :background "yellow" :weight 'normal) + + (media/instant-highlight-face + :foreground "black" :background "orange" :weight 'normal) + )) ) (define-key global-map [(meta \\)] 'media) @@ -2205,7 +2294,7 @@ next one. With universal argument, kill all killable buffers." "-framedrop" "-zoom" "-subfont-osd-scale" "3" - "-stop-xscreensaver" + ;; "-stop-xscreensaver" ;; "-osdlevel" "3" ) media/mplayer/timing-request-period 5.0 @@ -2320,6 +2409,32 @@ proposes to visit them." (flyspell-mode) (when flyspell-mode (flyspell-buffer))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; The fridge! +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun ff/move-region-to-fridge () (interactive) + "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") + ) + ) + ) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; My own keymap ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2336,6 +2451,7 @@ proposes to visit them." (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 [(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) @@ -2347,6 +2463,7 @@ proposes to visit them." (define-key ff/map [(control c)] 'calendar) ;; (define-key ff/map [(control c)] (lambda () (interactive) (save-excursion (calendar)))) (define-key ff/map [(control l)] 'goto-line) +(define-key ff/map "l" 'longlines-mode) (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) @@ -2363,6 +2480,7 @@ proposes to visit them." (lambda () (interactive) (bookmark-set) (bookmark-save))) +(define-key ff/map "f" 'ff/move-region-to-fridge) (define-key ff/map [(control f)] 'ff/flyspell-mode) (define-key ff/map [?\C-0] 'ff/delete-annoying-windows) @@ -2373,6 +2491,8 @@ proposes to visit them." (define-key ff/map "3" 'ff/twin-horizontal-current-buffer) (define-key ff/map [?\C-3] 'ff/twin-horizontal-current-buffer) +(define-key ff/map " " 'delete-trailing-whitespace) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Hacks so that all keys are functionnal in xterm and through ssh. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;