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")
274 (add-to-list 'org-structure-template-alist '("tm" . "src conf :tangle ~/.tmux.conf")))
278 Simple, but not too simple autocompletion.
279 #+begin_src emacs-lisp
281 :bind (("C-s" . swiper)
282 :map ivy-minibuffer-map
283 ("TAB" . ivy-alt-done)
284 :map ivy-switch-buffer-map
285 ("M-d" . ivy-switch-buffer-kill))
289 #+begin_src emacs-lisp
290 (use-package ivy-rich
292 :config (ivy-rich-mode))
296 #+begin_src emacs-lisp
298 :bind (("C-M-j" . 'counsel-switch-buffer)
299 :map minibuffer-local-map
300 ("C-r" . 'counsel-minibuffer-history))
301 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
302 :config (counsel-mode))
304 ** Remember frequent commands
305 #+begin_src emacs-lisp
306 (use-package ivy-prescient
308 :custom (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 -e tmux
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}== updating nvim plugins ==${reset}"
804 nvim +PlugUpdate +PlugUpgrade +qall
805 echo "Updated nvim plugins"
807 echo "${color}You are entirely up to date!${reset}"
810 **** Clean all packages
811 #+begin_src shell :tangle ~/.config/ash/ashrc
813 doas echo "${color}== cleaning pacman orphans ==${reset}"
814 (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
816 echo "${color}== cleaning flatpaks ==${reset}"
817 flatpak remove --unused
819 echo "${color}== cleaning nvim plugins ==${reset}"
820 nvim +PlugClean +qall
821 echo "Cleaned nvim plugins"
823 echo "${color}All orphans cleaned!${reset}"
826 **** Interact with 0x0
827 #+begin_src shell :tangle ~/.config/ash/ashrc
828 zxz="https://envs.sh"
829 ufile() { curl -F"file=@$1" "$zxz" ; }
830 upb() { curl -F"file=@-;" "$zxz" ; }
831 uurl() { curl -F"url=$1" "$zxz" ; }
832 ushort() { curl -F"shorten=$1" "$zxz" ; }
833 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
836 #+begin_src shell :tangle ~/.config/ash/ashrc
838 user=$(echo "$1" | cut -f 1 -d '@')
839 host=$(echo "$1" | cut -f 2 -d '@')
840 echo $user | nc "$host" 79 -N
843 **** Upload to ftp.armaanb.net
844 #+begin_src shell :tangle ~/.config/ash/ashrc
846 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
847 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
851 #+begin_src shell :tangle ~/.config/ash/ashrc
852 export EDITOR="emacsclient -c"
853 export VISUAL="$EDITOR"
854 export TERM=xterm-256color # for compatability
856 export GPG_TTY="$(tty)"
857 export MANPAGER='nvim +Man!'
860 export GTK_USE_PORTAL=1
862 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
863 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
864 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
865 export PATH="$PATH:/home/armaa/.cargo/bin"
866 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
867 export PATH="$PATH:/usr/sbin"
868 export PATH="$PATH:/opt/FreeTube/freetube"
870 export LC_ALL="en_US.UTF-8"
871 export LC_CTYPE="en_US.UTF-8"
872 export LANGUAGE="en_US.UTF-8"
874 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
875 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
876 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
877 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
878 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
879 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
883 #+begin_src shell :tangle ~/.config/ash/ashrc
884 alias bhoji-drop='ssh -p 23 root@armaanb.net'
885 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
886 alias union='ssh 192.168.1.18'
887 alias mine='ssh -p 23 root@pickupserver.cc'
888 alias tcf='ssh root@204.48.23.68'
889 alias ngmun='ssh root@157.245.89.25'
890 alias prox='ssh root@192.168.1.224'
891 alias ncq='ssh root@143.198.123.17'
892 alias envs='ssh acheam@envs.net'
895 #+begin_src shell :tangle ~/.config/ash/ashrc
896 alias ls='ls -lh --group-directories-first'
898 alias df='df -h / /boot'
905 alias grep='grep -in --color=auto'
906 alias mkdir='mkdir -pv'
907 alias wget='wget -e robots=off'
908 alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
912 **** System management
913 #+begin_src shell :tangle ~/.config/ash/ashrc
914 alias pkill='pkill -i'
915 alias crontab='crontab-argh'
917 alias pasu='git -C ~/.password-store push'
918 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
922 #+begin_src shell :tangle ~/.config/ash/ashrc
923 alias ping='ping -c 10'
924 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
925 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
926 alias plan='T=$(mktemp) && \
927 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
929 head -n -2 $T > $TT && \
931 echo "\nLast updated: $(date -R)" >> "$TT" && \
932 fold -sw 72 "$TT" > "$T"| \
933 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
935 **** Virtual machines, chroots
936 #+begin_src shell :tangle ~/.config/ash/ashrc
937 alias ckiss="doas chrooter ~/Virtual/kiss"
938 alias cdebian="doas chrooter ~/Virtual/debian bash"
939 alias cwindows='devour qemu-system-x86_64 \
944 -device VGA,vgamem_mb=64 \
948 -net user,smb=/home/armaa/Public \
949 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
952 #+begin_src shell :tangle ~/.config/ash/ashrc
953 alias pip="python -m pip"
954 alias black="black -l 79"
957 #+begin_src shell :tangle ~/.config/ash/ashrc
958 alias words='gen-shell -c "words"'
959 alias words-e='gen-shell -c "words ~E"'
962 #+begin_src shell :tangle ~/.config/ash/ashrc
963 alias zathura='devour zathura'
964 alias cad='devour openscad'
965 alias feh='devour feh'
968 #+begin_src shell :tangle ~/.config/ash/ashrc
971 alias apii='doas pacman -S'
973 alias azf='pacman -Q | fzf'
974 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
977 #+begin_src shell :tangle ~/.config/ash/ashrc
978 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
979 iflag=fullblock status=progress'
980 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
981 iflag=fullblock status=progress'
982 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
983 --restrict-filenames -o '%(title)s.%(ext)s'"
984 alias cal="cal -3 --color=auto"
989 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
992 family: JetBrains Mono Nerd Font
999 ligatures: true # Requires ligature patch
1006 background_opacity: 1
1009 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1010 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1014 background: '#000000'
1015 foreground: '#ffffff'
1019 background: '#ffffff'
1021 # Normal colors (except green it is from intense colors)
1032 # Bright colors [all the faint colors in the modus theme]
1043 # dim [all the intense colors in modus theme]
1056 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1057 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1058 c.TerminalInteractiveShell.editing_mode = 'vi'
1059 c.InteractiveShell.colors = 'linux'
1060 c.TerminalInteractiveShell.confirm_exit = False
1063 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1067 return x * (180 / pi)
1070 return x * (pi / 180)
1073 return (x * (pi / 180)) / unit
1085 Make MPV play a little bit smoother.
1086 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1087 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1091 For any GNU Readline programs
1092 #+begin_src conf :tangle ~/.inputrc
1093 set editing-mode emacs
1097 #+begin_src conf :tangle ~/.gitconfig
1099 name = Armaan Bhojwani
1100 email = me@armaanb.net
1101 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1104 #+begin_src conf :tangle ~/.gitconfig
1106 defaultBranch = main
1109 #+begin_src conf :tangle ~/.gitconfig
1114 #+begin_src conf :tangle ~/.gitconfig
1116 smtpserver = smtp.mailbox.org
1117 smtpuser = me@armaanb.net
1118 smtpencryption = ssl
1119 smtpserverport = 465
1123 #+begin_src conf :tangle ~/.gitconfig
1128 #+begin_src conf :tangle ~/.gitconfig
1131 sclone = clone --depth 1
1136 quickfix = commit . --amend --no-edit
1138 subup = submodule update --remote
1139 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1140 pushnc = push -o skip-ci
1143 #+begin_src conf :tangle ~/.gitconfig
1149 Lightweight notification daemon.
1151 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1153 font = "JetBrains Mono Medium Nerd Font 11"
1155 format = "<b>%s</b>\n%b"
1157 indicate_hidden = yes
1160 show_age_threshold = 60
1163 geometry = "400x5-10+10"
1165 idle_threshold = 120
1167 sticky_history = yes
1169 separator_height = 1
1171 horizontal_padding = 8
1173 separator_color = "#ffffff"
1174 startup_notification = false
1177 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1184 close_all = mod4+shift+c
1185 history = mod4+ctrl+c
1188 background = "#222222"
1189 foreground = "#ffffff"
1190 highlight = "#ffffff"
1194 background = "#222222"
1195 foreground = "#ffffff"
1196 highlight = "#ffffff"
1200 background = "#222222"
1201 foreground = "#a60000"
1202 highlight = "#ffffff"
1207 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1209 map <A-b> toggle_statusbar
1210 set selection-clipboard clipboard
1213 set window-title-basename "true"
1214 set selection-clipboard "clipboard"
1217 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1218 set default-bg "#000000"
1219 set default-fg "#ffffff"
1220 set render-loading true
1221 set render-loading-bg "#000000"
1222 set render-loading-fg "#ffffff"
1224 set recolor-lightcolor "#000000" # bg
1225 set recolor-darkcolor "#ffffff" # fg
1229 *** Swap tab and URL bars
1230 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1232 -moz-box-ordinal-group: 1 !important;
1236 -moz-box-ordinal-group: 2 !important;
1240 -moz-box-ordinal-group: 3 !important;
1243 *** Hide URL bar when not focused.
1244 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1245 #navigator-toolbox:not(:focus-within):not(:hover) {
1249 #navigator-toolbox {
1250 transition: 0.1s margin-top ease-out;
1253 *** Black screen by default
1254 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1257 #browser vbox#appcontent tabbrowser,
1259 #tabbrowser-tabpanels,
1261 browser[type="content-primary"],
1262 browser[type="content"] > html,
1264 background: black !important;
1265 color: #fff !important;
1268 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1269 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1271 background: black !important;
1278 #+begin_src conf :tangle ~/.Xresources
1280 ,*.foreground: #ffffff
1281 ,*.background: #000000
1282 ,*.cursorColor: #ffffff
1317 #+begin_src conf :tangle ~/.Xresources
1318 xterm*VT100.Translations: #override \
1319 Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1320 Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
1321 Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
1322 Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1325 #+begin_src conf :tangle ~/.Xresources
1326 xterm*cursorBlink: true
1329 #+begin_src conf :tangle ~/.Xresources
1330 XTerm*eightBitInput: false
1331 XTerm*eightBitOutput: true
1334 #+begin_src conf :tangle ~/.tmux.conf