blob: 93dc30eba684fa6d077ca85b7fa8b3fe8ada0713 (
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
Modified regular file config.org:
...
337 337: ** Auth
338 338: To send mail, we need to log into everything.
339 339: Instead of typing out passwords every time, we use the ~~.authinfo.gpg~ file (can also be without the gpg encryption).
340 : First we install & set up pinentry.
341 : #+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
342 : (package! pinentry)
343 : #+end_src
344 340:
345 : #+begin_src emacs-lisp
346 : (use-package! pinentry
347 : :config
348 : (pinentry-start))
349 : (setq epg-pinentry-mode 'loopback)
350 : #+end_src
351 : To read the file:
341: Read authinfo.gpg, the file containing the secrets
352 342: #+begin_src emacs-lisp
353 343: (setq auth-sources '("~/.authinfo.gpg"))
354 344: #+end_src
...
1400 1390: (add-hook 'nov-mode-hook
1401 1391: (lambda ()
1402 1392: (face-remap-add-relative 'variable-pitch
1403 : :family "Georgia" :height 1.3))) ; different font for reading
1393: :family "Libron" :height 1.3))) ; different font for reading
1404 1394: (add-hook 'nov-mode-hook #'writeroom-mode) ; center text & stuff
1405 1395: #+end_src
1406 1396:
...
1420 1410: (package! try)
1421 1411: #+end_src
1422 1412: That's about all ~try~ needs.
1413: ** hledger-mode
1414: hledger mode lets you manage hledger via Emacs.
1415: #+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
1416: (package! hledger-mode)
1417: (package! company) ; needed for autocompletion
1418: #+end_src
1419:
1420: First we have to set up company, which is needed for autocompletion in hledger-mode
1421: #+begin_src emacs-lisp
1422: (use-package! company
1423: :ensure t
1424: :defer nil)
1425: #+end_src
1426:
1427:
1428: Then, we set up hledger-mode
1429: #+begin_src emacs-lisp
1430: (use-package! hledger-mode
1431: :mode ("\\.journal\\'" "\\.hledger\\'")
1432: :custom
1433: (hledger-jfile (expand-file-name "~/.hledger.journal"))
1434: :after (company cape)
1435: :config
1436: (add-hook 'hledger-mode-hook
1437: (lambda ()
1438: (add-hook 'completion-at-point-functions
1439: (cape-company-to-capf #'hledger-company)
1440: nil t))))
1441: #+end_src
1423 1442: * Tramp
1424 1443:
1425 1444: Tramp is a way to edit files via SSH and root owned files in Emacs.
...
1434 1453: (tramp-remote-shell-args ("-c"))
1435 1454: (tramp-connection-timeout 10))))
1436 1455: #+end_src
1456: * EXWM
1457: #+begin_quote
1458: Who needs a WM if you have Emacs?
1459: #+end_quote
1460: EXWM is the Emacs X Window Manager.
1461: #+begin_src emacs-lisp :tangle ~/.config/doom/packages.el
1462: (package! exwm)
1463: (package! edwina) ; dynamic tiling
1464: (package! exwm-edit) ; edit X text fields in an Emacs buffer
1465: (package! exwm-mff) ; mouse follows focus
1466: (package! app-launcher :recipe (:host github :repo "SebastienWae/app-launcher"))
1467: #+end_src
1468:
1469: ** Helpers and bindings
1470: #+begin_src emacs-lisp
1471: (defconst my/exwm-session-p (and (getenv "EXWM") t))
1472:
1473: (defun my/spawn (cmd)
1474: "Return a command that runs shell CMD."
1475: (lambda () (interactive) (start-process-shell-command cmd nil cmd)))
1476:
1477: (defun my/run-once (cmd)
1478: "Run CMD only if no process named like its executable is already running."
1479: (let ((name (file-name-nondirectory (car (split-string cmd)))))
1480: (start-process-shell-command
1481: cmd nil (format "pgrep -x %s >/dev/null || %s" (shell-quote-argument name) cmd))))
1482:
1483: (defun my/close-window ()
1484: (interactive)
1485: (kill-buffer)
1486: (when (cdr (window-list))
1487: (edwina-delete-window)))
1488:
1489: (defconst my/spawn-binds
1490: '(("s-<return>" . "alacritty") ("s-w" . "vivaldi") ("s-e" . "xfe")
1491: ("s-s" . "discord") ("s-x" . "loginctl lock-session")
1492: ("<print>" . "screenshot") ("S-<print>" . "screenrecord")
1493: ("s-S" . "screenshot select") ("s-R" . "screenrecord select")
1494: ("<XF86AudioRaiseVolume>" . "wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+")
1495: ("<XF86AudioLowerVolume>" . "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-")
1496: ("<XF86AudioMute>" . "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle")
1497: ("<XF86AudioPlay>" . "playerctl play-pause")
1498: ("<XF86AudioNext>" . "playerctl next")
1499: ("<XF86AudioPrev>" . "playerctl previous")))
1500:
1501: (defconst my/wm-binds
1502: '(("s-r" . exwm-reset)
1503: ("s-p" . app-launcher-run-app)
1504: ("s-j" . edwina-select-next-window)
1505: ("s-k" . edwina-select-previous-window)
1506: ("s-J" . edwina-swap-next-window)
1507: ("s-K" . edwina-swap-previous-window)
1508: ("s-h" . edwina-dec-mfact)
1509: ("s-l" . edwina-inc-mfact)
1510: ("s-H" . edwina-inc-nmaster)
1511: ("s-L" . edwina-dec-nmaster)
1512: ("s-m" . edwina-zoom) ; promote to master, dwm-style
1513: ("s-q" . my/close-window)
1514: ("s-f" . exwm-floating-toggle-floating)
1515: ("C-s-q" . save-buffers-kill-emacs)))
1516:
1517: (defconst my/ws-binds
1518: (cl-loop for i from 0 below 9
1519: for sym in '("!" "@" "#" "$" "%" "^" "&" "*" "(")
1520: collect (cons (format "s-%d" (1+ i))
1521: (let ((ws i)) (lambda () (interactive) (exwm-workspace-switch-create ws))))
1522: collect (cons (format "s-%s" sym)
1523: (let ((ws i)) (lambda () (interactive) (exwm-workspace-move-window ws))))))
1524:
1525: (defun my/exwm-key (spec)
1526: (cons (kbd (car spec))
1527: (if (stringp (cdr spec)) (my/spawn (cdr spec)) (cdr spec))))
1528: #+end_src
1529:
1530: ** EXWM itself
1531: #+begin_src emacs-lisp
1532: (use-package! exwm
1533: :when my/exwm-session-p
1534: :config
1535: (setenv "EXWM" nil)
1536: (setq exwm-workspace-number 9
1537: exwm-manage-configurations
1538: '(((member exwm-class-name '("Alacritty")) char-mode t)
1539: ((equal exwm-class-name "discord") workspace 8)
1540: ((member exwm-class-name '("Pavucontrol" "Blueman-manager" "ssh-askpass" "Gcr-prompter"))
1541: floating t)
1542: ((equal exwm-title "pinentry") floating t))
1543: exwm-input-global-keys
1544: (mapcar #'my/exwm-key (append my/spawn-binds my/wm-binds my/ws-binds))
1545: exwm-input-simulation-keys
1546: '(([?\C-b] . [left]) ([?\C-f] . [right])
1547: ([?\C-p] . [up]) ([?\C-n] . [down])
1548: ([?\C-a] . [home]) ([?\C-e] . [end])
1549: ([?\C-d] . [delete]) ([?\C-k] . [S-end delete])
1550: ([?\C-w] . [?\C-x]) ([?\M-w] . [?\C-c]) ([?\C-y] . [?\C-v])))
1551:
1552: (cl-pushnew ?\C-c exwm-input-prefix-keys)
1553:
1554: (add-hook 'exwm-update-class-hook
1555: (lambda () (exwm-workspace-rename-buffer exwm-class-name)))
1556: (add-hook 'exwm-update-title-hook
1557: (lambda ()
1558: (exwm-workspace-rename-buffer
1559: (format "%s | %s" exwm-class-name
1560: (truncate-string-to-width (or exwm-title "") 40 nil nil "…")))))
1561:
1562: (add-hook 'exwm-mode-hook #'doom-mark-buffer-as-real-h)
1563: (advice-add #'suspend-frame :override #'ignore)
1564:
1565: (add-hook 'exwm-init-hook
1566: (lambda ()
1567: (start-process-shell-command
1568: "dbus-env" nil "dbus-update-activation-environment DISPLAY XAUTHORITY")
1569: (dolist (c '("feh --bg-scale ~/Pictures/floating_gnu.png" "xset m 0"))
1570: (start-process-shell-command c nil c))
1571: (my/run-once "~/.cargo/bin/mprisence")))
1572:
1573: (if (fboundp 'exwm-systemtray-mode) (exwm-systemtray-mode 1) (exwm-systemtray-enable))
1574: (if (fboundp 'exwm-wm-mode) (exwm-wm-mode 1) (exwm-enable))) ; 0.34+ vs 0.33
1575:
1576: (use-package! exwm-edit
1577: :when my/exwm-session-p
1578: :after exwm
1579: :config (setq exwm-edit-split "below"))
1580:
1581: (use-package! exwm-mff
1582: :when my/exwm-session-p
1583: :hook (exwm-init . exwm-mff-mode))
1584: #+end_src
1585: ** Edwina
1586: Edwina lets EXWM become a dynamically tiling window manager.
1587: #+begin_src emacs-lisp
1588: (use-package! edwina
1589: :when my/exwm-session-p
1590: :after exwm
1591: :config
1592: (setq display-buffer-base-action '(display-buffer-below-selected)
1593: edwina-mfact 0.50
1594: edwina-narrow-threshold 0)
1595: (edwina-mode 1))
1596: #+end_src
1437 1597: * Evil
1438 1598: ~Mapping at its finest~
1439 1599: EVIl mode emulates VIM bindings in Emacs.
...
|