Skip to content
Snippets Groups Projects
keybindings.el 2.39 KiB
;;; keybindings.el --- other keybindings for Emacs.
;;; Commentary:

;;; Code:
(defvar emacs-default-map (make-sparse-keymap)
  "Base keymap for all Emacs leader key commands.")

;;; Whichkey
(use-package which-key
  :ensure t
  :hook (after-init . which-key-mode)
  :config
  (setq which-key-show-early-on-C-h t)
  (which-key-show-major-mode)
  :diminish which-key-mode)

;;; Keybinding
(use-package evil
  :ensure t
  :init
  (setq evil-want-integration t)
  (setq evil-want-keybinding nil)
  :config
  (evil-mode 1)
  (evil-set-undo-system 'undo-tree)
  (evil-set-leader '(normal motion visual) (kbd "SPC"))
  (evil-set-leader '(insert replace emacs) (kbd "M-m")))

(use-package evil-collection
  :after evil
  :ensure t
  :config
  (setq evil-collection-setup-minibuffer t)
  (evil-collection-init))

(defmacro user/set-leader-key (states keymap key op)
  "Bind KEY to OP at STATES and KEYMAP."
  `(evil-define-key ,states ,keymap (kbd ,(concat "<leader>" key)) ,op))

(defun user/set-leader-key* (states keymap key op &rest key-ops)
  "Bind KEY-OPS lists at states and KEYMAP."
  (while key
    (evil-define-key states keymap (kbd (concat "<leader>" key)) op)
    (setq key (pop key-ops)
          op (pop key-ops))))
(put 'user/set-leader-key* 'lisp-indent-function 'defun)

(defmacro user/set-global-leader-key (key op)
  "Bind KEY to OP globally for all evil states."
  `(user/set-leader-key nil 'global ,key ,op))

(defun user/set-global-leader-key* (key op &rest key-ops)
  "Bind KEY to OP."
  (while key
    (evil-define-key nil 'global (kbd (concat "<leader>" key)) op)
    (setq key (pop key-ops)
          op (pop key-ops))))
(put 'user/set-global-leader-key* 'lisp-indent-function 'defun)

;;; General - for keybindings
(use-package general
  :ensure t
  :init
  (defalias 'define-key! #'general-def)
  (defalias 'undefine-key! #'general-unbind))

;;; Define key
(user/set-global-leader-key*
 ;; windows jump
  "wh" 'evil-window-left
  "wl" 'evil-window-right
  "wj" 'evil-window-down
  "wk" 'evil-window-up
  ;; window split
  "wv" 'evil-window-vsplit
  "w-" 'evil-window-split
  "wd" 'evil-window-delete
  "w1" 'delete-other-windows
  "w0" 'delete-window
  ;;
  "<SPC>" 'execute-extended-command
  ;; Files
  "ff" 'find-file
  "fs" 'save-buffer
  "fS" 'evil-write-all
  ;; Buffers
  "bd" 'kill-this-buffer
  "bn" 'next-buffer
  "bp" 'previous-buffer
  "bx" 'kill-buffer-and-window)

(provide 'keybindings)
;;; keybindings.el ends here