Emacs: Define and use define-keys and local-set-keys

master
Pierre Neidhardt 2017-06-16 20:33:53 +01:00
parent dbb3517a15
commit 2d9f77c920
12 changed files with 143 additions and 116 deletions

View File

@ -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."

View File

@ -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-<f10>") 'toggle-frame-fullscreen)
;;; Scroll zooming.
(define-key mickey-minor-mode-map (kbd "C-<wheel-down>") 'text-scale-decrease)
(define-key mickey-minor-mode-map (kbd "C-<mouse-5>") 'text-scale-decrease)
(define-key mickey-minor-mode-map (kbd "C-<wheel-up>") 'text-scale-increase)
(define-key mickey-minor-mode-map (kbd "C-<mouse-4>") 'text-scale-increase)
(define-keys mickey-minor-mode-map
"C-<wheel-down>" 'text-scale-decrease
"C-<mouse-5>" 'text-scale-decrease
"C-<wheel-up>" 'text-scale-increase
"C-<mouse-4>" 'text-scale-increase)
(setq text-scale-mode-step 1.1)
;;; Sort

View File

@ -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 "<f9>") '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
"<f9>" '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

View File

@ -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 "<left>") 'dired-up-directory)
(define-key map (kbd "<right>") 'dired-find-file)
(define-key map (kbd "SPC") 'dired-mark)
(define-key map (kbd "<backspace>") 'dired-up-directory)
(define-key map (kbd "b") 'dired-up-directory))
(define-keys dired-mode-map
"C-c h" 'dired-toggle-humansize
"<left>" 'dired-up-directory
"<right>" 'dired-find-file
"SPC" 'dired-mark
"<backspace>" 'dired-up-directory
"b" 'dired-up-directory)
(when (require 'dired+ nil t)
(toggle-diredp-find-file-reuse-dir 1))

View File

@ -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
"<f9>" 'go-metalinter
"C-<f9>" (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 "<f9>") 'go-metalinter)
(local-set-key (kbd "C-<f9>") (lambda () (interactive) (go-metalinter t)))
(when (require 'company-go nil t)
(add-hook 'go-mode-hook 'company-mode)

View File

@ -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

View File

@ -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}

View File

@ -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

View File

@ -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" @)

View File

@ -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 "<f9>") 'tex-pdf-view)
(define-key map (kbd "<f10>") 'tex-compile))
(define-keys tex-mode-map
"C-c C-f" nil
"C-c C-b" nil
"<f9>" 'tex-pdf-view
"<f10>" 'tex-compile)
(defvar-local tex-masterfile nil
"The file that should be compiled. Useful for modular documents.")

View File

@ -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")
"<escape>" '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.

View File

@ -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'.