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