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