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