1 #+TITLE: System Configuration
2 #+DESCRIPTION: Personal system configuration in org-mode format.
3 #+AUTHOR: Armaan Bhojwani
4 #+EMAIL: me@armaanb.net
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!
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.
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.
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.
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.
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
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.
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)
29 (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
30 (bootstrap-version 5))
31 (unless (file-exists-p bootstrap-file)
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))
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)
47 Very nice high contrast theme.
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-mode-line '3d
54 modus-themes-scale-headings t
55 modus-themes-diffs 'desaturated)
56 (load-theme 'modus-vivendi t)
60 Great programming font with ligatures.
61 #+begin_src emacs-lisp
62 (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
65 #+begin_src emacs-lisp
67 :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
69 (ligature-set-ligatures
70 '(prog-mode text-mode)
71 '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
72 "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
73 "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
74 "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
75 "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
76 ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
77 "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
78 "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
79 "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
80 "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
81 "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
82 "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
83 (global-ligature-mode t))
86 Display relative line numbers except in some modes
87 #+begin_src emacs-lisp
88 (global-display-line-numbers-mode)
89 (setq display-line-numbers-type 'relative)
90 (dolist (no-line-num '(term-mode-hook
95 (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
97 ** Highlight matching parenthesis
98 #+begin_src emacs-lisp
100 :config (show-paren-mode)
101 :custom (show-paren-style 'parenthesis))
104 *** Show current function
105 #+begin_src emacs-lisp
106 (which-function-mode)
108 *** Make position in file more descriptive
109 Show current column and file size.
110 #+begin_src emacs-lisp
112 (size-indication-mode)
115 #+begin_src emacs-lisp
117 :config (minions-mode))
120 Show a ruler at a certain number of chars depending on mode.
121 #+begin_src emacs-lisp
122 (setq display-fill-column-indicator-column 80)
123 (global-display-fill-column-indicator-mode)
126 Whenever starting a key chord, show possible future steps.
127 #+begin_src emacs-lisp
128 (use-package which-key
129 :config (which-key-mode)
130 :custom (which-key-idle-delay 0.3))
132 ** Highlight TODOs in comments
133 #+begin_src emacs-lisp
135 :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
136 :config (global-hl-todo-mode 1))
139 #+begin_src emacs-lisp
143 Soft wrap words and do operations by visual lines.
144 #+begin_src emacs-lisp
145 (add-hook 'text-mode-hook 'visual-line-mode 1)
147 ** Display number of matches in search
148 #+begin_src emacs-lisp
150 :config (global-anzu-mode))
153 Inverts modeline instead of audible bell or the standard visual bell.
154 #+begin_src emacs-lisp
155 (setq visible-bell nil
157 (lambda () (invert-face 'mode-line)
158 (run-with-timer 0.1 nil #'invert-face 'mode-line)))
162 #+begin_src emacs-lisp
164 :custom (select-enable-clipboard nil)
167 (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
168 ;; Use visual line motions even outside of visual-line-mode buffers
169 (evil-global-set-key 'motion "j" 'evil-next-visual-line)
170 (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
171 (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
174 #+begin_src emacs-lisp
175 (use-package evil-collection
177 :init (evil-collection-init)
178 :custom (evil-collection-setup-minibuffer t))
182 #+begin_src emacs-lisp
183 (use-package evil-surround
184 :config (global-evil-surround-mode))
187 #+begin_src emacs-lisp
188 (use-package evil-leader
189 :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
191 (evil-leader/set-leader "<SPC>")
192 (global-evil-leader-mode))
195 #+begin_src emacs-lisp
197 (use-package evil-nerd-commenter
198 :bind (:map evil-normal-state-map
199 ("gc" . evilnc-comment-or-uncomment-lines))
200 :custom (evilnc-invert-comment-line-by-line nil))
204 #+begin_src emacs-lisp
205 (evil-set-undo-system 'undo-redo)
207 ** Number incrementing
209 #+begin_src emacs-lisp
210 (use-package evil-numbers
211 :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
212 :bind (:map evil-normal-state-map
213 ("C-M-a" . evil-numbers/inc-at-pt)
214 ("C-M-x" . evil-numbers/dec-at-pt)))
218 #+begin_src emacs-lisp
219 (use-package evil-org
221 :hook (org-mode . evil-org-mode)
223 (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
224 (use-package evil-org-agenda
225 :straight (:type built-in)
227 :config (evil-org-agenda-set-keys))
230 #+begin_src emacs-lisp
231 (evil-leader/set-key-for-mode 'org-mode
232 "T" 'org-show-todo-tree
234 "c" 'org-archive-subtree)
238 #+begin_src emacs-lisp
240 :straight (:type built-in)
241 :commands (org-capture org-agenda)
244 (org-agenda-start-with-log-mode t)
245 (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
247 (org-log-into-drawer t)
248 (org-src-tab-acts-natively t)
249 (org-src-fontify-natively t)
250 (org-startup-indented t)
251 (org-hide-emphasis-markers t)
252 (org-fontify-whole-block-delimiter-line nil)
253 :bind ("C-c a" . org-agenda))
256 #+begin_src emacs-lisp
257 (use-package org-tempo
259 :straight (:type built-in)
261 ;; TODO: There's gotta be a more efficient way to write this
262 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
263 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
264 (add-to-list 'org-structure-template-alist '("ash" . "src shell :tangle ~/.config/ash/ashrc"))
265 (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
266 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
267 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
268 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
269 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
270 (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
271 (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
272 (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
273 (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources")))
277 Simple, but not too simple autocompletion.
278 #+begin_src emacs-lisp
280 :bind (("C-s" . swiper)
281 :map ivy-minibuffer-map
282 ("TAB" . ivy-alt-done)
283 :map ivy-switch-buffer-map
284 ("M-d" . ivy-switch-buffer-kill))
288 #+begin_src emacs-lisp
289 (use-package ivy-rich
291 :config (ivy-rich-mode))
295 #+begin_src emacs-lisp
297 :bind (("C-M-j" . 'counsel-switch-buffer)
298 :map minibuffer-local-map
299 ("C-r" . 'counsel-minibuffer-history))
300 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
301 :config (counsel-mode))
303 ** Remember frequent commands
304 #+begin_src emacs-lisp
305 (use-package ivy-prescient
308 (ivy-prescient-enable-filtering nil)
310 (prescient-persist-mode)
311 (ivy-prescient-mode))
314 Better search utility.
315 #+begin_src emacs-lisp
320 Use elfeed for RSS. I have another file with all the feeds in it.
321 #+begin_src emacs-lisp
323 :bind (("C-c e" . elfeed))
325 (load "~/.emacs.d/feeds.el")
326 (add-hook 'elfeed-new-entry-hook
327 (elfeed-make-tagger :feed-url "youtube\\.com"
329 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
331 (use-package elfeed-goodies
333 :config (elfeed-goodies/setup))
336 Use mu4e for reading emails.
338 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.
340 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.
341 #+begin_src emacs-lisp
342 (use-package smtpmail
343 :straight (:type built-in))
345 :load-path "/usr/share/emacs/site-lisp/mu4e"
346 :straight (:build nil)
347 :bind (("C-c m" . mu4e))
349 (setq user-full-name "Armaan Bhojwani"
350 smtpmail-local-domain "armaanb.net"
351 smtpmail-stream-type 'ssl
352 smtpmail-smtp-service '465
353 mu4e-change-filenames-when-moving t
354 mu4e-get-mail-command "offlineimap -q"
355 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
356 message-citation-line-function 'message-insert-formatted-citation-line
357 mu4e-completing-read-function 'ivy-completing-read
358 mu4e-confirm-quit nil
359 mail-user-agent 'mu4e-user-agent
361 `( ,(make-mu4e-context
363 :enter-func (lambda () (mu4e-message "Entering school context"))
364 :leave-func (lambda () (mu4e-message "Leaving school context"))
365 :match-func (lambda (msg)
367 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
368 :vars '((user-mail-address . "abhojwani22@nobles.edu")
369 (mu4e-sent-folder . "/school/Sent")
370 (mu4e-drafts-folder . "/school/Drafts")
371 (mu4e-trash-folder . "/school/Trash")
372 (mu4e-refile-folder . "/school/Archive")
373 (message-cite-reply-position . above)
374 (user-mail-address . "abhojwani22@nobles.edu")
375 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
376 (smtpmail-smtp-server . "smtp.gmail.com")))
379 :enter-func (lambda () (mu4e-message "Entering personal context"))
380 :leave-func (lambda () (mu4e-message "Leaving personal context"))
381 :match-func (lambda (msg)
383 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
384 :vars '((mu4e-sent-folder . "/personal/Sent")
385 (mu4e-drafts-folder . "/personal/Drafts")
386 (mu4e-trash-folder . "/personal/Trash")
387 (mu4e-refile-folder . "/personal/Archive")
388 (user-mail-address . "me@armaanb.net")
389 (message-cite-reply-position . below)
390 (smtpmail-smtp-user . "me@armaanb.net")
391 (smtpmail-smtp-server . "smtp.mailbox.org")))))
392 (add-to-list 'mu4e-bookmarks
393 '(:name "Unified inbox"
394 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
396 :hook ((mu4e-compose-mode . flyspell-mode)
397 (mu4e-compose-mode . auto-fill-mode)
398 (mu4e-view-mode-hook . turn-on-visual-line-mode)))
401 Set EWW as default browser except for videos.
402 #+begin_src emacs-lisp
403 (defun browse-url-mpv (url &optional new-window)
405 (start-process "mpv" "*mpv*" "mpv" url))
407 (setq browse-url-handlers
409 (("youtu\\.?be" . browse-url-mpv)
410 ("peertube.*" . browse-url-mpv)
411 ("vid.*" . browse-url-mpv)
412 ("vid.*" . browse-url-mpv)
413 ("." . eww-browse-url)
417 Some EWW enhancements.
418 *** Give buffer a useful name
419 #+begin_src emacs-lisp
420 ;; From https://protesilaos.com/dotemacs/
421 (defun prot-eww--rename-buffer ()
422 "Rename EWW buffer using page title or URL.
423 To be used by `eww-after-render-hook'."
424 (let ((name (if (eq "" (plist-get eww-data :title))
425 (plist-get eww-data :url)
426 (plist-get eww-data :title))))
427 (rename-buffer (format "*%s # eww*" name) t)))
430 :straight (:type built-in)
431 :bind (("C-c w" . eww))
432 :hook (eww-after-render-hook prot-eww--rename-buffer))
434 *** Better entrypoint
435 #+begin_src emacs-lisp
436 ;; From https://protesilaos.com/dotemacs/
437 (defun prot-eww-browse-dwim (url &optional arg)
438 "Visit a URL, maybe from `eww-prompt-history', with completion.
440 With optional prefix ARG (\\[universal-argument]) open URL in a
443 If URL does not look like a valid link, run a web query using
446 When called from an eww buffer, provide the current link as
450 (completing-read "Query:" eww-prompt-history
451 nil nil (plist-get eww-data :url) 'eww-prompt-history)
453 (eww url (if arg 4 nil)))
455 (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
458 #+begin_src emacs-lisp
460 :straight (:type built-in)
462 (load "~/.emacs.d/irc.el")
463 (erc-notifications-mode 1)
465 :custom (erc-prompt-for-password . nil))
467 (use-package erc-hl-nicks
468 :config (erc-hl-nicks-mode 1))
473 (erc-tls :server "irc.armaanb.net" :nick "emacs"))
478 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
479 #+begin_src emacs-lisp
480 (use-package emacs-everywhere)
484 #+begin_src emacs-lisp
486 :hook (python-mode . blacken-mode)
487 :config (setq blacken-line-length 79))
490 (use-package ws-butler
491 :config (ws-butler-global-mode))
494 #+begin_src emacs-lisp
495 (use-package flycheck
496 :config (global-flycheck-mode))
498 ** Project management
499 #+begin_src emacs-lisp
500 (use-package projectile
501 :config (projectile-mode)
502 :custom ((projectile-completion-system 'ivy))
504 ("C-c p" . projectile-command-map)
506 (when (file-directory-p "~/Code")
507 (setq projectile-project-search-path '("~/Code")))
508 (setq projectile-switch-project-action #'projectile-dired))
510 (use-package counsel-projectile
512 :config (counsel-projectile-mode))
515 #+begin_src emacs-lisp
517 :straight (:type built-in)
518 :commands (dired dired-jump)
519 :custom ((dired-listing-switches "-agho --group-directories-first"))
520 :config (evil-collection-define-key 'normal 'dired-mode-map
521 "h" 'dired-single-up-directory
522 "l" 'dired-single-buffer))
524 (use-package dired-single
525 :commands (dired dired-jump))
527 (use-package dired-open
528 :commands (dired dired-jump)
529 :custom (dired-open-extensions '(("png" . "feh")
532 (use-package dired-hide-dotfiles
533 :hook (dired-mode . dired-hide-dotfiles-mode)
535 (evil-collection-define-key 'normal 'dired-mode-map
536 "H" 'dired-hide-dotfiles-mode))
540 # TODO: Write a command that commits hunk, skipping staging step.
541 #+begin_src emacs-lisp
544 *** Colored diff in line number area
545 #+begin_src emacs-lisp
547 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
548 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
549 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
550 :config (global-diff-hl-mode))
553 #+begin_src emacs-lisp
555 (use-package git-email
556 :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
557 :config (git-email-piem-mode))
559 * General text editing
561 Indent after every change.
562 #+begin_src emacs-lisp
563 (use-package aggressive-indent
564 :config (global-aggressive-indent-mode))
567 Spell check in text mode, and in prog-mode comments.
568 #+begin_src emacs-lisp
569 (dolist (hook '(text-mode-hook))
570 (add-hook hook (lambda () (flyspell-mode))))
571 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
572 (add-hook hook (lambda () (flyspell-mode -1))))
573 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
575 ** Expand tabs to spaces
576 #+begin_src emacs-lisp
577 (setq-default tab-width 2)
579 ** Copy kill ring to clipboard
580 #+begin_src emacs-lisp
581 (setq x-select-enable-clipboard t)
582 (defun copy-kill-ring-to-xorg ()
583 "Copy the current kill ring to the xorg clipboard."
585 (x-select-text (current-kill 0)))
588 Opens file where you left it.
589 #+begin_src emacs-lisp
593 Distraction free writing a la junegunn/goyo.
594 #+begin_src emacs-lisp
595 (use-package olivetti
597 (evil-leader/set-key "o" 'olivetti-mode))
601 #+begin_src emacs-lisp
602 (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
603 (setq save-abbrevs 'silent)
604 (setq-default abbrev-mode t)
607 #+begin_src emacs-lisp
608 (setq tramp-default-method "ssh")
610 ** Don't ask about following symlinks in vc
611 #+begin_src emacs-lisp
612 (setq vc-follow-symlinks t)
614 ** Don't ask to save custom dictionary
615 #+begin_src emacs-lisp
616 (setq ispell-silently-savep t)
619 #+begin_src emacs-lisp
620 (defun doas-edit (&optional arg)
621 "Edit currently visited file as root.
623 With a prefix ARG prompt for a file to visit.
624 Will also prompt for a file to visit if current
625 buffer is not visiting a file.
627 Modified from Emacs Redux."
629 (if (or arg (not buffer-file-name))
630 (find-file (concat "/doas:root@localhost:"
631 (ido-read-file-name "Find file(as root): ")))
632 (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
634 (global-set-key (kbd "C-x C-r") #'doas-edit)
638 #+begin_src emacs-lisp
639 (use-package ace-window
640 :bind ("M-o" . ace-window))
642 ** Kill current buffer
643 Makes "C-x k" binding faster.
644 #+begin_src emacs-lisp
645 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
649 #+begin_src emacs-lisp
650 (use-package scad-mode)
652 ** Control backup files
653 Stop backup files from spewing everywhere.
654 #+begin_src emacs-lisp
655 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
657 ** Make yes/no easier
658 #+begin_src emacs-lisp
659 (defalias 'yes-or-no-p 'y-or-n-p)
661 ** Move customize file
662 No more clogging up init.el.
663 #+begin_src emacs-lisp
664 (setq custom-file "~/.emacs.d/custom.el")
668 #+begin_src emacs-lisp
670 :commands (helpful-callable helpful-variable helpful-command helpful-key)
672 (counsel-describe-function-function #'helpful-callable)
673 (counsel-describe-variable-function #'helpful-variable)
675 ([remap describe-function] . counsel-describe-function)
676 ([remap describe-command] . helpful-command)
677 ([remap describe-variable] . counsel-describe-variable)
678 ([remap describe-key] . helpful-key))
681 #+begin_src emacs-lisp
682 (use-package epa-file
683 :straight (:type built-in)
685 (epa-file-select-keys nil)
686 (epa-file-encrypt-to '("me@armaanb.net"))
687 (password-cache-expiry (* 60 15)))
689 (use-package pinentry
690 :config (pinentry-start))
693 #+begin_src emacs-lisp
695 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
696 :custom (0x0-default-service 'envs)
697 :config (evil-leader/set-key
699 "0f" '0x0-upload-file
700 "0s" '0x0-upload-string
701 "0c" '0x0-upload-kill-ring
702 "0p" '0x0-upload-popup))
707 #+begin_src conf :tangle ~/.spectrwm.conf
711 autorun = ws[1]:/home/armaa/Code/scripts/autostart
714 #+begin_src conf :tangle ~/.spectrwm.conf
716 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
720 #+begin_src conf :tangle ~/.spectrwm.conf
721 program[term] = alacritty
722 program[screenshot_all] = flameshot gui
723 program[notif] = /home/armaa/Code/scripts/setter status
724 program[pass] = /home/armaa/Code/scripts/passmenu
727 bind[pass] = MOD+Shift+p
730 #+begin_src conf :tangle ~/.spectrwm.conf
731 program[paup] = /home/armaa/Code/scripts/setter audio +5
732 program[padown] = /home/armaa/Code/scripts/setter audio -5
733 program[pamute] = /home/armaa/Code/scripts/setter audio
734 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
735 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
736 program[next] = playerctl next
737 program[prev] = playerctl previous
738 program[pause] = playerctl play-pause
740 bind[padown] = XF86AudioLowerVolume
741 bind[paup] = XF86AudioRaiseVolume
742 bind[pamute] = XF86AudioMute
743 bind[brigdown] = XF86MonBrightnessDown
744 bind[brigup] = XF86MonBrightnessUp
745 bind[pause] = XF86AudioPlay
746 bind[next] = XF86AudioNext
747 bind[prev] = XF86AudioPrev
750 #+begin_src conf :tangle ~/.spectrwm.conf
751 program[h] = xdotool keyup h key --clearmodifiers Left
752 program[j] = xdotool keyup j key --clearmodifiers Down
753 program[k] = xdotool keyup k key --clearmodifiers Up
754 program[l] = xdotool keyup l key --clearmodifiers Right
756 bind[h] = MOD + Control + h
757 bind[j] = MOD + Control + j
758 bind[k] = MOD + Control + k
759 bind[l] = MOD + Control + l
762 #+begin_src conf :tangle ~/.spectrwm.conf
763 program[email] = emacsclient -c --eval "(mu4e)"
764 program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6697")'
765 program[emacs] = emacsclient -c
766 program[firefox] = firefox
767 program[calc] = alacritty -e because -l
768 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
770 bind[email] = MOD+Control+1
771 bind[irc] = MOD+Control+2
772 bind[firefox] = MOD+Control+3
773 bind[emacs-anywhere] = MOD+Control+4
774 bind[calc] = MOD+Control+5
775 bind[emacs] = MOD+Control+Return
778 #+begin_src conf :tangle ~/.spectrwm.conf
779 quirk[Castle Menu] = FLOAT
784 #+begin_src conf :tangle ~/.config/ash/ashrc
788 **** Update all packages
789 #+begin_src shell :tangle ~/.config/ash/ashrc
790 color=$(tput setaf 5)
794 doas echo "${color}== upgrading with yay ==${reset}"
797 echo "${color}== checking for pacnew files ==${reset}"
800 echo "${color}== upgrading flatpaks ==${reset}"
803 echo "${color}== upgrading zsh plugins ==${reset}"
806 echo "${color}== updating nvim plugins ==${reset}"
807 nvim +PlugUpdate +PlugUpgrade +qall
808 echo "Updated nvim plugins"
810 echo "${color}You are entirely up to date!${reset}"
813 **** Clean all packages
814 #+begin_src shell :tangle ~/.config/ash/ashrc
816 doas echo "${color}== cleaning pacman orphans ==${reset}"
817 (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
819 echo "${color}== cleaning flatpaks ==${reset}"
820 flatpak remove --unused
822 echo "${color}== cleaning zsh plugins ==${reset}"
825 echo "${color}== cleaning nvim plugins ==${reset}"
826 nvim +PlugClean +qall
827 echo "Cleaned nvim plugins"
829 echo "${color}All orphans cleaned!${reset}"
832 **** Interact with 0x0
833 #+begin_src shell :tangle ~/.config/ash/ashrc
834 zxz="https://envs.sh"
835 ufile() { curl -F"file=@$1" "$zxz" ; }
836 upb() { curl -F"file=@-;" "$zxz" ; }
837 uurl() { curl -F"url=$1" "$zxz" ; }
838 ushort() { curl -F"shorten=$1" "$zxz" ; }
839 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
842 #+begin_src shell :tangle ~/.config/ash/ashrc
844 user=$(echo "$1" | cut -f 1 -d '@')
845 host=$(echo "$1" | cut -f 2 -d '@')
846 echo $user | nc "$host" 79 -N
849 **** Upload to ftp.armaanb.net
850 #+begin_src shell :tangle ~/.config/ash/ashrc
852 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
853 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
857 #+begin_src shell :tangle ~/.config/ash/ashrc
858 export EDITOR="emacsclient -c"
859 export VISUAL="$EDITOR"
860 export TERM=xterm-256color # for compatability
862 export GPG_TTY="$(tty)"
863 export MANPAGER='nvim +Man!'
866 export GTK_USE_PORTAL=1
868 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
869 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
870 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
871 export PATH="$PATH:/home/armaa/.cargo/bin"
872 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
873 export PATH="$PATH:/usr/sbin"
874 export PATH="$PATH:/opt/FreeTube/freetube"
876 export LC_ALL="en_US.UTF-8"
877 export LC_CTYPE="en_US.UTF-8"
878 export LANGUAGE="en_US.UTF-8"
880 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
881 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
882 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
883 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
884 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
885 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
889 #+begin_src shell :tangle ~/.config/ash/ashrc
890 alias bhoji-drop='ssh -p 23 root@armaanb.net'
891 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
892 alias union='ssh 192.168.1.18'
893 alias mine='ssh -p 23 root@pickupserver.cc'
894 alias tcf='ssh root@204.48.23.68'
895 alias ngmun='ssh root@157.245.89.25'
896 alias prox='ssh root@192.168.1.224'
897 alias ncq='ssh root@143.198.123.17'
898 alias envs='ssh acheam@envs.net'
901 #+begin_src shell :tangle ~/.config/ash/ashrc
902 alias ls='exa -lh --icons --git --group-directories-first'
903 alias la='exa -lha --icons --git --group-directories-first'
904 alias df='df -h / /boot'
911 alias grep='grep -in --exclude-dir=.git --color=auto'
912 alias fname='find -name'
913 alias mkdir='mkdir -pv'
914 alias unar='atool -x'
915 alias wget='wget -e robots=off'
916 alias lanex='~/.local/share/lxc/lxc'
920 **** System management
921 #+begin_src shell :tangle ~/.config/ash/ashrc
922 alias jctl='journalctl -p 3 -xb'
923 alias pkill='pkill -i'
925 alias redoas='doas $(fc -ln -1)'
926 alias crontab='crontab-argh'
927 alias sudo='doas ' # allows aliases to be run with doas
928 alias pasu='git -C ~/.password-store push'
929 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
933 #+begin_src shell :tangle ~/.config/ash/ashrc
934 alias ping='ping -c 10'
935 alias speed='speedtest-cli'
936 alias ip='ip --color=auto'
937 alias cip='curl https://armaanb.net/ip'
938 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
939 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
940 alias plan='T=$(mktemp) && \
941 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
943 head -n -2 $T > $TT && \
945 echo "\nLast updated: $(date -R)" >> "$TT" && \
946 fold -sw 72 "$TT" > "$T"| \
947 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
948 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
951 #+begin_src shell :tangle ~/.config/ash/ashrc
952 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
953 iflag=fullblock status=progress'
954 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
955 iflag=fullblock status=progress'
956 alias ts='gen-shell -c task'
957 alias ts='gen-shell -c task'
958 alias tetris='autoload -Uz tetriscurses && tetriscurses'
959 alias news='newsboat'
960 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
961 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
962 --restrict-filenames -o '%(title)s.%(ext)s'"
963 alias cal="cal -3 --color=auto"
966 **** Virtual machines, chroots
967 #+begin_src shell :tangle ~/.config/ash/ashrc
968 alias ckiss="doas chrooter ~/Virtual/kiss"
969 alias cdebian="doas chrooter ~/Virtual/debian bash"
970 alias cwindows='devour qemu-system-x86_64 \
975 -device VGA,vgamem_mb=64 \
979 -net user,smb=/home/armaa/Public \
980 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
983 #+begin_src shell :tangle ~/.config/ash/ashrc
985 alias zpy="zconda && ipython"
986 alias math="ipython --profile=math"
987 alias pypi="python setup.py sdist && twine upload dist/*"
988 alias pip="python -m pip"
989 alias black="black -l 79"
992 #+begin_src shell :tangle ~/.config/ash/ashrc
993 alias words='gen-shell -c "words"'
994 alias words-e='gen-shell -c "words ~E"'
997 #+begin_src shell :tangle ~/.config/ash/ashrc
998 alias zathura='devour zathura'
999 alias mpv='devour mpv'
1000 alias sql='devour sqlitebrowser'
1001 alias cad='devour openscad'
1002 alias feh='devour feh'
1004 **** Package management (Pacman)
1005 #+begin_src shell :tangle ~/.config/ash/ashrc
1007 alias api='yay -Syu'
1008 alias apii='doas pacman -S'
1009 alias app='yay -Rns'
1011 alias apo='yay -Qttd'
1012 alias azf='pacman -Q | fzf'
1013 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1014 alias ufetch='ufetch-arch'
1015 alias reflect='reflector --verbose --sort rate --save \
1016 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1018 **** Package management (KISS)
1019 #+begin_src shell :tangle ~/.config/ash/ashrc
1020 alias kzf="kiss s \* | xargs -l basename | \
1021 fzf --preview 'kiss search {} | xargs -l dirname'"
1025 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1028 family: JetBrains Mono Nerd Font
1035 ligatures: true # Requires ligature patch
1042 background_opacity: 1
1045 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1046 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1050 background: '#000000'
1051 foreground: '#ffffff'
1055 background: '#ffffff'
1057 # Normal colors (except green it is from intense colors)
1068 # Bright colors [all the faint colors in the modus theme]
1079 # dim [all the intense colors in modus theme]
1092 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1093 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1094 c.TerminalInteractiveShell.editing_mode = 'vi'
1095 c.InteractiveShell.colors = 'linux'
1096 c.TerminalInteractiveShell.confirm_exit = False
1099 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1103 return x * (180 / pi)
1106 return x * (pi / 180)
1109 return (x * (pi / 180)) / unit
1121 Make MPV play a little bit smoother.
1122 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1123 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1127 For any GNU Readline programs
1128 #+begin_src conf :tangle ~/.inputrc
1129 set editing-mode emacs
1133 #+begin_src conf :tangle ~/.gitconfig
1135 name = Armaan Bhojwani
1136 email = me@armaanb.net
1137 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1140 #+begin_src conf :tangle ~/.gitconfig
1142 defaultBranch = main
1145 #+begin_src conf :tangle ~/.gitconfig
1150 #+begin_src conf :tangle ~/.gitconfig
1152 smtpserver = smtp.mailbox.org
1153 smtpuser = me@armaanb.net
1154 smtpencryption = ssl
1155 smtpserverport = 465
1159 #+begin_src conf :tangle ~/.gitconfig
1164 #+begin_src conf :tangle ~/.gitconfig
1167 sclone = clone --depth 1
1172 quickfix = commit . --amend --no-edit
1174 subup = submodule update --remote
1175 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1176 pushnc = push -o skip-ci
1179 #+begin_src conf :tangle ~/.gitconfig
1185 Lightweight notification daemon.
1187 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1189 font = "JetBrains Mono Medium Nerd Font 11"
1191 format = "<b>%s</b>\n%b"
1193 indicate_hidden = yes
1196 show_age_threshold = 60
1199 geometry = "400x5-10+10"
1201 idle_threshold = 120
1203 sticky_history = yes
1205 separator_height = 1
1207 horizontal_padding = 8
1209 separator_color = "#ffffff"
1210 startup_notification = false
1213 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1220 close_all = mod4+shift+c
1221 history = mod4+ctrl+c
1224 background = "#222222"
1225 foreground = "#ffffff"
1226 highlight = "#ffffff"
1230 background = "#222222"
1231 foreground = "#ffffff"
1232 highlight = "#ffffff"
1236 background = "#222222"
1237 foreground = "#a60000"
1238 highlight = "#ffffff"
1243 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1245 map <A-b> toggle_statusbar
1246 set selection-clipboard clipboard
1249 set window-title-basename "true"
1250 set selection-clipboard "clipboard"
1253 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1254 set default-bg "#000000"
1255 set default-fg "#ffffff"
1256 set render-loading true
1257 set render-loading-bg "#000000"
1258 set render-loading-fg "#ffffff"
1260 set recolor-lightcolor "#000000" # bg
1261 set recolor-darkcolor "#ffffff" # fg
1265 *** Swap tab and URL bars
1266 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1268 -moz-box-ordinal-group: 1 !important;
1272 -moz-box-ordinal-group: 2 !important;
1276 -moz-box-ordinal-group: 3 !important;
1279 *** Hide URL bar when not focused.
1280 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1281 #navigator-toolbox:not(:focus-within):not(:hover) {
1285 #navigator-toolbox {
1286 transition: 0.1s margin-top ease-out;
1289 ** Black screen by default
1290 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1293 #browser vbox#appcontent tabbrowser,
1295 #tabbrowser-tabpanels,
1297 browser[type="content-primary"],
1298 browser[type="content"] > html,
1300 background: black !important;
1301 color: #fff !important;
1304 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1305 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1307 background: black !important;
1314 #+begin_src conf :tangle ~/.Xresources
1316 ,*.foreground: #ffffff
1317 ,*.background: #000000
1318 ,*.cursorColor: #ffffff
1353 #+begin_src conf :tangle ~/.Xresources
1354 xterm*VT100.Translations: #override \
1355 Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1356 Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
1357 Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
1358 Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1361 #+begin_src conf :tangle ~/.Xresources
1362 xterm*cursorBlink: true
1365 #+begin_src conf :tangle ~/.Xresources
1366 XTerm*eightBitInput: false
1367 XTerm*eightBitOutput: true