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