bind! -> map!; new minimalistic keybinding macro
This commit is contained in:
parent
2e4a083bbb
commit
81df2830a9
19 changed files with 431 additions and 441 deletions
|
@ -110,54 +110,52 @@ Examples:
|
|||
`((add-hook 'find-file-hook ',hook-name))))))))))
|
||||
|
||||
(after! evil
|
||||
;; Register keywords for proper indentation (see `bind!')
|
||||
(put ':prefix 'lisp-indent-function 'defun)
|
||||
(put ':map 'lisp-indent-function 'defun)
|
||||
(put ':after 'lisp-indent-function 'defun)
|
||||
(put ':when 'lisp-indent-function 'defun)
|
||||
(put ':unless 'lisp-indent-function 'defun)
|
||||
;; Register keywords for proper indentation (see `map!')
|
||||
(put ':prefix 'lisp-indent-function 'defun)
|
||||
(put ':map 'lisp-indent-function 'defun)
|
||||
(put ':after 'lisp-indent-function 'defun)
|
||||
(put ':when 'lisp-indent-function 'defun)
|
||||
(put ':unless 'lisp-indent-function 'defun)
|
||||
(put ':leader 'lisp-indent-function 'defun)
|
||||
(put ':localleader 'lisp-indent-function 'defun)
|
||||
|
||||
(defmacro bind! (&rest rest)
|
||||
(defmacro map! (&rest rest)
|
||||
(let ((i 0)
|
||||
key def
|
||||
first-set
|
||||
prefix
|
||||
internal
|
||||
(default-keymaps '((current-global-map)))
|
||||
(keymaps (if (boundp 'keymaps) keymaps))
|
||||
(states (if (boundp 'states) states '()))
|
||||
(forms '())
|
||||
(keymaps (if (boundp 'keymaps) keymaps))
|
||||
(default-keymaps '((current-global-map)))
|
||||
(state-map '(("n" . normal)
|
||||
("v" . visual)
|
||||
("i" . insert)
|
||||
("e" . emacs)
|
||||
("o" . operator)
|
||||
("m" . motion)
|
||||
("r" . replace))))
|
||||
("r" . replace)))
|
||||
key def prefix states)
|
||||
(unless keymaps
|
||||
(setq keymaps default-keymaps))
|
||||
(while rest
|
||||
(setq key (pop rest))
|
||||
(add-to-list
|
||||
'forms
|
||||
(cond ((eq key '-) nil) ; skip this
|
||||
|
||||
((listp key) ; it's a sub exp
|
||||
`((bind! ,@key)))
|
||||
(cond ((listp key) ; it's a sub exp
|
||||
`(,(macroexpand `(map! ,@key))))
|
||||
|
||||
((keywordp key)
|
||||
(when (memq key '(:leader :localleader))
|
||||
(push (pcase key
|
||||
(:leader narf-leader-prefix)
|
||||
(:localleader narf-localleader-prefix))
|
||||
rest)
|
||||
(setq key :prefix))
|
||||
(pcase key
|
||||
;; TODO: Data checks
|
||||
(:prefix (setq prefix (kbd (pop rest)))
|
||||
(if (= i 0) (setq first-set `(:prefix . ,prefix)))
|
||||
nil)
|
||||
(:map (setq keymaps (-list (pop rest)))
|
||||
(if (= i 0) (setq first-set `(:map . ,keymaps)))
|
||||
nil)
|
||||
(:unset `((bind! ,(kbd (pop rest)) nil)))
|
||||
(:after (prog1 `((after! ,(pop rest) (bind! ,@rest))) (setq rest '())))
|
||||
(:when (prog1 `((if ,(pop rest) (bind! ,@rest))) (setq rest '())))
|
||||
(:unless (prog1 `((if (not ,(pop rest)) (bind! ,@rest))) (setq rest '())))
|
||||
(:prefix (setq prefix (kbd (pop rest))) nil)
|
||||
(:map (setq keymaps (-list (pop rest))) nil)
|
||||
(:unset `(,(macroexpand `(map! ,(kbd (pop rest)) nil))))
|
||||
(:after (prog1 `((after! ,(pop rest) ,(macroexpand `(map! ,@rest)))) (setq rest '())))
|
||||
(:when (prog1 `((if ,(pop rest) ,(macroexpand `(map! ,@rest)))) (setq rest '())))
|
||||
(:unless (prog1 `((if (not ,(pop rest)) ,(macroexpand `(map! ,@rest)))) (setq rest '())))
|
||||
(otherwise ; might be a state prefix
|
||||
(mapc (lambda (letter)
|
||||
(if (assoc letter state-map)
|
||||
|
@ -179,16 +177,12 @@ Examples:
|
|||
(unless (> (length rest) 0)
|
||||
(user-error "Map has no definition for %s" key))
|
||||
(setq def (pop rest))
|
||||
(let ((first-key (car first-set))
|
||||
(first-value (cdr first-set))
|
||||
out-forms)
|
||||
(let (out-forms)
|
||||
(dolist (keymap keymaps)
|
||||
(if (not states)
|
||||
(add-to-list 'out-forms `(evil-define-key nil ,keymap ,key ,def) t)
|
||||
(dolist (state states)
|
||||
(add-to-list 'out-forms `(evil-define-key ',state ,keymap ,key ,def) t))))
|
||||
(setq prefix (if (eq first-key :prefix) first-value))
|
||||
(setq keymaps (if (eq first-key :map) first-value default-keymaps))
|
||||
(setq states '())
|
||||
out-forms))
|
||||
|
||||
|
|
|
@ -11,14 +11,14 @@
|
|||
flycheck-disabled-checkers '(emacs-lisp-checkdoc make))
|
||||
:config
|
||||
(evil-initial-state 'flycheck-error-list-mode 'emacs)
|
||||
(bind! (:map flycheck-error-list-mode-map
|
||||
:n [escape] 'kill-this-buffer
|
||||
:n "q" 'kill-this-buffer
|
||||
:n "C-n" 'flycheck-error-list-next-error
|
||||
:n "C-p" 'flycheck-error-list-previous-error
|
||||
:n "j" 'flycheck-error-list-next-error
|
||||
:n "k" 'flycheck-error-list-previous-error
|
||||
:n "RET" 'flycheck-error-list-goto-error))
|
||||
(map! (:map flycheck-error-list-mode-map
|
||||
:n [escape] 'kill-this-buffer
|
||||
:n "q" 'kill-this-buffer
|
||||
:n "C-n" 'flycheck-error-list-next-error
|
||||
:n "C-p" 'flycheck-error-list-previous-error
|
||||
:n "j" 'flycheck-error-list-next-error
|
||||
:n "k" 'flycheck-error-list-previous-error
|
||||
:n "RET" 'flycheck-error-list-goto-error))
|
||||
|
||||
;; Check buffer when normal mode is entered
|
||||
(add-hook! evil-normal-state-entry 'narf*flycheck-buffer)
|
||||
|
|
|
@ -32,24 +32,24 @@
|
|||
(mapc (lambda (r) (add-to-list 'helm-boring-file-regexp-list r))
|
||||
(list "\\.projects$" "\\.DS_Store$"))
|
||||
|
||||
(bind! (:map (helm-map helm-generic-files-map helm-find-files-map helm-swoop-map helm-projectile-find-file-map)
|
||||
"C-w" 'backward-kill-word
|
||||
"C-r" 'evil-ex-paste-from-register ; Evil registers in helm! Glorious!
|
||||
"<escape>" 'helm-keyboard-quit
|
||||
[escape] 'helm-keyboard-quit)
|
||||
(:map helm-find-files-map
|
||||
"C-w" 'helm-find-files-up-one-level
|
||||
;; "TAB" 'helm-execute-persistent-action
|
||||
"/" 'helm-execute-persistent-action)
|
||||
(:map helm-ag-map
|
||||
"<backtab>" 'helm-ag-edit)
|
||||
(:map helm-ag-edit-map
|
||||
"<escape>" 'helm-ag--edit-abort
|
||||
:n "zx" 'helm-ag--edit-abort)
|
||||
(:map helm-map
|
||||
"C-S-n" 'helm-next-source
|
||||
"C-S-p" 'helm-previous-source
|
||||
"C-u" 'helm-delete-minibuffer-contents))
|
||||
(map! (:map (helm-map helm-generic-files-map helm-find-files-map helm-swoop-map helm-projectile-find-file-map)
|
||||
"C-w" 'backward-kill-word
|
||||
"C-r" 'evil-ex-paste-from-register ; Evil registers in helm! Glorious!
|
||||
"<escape>" 'helm-keyboard-quit
|
||||
[escape] 'helm-keyboard-quit)
|
||||
(:map helm-find-files-map
|
||||
"C-w" 'helm-find-files-up-one-level
|
||||
;; "TAB" 'helm-execute-persistent-action
|
||||
"/" 'helm-execute-persistent-action)
|
||||
(:map helm-ag-map
|
||||
"<backtab>" 'helm-ag-edit)
|
||||
(:map helm-ag-edit-map
|
||||
"<escape>" 'helm-ag--edit-abort
|
||||
:n "zx" 'helm-ag--edit-abort)
|
||||
(:map helm-map
|
||||
"C-S-n" 'helm-next-source
|
||||
"C-S-p" 'helm-previous-source
|
||||
"C-u" 'helm-delete-minibuffer-contents))
|
||||
|
||||
;;; Helm hacks
|
||||
(defun narf*helm-hide-source-header-maybe ()
|
||||
|
|
|
@ -33,13 +33,13 @@
|
|||
(ido-vertical-mode 1)
|
||||
(require 'flx-ido)
|
||||
(flx-ido-mode 1)
|
||||
(bind! :map (ido-common-completion-map
|
||||
ido-completion-map
|
||||
ido-file-completion-map)
|
||||
"C-n" 'ido-next-match
|
||||
"C-p" 'ido-prev-match
|
||||
"C-w" 'ido-delete-backward-word-updir
|
||||
"C-u" 'ido-up-directory))
|
||||
(map! :map (ido-common-completion-map
|
||||
ido-completion-map
|
||||
ido-file-completion-map)
|
||||
"C-n" 'ido-next-match
|
||||
"C-p" 'ido-prev-match
|
||||
"C-w" 'ido-delete-backward-word-updir
|
||||
"C-u" 'ido-up-directory))
|
||||
|
||||
(advice-add 'ido-sort-mtime :override 'narf*ido-sort-mtime)
|
||||
(add-hook! (ido-make-file-list ido-make-dir-list) 'narf*ido-sort-mtime)
|
||||
|
@ -68,22 +68,22 @@
|
|||
neo-modern-sidebar t)
|
||||
:config
|
||||
(defun narf|neotree-init-keymap ()
|
||||
(bind! :map evil-motion-state-local-map
|
||||
"ESC" 'neotree-hide
|
||||
"\\\\" 'neotree-hide
|
||||
"RET" 'neotree-enter
|
||||
"J" 'neotree-select-next-sibling-node
|
||||
"K" 'neotree-select-previous-sibling-node
|
||||
"H" 'neotree-select-up-node
|
||||
"L" 'neotree-select-down-node
|
||||
"v" 'neotree-enter-vertical-split
|
||||
"s" 'neotree-enter-horizontal-split
|
||||
"c" 'neotree-create-node
|
||||
"d" 'neotree-delete-node
|
||||
"g" 'neotree-refresh
|
||||
"q" 'neotree-hide
|
||||
"r" 'neotree-rename-node
|
||||
"R" 'neotree-change-root))
|
||||
(map! :map evil-motion-state-local-map
|
||||
"ESC" 'neotree-hide
|
||||
"\\\\" 'neotree-hide
|
||||
"RET" 'neotree-enter
|
||||
"J" 'neotree-select-next-sibling-node
|
||||
"K" 'neotree-select-previous-sibling-node
|
||||
"H" 'neotree-select-up-node
|
||||
"L" 'neotree-select-down-node
|
||||
"v" 'neotree-enter-vertical-split
|
||||
"s" 'neotree-enter-horizontal-split
|
||||
"c" 'neotree-create-node
|
||||
"d" 'neotree-delete-node
|
||||
"g" 'neotree-refresh
|
||||
"q" 'neotree-hide
|
||||
"r" 'neotree-rename-node
|
||||
"R" 'neotree-change-root))
|
||||
|
||||
(add-hook! neotree-mode 'narf|neotree-init-keymap)
|
||||
(add-hook! window-configuration-change 'narf|neotree-close-on-window-change)
|
||||
|
|
|
@ -23,8 +23,8 @@
|
|||
yas-snippet-dirs `(,@narf-snippet-dirs)
|
||||
yas-prompt-functions '(yas-ido-prompt yas-no-prompt))
|
||||
|
||||
(bind! :i [(tab)] 'yas-expand
|
||||
:v "<backtab>" 'narf/yas-insert-snippet)
|
||||
(map! :i [(tab)] 'yas-expand
|
||||
:v "<backtab>" 'narf/yas-insert-snippet)
|
||||
|
||||
(defvar yas-minor-mode-map
|
||||
(let ((map (make-sparse-keymap)))
|
||||
|
@ -40,21 +40,21 @@
|
|||
;; Simpler `yas-selected-text' alias for templates
|
||||
(defvaralias '% 'yas-selected-text)
|
||||
;; Undo global maps
|
||||
(bind! :i [(tab)] nil
|
||||
:v "<backtab>" nil)
|
||||
(map! :i [(tab)] nil
|
||||
:v "<backtab>" nil)
|
||||
|
||||
;; keybinds
|
||||
(bind! :map yas-keymap
|
||||
"C-e" 'narf/yas-goto-end-of-field
|
||||
"C-a" 'narf/yas-goto-start-of-field
|
||||
"<M-right>" 'narf/yas-goto-end-of-field
|
||||
"<M-left>" 'narf/yas-goto-start-of-field
|
||||
"<S-tab>" 'yas-prev-field
|
||||
"<M-backspace>" 'narf/yas-clear-to-sof
|
||||
(map! :map yas-keymap
|
||||
"C-e" 'narf/yas-goto-end-of-field
|
||||
"C-a" 'narf/yas-goto-start-of-field
|
||||
"<M-right>" 'narf/yas-goto-end-of-field
|
||||
"<M-left>" 'narf/yas-goto-start-of-field
|
||||
"<S-tab>" 'yas-prev-field
|
||||
"<M-backspace>" 'narf/yas-clear-to-sof
|
||||
|
||||
"<escape>" 'evil-normal-state
|
||||
[backspace] 'narf/yas-backspace
|
||||
"<delete>" 'narf/yas-delete)
|
||||
"<escape>" 'evil-normal-state
|
||||
[backspace] 'narf/yas-backspace
|
||||
"<delete>" 'narf/yas-delete)
|
||||
|
||||
;; Once you're in normal mode, you're out
|
||||
(add-hook! evil-normal-state-entry 'yas-abort-snippet)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue