summaryrefslogtreecommitdiff
path: root/modules/keybindings.el
blob: 5d8b6bdd59a354d0b3224cab57134771ac5f140e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
;;; keybindings --- General Keyboard Shortcuts -*- lexical-binding: t; -*-
;; author: Craig Jennings <c@cjennings.net>

;;; Commentary:

;; TLDR: "C-c ?" Should bring up a helpful menu from wherever you are.

;; I've created a general menu that contains commonly used applications and
;; utilities.

;; There are also helpful menus that describe common functionality from within
;; another package, e.g., ledger. You access these with the same "C-c ? keyboard
;; shortcut"

;; Also, commonly used files should be easy to jump to. The "jump-to" keymap
;; refers to files defined in user-constants.el.

;; "Hostile Keybindings" are those that are close to keybindings I use commonly
;; so they're easy to  hit by accident, but they have painful results. I'd
;; rather avoid the pain by unsetting they keybindings and view an error '<key>
;; is undefined' message. Finally, I'm providing messages to train me to use
;; faster keybindings and provide feedback when evaluating buffers.

;;; Code:


;; ----------------------------------- Hydra -----------------------------------
;; provides ability to create menus

(use-package hydra
  :demand t) ;; used in init, so load it now

;; --------------------------------- Main Hydra --------------------------------
;; convenience menu for commonly used apps

(defhydra hydra-general (:color blue :hint nil)
  "

                                         Main Menu

      ^Applications^            ^Communication^        ^Utilities^            ^Entertainment
      ^^^^^^^^--------------------------------------------------------------------------------
	  _f_: Feed Reader          _m_: Mu4e Email        _p_: Open Project      _r_: Play Radio
	  _b_: Ebook Manager        _t_: Telegram          _c_: Calculator        _g_: Games Menu
	  _F_: File Manager         _i_: IRC               _W_: World Clock
	  _l_: Ledger Accounting    ^^                     _z_: Diff Directories
	  _d_: Flashcard Drill      ^^                     ^^
	  ^^                        ^^                     ^^                     _q_: quit
\n\n
"
  ("q" nil)
  ;; Applications
  ("f" elfeed-dashboard)
  ("b" calibredb)
  ("F" (dirvish user-home-dir))
  ("l" (find-file ledger-file))
  ("d" cj/drill-start)

  ;; Communication
  ("m" mu4e)
  ("t" telega)
  ("i" cj/erc-start-or-switch)

  ;; Utilities
  ("p" projectile-switch-project)
  ("c" calc)
  ("W" world-clock)
  ("z" ztree-diff)

  ;; Entertainment
  ("r" eradio-play)
  ("g" hydra-games/body))

(global-set-key (kbd "C-c ?") 'hydra-general/body)

;; ---------------------------- General Keybindings ----------------------------

;; Avoid hostile bindings
(global-unset-key (kbd "C-x C-f"))   ;; find-file-read-only
(global-unset-key (kbd "C-z"))       ;; suspend-frame is accidentally hit often
(global-unset-key (kbd "M-o"))       ;; facemenu-mode

;; Add commonly-used general keybindings
(global-set-key (kbd "C-x C-f") 'find-file)
(global-set-key (kbd "C-c u")   'capitalize-region)
(global-set-key (kbd "C-c f")   'link-hint-open-link-at-point)
(global-set-key (kbd "M-*")     'calculator)

;; Normally bound to ESC ESC ESC, hit ESC once to get out of unpleasant situations.
(global-set-key (kbd "<escape>")  'keyboard-escape-quit)

;; remap C-x \ to sort-lines (from remap activate-transient-input-method)
(global-unset-key (kbd "C-x \\"))
(global-set-key (kbd "C-x \\") 'sort-lines)

;; training myself to use C-/ for undo (bound internally) as it's faster.
(if (display-graphic-p)
	(progn
	  (global-unset-key (kbd "C-x u"))
	  (define-key global-map (kbd "C-x u")
				  #'(lambda () (interactive)
					  (message (concat "Seriously, " user-name
									   "? Use 'C-/'. It's faster."))))))

;; evaluating a buffer should give confirmation or error.
(defun cj/eval-buffer-with-confirmation-or-error-message ()
  "Evaluate the buffer and display a message."
  (interactive)
  (let ((result (eval-buffer)))
    (if (not (eq result 'error))
        (message "Buffer evaluated.")
      (message "error occurred during evaluation: %s" result))))
(global-set-key (kbd "C-c b")   'cj/eval-buffer-with-confirmation-or-error-message)

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