]> git.armaanb.net Git - config.org.git/blob - config.org
zsh: change default ls behavior to -l
[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
842   bind[aerc] = MOD+Control+1
843   # bind[weechat] = MOD+Control+2
844   bind[catgirl] = MOD+Control+2
845   bind[emacs-anywhere] = MOD+Control+3
846   bind[firefox] = MOD+Control+4
847   bind[emacs] = MOD+Control+Return
848 #+end_src
849 ** Zsh
850 *** Settings
851 **** Completions
852 #+begin_src shell :tangle ~/.config/zsh/zshrc
853   autoload -Uz compinit
854   compinit
855
856   setopt no_case_glob
857   unsetopt glob_complete
858 #+end_src
859 **** Vim bindings
860 #+begin_src shell :tangle ~/.config/zsh/zshrc
861   bindkey -v
862   KEYTIMEOUT=1
863
864   bindkey -M vicmd "^[[3~" delete-char
865   bindkey "^[[3~" delete-char
866
867   autoload edit-command-line
868   zle -N edit-command-line
869   bindkey -M vicmd ^e edit-command-line
870   bindkey ^e edit-command-line
871 #+end_src
872 **** History
873 #+begin_src shell :tangle ~/.config/zsh/zshrc
874   setopt extended_history
875   setopt share_history
876   setopt inc_append_history
877   setopt hist_ignore_dups
878   setopt hist_reduce_blanks
879
880   HISTSIZE=10000
881   SAVEHIST=10000
882   HISTFILE=~/.local/share/zsh/history
883 #+end_src
884 *** Plugins
885 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
886 **** ZPE
887 #+begin_src conf :tangle ~/.config/zpe/repositories
888     https://github.com/Aloxaf/fzf-tab
889     https://github.com/zdharma/fast-syntax-highlighting
890     https://github.com/rupa/z
891 #+end_src
892 **** Zshrc
893 #+begin_src shell :tangle ~/.config/zsh/zshrc
894   source ~/Code/zpe/zpe.sh
895   source ~/Code/admone/admone.zsh
896   source ~/.config/zsh/fzf-bindings.zsh
897
898   zpe-source fzf-tab/fzf-tab.zsh
899   zstyle ':completion:*:descriptions' format '[%d]'
900   zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
901   zstyle ':completion:*' completer _complete
902   zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' \
903          'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
904   enable-fzf-tab
905   zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
906   export _Z_DATA="/home/armaa/.local/share/z"
907   zpe-source z/z.sh
908 #+end_src
909 *** Functions
910 **** Alert after long command
911 #+begin_src shell :tangle ~/.config/zsh/zshrc
912   alert() {
913       notify-send --urgency=low -i ${(%):-%(?.terminal.error)} \
914                   ${history[$HISTCMD]%[;&|][[:space:]]##alert}
915   }
916 #+end_src
917 **** Time Zsh startup
918 #+begin_src shell :tangle ~/.config/zsh/zshrc
919   timezsh() {
920       for i in $(seq 1 10); do
921           time "zsh" -i -c exit;
922       done
923   }
924 #+end_src
925 **** Update all packages
926 #+begin_src shell :tangle ~/.config/zsh/zshrc
927   color=$(tput setaf 5)
928   reset=$(tput sgr0)
929
930   apu() {
931       sudo echo "${color}== upgrading with yay ==${reset}"
932       yay
933       echo ""
934       echo "${color}== checking for pacnew files ==${reset}"
935       sudo pacdiff
936       echo
937       echo "${color}== upgrading flatpaks ==${reset}"
938       flatpak update
939       echo ""
940       echo "${color}== upgrading zsh plugins ==${reset}"
941       zpe-pull
942       echo ""
943       echo "${color}== updating nvim plugins ==${reset}"
944       nvim +PlugUpdate +PlugUpgrade +qall
945       echo "Updated nvim plugins"
946       echo ""
947       echo "${color}You are entirely up to date!${reset}"
948   }
949 #+end_src
950 **** Clean all packages
951 #+begin_src shell :tangle ~/.config/zsh/zshrc
952   apap() {
953       sudo echo "${color}== cleaning pacman orphans ==${reset}"
954       (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
955       echo ""
956       echo "${color}== cleaning flatpaks ==${reset}"
957       flatpak remove --unused
958       echo ""
959       echo "${color}== cleaning zsh plugins ==${reset}"
960       zpe-clean
961       echo ""
962       echo "${color}== cleaning nvim plugins ==${reset}"
963       nvim +PlugClean +qall
964       echo "Cleaned nvim plugins"
965       echo ""
966       echo "${color}All orphans cleaned!${reset}"
967   }
968 #+end_src
969 **** ls every cd
970 #+begin_src shell :tangle ~/.config/zsh/zshrc
971   chpwd() {
972       emulate -L zsh
973       exa -lh --icons --git --group-directories-first
974   }
975 #+end_src
976 **** Change default enter behavior
977 If no command given, =ls=, if in a Git repo, =git status= as well.
978 #+begin_src shell :tangle ~/.config/zsh/zshrc
979   acheam-accept-line () {
980       zle accept-line
981       if [ ${#${(z)BUFFER}} -eq 0 ]; then
982           echo
983           exa -lh --icons --git --group-directories-first
984           [ -d ".git" ] && git status
985       fi
986   }
987   zle -N acheam-accept-line
988   bindkey '^M' acheam-accept-line
989 #+end_src
990 **** Setup anaconda
991 #+begin_src shell :tangle ~/.config/zsh/zshrc
992   zconda() {
993       __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
994       if [ $? -eq 0 ]; then
995           eval "$__conda_setup"
996       else
997           if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
998               . "/opt/anaconda/etc/profile.d/conda.sh"
999           else
1000               export PATH="/opt/anaconda/bin:$PATH"
1001           fi
1002       fi
1003       unset __conda_setup
1004   }
1005 #+end_src
1006 **** Interact with 0x0
1007 #+begin_src shell :tangle ~/.config/zsh/zshrc
1008   zxz="https://envs.sh"
1009   0file() { curl -F"file=@$1" "$zxz" ; }
1010   0pb() { curl -F"file=@-;" "$zxz" ; }
1011   0url() { curl -F"url=$1" "$zxz" ; }
1012   0short() { curl -F"shorten=$1" "$zxz" ; }
1013   0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
1014 #+end_src
1015 **** Swap two files
1016 #+begin_src shell :tangle ~/.config/zsh/zshrc
1017   sw() {
1018       mv $1 $1.tmp
1019       mv $2 $1
1020       mv $1.tmp $2
1021   }
1022 #+end_src
1023 *** Aliases
1024 **** SSH
1025 #+begin_src shell :tangle ~/.config/zsh/zshrc
1026   alias bhoji-drop='ssh -p 23 root@armaanb.net'
1027   alias weechat='ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat'
1028   alias catgirl='ssh -p 23 -t root@armaanb.net tmux attach-session -t catgirl'
1029   alias tcf='ssh root@204.48.23.68'
1030   alias ngmun='ssh root@157.245.89.25'
1031   alias prox='ssh root@192.168.1.224'
1032   alias ncq='ssh root@143.198.123.17'
1033   alias dock='ssh root@192.168.1.225'
1034   alias jenkins='ssh root@192.168.1.226'
1035   alias envs='ssh acheam@envs.net'
1036 #+end_src
1037 **** File management
1038 #+begin_src shell :tangle ~/.config/zsh/zshrc
1039   alias ls='exa -lh --icons --git --group-directories-first'
1040   alias la='exa -lha --icons --git --group-directories-first'
1041   alias df='df -h / /boot'
1042   alias du='du -h'
1043   alias free='free -h'
1044   alias cp='cp -riv'
1045   alias rm='rm -Iv'
1046   alias mv='mv -iv'
1047   alias ln='ln -iv'
1048   alias grep='grep -in --exclude-dir=.git --color=auto'
1049   alias fname='find -name'
1050   alias mkdir='mkdir -pv'
1051   alias unar='atool -x'
1052   alias wget='wget -e robots=off'
1053   alias lanex='~/.local/share/lxc/lxc'
1054 #+end_src
1055 **** Dotfiles
1056 #+begin_src shell :tangle ~/.config/zsh/zshrc
1057   alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1058   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1059     yadm push'
1060   alias padu='padm add -u && padm commit && padm push && yadu'
1061 #+end_src
1062 **** Editing
1063 #+begin_src shell :tangle ~/.config/zsh/zshrc
1064   alias v='nvim'
1065   alias vim='nvim'
1066   alias vw="nvim ~/Documents/vimwiki/index.md"
1067 #+end_src
1068 **** System management
1069 #+begin_src shell :tangle ~/.config/zsh/zshrc
1070   alias jctl='journalctl -p 3 -xb'
1071   alias pkill='pkill -i'
1072   alias cx='chmod +x'
1073   alias redoas='doas $(fc -ln -1)'
1074   alias crontab='crontab-argh'
1075   alias sudo='doas ' # allows aliases to be run with doas
1076 #+end_src
1077 **** Networking
1078 #+begin_src shell :tangle ~/.config/zsh/zshrc
1079   alias ping='ping -c 10'
1080   alias speed='speedtest-cli'
1081   alias ip='ip --color=auto'
1082   alias cip='curl https://armaanb.net/ip'
1083   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1084   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1085 #+end_src
1086 **** Docker
1087 #+begin_src shell :tangle ~/.config/zsh/zshrc
1088   alias dc='docker-compose'
1089   alias dcdu='docker-compose down && docker-compose up -d'
1090 #+end_src
1091 **** Other
1092 #+begin_src shell :tangle ~/.config/zsh/zshrc
1093   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1094     iflag=fullblock status=progress'
1095   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1096     iflag=fullblock status=progress'
1097   alias ts='gen-shell -c task'
1098   alias ts='gen-shell -c task'
1099   alias tetris='autoload -Uz tetriscurses && tetriscurses'
1100   alias news='newsboat'
1101   alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1102   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
1103     --restrict-filenames -o '%(title)s.%(ext)s'"
1104   alias cal="cal -3 --color=auto"
1105 #+end_src
1106 **** Virtual machines, chroots
1107 #+begin_src shell :tangle ~/.config/zsh/zshrc
1108   alias ckiss="sudo chrooter ~/Virtual/kiss"
1109   alias cdebian="sudo chrooter ~/Virtual/debian bash"
1110   alias cwindows='devour qemu-system-x86_64 \
1111     -smp 3 \
1112     -cpu host \
1113     -enable-kvm \
1114     -m 3G \
1115     -device VGA,vgamem_mb=64 \
1116     -device intel-hda \
1117     -device hda-duplex \
1118     -net nic \
1119     -net user,smb=/home/armaa/Public \
1120     -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1121 #+end_src
1122 **** Python
1123 #+begin_src shell :tangle ~/.config/zsh/zshrc
1124   alias ipy="ipython"
1125   alias zpy="zconda && ipython"
1126   alias math="ipython --profile=math"
1127   alias pypi="python setup.py sdist && twine upload dist/*"
1128   alias pip="python -m pip"
1129   alias black="black -l 79"
1130 #+end_src
1131 **** Latin
1132 #+begin_src shell :tangle ~/.config/zsh/zshrc
1133   alias words='gen-shell -c "words"'
1134   alias words-e='gen-shell -c "words ~E"'
1135 #+end_src
1136 **** Devour
1137 #+begin_src shell :tangle ~/.config/zsh/zshrc
1138   alias zathura='devour zathura'
1139   alias mpv='devour mpv'
1140   alias sql='devour sqlitebrowser'
1141   alias cad='devour openscad'
1142   alias feh='devour feh'
1143 #+end_src
1144 **** Package management (Pacman)
1145 #+begin_src shell :tangle ~/.config/zsh/zshrc
1146   alias aps='yay -Ss'
1147   alias api='yay -Syu'
1148   alias apii='sudo pacman -S'
1149   alias app='yay -Rns'
1150   alias apc='yay -Sc'
1151   alias apo='yay -Qttd'
1152   alias azf='pacman -Q | fzf'
1153   alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1154   alias ufetch='ufetch-arch'
1155   alias reflect='reflector --verbose --sort rate --save \
1156      ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1157 #+end_src
1158 *** Exports
1159 #+begin_src shell :tangle ~/.config/zsh/zshrc
1160   export EDITOR="emacsclient -c"
1161   export VISUAL="$EDITOR"
1162   export TERM=xterm-256color # for compatability
1163
1164   export GPG_TTY="$(tty)"
1165   export MANPAGER='nvim +Man!'
1166   export PAGER='less'
1167
1168   export GTK_USE_PORTAL=1
1169
1170   export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1171   export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
1172   export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
1173   export PATH="$PATH:/home/armaa/.cargo/bin"
1174   export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1175   export PATH="$PATH:/usr/sbin"
1176   export PATH="$PATH:/opt/FreeTube/freetube"
1177
1178   export LC_ALL="en_US.UTF-8"
1179   export LC_CTYPE="en_US.UTF-8"
1180   export LANGUAGE="en_US.UTF-8"
1181
1182   export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
1183   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1184   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1185   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1186   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1187   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1188 #+end_src
1189 ** Alacritty
1190 *** Appearance
1191 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1192 font:
1193   normal:
1194     family: JetBrains Mono Nerd Font
1195     style: Medium
1196   italic:
1197     style: Italic
1198   Bold:
1199     style: Bold
1200   size: 7
1201   ligatures: true # Requires ligature patch
1202
1203 window:
1204   padding:
1205     x: 5
1206     y: 5
1207
1208 background_opacity: 1
1209 #+end_src
1210 *** Color scheme
1211 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1212 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1213 colors:
1214   # Default colors
1215   primary:
1216     background: '#000000'
1217     foreground: '#ffffff'
1218
1219   cursor:
1220     text: '#000000'
1221     background: '#ffffff'
1222
1223   # Normal colors (except green it is from intense colors)
1224   normal:
1225     black:   '#000000'
1226     red:     '#ff8059'
1227     green:   '#00fc50'
1228     yellow:  '#eecc00'
1229     blue:    '#29aeff'
1230     magenta: '#feacd0'
1231     cyan:    '#00d3d0'
1232     white:   '#eeeeee'
1233
1234   # Bright colors [all the faint colors in the modus theme]
1235   bright:
1236     black:   '#555555'
1237     red:     '#ffa0a0'
1238     green:   '#88cf88'
1239     yellow:  '#d2b580'
1240     blue:    '#92baff'
1241     magenta: '#e0b2d6'
1242     cyan:    '#a0bfdf'
1243     white:   '#ffffff'
1244
1245   # dim [all the intense colors in modus theme]
1246   dim:
1247     black:   '#222222'
1248     red:     '#fb6859'
1249     green:   '#00fc50'
1250     yellow:  '#ffdd00'
1251     blue:    '#00a2ff'
1252     magenta: '#ff8bd4'
1253     cyan:    '#30ffc0'
1254     white:   '#dddddd'
1255 #+end_src
1256 ** IPython
1257 *** General
1258 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1259 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1260   c.TerminalInteractiveShell.editing_mode = 'vi'
1261   c.InteractiveShell.colors = 'linux'
1262   c.TerminalInteractiveShell.confirm_exit = False
1263 #+end_src
1264 *** Math
1265 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1266   from math import *
1267
1268   def deg(x):
1269       return x * (180 /  pi)
1270
1271   def rad(x):
1272       return x * (pi / 180)
1273
1274   def rad(x, unit):
1275       return (x * (pi / 180)) / unit
1276
1277   def csc(x):
1278       return 1 / sin(x)
1279
1280   def sec(x):
1281       return 1 / cos(x)
1282
1283   def cot(x):
1284       return 1 / tan(x)
1285 #+end_src
1286 ** MPV
1287 Make MPV play a little bit smoother.
1288 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1289   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1290   hwdec=auto-copy
1291 #+end_src
1292 ** Inputrc
1293 For any GNU Readline programs
1294 #+begin_src conf :tangle ~/.inputrc
1295   set editing-mode vi
1296 #+end_src
1297 ** Git
1298 *** User
1299 #+begin_src conf :tangle ~/.gitconfig
1300 [user]
1301   name = Armaan Bhojwani
1302   email = me@armaanb.net
1303   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1304 #+end_src
1305 *** Init
1306 #+begin_src conf :tangle ~/.gitconfig
1307 [init]
1308   defaultBranch = main
1309 #+end_src
1310 *** GPG
1311 #+begin_src conf :tangle ~/.gitconfig
1312 [gpg]
1313   program = gpg
1314 #+end_src
1315 *** Sendemail
1316 #+begin_src conf :tangle ~/.gitconfig
1317 [sendemail]
1318   smtpserver = smtp.mailbox.org
1319   smtpuser = me@armaanb.net
1320   smtpencryption = ssl
1321   smtpserverport = 465
1322   confirm = auto
1323 #+end_src
1324 *** Submodules
1325 #+begin_src conf :tangle ~/.gitconfig
1326 [submodule]
1327   recurse = true
1328 #+end_src
1329 *** Aliases
1330 #+begin_src conf :tangle ~/.gitconfig
1331 [alias]
1332   stat = diff --stat
1333   sclone = clone --depth 1
1334   sclean = clean -dfX
1335   a = add
1336   aa = add .
1337   c = commit
1338   p = push
1339   subup = submodule update --remote
1340   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1341   mirror = git config --global alias.mirrormirror
1342 #+end_src
1343 *** Commits
1344 #+begin_src conf :tangle ~/.gitconfig
1345 [commit]
1346   gpgsign = true
1347   verbose = true
1348 #+end_src
1349 ** Dunst
1350 Lightweight notification daemon.
1351 *** General
1352 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1353   [global]
1354   font = "JetBrains Mono Medium Nerd Font 11"
1355   allow_markup = yes
1356   format = "<b>%s</b>\n%b"
1357   sort = no
1358   indicate_hidden = yes
1359   alignment = center
1360   bounce_freq = 0
1361   show_age_threshold = 60
1362   word_wrap = yes
1363   ignore_newline = no
1364   geometry = "400x5-10+10"
1365   transparency = 0
1366   idle_threshold = 120
1367   monitor = 0
1368   sticky_history = yes
1369   line_height = 0
1370   separator_height = 4
1371   padding = 8
1372   horizontal_padding = 8
1373   max_icon_size = 32
1374   separator_color = "#ffffff"
1375   startup_notification = false
1376 #+end_src
1377 *** Modes
1378 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1379   [frame]
1380   width = 3
1381   color = "#ffffff"
1382
1383   [shortcuts]
1384   close = mod4+c
1385   close_all = mod4+shift+c
1386   history = mod4+ctrl+c
1387
1388   [urgency_low]
1389   background = "#222222"
1390   foreground = "#ffffff"
1391   highlight = "#ffffff"
1392   timeout = 5
1393
1394   [urgency_normal]
1395   background = "#222222"
1396   foreground = "#ffffff"
1397   highlight = "#ffffff"
1398   timeout = 15
1399
1400   [urgency_critical]
1401   background = "#222222"
1402   foreground = "#a60000"
1403   highlight = "#ffffff"
1404   timeout = 0
1405 #+end_src
1406 ** Rofi
1407 Modus vivendi theme that extends DarkBlue.
1408 #+begin_src javascript :tangle ~/.config/rofi/config.rasi
1409   @import "/usr/share/rofi/themes/DarkBlue.rasi"
1410       ,* {
1411           white:                        rgba ( 255, 255, 255, 100 % );
1412           foreground:                   @white;
1413           selected-normal-background:   @white;
1414           separatorcolor:               @white;
1415           background:                   rgba ( 34, 34, 34, 100 % );
1416       }
1417
1418   window {
1419       border: 3;
1420   }
1421 #+end_src
1422 ** Zathura
1423 *** Options
1424 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1425   map <C-i> recolor
1426   map <A-b> toggle_statusbar
1427   set selection-clipboard clipboard
1428   set scroll-step 200
1429
1430   set window-title-basename "true"
1431   set selection-clipboard "clipboard"
1432 #+end_src
1433 *** Colors
1434 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1435   set default-bg         "#000000"
1436   set default-fg         "#ffffff"
1437   set render-loading     true
1438   set render-loading-bg  "#000000"
1439   set render-loading-fg  "#ffffff"
1440
1441   set recolor-lightcolor "#000000" # bg
1442   set recolor-darkcolor  "#ffffff" # fg
1443   set recolor            "true"
1444 #+end_src