diff --git a/.emacs.d/lisp/functions.el b/.emacs.d/lisp/functions.el index 8fd10d05..fb79962a 100644 --- a/.emacs.d/lisp/functions.el +++ b/.emacs.d/lisp/functions.el @@ -48,6 +48,14 @@ If you want to operate on buffer, use `how-many' instead." (setq matches (1+ matches))) matches)) +(defun define-keys (map key def &rest bindings) + "Like `define-key' but allow for defining several bindings at once. +`KEY' must be acceptable for `kbd'." + (while key + (define-key map (kbd key) def) + (setq key (pop bindings) + def (pop bindings)))) + (defun duplicate (arg) "Duplicate the current line or region ARG times. If there's no region, the current line will be duplicated. However, if @@ -168,6 +176,14 @@ it appears in the minibuffer prompt." (t (insert filename)))) +(defun local-set-keys (key def &rest bindings) + "Like `local-set-key' but allow for defining several bindings at once. +`KEY' must be acceptable for `kbd'." + (while key + (local-set-key (kbd key) def) + (setq key (pop bindings) + def (pop bindings)))) + (defun mark-word-from-beginning (&optional arg allow-extend) "Set the point at the beginning of the word and call `mark-word'. ARG and ALLOW-EXTEND are the same." diff --git a/.emacs.d/lisp/main.el b/.emacs.d/lisp/main.el index 353b5a8d..6d17ee93 100644 --- a/.emacs.d/lisp/main.el +++ b/.emacs.d/lisp/main.el @@ -1,5 +1,7 @@ ;;; Main options +(require 'functions) + ;;; Minimal UI. Run early to hide it as soon as possible. (setq inhibit-startup-screen t) (menu-bar-mode -1) @@ -61,8 +63,9 @@ (setq scroll-error-top-bottom t) ;;; Narrow page navigation. -(define-key mickey-minor-mode-map (kbd "C-x M-n") (lambda () (interactive) (narrow-to-page 1))) -(define-key mickey-minor-mode-map (kbd "C-x M-p") (lambda () (interactive) (narrow-to-page -1))) +(define-keys mickey-minor-mode-map + "C-x M-n" (lambda () (interactive) (narrow-to-page 1)) + "C-x M-p" (lambda () (interactive) (narrow-to-page -1))) ;;; Line numbers ;;; Adding to `find-file-hook' ensures it will work for every file, regardless of @@ -132,10 +135,11 @@ ;; stick to the home-row, but to avoid shadowing other binding I exceptionaly use ;; 'super' (normally reserved to the WM). (when (fboundp 'windmove-default-keybindings) - (define-key mickey-minor-mode-map (kbd "M-s-h") 'windmove-left) - (define-key mickey-minor-mode-map (kbd "M-s-j") 'windmove-down) - (define-key mickey-minor-mode-map (kbd "M-s-k") 'windmove-up) - (define-key mickey-minor-mode-map (kbd "M-s-l") 'windmove-right)) + (define-keys mickey-minor-mode-map + "M-s-h" 'windmove-left + "M-s-j" 'windmove-down + "M-s-k" 'windmove-up + "M-s-l" 'windmove-right)) ;;; Make Emacs use environment browser, or w3m if BROWSER is not set. (setq browse-url-generic-program @@ -229,12 +233,12 @@ (setq uniquify-buffer-name-style 'forward) ;;; Skeleton settings -(require 'functions) ;;; Do not expand abbrevs in skeletons. (setq-default skeleton-further-elements '((abbrev-mode nil))) (turn-on-skeleton-markers) -(define-key mickey-minor-mode-map (kbd "C->") 'skeleton-next-position) -(define-key mickey-minor-mode-map (kbd "C-<") (lambda () (interactive) (skeleton-next-position t))) +(define-keys mickey-minor-mode-map + "C->" 'skeleton-next-position + "C-<" (lambda () (interactive) (skeleton-next-position t))) ;;; Disable prompt (but leave warning) on git symlink. (setq vc-follow-symlinks t) @@ -259,10 +263,11 @@ ;; (define-key mickey-minor-mode-map (kbd "M-") 'toggle-frame-fullscreen) ;;; Scroll zooming. -(define-key mickey-minor-mode-map (kbd "C-") 'text-scale-decrease) -(define-key mickey-minor-mode-map (kbd "C-") 'text-scale-decrease) -(define-key mickey-minor-mode-map (kbd "C-") 'text-scale-increase) -(define-key mickey-minor-mode-map (kbd "C-") 'text-scale-increase) +(define-keys mickey-minor-mode-map + "C-" 'text-scale-decrease + "C-" 'text-scale-decrease + "C-" 'text-scale-increase + "C-" 'text-scale-increase) (setq text-scale-mode-step 1.1) ;;; Sort diff --git a/.emacs.d/lisp/mode-cc.el b/.emacs.d/lisp/mode-cc.el index 6961131d..1eb572ef 100644 --- a/.emacs.d/lisp/mode-cc.el +++ b/.emacs.d/lisp/mode-cc.el @@ -3,14 +3,14 @@ ;; Should we split this into mode-c and mode-c++? (dolist (map (list c-mode-map c++-mode-map)) - (define-key map (kbd "C-c m") 'cc-main) - (define-key map (kbd "") 'cc-clean) - (define-key map (kbd "M-.") 'semantic-ia-fast-jump) - (define-key map (kbd "C-c C-d") 'semantic-ia-show-summary) - ;; (define-key map (kbd "C-c o") 'ff-find-other-file) - (define-key map (kbd "M-TAB") 'semantic-complete-analyze-inline)) + (define-keys map "C-c m" 'cc-main + "" 'cc-clean + "M-." 'semantic-ia-fast-jump + "C-c C-d" 'semantic-ia-show-summary + "M-TAB" 'semantic-complete-analyze-inline)) +;; (define-key map (kbd "C-c o") 'ff-find-other-file) -;;; C additional keywords. +;;; C additional faces. ;;; Useless in quasi-monochrome. ;; (dolist (mode '(c-mode c++-mode)) ;; (font-lock-add-keywords diff --git a/.emacs.d/lisp/mode-dired.el b/.emacs.d/lisp/mode-dired.el index 53d16ef2..941baaa4 100644 --- a/.emacs.d/lisp/mode-dired.el +++ b/.emacs.d/lisp/mode-dired.el @@ -2,13 +2,13 @@ ;;; Warning: This file is loaded unconditionally on startup. ;;; We cannot assume that current buffer is in dired-mode. -(let ((map dired-mode-map)) - (define-key map (kbd "C-c h") 'dired-toggle-humansize) - (define-key map (kbd "") 'dired-up-directory) - (define-key map (kbd "") 'dired-find-file) - (define-key map (kbd "SPC") 'dired-mark) - (define-key map (kbd "") 'dired-up-directory) - (define-key map (kbd "b") 'dired-up-directory)) +(define-keys dired-mode-map + "C-c h" 'dired-toggle-humansize + "" 'dired-up-directory + "" 'dired-find-file + "SPC" 'dired-mark + "" 'dired-up-directory + "b" 'dired-up-directory) (when (require 'dired+ nil t) (toggle-diredp-find-file-reuse-dir 1)) diff --git a/.emacs.d/lisp/mode-go.el b/.emacs.d/lisp/mode-go.el index 77839f53..1ad78c5d 100644 --- a/.emacs.d/lisp/mode-go.el +++ b/.emacs.d/lisp/mode-go.el @@ -4,14 +4,15 @@ ;; https://github.com/dominikh/go-mode.el/issues/191 (use-local-map go-mode-map) -(local-set-key (kbd "C-c m") 'go-main) -(local-set-key (kbd "C-c D") 'godoc) +(local-set-keys + "C-c m" 'go-main + "C-c D" 'godoc + "C-c d" 'godoc-at-point + "M-." #'godef-jump + "" 'go-metalinter + "C-" (lambda () (interactive) (go-metalinter t))) (when (require 'helm-go-package nil t) (local-set-key (kbd "C-c D") 'helm-go-package)) -(local-set-key (kbd "C-c d") 'godoc-at-point) -(local-set-key (kbd "M-.") #'godef-jump) -(local-set-key (kbd "") 'go-metalinter) -(local-set-key (kbd "C-") (lambda () (interactive) (go-metalinter t))) (when (require 'company-go nil t) (add-hook 'go-mode-hook 'company-mode) diff --git a/.emacs.d/lisp/mode-latex.el b/.emacs.d/lisp/mode-latex.el index 9b84690d..513361af 100644 --- a/.emacs.d/lisp/mode-latex.el +++ b/.emacs.d/lisp/mode-latex.el @@ -5,17 +5,18 @@ (require 'mode-tex) ;;; Since current buffer is a LaTeX one, we can use `local-set-key'. -(local-set-key (kbd "C-c m") 'latex-article) -(local-set-key (kbd "C-c C-a") 'latex-insert-table) -(local-set-key (kbd "C-c C-c") 'latex-smallcaps) -(local-set-key (kbd "C-c C-e") 'latex-emph) -(local-set-key (kbd "C-c C-l") 'latex-slanted) -(local-set-key (kbd "C-c C-s") 'latex-insert-section) -(local-set-key (kbd "C-c C-u") 'latex-superscript) -(local-set-key (kbd "C-c l") 'latex-lstinline) -(local-set-key (kbd "C-c o") 'latex-orgtbl) -(local-set-key (kbd "C-c u") 'latex-package) -(local-set-key (kbd "M-RET") 'latex-itemize) +(local-set-keys + "C-c m" 'latex-article + "C-c C-a" 'latex-insert-table + "C-c C-c" 'latex-smallcaps + "C-c C-e" 'latex-emph + "C-c C-l" 'latex-slanted + "C-c C-s" 'latex-insert-section + "C-c C-u" 'latex-superscript + "C-c l" 'latex-lstinline + "C-c o" 'latex-orgtbl + "C-c u" 'latex-package + "M-RET" 'latex-itemize) ;; Needs dvipng. ;; With TeXlive, the following packages are needed: psnfss, symbol, zapfding diff --git a/.emacs.d/lisp/mode-makefile.el b/.emacs.d/lisp/mode-makefile.el index 504ac9f1..4977b5b3 100644 --- a/.emacs.d/lisp/mode-makefile.el +++ b/.emacs.d/lisp/mode-makefile.el @@ -1,10 +1,10 @@ ;; Makefile -(let ((map makefile-mode-map)) - (define-key map (kbd "C-c c") 'makefile-config) - (define-key map (kbd "C-c d") 'makefile-doc) - (define-key map (kbd "C-c m") 'makefile-main) - (define-key map (kbd "C-c s") 'makefile-c)) +(define-keys makefile-mode-map + "C-c c" 'makefile-config + "C-c d" 'makefile-doc + "C-c m" 'makefile-main + "C-c s" 'makefile-c) (define-skeleton makefile-main "Insert root Makefile." nil @@ -19,25 +19,25 @@ all: app doc .PHONY: app app: - ${MAKE} -C ${srcdir} + ${MAKE} -C ${srcdir} .PHONY: doc doc: - ${MAKE} -C ${docsrcdir} + ${MAKE} -C ${docsrcdir} .PHONY: debug debug: - CFLAGS+=\"-g3 -O0 -DDEBUG=9\" ${MAKE} + CFLAGS+=\"-g3 -O0 -DDEBUG=9\" ${MAKE} .PHONY: test test: - ${MAKE} -C ${testdir} + ${MAKE} -C ${testdir} .PHONY: clean clean: - ${MAKE} -C ${srcdir} clean - ${MAKE} -C ${docsrcdir} clean - ${MAKE} -C ${testdir} clean + ${MAKE} -C ${srcdir} clean + ${MAKE} -C ${docsrcdir} clean + ${MAKE} -C ${testdir} clean ################################################################################ ## Install / Uninstall. @@ -68,22 +68,22 @@ sysconfdir ?= ${perfix}/etc .PHONY: install install: - ${MAKE} - ${INSTALL_DIR} ${DESTDIR}${bindir} - ${INSTALL} ${srcdir}/${cmdname} ${DESTDIR}${bindir}/${cmdname} - ${INSTALL_DIR} ${DESTDIR}${mandir}/man1 - ${INSTALL_DATA} ${docsrcdir}/${cmdname}.1 ${DESTDIR}${mandir}/man1/${cmdname}.1 - ${INSTALL_DIR} ${DESTDIR}${licensedir}/${cmdname} - ${INSTALL_DATA} LICENSE ${DESTDIR}${licensedir}/${cmdname}/LICENSE + ${MAKE} + ${INSTALL_DIR} ${DESTDIR}${bindir} + ${INSTALL} ${srcdir}/${cmdname} ${DESTDIR}${bindir}/${cmdname} + ${INSTALL_DIR} ${DESTDIR}${mandir}/man1 + ${INSTALL_DATA} ${docsrcdir}/${cmdname}.1 ${DESTDIR}${mandir}/man1/${cmdname}.1 + ${INSTALL_DIR} ${DESTDIR}${licensedir}/${cmdname} + ${INSTALL_DATA} LICENSE ${DESTDIR}${licensedir}/${cmdname}/LICENSE .PHONY: uninstall uninstall: - -rm -f ${DESTDIR}${bindir}/${cmdname} - -rmdir -p ${DESTDIR}${bindir} - -rm -f ${DESTDIR}${mandir}/${cmdname}.${mansection}.gz - -rmdir -p ${DESTDIR}${mandir} - -rm -f ${DESTDIR}${licensedir}/${cmdname}/LICENSE - -rmdir -p ${DESTDIR}${licensedir}/${cmdname} + -rm -f ${DESTDIR}${bindir}/${cmdname} + -rmdir -p ${DESTDIR}${bindir} + -rm -f ${DESTDIR}${mandir}/${cmdname}.${mansection}.gz + -rmdir -p ${DESTDIR}${mandir} + -rm -f ${DESTDIR}${licensedir}/${cmdname}/LICENSE + -rmdir -p ${DESTDIR}${licensedir}/${cmdname} " > \n) (define-skeleton makefile-doc @@ -98,11 +98,11 @@ manpages = ${cmdname}.1 all: ${manpages} .in: - awk -v date=`date '+%Y-%m-%d'` 'BEGIN {section=\"$@\"; sub (/.*\\./, \"\", section); manname=toupper(\"$@\"); sub(/\\.[^.]+$$/, \"\", manname); print \".ds appname ${appname}\\n.ds authors ${authors}\\n.ds cmdname ${cmdname}\\n.ds date \" date \"\\n.ds manname \" manname \"\\n.ds section \" section \"\\n.ds version ${version}\\n.ds year ${year}\\n.\"}' > $@ - cat $< >> $@ + awk -v date=`date '+%Y-%m-%d'` 'BEGIN {section=\"$@\"; sub (/.*\\./, \"\", section); manname=toupper(\"$@\"); sub(/\\.[^.]+$$/, \"\", manname); print \".ds appname ${appname}\\n.ds authors ${authors}\\n.ds cmdname ${cmdname}\\n.ds date \" date \"\\n.ds manname \" manname \"\\n.ds section \" section \"\\n.ds version ${version}\\n.ds year ${year}\\n.\"}' > $@ + cat $< >> $@ clean: - rm -f ${manpages} + rm -f ${manpages} " > \n) (define-skeleton makefile-c @@ -119,18 +119,18 @@ ${cmdname}: ${cmdname}.o .PHONY: debug debug: - CFLAGS+=\"-g3 -O0 -DDEBUG=9\" ${MAKE} + CFLAGS+=\"-g3 -O0 -DDEBUG=9\" ${MAKE} .PHONY: clean clean: - rm -f ${cmdname} *.d *.o + rm -f ${cmdname} *.d *.o ## Generate prerequisites automatically. GNU Make only. ## The 'awk' part is used to add the .d file itself to the target, so that it ## gets updated on changes. The -MQ option is to add full path to object files ## in subfolders. (-MM strips parent directories.) %.d: %.c - ${CC} -MM -MQ ${<:.c=.o} ${CPPFLAGS} $< | awk -v stem=$* -v target=$@ '{gsub (stem \".o[ :]*\", stem \".o \" target \" : \")} 1' > $@ + ${CC} -MM -MQ ${<:.c=.o} ${CPPFLAGS} $< | awk -v stem=$* -v target=$@ '{gsub (stem \".o[ :]*\", stem \".o \" target \" : \")} 1' > $@ sources = $(wildcard *.c) deps = ${sources:.c=.d} diff --git a/.emacs.d/lisp/mode-mediawiki.el b/.emacs.d/lisp/mode-mediawiki.el index 55b8cb34..1ccb92d7 100644 --- a/.emacs.d/lisp/mode-mediawiki.el +++ b/.emacs.d/lisp/mode-mediawiki.el @@ -5,11 +5,11 @@ ;; Besides you can try extending `url-cookie-save-interval'. ;; Nonetheless is mode is helpfull for syntax awareness. -(let ((map mediawiki-mode-map)) - (define-key map (kbd "C-c o") 'mediawiki-browse) - (define-key map (kbd "M-g") nil) ; This shadows M-g M-g. - (define-key map (kbd "C-x C-s") 'save-buffer) - (define-key map (kbd "C-c M-s") 'mediawiki-save)) +(define-keys mediawiki-mode-map + "C-c o" 'mediawiki-browse + "M-g" nil ; This shadows M-g M-g. + "C-x C-s" 'save-buffer + "C-c M-s" 'mediawiki-save) (setq mediawiki-site-alist diff --git a/.emacs.d/lisp/mode-nroff.el b/.emacs.d/lisp/mode-nroff.el index 8dcdf004..f35a3fd0 100644 --- a/.emacs.d/lisp/mode-nroff.el +++ b/.emacs.d/lisp/mode-nroff.el @@ -1,8 +1,8 @@ ;; Nroff -(let ((map nroff-mode-map)) - (define-key map (kbd "C-c C-b") 'nroff-bold) - (define-key map (kbd "C-c C-i") 'nroff-italic)) +(define-keys nroff-mode-map + "C-c C-b" 'nroff-bold + "C-c C-i" 'nroff-italic) ;; Skeletons (define-skeleton nroff-bold "Bold text." nil "\\fB" @ _ "\\fR" @) diff --git a/.emacs.d/lisp/mode-tex.el b/.emacs.d/lisp/mode-tex.el index 4c9b49d6..b6bbc1d2 100644 --- a/.emacs.d/lisp/mode-tex.el +++ b/.emacs.d/lisp/mode-tex.el @@ -18,11 +18,11 @@ ;; Note that -shell-escape can also be toggled with universal ;; argument. -(let ((map tex-mode-map)) - (dolist (key '("\C-c\C-f" "\C-c\C-b")) - (define-key map key nil)) - (define-key map (kbd "") 'tex-pdf-view) - (define-key map (kbd "") 'tex-compile)) +(define-keys tex-mode-map + "C-c C-f" nil + "C-c C-b" nil + "" 'tex-pdf-view + "" 'tex-compile) (defvar-local tex-masterfile nil "The file that should be compiled. Useful for modular documents.") diff --git a/.emacs.d/lisp/tool-evil.el b/.emacs.d/lisp/tool-evil.el index 0b03a1d9..b7ea961a 100644 --- a/.emacs.d/lisp/tool-evil.el +++ b/.emacs.d/lisp/tool-evil.el @@ -81,23 +81,25 @@ See `eshell' for the numeric prefix arg." ;; Should we stick to M-based bindings or use C-based? ;; Magit uses C-jk, helm uses C-space. Evil has C-w, C-o, C-p, C-r. Emacs has C-xC-q, C-xC-o. - (define-key helm-map (kbd "M-\\") 'helm-toggle-resplit-and-swap-windows) ; Or use M-t (helm standard binding is C-t). - (define-key helm-map (kbd "C-f") 'helm-next-page) - (define-key helm-map (kbd "C-b") 'helm-previous-page) - (define-key helm-map (kbd "M-j") 'helm-next-line) - (define-key helm-map (kbd "M-k") 'helm-previous-line) - (define-key helm-map (kbd "M-h") 'helm-next-source) - (define-key helm-map (kbd "M-H") 'describe-key) - (define-key helm-map (kbd "M-l") (kbd "RET")) - (define-key helm-map [escape] 'helm-keyboard-quit) + (define-keys helm-map + "M-\\" 'helm-toggle-resplit-and-swap-windows ; Or use M-t (helm standard binding is C-t). + "C-f" 'helm-next-page + "C-b" 'helm-previous-page + "M-j" 'helm-next-line + "M-k" 'helm-previous-line + "M-h" 'helm-next-source + "M-H" 'describe-key + "M-l" (kbd "RET") + "" 'helm-keyboard-quit) (dolist (keymap (list helm-buffer-map)) (define-key keymap (kbd "M-o") 'helm-buffer-switch-other-window)) (dolist (keymap (list helm-find-files-map helm-read-file-map)) - (define-key keymap (kbd "M-o") 'helm-ff-run-switch-other-window) - (define-key keymap (kbd "M-.") 'helm-ff-run-find-sh-command) - (define-key keymap (kbd "M-l") 'helm-execute-persistent-action) - (define-key keymap (kbd "M-h") 'helm-find-files-up-one-level) - (define-key keymap (kbd "M-H") 'describe-key))) + (define-keys keymap + "M-o" 'helm-ff-run-switch-other-window + "M-." 'helm-ff-run-find-sh-command + "M-l" 'helm-execute-persistent-action + "M-h" 'helm-find-files-up-one-level + "M-H" 'describe-key))) ;; Add support for magit. (require 'evil-magit nil t) @@ -145,8 +147,9 @@ See `eshell' for the numeric prefix arg." ;; TODO: evil-ex history binding in normal mode do not work. (evil-define-key 'normal evil-ex-completion-map "\M-p" 'previous-history-element) (evil-define-key 'normal evil-ex-completion-map "\M-n" 'next-history-element) -(define-key evil-ex-completion-map "\M-p" 'previous-history-element) -(define-key evil-ex-completion-map "\M-n" 'next-history-element) +(define-keys evil-ex-completion-map + "M-p" 'previous-history-element + "M-n" 'next-history-element) ;; Remap org-mode meta keys for convenience ;; - org-evil: Not as polished as of May 2017. diff --git a/.emacs.d/lisp/tool-helm.el b/.emacs.d/lisp/tool-helm.el index 38c20a73..b74d7664 100644 --- a/.emacs.d/lisp/tool-helm.el +++ b/.emacs.d/lisp/tool-helm.el @@ -91,18 +91,19 @@ Requires `call-process-to-string' from `functions'." (rectangle-exchange-point-and-mark) (helm-all-mark-rings))) -(define-key mickey-minor-mode-map (kbd "M-x") 'helm-M-x) -(define-key mickey-minor-mode-map (kbd "C-x C-f") 'helm-find-files) -(define-key mickey-minor-mode-map (kbd "C-x c C-/") 'helm-find) -(define-key mickey-minor-mode-map (kbd "C-x C-b") 'helm-mini) -(define-key mickey-minor-mode-map (kbd "M-y") 'helm-show-kill-ring) -(define-key mickey-minor-mode-map (kbd "C-x C-x") 'helm-mark-or-exchange-rect) -(define-key mickey-minor-mode-map (kbd "M-s o") 'helm-occur) -(define-key mickey-minor-mode-map (kbd "C-h a") 'helm-apropos) -(define-key mickey-minor-mode-map (kbd "C-M-%") 'helm-regexp) -(define-key mickey-minor-mode-map (kbd "C-x M-g") 'helm-grep-git-or-ag) -(define-key mickey-minor-mode-map (kbd "C-x M-G") 'helm-do-grep-ag) -(define-key mickey-minor-mode-map (kbd "C-x M-b") 'helm-resume) ; Convenient for god-mode. +(define-keys mickey-minor-mode-map + "M-x" 'helm-M-x + "C-x C-f" 'helm-find-files + "C-x c C-/" 'helm-find + "C-x C-b" 'helm-mini + "M-y" 'helm-show-kill-ring + "C-x C-x" 'helm-mark-or-exchange-rect + "M-s o" 'helm-occur + "C-h a" 'helm-apropos + "C-M-%" 'helm-regexp + "C-x M-g" 'helm-grep-git-or-ag + "C-x M-G" 'helm-do-grep-ag + "C-x M-b" 'helm-resume) ; Convenient for god-mode. (define-key helm-find-files-map (kbd "C-c C-/") 'helm-ff-run-find-sh-command) ; Convenient for god-mode. ;;; We use the M-s prefix just like `occur'.