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 '("zsh" . "src shell :tangle ~/.config/zsh/zshrc"))
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
752 #+begin_src shell :tangle ~/.config/zsh/zshrc
753 autoload -Uz compinit
757 unsetopt glob_complete
760 #+begin_src shell :tangle ~/.config/zsh/zshrc
764 bindkey -M vicmd "^[[3~" delete-char
765 bindkey "^[[3~" delete-char
767 autoload edit-command-line
768 zle -N edit-command-line
769 bindkey -M vicmd ^e edit-command-line
770 bindkey ^e edit-command-line
773 #+begin_src shell :tangle ~/.config/zsh/zshrc
774 setopt extended_history
776 setopt inc_append_history
777 setopt hist_ignore_dups
778 setopt hist_reduce_blanks
782 HISTFILE=~/.local/share/zsh/history
785 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
787 Right now, I'm only using fast-syntax-highlighting. It's a really nice visual addition.
789 #+begin_src conf :tangle ~/.config/zpe/repositories
790 https://github.com/zdharma/fast-syntax-highlighting
793 #+begin_src shell :tangle ~/.config/zsh/zshrc
794 source ~/Code/zpe/zpe.sh
795 source ~/Code/admone/admone.zsh
796 source ~/.config/zsh/fzf-bindings.zsh
798 zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
801 **** Time Zsh startup
802 #+begin_src shell :tangle ~/.config/zsh/zshrc
804 for i in $(seq 1 10); do time "$1" -i -c exit; done
807 **** Update all packages
808 #+begin_src shell :tangle ~/.config/zsh/zshrc
809 color=$(tput setaf 5)
813 sudo echo "${color}== upgrading with yay ==${reset}"
816 echo "${color}== checking for pacnew files ==${reset}"
819 echo "${color}== upgrading flatpaks ==${reset}"
822 echo "${color}== upgrading zsh plugins ==${reset}"
825 echo "${color}== updating nvim plugins ==${reset}"
826 nvim +PlugUpdate +PlugUpgrade +qall
827 echo "Updated nvim plugins"
829 echo "${color}You are entirely up to date!${reset}"
832 **** Clean all packages
833 #+begin_src shell :tangle ~/.config/zsh/zshrc
835 sudo echo "${color}== cleaning pacman orphans ==${reset}"
836 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
838 echo "${color}== cleaning flatpaks ==${reset}"
839 flatpak remove --unused
841 echo "${color}== cleaning zsh plugins ==${reset}"
844 echo "${color}== cleaning nvim plugins ==${reset}"
845 nvim +PlugClean +qall
846 echo "Cleaned nvim plugins"
848 echo "${color}All orphans cleaned!${reset}"
852 #+begin_src shell :tangle ~/.config/zsh/zshrc
854 __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
855 if [ $? -eq 0 ]; then
856 eval "$__conda_setup"
858 if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
859 . "/opt/anaconda/etc/profile.d/conda.sh"
861 export PATH="/opt/anaconda/bin:$PATH"
867 **** Interact with 0x0
868 #+begin_src shell :tangle ~/.config/zsh/zshrc
869 zxz="https://envs.sh"
870 0file() { curl -F"file=@$1" "$zxz" ; }
871 0pb() { curl -F"file=@-;" "$zxz" ; }
872 0url() { curl -F"url=$1" "$zxz" ; }
873 0short() { curl -F"shorten=$1" "$zxz" ; }
874 0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
877 #+begin_src shell :tangle ~/.config/zsh/zshrc
879 user=$(echo "$1" | cut -f 1 -d '@')
880 host=$(echo "$1" | cut -f 2 -d '@')
881 echo $user | nc "$host" 79 -N
884 **** Upload to ftp.armaanb.net
885 #+begin_src shell :tangle ~/.config/zsh/zshrc
887 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
888 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
893 #+begin_src shell :tangle ~/.config/zsh/zshrc
894 alias bhoji-drop='ssh -p 23 root@armaanb.net'
895 alias catgirl='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
896 alias union='ssh 192.168.1.18'
897 alias mine='ssh -p 23 root@pickupserver.cc'
898 alias tcf='ssh root@204.48.23.68'
899 alias ngmun='ssh root@157.245.89.25'
900 alias prox='ssh root@192.168.1.224'
901 alias ncq='ssh root@143.198.123.17'
902 alias dock='ssh root@192.168.1.225'
903 alias jenkins='ssh root@192.168.1.226'
904 alias envs='ssh acheam@envs.net'
907 #+begin_src shell :tangle ~/.config/zsh/zshrc
908 alias ls='exa -lh --icons --git --group-directories-first'
909 alias la='exa -lha --icons --git --group-directories-first'
910 alias df='df -h / /boot'
917 alias grep='grep -in --exclude-dir=.git --color=auto'
918 alias fname='find -name'
919 alias mkdir='mkdir -pv'
920 alias unar='atool -x'
921 alias wget='wget -e robots=off'
922 alias lanex='~/.local/share/lxc/lxc'
925 #+begin_src shell :tangle ~/.config/zsh/zshrc
928 alias vw="nvim ~/Documents/vimwiki/index.md"
930 **** System management
931 #+begin_src shell :tangle ~/.config/zsh/zshrc
932 alias jctl='journalctl -p 3 -xb'
933 alias pkill='pkill -i'
935 alias redoas='doas $(fc -ln -1)'
936 alias crontab='crontab-argh'
937 alias sudo='doas ' # allows aliases to be run with doas
938 alias pasu='git -C ~/.password-store push'
939 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
943 #+begin_src shell :tangle ~/.config/zsh/zshrc
944 alias ping='ping -c 10'
945 alias speed='speedtest-cli'
946 alias ip='ip --color=auto'
947 alias cip='curl https://armaanb.net/ip'
948 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
949 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
950 alias plan='T=$(mktemp) && \
951 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
953 head -n -2 $T > $TT && \
955 echo "\nLast updated: $(date -R)" >> "$TT" && \
956 fold -sw 72 "$TT" > "$T"| \
957 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
958 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
961 #+begin_src shell :tangle ~/.config/zsh/zshrc
962 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
963 iflag=fullblock status=progress'
964 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
965 iflag=fullblock status=progress'
966 alias ts='gen-shell -c task'
967 alias ts='gen-shell -c task'
968 alias tetris='autoload -Uz tetriscurses && tetriscurses'
969 alias news='newsboat'
970 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
971 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
972 --restrict-filenames -o '%(title)s.%(ext)s'"
973 alias cal="cal -3 --color=auto"
976 **** Virtual machines, chroots
977 #+begin_src shell :tangle ~/.config/zsh/zshrc
978 alias ckiss="sudo chrooter ~/Virtual/kiss"
979 alias cdebian="sudo chrooter ~/Virtual/debian bash"
980 alias cwindows='devour qemu-system-x86_64 \
985 -device VGA,vgamem_mb=64 \
989 -net user,smb=/home/armaa/Public \
990 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
993 #+begin_src shell :tangle ~/.config/zsh/zshrc
995 alias zpy="zconda && ipython"
996 alias math="ipython --profile=math"
997 alias pypi="python setup.py sdist && twine upload dist/*"
998 alias pip="python -m pip"
999 alias black="black -l 79"
1002 #+begin_src shell :tangle ~/.config/zsh/zshrc
1003 alias words='gen-shell -c "words"'
1004 alias words-e='gen-shell -c "words ~E"'
1007 #+begin_src shell :tangle ~/.config/zsh/zshrc
1008 alias zathura='devour zathura'
1009 alias mpv='devour mpv'
1010 alias sql='devour sqlitebrowser'
1011 alias cad='devour openscad'
1012 alias feh='devour feh'
1014 **** Package management (Pacman)
1015 #+begin_src shell :tangle ~/.config/zsh/zshrc
1017 alias api='yay -Syu'
1018 alias apii='sudo pacman -S'
1019 alias app='yay -Rns'
1021 alias apo='yay -Qttd'
1022 alias azf='pacman -Q | fzf'
1023 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1024 alias ufetch='ufetch-arch'
1025 alias reflect='reflector --verbose --sort rate --save \
1026 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1028 **** Package management (KISS)
1029 #+begin_src shell :tangle ~/.config/zsh/zshrc
1030 alias kzf="kiss s \* | xargs -l basename | \
1031 fzf --preview 'kiss search {} | xargs -l dirname'"
1034 #+begin_src shell :tangle ~/.config/zsh/zshrc
1035 export EDITOR="emacsclient -c"
1036 export VISUAL="$EDITOR"
1037 export TERM=xterm-256color # for compatability
1039 export GPG_TTY="$(tty)"
1040 export MANPAGER='nvim +Man!'
1043 export GTK_USE_PORTAL=1
1045 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1046 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
1047 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
1048 export PATH="$PATH:/home/armaa/.cargo/bin"
1049 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1050 export PATH="$PATH:/usr/sbin"
1051 export PATH="$PATH:/opt/FreeTube/freetube"
1053 export LC_ALL="en_US.UTF-8"
1054 export LC_CTYPE="en_US.UTF-8"
1055 export LANGUAGE="en_US.UTF-8"
1057 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
1058 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1059 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1060 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1061 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1062 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1066 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1069 family: JetBrains Mono Nerd Font
1076 ligatures: true # Requires ligature patch
1083 background_opacity: 1
1086 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1087 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1091 background: '#000000'
1092 foreground: '#ffffff'
1096 background: '#ffffff'
1098 # Normal colors (except green it is from intense colors)
1109 # Bright colors [all the faint colors in the modus theme]
1120 # dim [all the intense colors in modus theme]
1133 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1134 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1135 c.TerminalInteractiveShell.editing_mode = 'vi'
1136 c.InteractiveShell.colors = 'linux'
1137 c.TerminalInteractiveShell.confirm_exit = False
1140 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1144 return x * (180 / pi)
1147 return x * (pi / 180)
1150 return (x * (pi / 180)) / unit
1162 Make MPV play a little bit smoother.
1163 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1164 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1168 For any GNU Readline programs
1169 #+begin_src conf :tangle ~/.inputrc
1174 #+begin_src conf :tangle ~/.gitconfig
1176 name = Armaan Bhojwani
1177 email = me@armaanb.net
1178 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1181 #+begin_src conf :tangle ~/.gitconfig
1183 defaultBranch = main
1186 #+begin_src conf :tangle ~/.gitconfig
1191 #+begin_src conf :tangle ~/.gitconfig
1193 smtpserver = smtp.mailbox.org
1194 smtpuser = me@armaanb.net
1195 smtpencryption = ssl
1196 smtpserverport = 465
1200 #+begin_src conf :tangle ~/.gitconfig
1205 #+begin_src conf :tangle ~/.gitconfig
1208 sclone = clone --depth 1
1214 subup = submodule update --remote
1215 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1216 mirror = git config --global alias.mirrormirror
1217 pushnc = push -o skip-ci
1220 #+begin_src conf :tangle ~/.gitconfig
1226 Lightweight notification daemon.
1228 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1230 font = "JetBrains Mono Medium Nerd Font 11"
1232 format = "<b>%s</b>\n%b"
1234 indicate_hidden = yes
1237 show_age_threshold = 60
1240 geometry = "400x5-10+10"
1242 idle_threshold = 120
1244 sticky_history = yes
1246 separator_height = 1
1248 horizontal_padding = 8
1250 separator_color = "#ffffff"
1251 startup_notification = false
1254 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1261 close_all = mod4+shift+c
1262 history = mod4+ctrl+c
1265 background = "#222222"
1266 foreground = "#ffffff"
1267 highlight = "#ffffff"
1271 background = "#222222"
1272 foreground = "#ffffff"
1273 highlight = "#ffffff"
1277 background = "#222222"
1278 foreground = "#a60000"
1279 highlight = "#ffffff"
1284 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1286 map <A-b> toggle_statusbar
1287 set selection-clipboard clipboard
1290 set window-title-basename "true"
1291 set selection-clipboard "clipboard"
1294 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1295 set default-bg "#000000"
1296 set default-fg "#ffffff"
1297 set render-loading true
1298 set render-loading-bg "#000000"
1299 set render-loading-fg "#ffffff"
1301 set recolor-lightcolor "#000000" # bg
1302 set recolor-darkcolor "#ffffff" # fg
1306 *** Swap tab and URL bars
1307 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1309 -moz-box-ordinal-group: 1 !important;
1313 -moz-box-ordinal-group: 2 !important;
1317 -moz-box-ordinal-group: 3 !important;
1320 *** Hide URL bar when not focused.
1321 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1322 #navigator-toolbox:not(:focus-within):not(:hover) {
1326 #navigator-toolbox {
1327 transition: 0.1s margin-top ease-out;
1330 ** Black screen by default
1331 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1334 #browser vbox#appcontent tabbrowser,
1336 #tabbrowser-tabpanels,
1338 browser[type="content-primary"],
1339 browser[type="content"] > html,
1341 background: black !important;
1342 color: #fff !important;
1345 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1346 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1348 background: black !important;
1355 #+begin_src conf :tangle ~/.Xresources
1357 ,*.foreground: #ffffff
1358 ,*.background: #000000
1359 ,*.cursorColor: #ffffff
1394 #+begin_src conf :tangle ~/.Xresources
1395 xterm*VT100.Translations: #override \
1396 Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1397 Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
1398 Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
1399 Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1402 #+begin_src conf :tangle ~/.Xresources
1403 xterm*cursorBlink: true
1406 #+begin_src conf :tangle ~/.Xresources
1407 XTerm*eightBitInput: false
1408 XTerm*eightBitOutput: true