]> git.armaanb.net Git - config.org.git/blob - config.org
Improve Circe integration
[config.org.git] / config.org
1 #+TITLE: System Configuration
2 #+DESCRIPTION: Armaan's system configuration.
3
4 * Welcome
5 Welcome to my system configuration! This file contains my Emacs configuration, but also my config files for many of the other programs on my system!
6 ** Compatability
7 I am currently using GCCEmacs 28 from the feature/native-comp branch, so some settings may not be available for older versions of Emacs. This is a purely personal configuration, so while I can garuntee that it works on my setup, I can't for anything else.
8 ** Choices
9 I chose to create a powerful, yet not overly heavy Emacs configuration. Things like LSP mode are important to my workflow and help me be productive, so despite its weight, it is kept. Things like a fancy modeline or icons on the other hand, do not increase my productivity, and create visual clutter, and thus have been excluded.
10
11 Another important choice has been to integrate Emacs into a large part of my computing environment (see [[*EmacsOS]]). I use Email, IRC, et cetera, all through Emacs which simplifies my workflow.
12
13 Lastly, I use Evil mode. I think modal keybindings are simple and more ergonomic than standard Emacs style, and Vim keybindings are what I'm comfortable with and are pervasive throughout computing.
14 ** TODOs
15 *** TODO Turn keybinding and hook declarations into use-package declarations where possible
16 *** TODO Put configs with passwords in here with some kind of authentication
17 - Offlineimap
18 - irc.el
19 ** License
20 Released under the [[https://opensource.org/licenses/MIT][MIT license]] by Armaan Bhojwani, 2021. Note that many snippets are taken from online, and other sources, who are credited for their work at the snippet.
21 * Package management
22 ** Bootstrap straight.el
23 straight.el is really nice for managing package, and it integrates nicely with use-package. It uses the bootstrapping system defined here for installation.
24 #+begin_src emacs-lisp
25   (defvar bootstrap-version)
26   (let ((bootstrap-file
27          (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
28         (bootstrap-version 5))
29     (unless (file-exists-p bootstrap-file)
30       (with-current-buffer
31           (url-retrieve-synchronously
32            "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
33            'silent 'inhibit-cookies)
34         (goto-char (point-max))
35         (eval-print-last-sexp)))
36     (load bootstrap-file nil 'nomessage))
37 #+end_src
38 ** Replace use-package with straight
39 #+begin_src emacs-lisp
40   (straight-use-package 'use-package)
41   (setq straight-use-package-by-default t)
42 #+end_src
43 * Visual options
44 ** Theme
45 Very nice high contrast theme.
46
47 Its fine to set this here because I run Emacs in daemon mode, but if I were not, then putting it in early-init.el would be a better choice to eliminate the window being white before the theme is loaded.
48 #+begin_src emacs-lisp
49   (setq modus-themes-slanted-constructs t
50         modus-themes-bold-constructs t
51         modus-themes-org-blocks 'rainbow
52         modus-themes-mode-line '3d
53         modus-themes-scale-headings t
54         modus-themes-region 'no-extend
55         modus-themes-diffs 'desaturated)
56   (load-theme 'modus-vivendi t)
57 #+end_src
58 ** Typography
59 *** Font
60 Great programming font with ligatures.
61 #+begin_src emacs-lisp
62   (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
63 #+end_src
64 *** Ligatures
65 #+begin_src emacs-lisp
66   (use-package ligature
67     :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
68     :config
69     (ligature-set-ligatures
70      '(prog-mode text-mode)
71      '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "///" "/=" "/=="
72        "/>" "//" "/*" "*>" "***" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
73        "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>" "<-|"
74        "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>" "</" "<*"
75        "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>" ":=" "::=" "=>>"
76        "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!==" "!!" "!=" ">]" ">:"
77        ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&" "&&" "|||>" "||>" "|>" "|]"
78        "|}" "|=>" "|->" "|=" "||-" "|-" "||=" "||" ".." ".?" ".=" ".-" "..<"
79        "..." "+++" "+>" "++" "[||]" "[<" "[|" "{|" "??" "?." "?=" "?:" "##"
80        "###" "####" "#[" "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_"
81        "__" "~~" "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
82     (global-ligature-mode t))
83 #+end_src
84 *** Emoji
85 #+begin_src emacs-lisp
86   (use-package emojify
87     :config (global-emojify-mode))
88
89   ;; http://ergoemacs.org/emacs/emacs_list_and_set_font.html
90   (set-fontset-font
91    t
92    '(#x1f300 . #x1fad0)
93    (cond
94     ((member "Twitter Color Emoji" (font-family-list)) "Twitter Color Emoji")
95     ((member "Noto Color Emoji" (font-family-list)) "Noto Color Emoji")
96     ((member "Noto Emoji" (font-family-list)) "Noto Emoji")))
97 #+end_src
98 ** Line numbers
99 Display relative line numbers except in some modes
100 #+begin_src emacs-lisp
101   (global-display-line-numbers-mode)
102   (setq display-line-numbers-type 'relative)
103   (dolist (no-line-num '(term-mode-hook
104                          pdf-view-mode-hook
105                          shell-mode-hook
106                          org-mode-hook
107                          eshell-mode-hook))
108     (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
109 #+end_src
110 ** Highlight matching parenthesis
111 #+begin_src emacs-lisp
112   (use-package paren
113     :config (show-paren-mode)
114     :custom (show-paren-style 'parenthesis))
115 #+end_src
116 ** Modeline
117 *** Show current function
118 #+begin_src emacs-lisp
119   (which-function-mode)
120 #+end_src
121 *** Make position in file more descriptive
122 Show current column and file size.
123 #+begin_src emacs-lisp
124   (column-number-mode)
125   (size-indication-mode)
126 #+end_src
127 *** Hide minor modes
128 #+begin_src emacs-lisp
129   (use-package minions
130     :config (minions-mode))
131 #+end_src
132 ** Ruler
133 Show a ruler at a certain number of chars depending on mode.
134 #+begin_src emacs-lisp
135   (global-display-fill-column-indicator-mode)
136 #+end_src
137 ** Keybinding hints
138 Whenever starting a key chord, show possible future steps.
139 #+begin_src emacs-lisp
140   (use-package which-key
141     :config (which-key-mode)
142     :custom (which-key-idle-delay 0.3))
143 #+end_src
144 ** Visual highlights of changes
145 Highlight when changes are made.
146 #+begin_src emacs-lisp
147   (use-package evil-goggles
148     :config (evil-goggles-mode)
149     (evil-goggles-use-diff-faces))
150 #+end_src
151 ** Highlight "TODO" comments
152 #+begin_src emacs-lisp
153   (use-package hl-todo
154     :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
155     :config (global-hl-todo-mode))
156 #+end_src
157 ** Don't lose cursor
158 #+begin_src emacs-lisp
159   (blink-cursor-mode)
160 #+end_src
161 ** Visual line mode
162 Soft wrap words and do operations by visual lines.
163 #+begin_src emacs-lisp
164   (add-hook 'text-mode-hook 'turn-on-visual-line-mode)
165 #+end_src
166 ** Display number of matches in search
167 #+begin_src emacs-lisp
168   (use-package anzu
169     :config (global-anzu-mode))
170 #+end_src
171 ** Visual bell
172 Inverts modeline instead of audible bell or the standard visual bell.
173 #+begin_src emacs-lisp
174   (setq visible-bell nil
175         ring-bell-function 'flash-mode-line)
176   (defun flash-mode-line ()
177     (invert-face 'mode-line)
178     (run-with-timer 0.1 nil #'invert-face 'mode-line))
179 #+end_src
180 * Evil mode
181 ** General
182 #+begin_src emacs-lisp
183   (use-package evil
184     :custom (select-enable-clipboard nil)
185     :config
186     (evil-mode)
187     (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
188     ;; Use visual line motions even outside of visual-line-mode buffers
189     (evil-global-set-key 'motion "j" 'evil-next-visual-line)
190     (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
191     (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
192 #+end_src
193 ** Evil collection
194 #+begin_src emacs-lisp
195   (use-package evil-collection
196     :after evil
197     :init (evil-collection-init)
198     :custom (evil-collection-setup-minibuffer t))
199 #+end_src
200 ** Surround
201 tpope prevails!
202 #+begin_src emacs-lisp
203   (use-package evil-surround
204     :config (global-evil-surround-mode))
205 #+end_src
206 ** Leader key
207 #+begin_src emacs-lisp
208   (use-package evil-leader
209     :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
210     :config
211     (evil-leader/set-leader "<SPC>")
212     (global-evil-leader-mode))
213 #+end_src
214 ** Nerd commenter
215 #+begin_src emacs-lisp
216   ;; Nerd commenter
217   (use-package evil-nerd-commenter
218     :bind (:map evil-normal-state-map
219                 ("gc" . evilnc-comment-or-uncomment-lines))
220     :custom (evilnc-invert-comment-line-by-line nil))
221 #+end_src
222 ** Undo tree
223 Fix the oopsies!
224 #+begin_src emacs-lisp
225   (use-package undo-tree
226     :custom
227     (undo-tree-auto-save-history t)
228     (undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo-tree")))
229     :config
230     (global-undo-tree-mode)
231     (evil-set-undo-system 'undo-tree))
232 #+end_src
233 ** Number incrementing
234 Add back C-a/C-x
235 #+begin_src emacs-lisp
236   (use-package evil-numbers
237     :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
238     :bind (:map evil-normal-state-map
239                 ("C-M-a" . evil-numbers/inc-at-pt)
240                 ("C-M-x" . evil-numbers/dec-at-pt)))
241 #+end_src
242 ** Evil org
243 *** Init
244 #+begin_src emacs-lisp
245   (use-package evil-org
246     :after org
247     :hook (org-mode . evil-org-mode)
248     :config
249     (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
250   (use-package evil-org-agenda
251     :straight (:type built-in)
252     :after evil-org
253     :config
254     (evil-org-agenda-set-keys))
255 #+end_src
256 *** Leader maps
257 #+begin_src emacs-lisp
258   (evil-leader/set-key-for-mode 'org-mode
259     "T" 'org-show-todo-tree
260     "a" 'org-agenda
261     "c" 'org-archive-subtree)
262 #+end_src
263 * Org mode
264 ** General
265 #+begin_src emacs-lisp
266   (use-package org
267     :straight (:type built-in)
268     :commands (org-capture org-agenda)
269     :custom
270     (org-ellipsis " â–¾")
271     (org-agenda-start-with-log-mode t)
272     (org-log-done 'time)
273     (org-log-into-drawer t)
274     (org-src-tab-acts-natively t)
275     (org-src-fontify-natively t)
276     (org-startup-indented t)
277     (org-hide-emphasis-markers t)
278     (org-fontify-whole-block-delimiter-line nil))
279 #+end_src
280 ** Tempo
281 #+begin_src emacs-lisp
282   (use-package org-tempo
283     :after org
284     :straight (:type built-in)
285     :config
286     ;; TODO: There's gotta be a more efficient way to write this
287     (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
288     (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
289     (add-to-list 'org-structure-template-alist '("zsh" . "src shell :tangle ~/.config/zsh/zshrc"))
290     (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
291     (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
292     (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
293     (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
294     (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc")))
295 #+end_src
296 * Autocompletion
297 ** Ivy
298 Simple, but not too simple autocompletion.
299 #+begin_src emacs-lisp
300   (use-package ivy
301     :bind (("C-s" . swiper)
302            :map ivy-minibuffer-map
303            ("TAB" . ivy-alt-done)
304            :map ivy-switch-buffer-map
305            ("M-d" . ivy-switch-buffer-kill))
306     :config (ivy-mode))
307 #+end_src
308 ** Ivy-rich
309 #+begin_src emacs-lisp
310   (use-package ivy-rich
311     :after (ivy counsel)
312     :config (ivy-rich-mode))
313 #+end_src
314 ** Counsel
315 Ivy everywhere.
316 #+begin_src emacs-lisp
317   (use-package counsel
318     :bind (("C-M-j" . 'counsel-switch-buffer)
319            :map minibuffer-local-map
320            ("C-r" . 'counsel-minibuffer-history))
321     :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
322     :config (counsel-mode))
323 #+end_src
324 ** Remember frequent commands
325 #+begin_src emacs-lisp
326   (use-package ivy-prescient
327     :after counsel
328     :custom
329     (ivy-prescient-enable-filtering nil)
330     :config
331     (prescient-persist-mode)
332     (ivy-prescient-mode))
333 #+end_src
334 ** Swiper
335 Better search utility.
336 #+begin_src emacs-lisp
337   (use-package swiper)
338 #+end_src
339 * EmacsOS
340 ** RSS
341 Use elfeed for RSS. I have another file with all the feeds in it.
342 #+begin_src emacs-lisp
343   (use-package elfeed
344     :bind (("C-c e" . elfeed))
345     :config
346     (load "~/.emacs.d/feeds.el")
347     (add-hook 'elfeed-new-entry-hook
348               (elfeed-make-tagger :feed-url "youtube\\.com"
349                                   :add '(youtube)))
350     :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
351
352   (use-package elfeed-goodies
353     :after elfeed
354     :config (elfeed-goodies/setup))
355 #+end_src
356 ** Email
357 Use mu4e for reading emails.
358
359 I use `offlineimap` to sync my maildirs. It is slower than mbsync, but is fast enough for me, especially when ran with the =-q= option.
360
361 Contexts are a not very well known feature of mu4e that makes it super easy to manage multiple accounts. Much better than some of the hacky methods and external packages that I've seen.
362 #+begin_src emacs-lisp
363   (use-package smtpmail
364     :straight (:type built-in))
365   (use-package mu4e
366     :load-path "/usr/share/emacs/site-lisp/mu4e"
367     :bind (("C-c m" . mu4e))
368     :config
369     (setq user-full-name "Armaan Bhojwani"
370           smtpmail-local-domain "armaanb.net"
371           smtpmail-stream-type 'ssl
372           smtpmail-smtp-service '465
373           mu4e-change-filenames-when-moving t
374           message-kill-buffer-on-exit t
375           mu4e-get-mail-command "offlineimap -q"
376           message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
377           message-citation-line-function 'message-insert-formatted-citation-line
378           mu4e-context-policy "pick-first"
379           mu4e-contexts
380           `( ,(make-mu4e-context
381                :name "school"
382                :enter-func (lambda () (mu4e-message "Entering school context"))
383                :leave-func (lambda () (mu4e-message "Leaving school context"))
384                :match-func (lambda (msg)
385                              (when msg
386                                (string-match-p "^/school" (mu4e-message-field msg :maildir))))
387                :vars '( (user-mail-address . "abhojwani22@nobles.edu")
388                         (mu4e-sent-folder . "/school/Sent")
389                         (mu4e-drafts-folder . "/school/Drafts")
390                         (mu4e-trash-folder . "/school/Trash")
391                         (mu4e-refile-folder . "/school/Archive")
392                         (user-mail-address . "abhojwani22@nobles.edu")
393                         (smtpmail-smtp-user . "abhojwani22@nobles.edu")
394                         (smtpmail-smtp-server . "smtp.gmail.com")))
395              ,(make-mu4e-context
396                :name "personal"
397                :enter-func (lambda () (mu4e-message "Entering personal context"))
398                :leave-func (lambda () (mu4e-message "Leaving personal context"))
399                :match-func (lambda (msg)
400                              (when msg
401                                (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
402                :vars '(
403                        (mu4e-sent-folder . "/personal/Sent")
404                        (mu4e-drafts-folder . "/personal/Drafts")
405                        (mu4e-trash-folder . "/personal/Trash")
406                        (mu4e-refile-folder . "/personal/Archive")
407                        (user-mail-address . "me@armaanb.net")
408                        (smtpmail-smtp-user . "me@armaanb.net")
409                        (smtpmail-smtp-server "smtp.mailbox.org")
410                        (mu4e-drafts-folder . "/school/Drafts")
411                        (mu4e-trash-folder . "/school/Trash")))))
412     (add-to-list 'mu4e-bookmarks
413                  '(:name "Unified inbox"
414                          :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
415                          :key ?b)))
416 #+end_src
417 ** Calendar
418 #+begin_src emacs-lisp
419   (use-package calfw)
420   (use-package calfw-org)
421   (use-package calfw-ical)
422
423   (defun acheam-calendar ()
424     "Open a calendar."
425     (interactive)
426     (shell-command "vdirsyncer sync")
427     (let ((default-directory "~/.local/share/vdirsyncer/"))
428       (cfw:open-calendar-buffer
429        :contents-sources
430        (list
431         (cfw:ical-create-source "School" (expand-file-name "school/abhojwani22@nobles.edu.ics") "Green")
432         (cfw:ical-create-source "Personal" (expand-file-name "mailbox/Y2FsOi8vMC8zMQ.ics") "Blue")
433         (cfw:ical-create-source "Birthdays" (expand-file-name "mailbox/Y2FsOi8vMS8w.ics") "Gray")
434         ))))
435 #+end_src
436 ** IRC
437 Another file has more specific network configuration.
438 #+begin_src emacs-lisp
439   (use-package circe
440     :config (load-file "~/.emacs.d/irc.el"))
441
442   (use-package circe-chanop
443     :straight (:type built-in)
444     :after circe)
445
446   (use-package circe-color-nicks
447     :straight (:type built-in)
448     :after circe)
449 #+end_src
450 ** Default browser
451 Set EWW as default browser except for videos.
452 #+begin_src emacs-lisp
453   (defun browse-url-mpv (url &optional new-window)
454     "Open URL in MPV."
455     (start-process "mpv" "*mpv*" "mpv" url))
456
457   (setq browse-url-handlers
458         (quote
459          (("youtu\\.?be" . browse-url-mpv)
460           ("." . eww-browse-url)
461           )))
462 #+end_src
463 ** Emacs Anywhere
464 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to
465 "emacsclient --eval "(emacs-everywhere)".
466 #+begin_src emacs-lisp
467   (use-package emacs-everywhere)
468 #+end_src
469 * Emacs IDE
470 ** LSP
471 *** General
472 #+begin_src emacs-lisp
473   (use-package lsp-mode
474     :commands (lsp lsp-deferred)
475     :custom (lsp-keymap-prefix "C-c l")
476     :hook ((lsp-mode . lsp-enable-which-key-integration)))
477
478   (use-package lsp-ivy)
479
480   (use-package lsp-ui
481     :commands lsp-ui-mode
482     :custom (lsp-ui-doc-position 'bottom))
483   (use-package lsp-ui-flycheck
484     :after lsp-ui
485     :straight (:type built-in))
486 #+end_src
487 *** Company
488 Company-box adds icons.
489 #+begin_src emacs-lisp
490   (use-package company
491     :after lsp-mode
492     :hook (lsp-mode . company-mode)
493     :bind (:map company-active-map
494                 ("<tab>" . company-complete-selection))
495     (:map lsp-mode-map
496           ("<tab>" . company-indent-or-complete-common))
497     :custom
498     (company-minimum-prefix-length 1)
499     (setq company-dabbrev-downcase 0)
500     (company-idle-delay 0.0))
501
502   (use-package company-box
503     :hook (company-mode . company-box-mode))
504 #+end_src
505 *** Language servers
506 **** Python
507 #+begin_src emacs-lisp
508   (use-package lsp-pyright
509     :hook (python-mode . (lambda ()
510                            (use-package lsp-pyright
511                              :straight (:type built-in))
512                            (lsp-deferred))))
513 #+end_src
514 ** Code cleanup
515 #+begin_src emacs-lisp
516   (use-package blacken
517     :hook (python-mode . blacken-mode)
518     :config
519     (setq blacken-line-length 79))
520
521   ;; Purge whitespace
522   (use-package ws-butler
523     :config
524     (ws-butler-global-mode))
525 #+end_src
526 ** Flycheck
527 #+begin_src emacs-lisp
528   (use-package flycheck
529     :config
530     (global-flycheck-mode))
531 #+end_src
532 ** Project management
533 #+begin_src emacs-lisp
534   (use-package projectile
535     :config (projectile-mode)
536     :custom ((projectile-completion-system 'ivy))
537     :bind-keymap
538     ("C-c p" . projectile-command-map)
539     :init
540     (when (file-directory-p "~/Code")
541       (setq projectile-project-search-path '("~/Code")))
542     (setq projectile-switch-project-action #'projectile-dired))
543
544   (use-package counsel-projectile
545     :after projectile
546     :config (counsel-projectile-mode))
547 #+end_src
548 ** Dired
549 #+begin_src emacs-lisp
550   (use-package dired
551     :straight (:type built-in)
552     :commands (dired dired-jump)
553     :custom ((dired-listing-switches "-agho --group-directories-first"))
554     :config
555     (evil-collection-define-key 'normal 'dired-mode-map
556       "h" 'dired-single-up-directory
557       "l" 'dired-single-buffer))
558
559   (use-package dired-single
560     :commands (dired dired-jump))
561
562   (use-package dired-open
563     :commands (dired dired-jump)
564     :custom
565     (dired-open-extensions '(("png" . "feh")
566                              ("mkv" . "mpv"))))
567
568   (use-package dired-hide-dotfiles
569     :hook (dired-mode . dired-hide-dotfiles-mode)
570     :config
571     (evil-collection-define-key 'normal 'dired-mode-map
572       "H" 'dired-hide-dotfiles-mode))
573 #+end_src
574 ** Git
575 *** Magit
576 #+begin_src emacs-lisp
577   (use-package magit
578     :hook (git-commit-setup-hook . pinentry-start))
579 #+end_src
580 *** Colored diff in line number area
581 #+begin_src emacs-lisp
582   (use-package diff-hl
583     :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
584     :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
585            (magit-post-refresh-hook . diff-hl-magit-post-refresh))
586     :config (global-diff-hl-mode))
587 #+end_src
588 * General text editing
589 ** Indentation
590 Indent after every change.
591 #+begin_src emacs-lisp
592   (use-package aggressive-indent
593     :config (global-aggressive-indent-mode))
594 #+end_src
595 ** Spell checking
596 Spell check in text mode, and in prog-mode comments.
597 #+begin_src emacs-lisp
598   (dolist (hook '(text-mode-hook))
599     (add-hook hook (lambda () (flyspell-mode))))
600   (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
601     (add-hook hook (lambda () (flyspell-mode -1))))
602   (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
603 #+end_src
604 ** Expand tabs to spaces
605 #+begin_src emacs-lisp
606   (setq-default tab-width 2)
607 #+end_src
608 ** Copy kill ring to clipboard
609 #+begin_src emacs-lisp
610   (setq x-select-enable-clipboard t)
611   (defun copy-kill-ring-to-xorg ()
612     "Copy the current kill ring to the xorg clipboard."
613     (interactive)
614     (x-select-text (current-kill 0)))
615 #+end_src
616 ** Browse kill ring
617 #+begin_src emacs-lisp
618   (use-package browse-kill-ring)
619 #+end_src
620 ** Save place
621 Opens file where you left it.
622 #+begin_src emacs-lisp
623   (save-place-mode)
624 #+end_src
625 ** Writing mode
626 Distraction free writing a la junegunn/goyo.
627 #+begin_src emacs-lisp
628   (use-package olivetti
629     :config
630     (evil-leader/set-key "o" 'olivetti-mode))
631 #+end_src
632 ** Abbreviations
633 Abbreviate things!
634 #+begin_src emacs-lisp
635   (setq abbrev-file-name "~/.emacs.d/abbrevs")
636   (setq save-abbrevs 'silent)
637   (setq-default abbrev-mode t)
638 #+end_src
639 * Functions
640 ** Easily convert splits
641 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
642 #+begin_src emacs-lisp
643   (defun toggle-window-split ()
644     (interactive)
645     (if (= (count-windows) 2)
646         (let* ((this-win-buffer (window-buffer))
647                (next-win-buffer (window-buffer (next-window)))
648                (this-win-edges (window-edges (selected-window)))
649                (next-win-edges (window-edges (next-window)))
650                (this-win-2nd (not (and (<= (car this-win-edges)
651                                            (car next-win-edges))
652                                        (<= (cadr this-win-edges)
653                                            (cadr next-win-edges)))))
654                (splitter
655                 (if (= (car this-win-edges)
656                        (car (window-edges (next-window))))
657                     'split-window-horizontally
658                   'split-window-vertically)))
659           (delete-other-windows)
660           (let ((first-win (selected-window)))
661             (funcall splitter)
662             (if this-win-2nd (other-window 1))
663             (set-window-buffer (selected-window) this-win-buffer)
664             (set-window-buffer (next-window) next-win-buffer)
665             (select-window first-win)
666             (if this-win-2nd (other-window 1))))))
667
668   (define-key ctl-x-4-map "t" 'toggle-window-split)
669 #+end_src
670 ** Insert date
671 #+begin_src emacs-lisp
672   (defun insert-date ()
673     (interactive)
674     (insert (format-time-string "%Y-%m-%d")))
675 #+end_src
676 * Keybindings
677 ** Switch windows
678 #+begin_src emacs-lisp
679   (use-package ace-window
680     :bind ("M-o" . ace-window))
681 #+end_src
682 ** Kill current buffer
683 Makes "C-x k" binding faster.
684 #+begin_src emacs-lisp
685   (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
686 #+end_src
687 * Other settings
688 ** OpenSCAD
689 Render OpenSCAD files, and add a preview window.
690
691 Personal fork just merges a PR.
692 #+begin_src emacs-lisp
693   (use-package scad-mode)
694   (use-package scad-preview
695     :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
696 #+end_src
697 ** Control backup files
698 Stop backup files from spewing everywhere.
699 #+begin_src emacs-lisp
700   (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
701 #+end_src
702 ** Make yes/no easier
703 #+begin_src emacs-lisp
704   (defalias 'yes-or-no-p 'y-or-n-p)
705 #+end_src
706 ** Move customize file
707 No more clogging up init.el.
708 #+begin_src emacs-lisp
709   (setq custom-file "~/.emacs.d/custom.el")
710   (load custom-file)
711 #+end_src
712 ** Better help
713 #+begin_src emacs-lisp
714   (use-package helpful
715     :commands (helpful-callable helpful-variable helpful-command helpful-key)
716     :custom
717     (counsel-describe-function-function #'helpful-callable)
718     (counsel-describe-variable-function #'helpful-variable)
719     :bind
720     ([remap describe-function] . counsel-describe-function)
721     ([remap describe-command] . helpful-command)
722     ([remap describe-variable] . counsel-describe-variable)
723     ([remap describe-key] . helpful-key))
724 #+end_src
725 ** GPG
726 #+begin_src emacs-lisp
727   (use-package epa-file
728     :straight (:type built-in))
729   (setq epa-file-select-keys nil
730         epa-file-encrypt-to '("me@armaanb.net")
731         password-cache-expiry (* 60 15))
732
733   (use-package pinentry)
734 #+end_src
735 ** Pastebin
736 #+begin_src emacs-lisp
737   (use-package 0x0
738     :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
739     :custom (0x0-default-service 'envs)
740     :config (evil-leader/set-key
741               "00" '0x0-upload
742               "0f" '0x0-upload-file
743               "0s" '0x0-upload-string
744               "0c" '0x0-upload-kill-ring
745               "0p" '0x0-upload-popup))
746 #+end_src
747 * Tangles
748 ** Spectrwm
749 *** General settings
750 #+begin_src conf :tangle ~/.spectrwm.conf
751   workspace_limit = 5
752   warp_pointer = 1
753   modkey = Mod4
754   border_width = 4
755   tile_gap = 10
756   autorun = ws[1]:/home/armaa/Code/scripts/autostart
757 #+end_src
758 *** Apprearance
759 Gruvbox colors
760 #+begin_src conf :tangle ~/.spectrwm.conf
761   color_focus = rgb:83/a5/98
762   color_focus_maximized = rgb:d6/5d/0e
763   color_unfocus = rgb:58/58/58
764 #+end_src
765 *** Bar
766 #+begin_src conf :tangle ~/.spectrwm.conf
767   bar_enabled = 0
768   bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
769 #+end_src
770 *** Keybindings
771 **** WM actions
772 #+begin_src conf :tangle ~/.spectrwm.conf
773   program[lock] = i3lock -c 000000 -ef
774   program[term] = alacritty
775   program[screenshot_all] = flameshot gui
776   program[menu] = rofi -show run # `rofi-dmenu` handles the rest
777   program[switcher] = rofi -show window
778   program[notif] = /home/armaa/Code/scripts/setter status
779
780   bind[notif] = MOD+n
781   bind[switcher] = MOD+Tab
782 #+end_src
783 **** Media keys
784 #+begin_src conf :tangle ~/.spectrwm.conf
785   program[paup] = /home/armaa/Code/scripts/setter audio +5
786   program[padown] = /home/armaa/Code/scripts/setter audio -5
787   program[pamute] = /home/armaa/Code/scripts/setter audio
788   program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
789   program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
790   program[next] = playerctl next
791   program[prev] = playerctl previous
792   program[pause] = playerctl play-pause
793
794   bind[padown] = XF86AudioLowerVolume
795   bind[paup] = XF86AudioRaiseVolume
796   bind[pamute] = XF86AudioMute
797   bind[brigdown] = XF86MonBrightnessDown
798   bind[brigup] = XF86MonBrightnessUp
799   bind[pause] = XF86AudioPlay
800   bind[next] = XF86AudioNext
801   bind[prev] = XF86AudioPrev
802 #+end_src
803 **** HJKL
804 #+begin_src conf :tangle ~/.spectrwm.conf
805   program[h] = xdotool keyup h key --clearmodifiers Left
806   program[j] = xdotool keyup j key --clearmodifiers Down
807   program[k] = xdotool keyup k key --clearmodifiers Up
808   program[l] = xdotool keyup l key --clearmodifiers Right
809
810   bind[h] = MOD + Control + h
811   bind[j] = MOD + Control + j
812   bind[k] = MOD + Control + k
813   bind[l] = MOD + Control + l
814 #+end_src
815 **** Programs
816 #+begin_src conf :tangle ~/.spectrwm.conf
817   program[aerc] = alacritty -e aerc
818   program[weechat] = alacritty --hold -e sh -c "while : ; do ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat; sleep 2; done"
819   program[emacs] = emacsclient -c
820   program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
821   program[firefox] = firefox
822   program[thunderbird] = thunderbird
823   program[slack] = slack
824
825   bind[aerc] = MOD+Control+s
826   bind[weechat] = MOD+Control+d
827   bind[emacs] = MOD+Control+f
828   bind[emacs-anywhere] = MOD+f
829   bind[firefox] = MOD+Control+u
830   bind[thunderbird] = MOD+Control+i
831   bind[slack] = MOD+Control+o
832 #+end_src
833 ** Zsh
834 *** Settings
835 **** Completions
836 #+begin_src shell :tangle ~/.config/zsh/zshrc
837   autoload -Uz compinit
838   compinit
839
840   setopt no_case_glob
841   unsetopt glob_complete
842 #+end_src
843 **** Vim bindings
844 #+begin_src shell :tangle ~/.config/zsh/zshrc
845   bindkey -v
846   KEYTIMEOUT=1
847
848   bindkey -M vicmd "^[[3~" delete-char
849   bindkey "^[[3~" delete-char
850
851   autoload edit-command-line
852   zle -N edit-command-line
853   bindkey -M vicmd ^e edit-command-line
854   bindkey ^e edit-command-line
855 #+end_src
856 **** History
857 #+begin_src shell :tangle ~/.config/zsh/zshrc
858   setopt extended_history
859   setopt share_history
860   setopt inc_append_history
861   setopt hist_ignore_dups
862   setopt hist_reduce_blanks
863
864   HISTSIZE=10000
865   SAVEHIST=10000
866   HISTFILE=~/.local/share/zsh/history
867 #+end_src
868 *** Plugins
869 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
870 **** ZPE
871 #+begin_src plain :tangle ~/.config/zpe/repositories
872     https://github.com/Aloxaf/fzf-tab
873     https://github.com/zdharma/fast-syntax-highlighting
874     https://github.com/rupa/z
875 #+end_src
876 **** Zshrc
877 #+begin_src shell :tangle ~/.config/zsh/zshrc
878   source ~/Code/zpe/zpe.sh
879   source ~/Code/admone/admone.zsh
880   source ~/.config/zsh/fzf-bindings.zsh
881
882   zpe-source fzf-tab/fzf-tab.zsh
883   zstyle ':completion:*:descriptions' format '[%d]'
884   zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
885   zstyle ':completion:*' completer _complete
886   zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' \
887          'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
888   enable-fzf-tab
889   zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
890   export _Z_DATA="/home/armaa/.local/share/z"
891   zpe-source z/z.sh
892 #+end_src
893 *** Functions
894 **** Alert after long command
895 #+begin_src shell :tangle ~/.config/zsh/zshrc
896   alert() {
897       notify-send --urgency=low -i ${(%):-%(?.terminal.error)} \
898                   ${history[$HISTCMD]%[;&|][[:space:]]##alert}
899   }
900 #+end_src
901 **** Time Zsh startup
902 #+begin_src shell :tangle ~/.config/zsh/zshrc
903   timezsh() {
904       for i in $(seq 1 10); do
905           time "zsh" -i -c exit;
906       done
907   }
908 #+end_src
909 **** Update all packages
910 #+begin_src shell :tangle ~/.config/zsh/zshrc
911   color=$(tput setaf 5)
912   reset=$(tput sgr0)
913
914   apu() {
915       sudo echo "${color}== upgrading with yay ==${reset}"
916       yay
917       echo ""
918       echo "${color}== checking for pacnew files ==${reset}"
919       sudo pacdiff
920       echo
921       echo "${color}== upgrading flatpaks ==${reset}"
922       flatpak update
923       echo ""
924       echo "${color}== upgrading zsh plugins ==${reset}"
925       zpe-pull
926       echo ""
927       echo "${color}== updating nvim plugins ==${reset}"
928       nvim +PlugUpdate +PlugUpgrade +qall
929       echo "Updated nvim plugins"
930       echo ""
931       echo "${color}You are entirely up to date!${reset}"
932   }
933 #+end_src
934 **** Clean all packages
935 #+begin_src shell :tangle ~/.config/zsh/zshrc
936   apap() {
937       sudo echo "${color}== cleaning pacman orphans ==${reset}"
938       (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
939       echo ""
940       echo "${color}== cleaning flatpaks ==${reset}"
941       flatpak remove --unused
942       echo ""
943       echo "${color}== cleaning zsh plugins ==${reset}"
944       zpe-clean
945       echo ""
946       echo "${color}== cleaning nvim plugins ==${reset}"
947       nvim +PlugClean +qall
948       echo "Cleaned nvim plugins"
949       echo ""
950       echo "${color}All orphans cleaned!${reset}"
951   }
952 #+end_src
953 **** ls every cd
954 #+begin_src shell :tangle ~/.config/zsh/zshrc
955   chpwd() {
956       emulate -L zsh
957       exa -lh --icons --git --group-directories-first
958   }
959 #+end_src
960 **** Setup anaconda
961 #+begin_src shell :tangle ~/.config/zsh/zshrc
962   zconda() {
963       __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
964       if [ $? -eq 0 ]; then
965           eval "$__conda_setup"
966       else
967           if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
968               . "/opt/anaconda/etc/profile.d/conda.sh"
969           else
970               export PATH="/opt/anaconda/bin:$PATH"
971           fi
972       fi
973       unset __conda_setup
974   }
975 #+end_src
976 **** Interact with 0x0
977 #+begin_src shell :tangle ~/.config/zsh/zshrc
978   zxz="https://envs.sh"
979   0file() { curl -F"file=@$1" "$zxz" ; }
980   0pb() { curl -F"file=@-;" "$zxz" ; }
981   0url() { curl -F"url=$1" "$zxz" ; }
982   0short() { curl -F"shorten=$1" "$zxz" ; }
983   0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
984 #+end_src
985 **** Swap two files
986 #+begin_src shell :tangle ~/.config/zsh/zshrc
987   sw() {
988       mv $1 $1.tmp
989       mv $2 $1
990       mv $1.tmp $2
991   }
992 #+end_src
993 *** Aliases
994 **** SSH
995 #+begin_src shell :tangle ~/.config/zsh/zshrc
996   alias bhoji-drop='ssh -p 23 root@armaanb.net'
997   alias weechat='ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat'
998   alias tcf='ssh root@204.48.23.68'
999   alias ngmun='ssh root@157.245.89.25'
1000   alias prox='ssh root@192.168.1.224'
1001   alias dock='ssh root@192.168.1.225'
1002   alias jenkins='ssh root@192.168.1.226'
1003   alias envs='ssh acheam@envs.net'
1004 #+end_src
1005 **** File management
1006 #+begin_src shell :tangle ~/.config/zsh/zshrc
1007   alias ls='exa -lh --icons --git --group-directories-first'
1008   alias la='exa -lha --icons --git --group-directories-first'
1009   alias df='df -h / /boot'
1010   alias du='du -h'
1011   alias free='free -h'
1012   alias cp='cp -riv'
1013   alias rm='rm -Iv'
1014   alias mv='mv -iv'
1015   alias ln='ln -iv'
1016   alias grep='grep -in --exclude-dir=.git --color=auto'
1017   alias mkdir='mkdir -pv'
1018   alias unar='atool -x'
1019   alias wget='wget -e robots=off'
1020   alias lanex='~/.local/share/lxc/lxc'
1021 #+end_src
1022 **** Dotfiles
1023 #+begin_src shell :tangle ~/.config/zsh/zshrc
1024   alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1025   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1026     yadm push'
1027   alias padu='padm add -u && padm commit && padm push && yadu'
1028 #+end_src
1029 **** Editing
1030 #+begin_src shell :tangle ~/.config/zsh/zshrc
1031   alias v='nvim'
1032   alias vim='nvim'
1033   alias vw="nvim ~/Documents/vimwiki/index.md"
1034 #+end_src
1035 **** System management
1036 #+begin_src shell :tangle ~/.config/zsh/zshrc
1037   alias jctl='journalctl -p 3 -xb'
1038   alias pkill='pkill -i'
1039   alias cx='chmod +x'
1040   alias please='sudo $(fc -ln -1)'
1041   alias sudo='sudo ' # allows aliases to be run with sudo
1042 #+end_src
1043 **** Networking
1044 #+begin_src shell :tangle ~/.config/zsh/zshrc
1045   alias ping='ping -c 10'
1046   alias speed='speedtest-cli'
1047   alias ip='ip --color=auto'
1048   alias cip='curl https://armaanb.net/ip'
1049   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1050   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1051 #+end_src
1052 **** Docker
1053 #+begin_src shell :tangle ~/.config/zsh/zshrc
1054   alias dc='docker-compose'
1055   alias dcdu='docker-compose down && docker-compose up -d'
1056 #+end_src
1057 **** Other
1058 #+begin_src shell :tangle ~/.config/zsh/zshrc
1059   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1060     iflag=fullblock status=progress'
1061   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1062     iflag=fullblock status=progress'
1063   alias ts='gen-shell -c task'
1064   alias ts='gen-shell -c task'
1065   alias tetris='autoload -Uz tetriscurses && tetriscurses'
1066   alias news='newsboat'
1067   alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1068   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
1069     --restrict-filenames -o '%(title)s.%(ext)s'"
1070   alias cal="cal -3 --color=auto"
1071 #+end_src
1072 **** Virtual machines, chroots
1073 #+begin_src shell :tangle ~/.config/zsh/zshrc
1074   alias ckiss="sudo chrooter ~/Virtual/kiss"
1075   alias cdebian="sudo chrooter ~/Virtual/debian bash"
1076   alias cwindows='devour qemu-system-x86_64 \
1077     -smp 3 \
1078     -cpu host \
1079     -enable-kvm \
1080     -m 3G \
1081     -device VGA,vgamem_mb=64 \
1082     -device intel-hda \
1083     -device hda-duplex \
1084     -net nic \
1085     -net user,smb=/home/armaa/Public \
1086     -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1087 #+end_src
1088 **** Python
1089 #+begin_src shell :tangle ~/.config/zsh/zshrc
1090   alias ipy="ipython"
1091   alias zpy="zconda && ipython"
1092   alias math="ipython --profile=math"
1093   alias pypi="python setup.py sdist && twine upload dist/*"
1094   alias pip="python -m pip"
1095   alias black="black -l 79"
1096 #+end_src
1097 **** Latin
1098 #+begin_src shell :tangle ~/.config/zsh/zshrc
1099   alias words='gen-shell -c "words"'
1100   alias words-e='gen-shell -c "words ~E"'
1101 #+end_src
1102 **** Devour
1103 #+begin_src shell :tangle ~/.config/zsh/zshrc
1104   alias zathura='devour zathura'
1105   alias mpv='devour mpv'
1106   alias sql='devour sqlitebrowser'
1107   alias cad='devour openscad'
1108   alias feh='devour feh'
1109 #+end_src
1110 **** Package management (Pacman)
1111 #+begin_src shell :tangle ~/.config/zsh/zshrc
1112   alias aps='yay -Ss'
1113   alias api='yay -Syu'
1114   alias app='yay -Rns'
1115   alias apc='yay -Sc'
1116   alias apo='yay -Qttd'
1117   alias azf='pacman -Q | fzf'
1118   alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1119   alias ufetch='ufetch-arch'
1120   alias reflect='reflector --verbose --sort rate --save \
1121     ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1122 #+end_src
1123 *** Exports
1124 #+begin_src shell :tangle ~/.config/zsh/zshrc
1125   export EDITOR="emacsclient -c"                  # $EDITOR opens in terminal
1126   export VISUAL="emacsclient -c -a emacs"         # $VISUAL opens in GUI mode
1127   export TERM=xterm-256color # for compatability
1128
1129   export GPG_TTY="$(tty)"
1130   export MANPAGER='nvim +Man!'
1131   export PAGER='less'
1132
1133   # generated with "vivid generate gruvbox"
1134   export LS_COLORS="$(cat ~/.local/share/zsh/gruvbox)"
1135
1136   export GTK_USE_PORTAL=1
1137
1138   export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1139   export PATH="$PATH:/home/armaa/Code/scripts"
1140   export PATH="$PATH:/home/armaa/.cargo/bin"
1141   export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1142   export PATH="$PATH:/usr/sbin"
1143   export PATH="$PATH:/opt/FreeTube/freetube"
1144
1145   export LC_ALL="en_US.UTF-8"
1146   export LC_CTYPE="en_US.UTF-8"
1147   export LANGUAGE="en_US.UTF-8"
1148
1149   export KISS_PATH="/home/armaa/kiss/home/armaa/kiss-repo"
1150   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1151   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1152   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1153   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1154   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1155 #+end_src
1156 ** Alacritty
1157 *** Appearance
1158 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1159 font:
1160   normal:
1161     family: JetBrains Mono Nerd Font
1162     style: Medium
1163   italic:
1164     style: Italic
1165   Bold:
1166     style: Bold
1167   size: 7
1168   ligatures: true # Requires ligature patch
1169
1170 window:
1171   padding:
1172     x: 5
1173     y: 5
1174
1175 background_opacity: 0.6
1176 #+end_src
1177 *** Keybindings
1178 Send <RET> + modifier through
1179 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1180 key_bindings:
1181   - {
1182     key: Return,
1183     mods: Shift,
1184     chars: "\x1b[13;2u"
1185   }
1186   - {
1187     key: Return,
1188     mods: Control,
1189     chars: "\x1b[13;5u"
1190   }
1191 #+end_src
1192 *** Color scheme
1193 Gruvbox
1194 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1195 colors:
1196   # Default colors
1197   primary:
1198     background: '#000000'
1199     foreground: '#ebdbb2'
1200
1201   # Normal colors
1202   normal:
1203     black:   '#282828'
1204     red:     '#cc241d'
1205     green:   '#98971a'
1206     yellow:  '#d79921'
1207     blue:    '#458588'
1208     magenta: '#b16286'
1209     cyan:    '#689d6a'
1210     white:   '#a89984'
1211
1212   # Bright colors
1213   bright:
1214     black:   '#928374'
1215     red:     '#fb4934'
1216     green:   '#b8bb26'
1217     yellow:  '#fabd2f'
1218     blue:    '#83a598'
1219     magenta: '#d3869b'
1220     cyan:    '#8ec07c'
1221     white:   '#ebdbb2'
1222 #+end_src
1223 ** IPython
1224 *** General
1225 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1226 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1227   c.TerminalInteractiveShell.editing_mode = 'vi'
1228   c.InteractiveShell.colors = 'linux'
1229   c.TerminalInteractiveShell.confirm_exit = False
1230 #+end_src
1231 *** Math
1232 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1233   from math import *
1234
1235   def deg(x):
1236       return x * (180 /  pi)
1237
1238   def rad(x):
1239       return x * (pi / 180)
1240
1241   def rad(x, unit):
1242       return (x * (pi / 180)) / unit
1243
1244   def csc(x):
1245       return 1 / sin(x)
1246
1247   def sec(x):
1248       return 1 / cos(x)
1249
1250   def cot(x):
1251       return 1 / tan(x)
1252 #+end_src
1253 ** MPV
1254 Make MPV play a little bit smoother.
1255 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1256   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1257   hwdec=auto-copy
1258 #+end_src
1259 ** Picom
1260 *** Shadows
1261 #+begin_src conf :tangle ~/.config/picom/picom.conf
1262   shadow = true;
1263   shadow-radius = 10;
1264   shadow-offset-x = -5;
1265   shadow-offset-y = -5;
1266 #+end_src
1267 *** Fading
1268 #+begin_src conf :tangle ~/.config/picom/picom.conf
1269   fading = true
1270   fade-delta = 5
1271 #+end_src
1272 *** Blur
1273 #+begin_src conf :tangle ~/.config/picom/picom.conf
1274   blur:
1275   {
1276   method = "gaussian";
1277   size = 5;
1278   deviation = 5;
1279   };
1280 #+end_src
1281 *** Backend
1282 Needs picom to be run with "--experimental-backends"
1283 #+begin_src conf :tangle ~/.config/picom/picom.conf
1284   backend = "glx";
1285 #+end_src
1286 ** Inputrc
1287 For any GNU Readline programs
1288 #+begin_src plain :tangle ~/.inputrc
1289   set editing-mode vi
1290 #+end_src
1291 ** Vivid
1292 https://github.com/sharkdp/vivid
1293 *** Colors
1294 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1295   colors:
1296     background_color: '282A36'
1297     black: '21222C'
1298     orange: 'd65d0e'
1299     purple: 'b16286'
1300     red: 'cc241d'
1301     blue: '458588'
1302     pink: 'd3869b'
1303     lime: '689d6a'
1304
1305     gray: '928374'
1306 #+end_src
1307 *** Core
1308 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1309   core:
1310     regular_file: {}
1311
1312     directory:
1313       foreground: blue
1314
1315     executable_file:
1316       foreground: red
1317       font-style: bold
1318
1319     symlink:
1320       foreground: pink
1321
1322     broken_symlink:
1323       foreground: black
1324       background: red
1325     missing_symlink_target:
1326       foreground: black
1327       background: red
1328
1329     fifo:
1330       foreground: black
1331       background: blue
1332
1333     socket:
1334       foreground: black
1335       background: pink
1336
1337     character_device:
1338       foreground: black
1339       background: lime
1340
1341     block_device:
1342       foreground: black
1343       background: red
1344
1345     normal_text:
1346       {}
1347
1348     sticky:
1349       {}
1350
1351     sticky_other_writable:
1352       {}
1353
1354     other_writable:
1355       {}
1356
1357   text:
1358     special:
1359       foreground: black
1360       background: orange
1361
1362     todo:
1363       font-style: bold
1364
1365     licenses:
1366       foreground: gray
1367
1368     configuration:
1369       foreground: orange
1370
1371     other:
1372       foreground: orange
1373
1374   markup:
1375     foreground: orange
1376
1377   programming:
1378     source:
1379       foreground: purple
1380
1381     tooling:
1382       foreground: purple
1383
1384       continuous-integration:
1385         foreground: purple
1386
1387   media:
1388     foreground: pink
1389
1390   office:
1391     foreground: red
1392
1393   archives:
1394     foreground: lime
1395     font-style: underline
1396
1397   executable:
1398     foreground: red
1399     font-style: bold
1400
1401   unimportant:
1402     foreground: gray
1403 #+end_src
1404 ** Git
1405 *** User
1406 #+begin_src plain :tangle ~/.gitconfig
1407 [user]
1408   name = Armaan Bhojwani
1409   email = me@armaanb.net
1410   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1411 #+end_src
1412 *** Init
1413 #+begin_src plain :tangle ~/.gitconfig
1414 [init]
1415   defaultBranch = main
1416 #+end_src
1417 *** GPG
1418 #+begin_src plain :tangle ~/.gitconfig
1419 [gpg]
1420   program = gpg
1421 #+end_src
1422 *** Sendemail
1423 #+begin_src plain :tangle ~/.gitconfig
1424 [sendemail]
1425   smtpserver = smtp.mailbox.org
1426   smtpuser = me@armaanb.net
1427   smtpencryption = ssl
1428   smtpserverport = 465
1429   confirm = auto
1430 #+end_src
1431 *** Submodules
1432 #+begin_src plain :tangle ~/.gitconfig
1433 [submodule]
1434   recurse = true
1435 #+end_src
1436 *** Aliases
1437 #+begin_src plain :tangle ~/.gitconfig
1438 [alias]
1439   stat = diff --stat
1440   sclone = clone --depth 1
1441   sclean = clean -dfX
1442   a = add
1443   aa = add .
1444   c = commit
1445   p = push
1446   subup = submodule update --remote
1447   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1448   mirror = git config --global alias.mirrormirror
1449 #+end_src
1450 *** Commits
1451 #+begin_src plain :tangle ~/.gitconfig
1452 [commit]
1453   gpgsign = true
1454 #+end_src
1455 ** Dunst
1456 Lightweight notification daemon. Gruvbox colors, based on https://github.com/a-schaefers/i3-wm-gruvbox-theme/
1457 *** General
1458 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1459   [global]
1460   font = "JetBrains Mono Medium Nerd Font 11"
1461   allow_markup = yes
1462   format = "<b>%s</b>\n%b"
1463   sort = no
1464   indicate_hidden = yes
1465   alignment = center
1466   bounce_freq = 0
1467   show_age_threshold = 60
1468   word_wrap = yes
1469   ignore_newline = no
1470   geometry = "400x5-20+20"
1471   transparency = 0
1472   idle_threshold = 120
1473   monitor = 0
1474   sticky_history = yes
1475   line_height = 0
1476   separator_height = 4
1477   padding = 8
1478   horizontal_padding = 8
1479   max_icon_size = 32
1480   separator_color = "#585858"
1481   startup_notification = false
1482 #+end_src
1483 *** Modes
1484 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1485   [frame]
1486   width = 4
1487   color = "#585858"
1488
1489   [shortcuts]
1490   close = mod4+c
1491   close_all = mod4+shift+c
1492   history = mod4+ctrl+c
1493
1494   [urgency_low]
1495   background = "#282828"
1496   foreground = "#ebdbb2"
1497   highlight = "#ebdbb2"
1498   timeout = 5
1499
1500   [urgency_normal]
1501   background = "#282828"
1502   foreground = "#ebdbb2"
1503   highlight = "#ebdbb2"
1504   timeout = 15
1505
1506   [urgency_critical]
1507   background = "#282828"
1508   foreground = "#cc241d"
1509   highlight = "#ebdbb2"
1510   timeout = 0
1511 #+end_src