X-Git-Url: https://www.fleuret.org/cgi-bin/gitweb/gitweb.cgi?p=elisp.git;a=blobdiff_plain;f=emacs.el;h=037615f61ede88c675377fef4bbbc32ef30dfd54;hp=ac9782cf6007716999ea316f2408c349208a511f;hb=dec839751ebc5e22f91748a6b225955765176937;hpb=a079aa1ea4c41ff834ae10de5a94d62be7e08ede diff --git a/emacs.el b/emacs.el index ac9782c..037615f 100644 --- a/emacs.el +++ b/emacs.el @@ -33,6 +33,8 @@ ;; (set-default-font "Inconsolata 15") +;; (package-initialize) + (set-default-font "Bitstream vera sans mono-12") ;; (set-default-font "Liberation Mono-13") ;; (set-default-font "DejaVu sans mono 15") @@ -340,7 +342,7 @@ load-warning buffer in case of failure." (flyspell-mode)))) (add-hook 'c++-mode-hook 'flyspell-prog-mode) -(add-hook 'lua-mode-hook 'flyspell-prog-mode) +;; (add-hook 'lua-mode-hook 'flyspell-prog-mode) (add-hook 'log-edit-mode-hook 'flyspell-mode) ;; I am a power-user @@ -596,6 +598,8 @@ load-warning buffer in case of failure." (define-key global-map [(control c) (control q)] 'ff/delete-trailing-whitespaces-and-indent) +(define-key global-map [(control x) (control o)] 'other-window) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Playing sounds ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -968,9 +972,9 @@ printer." ,@(when (ff/battery-info-string) '((ff/battery-info-string))) - ;; '((propertize - ;; (ff/battery-info-string) - ;; 'face 'ff/battery-info-face))) + ;; '((propertize + ;; (ff/battery-info-string) + ;; 'face 'ff/battery-info-face))) " " @@ -1181,45 +1185,71 @@ goback argument, go back where we were." (define-key global-map [(meta G)] (lambda () (interactive) (ff/goto-function-definition t))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; (setq python-indent-offset 4) + +;; (define-key python-mode-map [(shift right)] 'python-indent-shift-right) +;; (define-key python-mode-map [(shift left)] 'python-indent-shift-left) +;; (define-key python-mode-map [(shift right)] 'indent-rigidly-right-to-tab-stop) +;; (define-key python-mode-map [(shift left)] 'indent-rigidly-left-to-tab-stop) + +(load "vc-git") + +(defun ff/git-pull-push () (interactive) + (message "git pull / push ...") + (shell-command "git pull && git push" nil) + ) + +(defun ff/git-pull () (interactive) + (message "git pull ...") + (shell-command "git pull" nil) + ) + +(define-key global-map [(control x) (v) (p)] 'ff/git-pull-push) +(define-key global-map [(control x) (v) (P)] 'ff/git-pull) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; The big stuff (bbdb, mailcrypt, etc.) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Failsafe version if we can't load bbdb -(defun ff/explicit-name (email) email) +(setq bbdb-file "~/private/bbdb") -(load "vc-git") +(when (file-exists-p bbdb-file) -(when (ff/load-or-alert "bbdb") - - (setq - ;; Stop asking (if not t or nil, will not ask) - bbdb-offer-save 'never - ;; I hate when bbdb decides to mess up my windows - bbdb-use-pop-up nil - ;; I have no problem with bbdb asking me if the sender email - ;; does not match exactly the address we have in the database - bbdb-quiet-about-name-mismatches 0 - ;; I have european friends, too - bbdb-north-american-phone-numbers-p nil - ;; To cycle through all possible addresses - bbdb-complete-name-allow-cycling t - ;; Cycle with full names only, not through all net-addresses alone too - bbdb-dwim-net-address-allow-redundancy t - ;; Do not add new addresses automatically - bbdb-always-add-addresses nil - ) + ;; Failsafe version if we can't load bbdb + (defun ff/explicit-name (email) email) - (defface ff/known-address-face - '((t (:foreground "blue2"))) - "The face to display known mail identities.") + (when (ff/load-or-alert "bbdb") - (defface ff/unknown-address-face - '((t (:foreground "gray50"))) - "The face to display unknown mail identities.") + (setq + ;; Stop asking (if not t or nil, will not ask) + bbdb-offer-save 'never + ;; I hate when bbdb decides to mess up my windows + bbdb-use-pop-up nil + ;; I have no problem with bbdb asking me if the sender email + ;; does not match exactly the address we have in the database + bbdb-quiet-about-name-mismatches 0 + ;; I have european friends, too + bbdb-north-american-phone-numbers-p nil + ;; To cycle through all possible addresses + bbdb-complete-name-allow-cycling t + ;; Cycle with full names only, not through all net-addresses alone too + bbdb-dwim-net-address-allow-redundancy t + ;; Do not add new addresses automatically + bbdb-always-add-addresses nil + ) - (defun ff/explicit-name (email) - "Returns a string identity for the first address in EMAIL. The + (defface ff/known-address-face + '((t (:foreground "blue2"))) + "The face to display known mail identities.") + + (defface ff/unknown-address-face + '((t (:foreground "gray50"))) + "The face to display unknown mail identities.") + + (defun ff/explicit-name (email) + "Returns a string identity for the first address in EMAIL. The identity is taken from bbdb if possible or from the address itself with mail-extract-address-components. The suffix \"& al.\" is added if there are more than one address. @@ -1229,35 +1259,36 @@ ff/unknown-address-face. If a record is found and contains a note 'face, the associated face is used, otherwise ff/known-address-face is used." - (and email - (let* ((data (mail-extract-address-components email)) - (name (car data)) - (net (cadr data)) - (record (bbdb-search-simple nil net))) + (and email + (let* ((data (mail-extract-address-components email)) + (name (car data)) + (net (cadr data)) + (record (bbdb-search-simple nil net))) + + (concat + + (condition-case nil + (propertize (bbdb-record-name record) + 'face + (or (cdr (assoc 'face + (bbdb-record-raw-notes record))) + 'ff/known-address-face)) + (error + (propertize (or (and data (concat "<" net ">")) + "*undefined*") + 'face 'ff/unknown-address-face) + )) + (if (string-match "," (mail-strip-quoted-names email)) " & al.") + ))) + ) - (concat + (ff/configure-faces '((ff/robot-address-face :foreground "green4") + (ff/personal-address-face :foreground "dark magenta" :weight 'bold) + (ff/important-address-face :foreground "red3" + :weight 'bold + ))) - (condition-case nil - (propertize (bbdb-record-name record) - 'face - (or (cdr (assoc 'face - (bbdb-record-raw-notes record))) - 'ff/known-address-face)) - (error - (propertize (or (and data (concat "<" net ">")) - "*undefined*") - 'face 'ff/unknown-address-face) - )) - (if (string-match "," (mail-strip-quoted-names email)) " & al.") - ))) ) - - (ff/configure-faces '((ff/robot-address-face :foreground "green4") - (ff/personal-address-face :foreground "dark magenta" :weight 'bold) - (ff/important-address-face :foreground "red3" - :weight 'bold - ))) - ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -1407,6 +1438,41 @@ universal argument starts xfig even if the .fig does not exist" (load "tex-mode") (defun tex-font-lock-suscript (pos) ()) +;; Automagically add the frame numbers in comments in a beamer file + +(defun ff/number-beamer-frames () + "Add the frame numbers as comments after each \begin{frame}" + (interactive) + + (save-excursion + (let ((total 0) + (n 1)) + + ;; First, clean-up existing numbering + (goto-char (point-min)) + (while (re-search-forward "^ *\\\\begin{frame}.*\\( %% frame [0-9]* / [0-9]*\\)$" nil t) + (kill-region (match-beginning 1) (match-end 1)) + ) + + ;; Then count the total number of frames + (goto-char (point-min)) + (while (re-search-forward "^ *\\\\begin{frame}" nil t) + (setq total (+ total 1)) + ) + + ;; Then, add the updated numbers + (goto-char (point-min)) + (while (re-search-forward "^ *\\\\begin{frame}" nil t) + (move-end-of-line 1) + (insert " %% frame " (prin1-to-string n) " / " (prin1-to-string total)) + (setq n (+ n 1)) + ) + ) + ) + + (message "Added frame numbers in comments.") + ) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Prevents many errors from beeping and makes the others play a nifty ;; sound @@ -1690,6 +1756,43 @@ int main(int argc, char **argv) { ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun ff/start-lua () + "Adds all the stuff to start a new lua file" + (interactive) + (goto-char (point-min)) + (insert "#!/usr/bin/env luajit + +require 'torch' +require 'nn' +require 'image' +require 'optim' + +") + (lua-mode) + ) + +(defun ff/start-python () + "Adds all the stuff to start a new python file" + (interactive) + (goto-char (point-min)) + (insert "#!/usr/bin/env python-for-pytorch + +import torch +import math + +from torch import nn +from torch.nn import functional as fn + +from torch import Tensor +from torch.autograd import Variable +from torch.nn.parameter import Parameter +from torch.nn import Module + +") + (python-mode) + ) + + (defun ff/start-html () "Adds all that stuff to start a new HTML file." (interactive) @@ -1731,9 +1834,7 @@ the function is invoked with a universal arg" (interactive "P") (let ((line (if arg "cerr" "cout"))) (goto-char (point-at-bol)) - ;; Regexp syntax sucks moose balls, honnest. To match '[', just - ;; put it as the first char in the [...] ... This leads to some - ;; obvious things like the following + ;; To match '[', put it as the first char in the [...] (while (re-search-forward "\\([][a-zA-Z0-9_.:\(\)]+\\)" (point-at-eol) t) (setq line (concat line " << \" " @@ -1758,17 +1859,31 @@ and refilling all the paragraphs." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun ff/start-slide () - (interactive) - (insert "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +(defun ff/start-slide (universal) + (interactive "P") + + (if universal + (progn + (insert "\\end{frame} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\\begin{frame}{") + (save-excursion (insert "}{} + +")) + ) + + (insert "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \\begin{frame}{") - (save-excursion (insert "}{} + (save-excursion (insert "}{} \\end{frame} ")) + ) ) (add-hook @@ -1883,6 +1998,16 @@ a file in /tmp" (ff/add-copyrights)) ) + (when (string-match "\\.lua$" filename) + (lua-mode) + (ff/start-lua) + ) + + (when (string-match "\\.py$" filename) + (python-mode) + (ff/start-python) + ) + (when (string-match "\\.html$" filename) (html-mode) (ff/start-html) @@ -1993,10 +2118,10 @@ a file in /tmp" (setq compilation-read-command t compile-command "make -j -k" - compile-history '("make clean" "make DEBUG=yes -j -k" "make -j -k") + ;; compile-history '("make clean" "make DEBUG=yes -j -k" "make -j -k") ) -(defun ff/universal-compile () (interactive) +(defun ff/universal-compile (universal) (interactive "P") (funcall (or (cdr (assoc major-mode '( (latex-mode . tex-file) @@ -2099,7 +2224,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.3f" value))))))) + (insert (format "%0.1e" value))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Keymaping @@ -2298,7 +2423,7 @@ next one. With universal argument, kill all killable buffers." "svn-commit.tmp$" ".git/COMMIT_EDITMSG$" "\.bbl$" "\.aux$" "\.toc$" )) - recentf-max-saved-items 1000 + recentf-max-saved-items 10000 recentf-save-file (concat ff/emacs-dir "/recentf") ) @@ -2336,6 +2461,7 @@ next one. With universal argument, kill all killable buffers." media/duration-to-history 30 media/history-size 1000 media/playlist-file (concat ff/emacs-dir "/media-playlists") + media/continue-mode-hint (if window-system "⤸" "*") media/mplayer/args '( "-framedrop" "-zoom" @@ -2346,6 +2472,7 @@ next one. With universal argument, kill all killable buffers." ) media/mplayer/timing-request-period 1.0 ) + ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -2476,12 +2603,15 @@ proposes to visit them." ;; The fridge! ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(defun ff/move-region-to-fridge () (interactive) +(defun ff/move-region-to-fridge (&optional universal) (interactive "P") "Cut the current region, paste it in a file called ./fridge with a time tag, and save this file" (unless (use-region-p) (error "No region selected")) (let ((bn (file-name-nondirectory (buffer-file-name)))) - (kill-region (region-beginning) (region-end)) + (if universal + (copy-region-as-kill (region-beginning) (region-end)) + (kill-region (region-beginning) (region-end)) + ) (with-current-buffer (find-file-noselect "fridge") (goto-char (point-max)) (insert "\n") @@ -2505,6 +2635,14 @@ with a time tag, and save this file" (setq ff/map (make-sparse-keymap)) (define-key global-map [(control \`)] ff/map) +;; (defun ff/start-stop-macro-recording () (interactive) + ;; (if (or defining-kbd-macro executing-kbd-macro) + ;; (kmacro-end-macro) + ;; (kmacro-start-macro)) + ;; ) + +;; (define-key global-map [(shift return)] 'ff/start-stop-macro-recording) + (unless window-system ;; (define-key global-map [(control @)] ff/map) (define-key global-map [(meta O) \`] ff/map) @@ -2512,6 +2650,12 @@ with a time tag, and save this file" (define-key esc-map "`" ff/map) +(defun ff/kill-downto-signature () (interactive) + (let ((s (point))) + (when (re-search-forward "^-- $") + (kill-region s (match-beginning 0)) + (goto-char s)))) + (defun ff/git-status (&optional dir) (interactive) (if (buffer-file-name) (git-status (file-name-directory (buffer-file-name))) @@ -2556,12 +2700,14 @@ with a time tag, and save this file" (define-key ff/map [(control m)] 'woman) (define-key ff/map "b" 'bookmark-jump) (define-key ff/map [(control =)] 'calc) +(define-key ff/map "=" 'ff/number-beamer-frames) (define-key ff/map [(control shift b)] (lambda () (interactive) (bookmark-set) (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 [(control k)] 'ff/kill-downto-signature) (define-key ff/map [?\C-0] 'ff/delete-annoying-windows) (define-key ff/map "1" 'delete-other-windows) @@ -2737,10 +2883,9 @@ With argument ARG, do this that many times." ;; Privacy ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Where to save the bookmarks and where is bbdb +;; Where to save the bookmarks (setq bookmark-default-file (concat ff/emacs-dir "/bmk") - bbdb-file "~/private/bbdb" custom-file (concat ff/emacs-dir "/custom")) ;; enotes.el is one of my own scripts, check my web page