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 (user-mail-address . "abhojwani22@nobles.edu")
374 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
375 (smtpmail-smtp-server . "smtp.gmail.com")))
378 :enter-func (lambda () (mu4e-message "Entering personal context"))
379 :leave-func (lambda () (mu4e-message "Leaving personal context"))
380 :match-func (lambda (msg)
382 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
383 :vars '((mu4e-sent-folder . "/personal/Sent")
384 (mu4e-drafts-folder . "/personal/Drafts")
385 (mu4e-trash-folder . "/personal/Trash")
386 (mu4e-refile-folder . "/personal/Archive")
387 (user-mail-address . "me@armaanb.net")
388 (smtpmail-smtp-user . "me@armaanb.net")
389 (smtpmail-smtp-server "smtp.mailbox.org")
390 (mu4e-drafts-folder . "/school/Drafts")
391 (mu4e-trash-folder . "/school/Trash")))))
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-view-mode-hook . turn-on-visual-line-mode)))
400 Set EWW as default browser except for videos.
401 #+begin_src emacs-lisp
402 (defun browse-url-mpv (url &optional new-window)
404 (start-process "mpv" "*mpv*" "mpv" url))
406 (setq browse-url-handlers
408 (("youtu\\.?be" . browse-url-mpv)
409 ("peertube.*" . browse-url-mpv)
410 ("vid.*" . browse-url-mpv)
411 ("vid.*" . browse-url-mpv)
412 ("." . eww-browse-url)
416 Some EWW enhancements.
417 *** Give buffer a useful name
418 #+begin_src emacs-lisp
419 ;; From https://protesilaos.com/dotemacs/
420 (defun prot-eww--rename-buffer ()
421 "Rename EWW buffer using page title or URL.
422 To be used by `eww-after-render-hook'."
423 (let ((name (if (eq "" (plist-get eww-data :title))
424 (plist-get eww-data :url)
425 (plist-get eww-data :title))))
426 (rename-buffer (format "*%s # eww*" name) t)))
429 :straight (:type built-in)
430 :bind (("C-c w" . eww))
431 :hook (eww-after-render-hook prot-eww--rename-buffer))
433 *** Better entrypoint
434 #+begin_src emacs-lisp
435 ;; From https://protesilaos.com/dotemacs/
436 (defun prot-eww-browse-dwim (url &optional arg)
437 "Visit a URL, maybe from `eww-prompt-history', with completion.
439 With optional prefix ARG (\\[universal-argument]) open URL in a
442 If URL does not look like a valid link, run a web query using
445 When called from an eww buffer, provide the current link as
449 (completing-read "Query:" eww-prompt-history
450 nil nil (plist-get eww-data :url) 'eww-prompt-history)
452 (eww url (if arg 4 nil)))
454 (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
457 #+begin_src emacs-lisp
459 :straight (:type built-in)
461 (load "~/.emacs.d/irc.el")
463 (erc-notifications-enable)
464 (erc-smiley-disable))
466 (use-package erc-hl-nicks
467 :config (erc-hl-nicks-mode 1))
470 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
471 #+begin_src emacs-lisp
472 (use-package emacs-everywhere)
476 #+begin_src emacs-lisp
478 :hook (python-mode . blacken-mode)
479 :config (setq blacken-line-length 79))
482 (use-package ws-butler
483 :config (ws-butler-global-mode))
486 #+begin_src emacs-lisp
487 (use-package flycheck
488 :config (global-flycheck-mode))
490 ** Project management
491 #+begin_src emacs-lisp
492 (use-package projectile
493 :config (projectile-mode)
494 :custom ((projectile-completion-system 'ivy))
496 ("C-c p" . projectile-command-map)
498 (when (file-directory-p "~/Code")
499 (setq projectile-project-search-path '("~/Code")))
500 (setq projectile-switch-project-action #'projectile-dired))
502 (use-package counsel-projectile
504 :config (counsel-projectile-mode))
507 #+begin_src emacs-lisp
509 :straight (:type built-in)
510 :commands (dired dired-jump)
511 :custom ((dired-listing-switches "-agho --group-directories-first"))
512 :config (evil-collection-define-key 'normal 'dired-mode-map
513 "h" 'dired-single-up-directory
514 "l" 'dired-single-buffer))
516 (use-package dired-single
517 :commands (dired dired-jump))
519 (use-package dired-open
520 :commands (dired dired-jump)
521 :custom (dired-open-extensions '(("png" . "feh")
524 (use-package dired-hide-dotfiles
525 :hook (dired-mode . dired-hide-dotfiles-mode)
527 (evil-collection-define-key 'normal 'dired-mode-map
528 "H" 'dired-hide-dotfiles-mode))
532 # TODO: Write a command that commits hunk, skipping staging step.
533 #+begin_src emacs-lisp
536 *** Colored diff in line number area
537 #+begin_src emacs-lisp
539 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
540 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
541 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
542 :config (global-diff-hl-mode))
544 * General text editing
546 Indent after every change.
547 #+begin_src emacs-lisp
548 (use-package aggressive-indent
549 :config (global-aggressive-indent-mode))
552 Spell check in text mode, and in prog-mode comments.
553 #+begin_src emacs-lisp
554 (dolist (hook '(text-mode-hook))
555 (add-hook hook (lambda () (flyspell-mode))))
556 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
557 (add-hook hook (lambda () (flyspell-mode -1))))
558 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
560 ** Expand tabs to spaces
561 #+begin_src emacs-lisp
562 (setq-default tab-width 2)
564 ** Copy kill ring to clipboard
565 #+begin_src emacs-lisp
566 (setq x-select-enable-clipboard t)
567 (defun copy-kill-ring-to-xorg ()
568 "Copy the current kill ring to the xorg clipboard."
570 (x-select-text (current-kill 0)))
573 Opens file where you left it.
574 #+begin_src emacs-lisp
578 Distraction free writing a la junegunn/goyo.
579 #+begin_src emacs-lisp
580 (use-package olivetti
582 (evil-leader/set-key "o" 'olivetti-mode))
586 #+begin_src emacs-lisp
587 (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
588 (setq save-abbrevs 'silent)
589 (setq-default abbrev-mode t)
592 #+begin_src emacs-lisp
593 (setq tramp-default-method "ssh")
595 ** Don't ask about following symlinks in vc
596 #+begin_src emacs-lisp
597 (setq vc-follow-symlinks t)
599 ** Don't ask to save custom dictionary
600 #+begin_src emacs-lisp
601 (setq ispell-silently-savep t)
605 #+begin_src emacs-lisp
606 (use-package ace-window
607 :bind ("M-o" . ace-window))
609 ** Kill current buffer
610 Makes "C-x k" binding faster.
611 #+begin_src emacs-lisp
612 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
616 #+begin_src emacs-lisp
617 (use-package scad-mode)
619 ** Control backup files
620 Stop backup files from spewing everywhere.
621 #+begin_src emacs-lisp
622 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
624 ** Make yes/no easier
625 #+begin_src emacs-lisp
626 (defalias 'yes-or-no-p 'y-or-n-p)
628 ** Move customize file
629 No more clogging up init.el.
630 #+begin_src emacs-lisp
631 (setq custom-file "~/.emacs.d/custom.el")
635 #+begin_src emacs-lisp
637 :commands (helpful-callable helpful-variable helpful-command helpful-key)
639 (counsel-describe-function-function #'helpful-callable)
640 (counsel-describe-variable-function #'helpful-variable)
642 ([remap describe-function] . counsel-describe-function)
643 ([remap describe-command] . helpful-command)
644 ([remap describe-variable] . counsel-describe-variable)
645 ([remap describe-key] . helpful-key))
648 #+begin_src emacs-lisp
649 (use-package epa-file
650 :straight (:type built-in)
652 (epa-file-select-keys nil)
653 (epa-file-encrypt-to '("me@armaanb.net"))
654 (password-cache-expiry (* 60 15)))
656 (use-package pinentry
657 :config (pinentry-start))
660 #+begin_src emacs-lisp
662 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
663 :custom (0x0-default-service 'envs)
664 :config (evil-leader/set-key
666 "0f" '0x0-upload-file
667 "0s" '0x0-upload-string
668 "0c" '0x0-upload-kill-ring
669 "0p" '0x0-upload-popup))
674 #+begin_src conf :tangle ~/.spectrwm.conf
678 autorun = ws[1]:/home/armaa/Code/scripts/autostart
681 #+begin_src conf :tangle ~/.spectrwm.conf
683 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
687 #+begin_src conf :tangle ~/.spectrwm.conf
688 program[term] = alacritty
689 program[screenshot_all] = flameshot gui
690 program[notif] = /home/armaa/Code/scripts/setter status
691 program[pass] = /home/armaa/Code/scripts/passmenu
694 bind[pass] = MOD+Shift+p
697 #+begin_src conf :tangle ~/.spectrwm.conf
698 program[paup] = /home/armaa/Code/scripts/setter audio +5
699 program[padown] = /home/armaa/Code/scripts/setter audio -5
700 program[pamute] = /home/armaa/Code/scripts/setter audio
701 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
702 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
703 program[next] = playerctl next
704 program[prev] = playerctl previous
705 program[pause] = playerctl play-pause
707 bind[padown] = XF86AudioLowerVolume
708 bind[paup] = XF86AudioRaiseVolume
709 bind[pamute] = XF86AudioMute
710 bind[brigdown] = XF86MonBrightnessDown
711 bind[brigup] = XF86MonBrightnessUp
712 bind[pause] = XF86AudioPlay
713 bind[next] = XF86AudioNext
714 bind[prev] = XF86AudioPrev
717 #+begin_src conf :tangle ~/.spectrwm.conf
718 program[h] = xdotool keyup h key --clearmodifiers Left
719 program[j] = xdotool keyup j key --clearmodifiers Down
720 program[k] = xdotool keyup k key --clearmodifiers Up
721 program[l] = xdotool keyup l key --clearmodifiers Right
723 bind[h] = MOD + Control + h
724 bind[j] = MOD + Control + j
725 bind[k] = MOD + Control + k
726 bind[l] = MOD + Control + l
729 #+begin_src conf :tangle ~/.spectrwm.conf
730 program[aerc] = alacritty -e aerc
731 program[catgirl] = alacritty --hold -e sh -c "while : ; do ssh root@armaanb.net -t abduco -A irc catgirl freenode; sleep 2; done"
732 program[emacs] = emacsclient -c
733 program[firefox] = firefox
734 program[calc] = alacritty -e because -l
735 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
737 bind[aerc] = MOD+Control+1
738 bind[catgirl] = MOD+Control+2
739 bind[firefox] = MOD+Control+3
740 bind[emacs-anywhere] = MOD+Control+4
741 bind[calc] = MOD+Control+5
742 bind[emacs] = MOD+Control+Return
745 #+begin_src conf :tangle ~/.spectrwm.conf
746 quirk[Castle Menu] = FLOAT
751 #+begin_src conf :tangle ~/.config/ash/ashrc
755 **** Update all packages
756 #+begin_src shell :tangle ~/.config/ash/ashrc
757 color=$(tput setaf 5)
761 sudo echo "${color}== upgrading with yay ==${reset}"
764 echo "${color}== checking for pacnew files ==${reset}"
767 echo "${color}== upgrading flatpaks ==${reset}"
770 echo "${color}== upgrading zsh plugins ==${reset}"
773 echo "${color}== updating nvim plugins ==${reset}"
774 nvim +PlugUpdate +PlugUpgrade +qall
775 echo "Updated nvim plugins"
777 echo "${color}You are entirely up to date!${reset}"
780 **** Clean all packages
781 #+begin_src shell :tangle ~/.config/ash/ashrc
783 sudo echo "${color}== cleaning pacman orphans ==${reset}"
784 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
786 echo "${color}== cleaning flatpaks ==${reset}"
787 flatpak remove --unused
789 echo "${color}== cleaning zsh plugins ==${reset}"
792 echo "${color}== cleaning nvim plugins ==${reset}"
793 nvim +PlugClean +qall
794 echo "Cleaned nvim plugins"
796 echo "${color}All orphans cleaned!${reset}"
799 **** Interact with 0x0
800 #+begin_src shell :tangle ~/.config/ash/ashrc
801 zxz="https://envs.sh"
802 ufile() { curl -F"file=@$1" "$zxz" ; }
803 upb() { curl -F"file=@-;" "$zxz" ; }
804 uurl() { curl -F"url=$1" "$zxz" ; }
805 ushort() { curl -F"shorten=$1" "$zxz" ; }
806 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
809 #+begin_src shell :tangle ~/.config/ash/ashrc
811 user=$(echo "$1" | cut -f 1 -d '@')
812 host=$(echo "$1" | cut -f 2 -d '@')
813 echo $user | nc "$host" 79 -N
816 **** Upload to ftp.armaanb.net
817 #+begin_src shell :tangle ~/.config/ash/ashrc
819 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
820 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
825 #+begin_src shell :tangle ~/.config/ash/ashrc
826 alias bhoji-drop='ssh -p 23 root@armaanb.net'
827 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
828 alias union='ssh 192.168.1.18'
829 alias mine='ssh -p 23 root@pickupserver.cc'
830 alias tcf='ssh root@204.48.23.68'
831 alias ngmun='ssh root@157.245.89.25'
832 alias prox='ssh root@192.168.1.224'
833 alias ncq='ssh root@143.198.123.17'
834 alias envs='ssh acheam@envs.net'
837 #+begin_src shell :tangle ~/.config/ash/ashrc
838 alias ls='exa -lh --icons --git --group-directories-first'
839 alias la='exa -lha --icons --git --group-directories-first'
840 alias df='df -h / /boot'
847 alias grep='grep -in --exclude-dir=.git --color=auto'
848 alias fname='find -name'
849 alias mkdir='mkdir -pv'
850 alias unar='atool -x'
851 alias wget='wget -e robots=off'
852 alias lanex='~/.local/share/lxc/lxc'
855 **** System management
856 #+begin_src shell :tangle ~/.config/ash/ashrc
857 alias jctl='journalctl -p 3 -xb'
858 alias pkill='pkill -i'
860 alias redoas='doas $(fc -ln -1)'
861 alias crontab='crontab-argh'
862 alias sudo='doas ' # allows aliases to be run with doas
863 alias pasu='git -C ~/.password-store push'
864 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
868 #+begin_src shell :tangle ~/.config/ash/ashrc
869 alias ping='ping -c 10'
870 alias speed='speedtest-cli'
871 alias ip='ip --color=auto'
872 alias cip='curl https://armaanb.net/ip'
873 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
874 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
875 alias plan='T=$(mktemp) && \
876 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
878 head -n -2 $T > $TT && \
880 echo "\nLast updated: $(date -R)" >> "$TT" && \
881 fold -sw 72 "$TT" > "$T"| \
882 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
883 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
886 #+begin_src shell :tangle ~/.config/ash/ashrc
887 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
888 iflag=fullblock status=progress'
889 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
890 iflag=fullblock status=progress'
891 alias ts='gen-shell -c task'
892 alias ts='gen-shell -c task'
893 alias tetris='autoload -Uz tetriscurses && tetriscurses'
894 alias news='newsboat'
895 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
896 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
897 --restrict-filenames -o '%(title)s.%(ext)s'"
898 alias cal="cal -3 --color=auto"
901 **** Virtual machines, chroots
902 #+begin_src shell :tangle ~/.config/ash/ashrc
903 alias ckiss="sudo chrooter ~/Virtual/kiss"
904 alias cdebian="sudo chrooter ~/Virtual/debian bash"
905 alias cwindows='devour qemu-system-x86_64 \
910 -device VGA,vgamem_mb=64 \
914 -net user,smb=/home/armaa/Public \
915 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
918 #+begin_src shell :tangle ~/.config/ash/ashrc
920 alias zpy="zconda && ipython"
921 alias math="ipython --profile=math"
922 alias pypi="python setup.py sdist && twine upload dist/*"
923 alias pip="python -m pip"
924 alias black="black -l 79"
927 #+begin_src shell :tangle ~/.config/ash/ashrc
928 alias words='gen-shell -c "words"'
929 alias words-e='gen-shell -c "words ~E"'
932 #+begin_src shell :tangle ~/.config/ash/ashrc
933 alias zathura='devour zathura'
934 alias mpv='devour mpv'
935 alias sql='devour sqlitebrowser'
936 alias cad='devour openscad'
937 alias feh='devour feh'
939 **** Package management (Pacman)
940 #+begin_src shell :tangle ~/.config/ash/ashrc
943 alias apii='sudo pacman -S'
946 alias apo='yay -Qttd'
947 alias azf='pacman -Q | fzf'
948 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
949 alias ufetch='ufetch-arch'
950 alias reflect='reflector --verbose --sort rate --save \
951 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
953 **** Package management (KISS)
954 #+begin_src shell :tangle ~/.config/ash/ashrc
955 alias kzf="kiss s \* | xargs -l basename | \
956 fzf --preview 'kiss search {} | xargs -l dirname'"
959 #+begin_src shell :tangle ~/.config/ash/ashrc
960 export EDITOR="emacsclient -c"
961 export VISUAL="$EDITOR"
962 export TERM=xterm-256color # for compatability
964 export GPG_TTY="$(tty)"
965 export MANPAGER='nvim +Man!'
968 export GTK_USE_PORTAL=1
970 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
971 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
972 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
973 export PATH="$PATH:/home/armaa/.cargo/bin"
974 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
975 export PATH="$PATH:/usr/sbin"
976 export PATH="$PATH:/opt/FreeTube/freetube"
978 export LC_ALL="en_US.UTF-8"
979 export LC_CTYPE="en_US.UTF-8"
980 export LANGUAGE="en_US.UTF-8"
982 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
983 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
984 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
985 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
986 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
987 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
991 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
994 family: JetBrains Mono Nerd Font
1001 ligatures: true # Requires ligature patch
1008 background_opacity: 1
1011 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1012 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1016 background: '#000000'
1017 foreground: '#ffffff'
1021 background: '#ffffff'
1023 # Normal colors (except green it is from intense colors)
1034 # Bright colors [all the faint colors in the modus theme]
1045 # dim [all the intense colors in modus theme]
1058 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1059 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1060 c.TerminalInteractiveShell.editing_mode = 'vi'
1061 c.InteractiveShell.colors = 'linux'
1062 c.TerminalInteractiveShell.confirm_exit = False
1065 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1069 return x * (180 / pi)
1072 return x * (pi / 180)
1075 return (x * (pi / 180)) / unit
1087 Make MPV play a little bit smoother.
1088 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1089 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1093 For any GNU Readline programs
1094 #+begin_src conf :tangle ~/.inputrc
1099 #+begin_src conf :tangle ~/.gitconfig
1101 name = Armaan Bhojwani
1102 email = me@armaanb.net
1103 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1106 #+begin_src conf :tangle ~/.gitconfig
1108 defaultBranch = main
1111 #+begin_src conf :tangle ~/.gitconfig
1116 #+begin_src conf :tangle ~/.gitconfig
1118 smtpserver = smtp.mailbox.org
1119 smtpuser = me@armaanb.net
1120 smtpencryption = ssl
1121 smtpserverport = 465
1125 #+begin_src conf :tangle ~/.gitconfig
1130 #+begin_src conf :tangle ~/.gitconfig
1133 sclone = clone --depth 1
1138 quickfix = commit . --amend --no-edit
1140 subup = submodule update --remote
1141 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1142 pushnc = push -o skip-ci
1145 #+begin_src conf :tangle ~/.gitconfig
1151 Lightweight notification daemon.
1153 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1155 font = "JetBrains Mono Medium Nerd Font 11"
1157 format = "<b>%s</b>\n%b"
1159 indicate_hidden = yes
1162 show_age_threshold = 60
1165 geometry = "400x5-10+10"
1167 idle_threshold = 120
1169 sticky_history = yes
1171 separator_height = 1
1173 horizontal_padding = 8
1175 separator_color = "#ffffff"
1176 startup_notification = false
1179 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1186 close_all = mod4+shift+c
1187 history = mod4+ctrl+c
1190 background = "#222222"
1191 foreground = "#ffffff"
1192 highlight = "#ffffff"
1196 background = "#222222"
1197 foreground = "#ffffff"
1198 highlight = "#ffffff"
1202 background = "#222222"
1203 foreground = "#a60000"
1204 highlight = "#ffffff"
1209 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1211 map <A-b> toggle_statusbar
1212 set selection-clipboard clipboard
1215 set window-title-basename "true"
1216 set selection-clipboard "clipboard"
1219 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1220 set default-bg "#000000"
1221 set default-fg "#ffffff"
1222 set render-loading true
1223 set render-loading-bg "#000000"
1224 set render-loading-fg "#ffffff"
1226 set recolor-lightcolor "#000000" # bg
1227 set recolor-darkcolor "#ffffff" # fg
1231 *** Swap tab and URL bars
1232 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1234 -moz-box-ordinal-group: 1 !important;
1238 -moz-box-ordinal-group: 2 !important;
1242 -moz-box-ordinal-group: 3 !important;
1245 *** Hide URL bar when not focused.
1246 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1247 #navigator-toolbox:not(:focus-within):not(:hover) {
1251 #navigator-toolbox {
1252 transition: 0.1s margin-top ease-out;
1255 ** Black screen by default
1256 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1259 #browser vbox#appcontent tabbrowser,
1261 #tabbrowser-tabpanels,
1263 browser[type="content-primary"],
1264 browser[type="content"] > html,
1266 background: black !important;
1267 color: #fff !important;
1270 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1271 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1273 background: black !important;
1280 #+begin_src conf :tangle ~/.Xresources
1282 ,*.foreground: #ffffff
1283 ,*.background: #000000
1284 ,*.cursorColor: #ffffff
1319 #+begin_src conf :tangle ~/.Xresources
1320 xterm*VT100.Translations: #override \
1321 Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1322 Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
1323 Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
1324 Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1327 #+begin_src conf :tangle ~/.Xresources
1328 xterm*cursorBlink: true
1331 #+begin_src conf :tangle ~/.Xresources
1332 XTerm*eightBitInput: false
1333 XTerm*eightBitOutput: true