config.phundrak.com/docs/emacs/keybindings.org

17 KiB
Raw Blame History

Emacs — Keybindings

Keybindings

Undefining some stuff to make keybind prefixes work correctly.

(mapconcat (lambda (line)
             (let* ((key      (nth 0 line))
                    (function (nth 1 line))
                    (comment  (or (nth 2 line) ""))
                    (package  (or (nth 3 line) "")))
               (format "\"%s%s\" %s"
                       prefix
                       key
                       (if (string= "" comment)
                           (if (member function '("" "nil")) "nil" (concat "#'" function))
                         (format "'(%s :wk %s%s)"
                                 (if (member function '("" "nil")) ":ignore t" function)
                                 (if (member function '("none" "nil")) "t" (concat "\"" comment "\""))
                                 (if (string-blank-p package) "" (concat ":package " package)))))))
           table
           "\n")
(general-define-key
 :keymaps 'global-map
 "<mouse-2>" nil
 "<mouse-3>" nil)

(phundrak/evil
  :packages '(counsel)
  "U"   #'evil-redo
  "C-a" #'beginning-of-line
  "C-e" #'end-of-line
  "C-y" #'yank
  "M-y" #'counsel-yank-pop)
(general-define-key
 "<f5>" #'compile
 "<f6>" #'recompile)

(phundrak/leader-key
  "SPC" '(counsel-M-x :wk "M-x")
  "'"   #'shell-pop

  <<general-keybindings-gen(table=keybinds-tabs, prefix="TAB ")>>

  <<general-keybindings-gen(table=keybinds-apps, prefix="a")>>
  <<general-keybindings-gen(table=keybinds-apps-shell, prefix="as")>>
  <<general-keybindings-gen(table=treemacs-keybinds, prefix="at")>>

  <<general-keybindings-gen(table=keybinds-buffers, prefix="b")>>

  "c"   '(:ignore t :wk "code")
  "cl"  #'evilnc-comment-or-uncomment-lines

  <<keybindings-flycheck>>

  <<general-keybindings-gen(table=keybinds-files, prefix="f")>>
  <<keybinds-specific-files>>

  <<general-keybindings-gen(table=keybinds-help, prefix="h")>>

  "i"   '(:ignore t :wk "insert")
  "iu"  #'counsel-unicode-char

  <<general-keybindings-gen(table=keybinds-jump, prefix="j")>>

  <<general-keybindings-gen(table=keybinds-toggle, prefix="t ")>>

  <<general-keybindings-gen(table=keybinds-text, prefix="T")>>

  <<general-keybindings-gen(table=keybinds-windows, prefix="w")>>

  <<general-keybindings-gen(table=keybinds-quit, prefix="q")>>

  "u"   #'universal-argument
  "U"   #'undo-tree-visualize)

Apps

Here are my apps keybinds. Each one of them is prefixed by a.

Key Function Description Package
apps
c calc
C calendar
CC calendar
Co org-agenda org
Cs org-caldav-sync org-caldav
d docker
E elfeed
e email
ec mu4e-compose-new
em mu4e
k keycast-mode
K keycast-log-mode
m mastodon
mm mastodon mastodon
mn mastodon-notifications-get mastodon
mt mastodon-toot mastodon
T tetris
w wttrin wttrin

I also have two main shell-related functions, prefixed with as.

Key Function Description Package
shells
e eshell-new
v vterm vterm
V multi-vterm multi-vterm

Buffers

My buffer-related keybinds are all prefixed by b.

Key Function Description
buffers
b bufler-switch-buffer
B bury-buffer
c clone-indirect-buffer
C clone-indirect-buffer-other-window
l bufler
d kill-this-buffer
D kill-buffer
h dashboard-refresh-buffer
m switch-to-messages-buffer
n next-buffer
p previous-buffer
r counsel-buffer-or-recentf
s switch-to-scratch-buffer

Errors

(defhydra hydra-flycheck
  (:pre (flycheck-list-errors)
   :post (quit-windows-on "*Flycheck errors*")
   :hint nil)
  ("f" flycheck-error-list-set-filter "Filter")
  ("t" flycheck-next-error "Next")
  ("s" flycheck-previous-error "Previous")
  ("gg" flycheck-first-error "First")
  ("G" (progn (goto-char (point-max)) (flycheck-previous-error)) "Last")
  ("q" nil))
"e"  '(:ignore t :which-key "errors")
"e." '(hydra-flycheck/body :wk "hydra")
"el" #'counsel-flycheck
"ee" '(:keymap flycheck-command-map :package 'flycheck :wk "flycheck")
"ef" '(:keymap flyspell-mode-map :package 'flyspell :wk "flyspell")
"eF" #'flyspell-hydra/body

Files

My keybinds for file manipulation are prefixed by f.

Key Function Description
files
f counsel-find-file
F quick-find-files
h hexl-find-file
r counsel-recentf
s save-buffer

I also have some keybinds dedicated to opening specific files.

"fc"  '((lambda ()
          (interactive)
          (quick-find-files nil "~/org/config/docs/emacs" "org"))
        :wk "emacs config")
"fC"  '((lambda ()
          (interactive)
          (quick-find-files nil "~/org/config/docs" "org"))
        :wk "general config")
"fi"  '((lambda ()
          (interactive)
          (find-file (concat user-emacs-directory "init.el")))
        :which-key "init.el")
"fI"  '((lambda ()
          (interactive)
          (quick-find-files nil
                            (expand-file-name "lisp" user-emacs-directory)
                            "el"))
        :which-key "elisp config")
"fR"  '((lambda ()
          (interactive)
          (counsel-find-file ""
                             (concat user-emacs-directory
                                    (file-name-as-directory "straight")
                                    (file-name-as-directory "repos"))))
        :which-key "straight package")
"fS"  '((lambda ()
          (interactive)
          (find-file "~/org/config/stumpwm.org"))
        :which-key "stumpwm.org")

Help

My keybinds for help are prefixed by h.

Key Function Description
help
k which-key-show-top-level
i info
I info-display-manual
d describe
dc describe-char
dC helpful-command
df helpful-callable
di describe-input-method
dk helpful-key
dm helpful-macro
dM helpful-mode
dp describe-package
ds helpful-symbol
dv helpful-variable

Jump

My keybinds for jumping around are prefixed by j.

Key Function Description
jump
f counsel-file-jump
d dirvish-dwim
D dired-jump-other-window

Project

My keybinds for my projects are prefixed by p.

Key Function Description
project
! projectile-run-shell-command-in-root
& projectile-run-async-shell-command-in-root
b counsel-projectile-switch-to-buffer
c counsel-projectile
d counsel-projectile-find-dir
e projectile-edit-dir-locals
f counsel-projectile-find-file
g projectile-find-tag
k project-kill-buffers
p counsel-projectile-switch-project
t ivy-magit-todos
v projectile-vc

Treemacs

Key Function Description
treemacs
c create
cd treemacs-create-dir
cf treemacs-create-file
ci treemacs-create-icon
ct treemacs-create-theme
cw treemacs-create-workspace
d treemacs-delete-file
f files
ff treemacs-find-file
ft treemacs-find-tag
l lsp
ls treemacs-expand-lsp-symbol
ld treemacs-expand-lsp-treemacs-deps
lD treemacs-collapse-lsp-treemacs-deps
lS treemacs-collapse-lsp-symbol
p projects
pa treemacs-add-project-to-workspace
pf treemacs-project-follow-mode
pn treemacs-project-of-node
pp treemacs-project-at-point
pr treemacs-remove-project-from-workspace
pt treemacs-move-project-down
ps treemacs-move-project-up
r rename
rf treemacs-rename-file
rp treemacs-rename-project
rr treemacs-rename
rw treemacs-rename-workspace
t treemacs
T toggles
Td treemacs-toggle-show-dotfiles
Tn treemacs-toggle-node
v visit node
va treemacs-visit-node-ace
vc treemacs-visit-node-close-treemacs
vn treemacs-visit-node-default
y yank
ya treemacs-copy-absolute-path-at-point
yp treemacs-copy-project-path-at-point
yr treemacs-copy-relative-path-at-point
yf treemacs-copy-file

Tabs

Emacs has native tabs available, which can be interesting when working on multiple projects at once between which we may want to switch. Tabs allow the user not to have multiple frames while keeping the advantages of having multiple frames.

My keybinds are prefixed by SPC TAB.

Key Function Description
tabs
TAB tab-switch
» tab-next
« tab-previous
c tab-new
C tab-new-to
d tab-close
n tab-next
p tab-previous
r tab-rename

Text

The prefix here is T.

Key Function Description
text
e string-edit-at-point
u downcase-region
U upcase-region
z hydra-zoom/body

Toggles

My toggle keybinds are prefixed by t.

Key Function Description
toggles
TAB tab-bar-mode
t my/modify-frame-alpha-background/body
T counsel-load-theme
d debug
de toggle-debug-on-error
dq toggle-debug-on-quit
i input method
it toggle-input-method
is set-input-method

Windows

A couple of keybinds are hidden from which-key, otherwise theres not much to say. The prefix here is w.

Key Function Description
windows
c evil-window-left
t evil-window-down
s evil-window-up
r evil-window-right
. windows-adjust-size/body
- split-window-below-and-focus
/ split-window-right-and-focus
$ winum-select-window-by-number
0 winum-select-window-0-or-10 none
1 winum-select-window-1 none
2 winum-select-window-2 none
3 winum-select-window-3 none
4 winum-select-window-4 none
5 winum-select-window-5 none
6 winum-select-window-6 none
7 winum-select-window-7 none
8 winum-select-window-8 none
9 winum-select-window-9 none
b kill-buffer-and-delete-window
d delete-window
o other-window
D delete-other-windows
w writeroom
w. writeroom-buffer-width/body
ww writeroom-mode

Quit

Why would I ever use any of these keybinds? They are prefixed with q.

Key Function Description
quit
f delete-frame
q save-buffers-kill-terminal
Q kill-emacs