1 #+TITLE: System Configuration
2 #+DESCRIPTION: Personal system configuration in org-mode format.
3 #+AUTHOR: Armaan Bhojwani
4 #+EMAIL: me@armaanb.net
7 Welcome to my system configuration! This file contains my Emacs configuration, but also my config files for many of the other programs on my system!
9 I am currently using GCCEmacs 28 from the feature/native-comp branch, so some settings may not be available for older versions of Emacs. This is a purely personal configuration, so while I can garuntee that it works on my setup, I can't for anything else.
11 I chose to create a powerful, yet not overly heavy Emacs configuration. Things like LSP mode are important to my workflow and help me be productive, so despite its weight, it is kept. Things like a fancy modeline or icons on the other hand, do not increase my productivity, and create visual clutter, and thus have been excluded.
13 Another important choice has been to integrate Emacs into a large part of my computing environment (see [[*EmacsOS]]). I use Email, IRC, et cetera, all through Emacs which simplifies my workflow.
15 Lastly, I use Evil mode. I think modal keybindings are simple and more ergonomic than standard Emacs style, and Vim keybindings are what I'm comfortable with and are pervasive throughout computing.
17 *** TODO Turn keybinding and hook declarations into use-package declarations where possible
18 *** TODO Put configs with passwords in here with some kind of authentication
22 Released under the [[https://opensource.org/licenses/MIT][MIT license]] by Armaan Bhojwani, 2021. Note that many snippets are taken from online, and other sources, who are credited for their work at the snippet.
24 ** Bootstrap straight.el
25 straight.el is really nice for managing package, and it integrates nicely with use-package. It uses the bootstrapping system defined here for installation.
26 #+begin_src emacs-lisp
27 (defvar bootstrap-version)
29 (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
30 (bootstrap-version 5))
31 (unless (file-exists-p bootstrap-file)
33 (url-retrieve-synchronously
34 "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
35 'silent 'inhibit-cookies)
36 (goto-char (point-max))
37 (eval-print-last-sexp)))
38 (load bootstrap-file nil 'nomessage))
40 ** Replace use-package with straight
41 #+begin_src emacs-lisp
42 (straight-use-package 'use-package)
43 (setq straight-use-package-by-default t)
47 Very nice high contrast theme.
49 Its fine to set this here because I run Emacs in daemon mode, but if I were not, then putting it in early-init.el would be a better choice to eliminate the window being white before the theme is loaded.
50 #+begin_src emacs-lisp
51 (setq modus-themes-slanted-constructs t
52 modus-themes-bold-constructs t
53 modus-themes-mode-line '3d
54 modus-themes-scale-headings t
55 modus-themes-diffs 'desaturated)
56 (load-theme 'modus-vivendi t)
60 Great programming font with ligatures.
61 #+begin_src emacs-lisp
62 (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
65 #+begin_src emacs-lisp
67 :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
69 (ligature-set-ligatures
70 '(prog-mode text-mode)
71 '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
72 "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
73 "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
74 "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
75 "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
76 ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
77 "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
78 "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
79 "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
80 "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
81 "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
82 "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
83 (global-ligature-mode t))
86 Display relative line numbers except in some modes
87 #+begin_src emacs-lisp
88 (global-display-line-numbers-mode)
89 (setq display-line-numbers-type 'relative)
90 (dolist (no-line-num '(term-mode-hook
95 (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
97 ** Highlight matching parenthesis
98 #+begin_src emacs-lisp
100 :config (show-paren-mode)
101 :custom (show-paren-style 'parenthesis))
104 *** Show current function
105 #+begin_src emacs-lisp
106 (which-function-mode)
108 *** Make position in file more descriptive
109 Show current column and file size.
110 #+begin_src emacs-lisp
112 (size-indication-mode)
115 #+begin_src emacs-lisp
117 :config (minions-mode))
120 Show a ruler at a certain number of chars depending on mode.
121 #+begin_src emacs-lisp
122 (setq display-fill-column-indicator-column 80)
123 (global-display-fill-column-indicator-mode)
126 Whenever starting a key chord, show possible future steps.
127 #+begin_src emacs-lisp
128 (use-package which-key
129 :config (which-key-mode)
130 :custom (which-key-idle-delay 0.3))
132 ** Highlight TODOs in comments
133 #+begin_src emacs-lisp
135 :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
136 :config (global-hl-todo-mode 1))
139 #+begin_src emacs-lisp
143 Soft wrap words and do operations by visual lines.
144 #+begin_src emacs-lisp
145 (add-hook 'text-mode-hook 'visual-line-mode 1)
147 ** Display number of matches in search
148 #+begin_src emacs-lisp
150 :config (global-anzu-mode))
153 Inverts modeline instead of audible bell or the standard visual bell.
154 #+begin_src emacs-lisp
155 (setq visible-bell nil
157 (lambda () (invert-face 'mode-line)
158 (run-with-timer 0.1 nil #'invert-face 'mode-line)))
162 #+begin_src emacs-lisp
164 :custom (select-enable-clipboard nil)
167 (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
168 ;; Use visual line motions even outside of visual-line-mode buffers
169 (evil-global-set-key 'motion "j" 'evil-next-visual-line)
170 (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
171 (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
174 #+begin_src emacs-lisp
175 (use-package evil-collection
177 :init (evil-collection-init)
178 :custom (evil-collection-setup-minibuffer t))
182 #+begin_src emacs-lisp
183 (use-package evil-surround
184 :config (global-evil-surround-mode))
187 #+begin_src emacs-lisp
188 (use-package evil-leader
189 :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
191 (evil-leader/set-leader "<SPC>")
192 (global-evil-leader-mode))
195 #+begin_src emacs-lisp
197 (use-package evil-nerd-commenter
198 :bind (:map evil-normal-state-map
199 ("gc" . evilnc-comment-or-uncomment-lines))
200 :custom (evilnc-invert-comment-line-by-line nil))
204 #+begin_src emacs-lisp
205 (evil-set-undo-system 'undo-redo)
207 ** Number incrementing
209 #+begin_src emacs-lisp
210 (use-package evil-numbers
211 :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
212 :bind (:map evil-normal-state-map
213 ("C-M-a" . evil-numbers/inc-at-pt)
214 ("C-M-x" . evil-numbers/dec-at-pt)))
218 #+begin_src emacs-lisp
219 (use-package evil-org
221 :hook (org-mode . evil-org-mode)
223 (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
224 (use-package evil-org-agenda
225 :straight (:type built-in)
227 :config (evil-org-agenda-set-keys))
230 #+begin_src emacs-lisp
231 (evil-leader/set-key-for-mode 'org-mode
232 "T" 'org-show-todo-tree
234 "c" 'org-archive-subtree)
238 #+begin_src emacs-lisp
240 :straight (:type built-in)
241 :commands (org-capture org-agenda)
244 (org-agenda-start-with-log-mode t)
245 (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
247 (org-log-into-drawer t)
248 (org-src-tab-acts-natively t)
249 (org-src-fontify-natively t)
250 (org-startup-indented t)
251 (org-hide-emphasis-markers t)
252 (org-fontify-whole-block-delimiter-line nil)
253 :bind ("C-c a" . org-agenda))
256 #+begin_src emacs-lisp
257 (use-package org-tempo
259 :straight (:type built-in)
261 ;; TODO: There's gotta be a more efficient way to write this
262 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
263 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
264 (add-to-list 'org-structure-template-alist '("ash" . "src shell :tangle ~/.config/ash/ashrc"))
265 (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
266 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
267 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
268 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
269 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
270 (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
271 (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
272 (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
273 (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources")))
277 Simple, but not too simple autocompletion.
278 #+begin_src emacs-lisp
280 :bind (("C-s" . swiper)
281 :map ivy-minibuffer-map
282 ("TAB" . ivy-alt-done)
283 :map ivy-switch-buffer-map
284 ("M-d" . ivy-switch-buffer-kill))
288 #+begin_src emacs-lisp
289 (use-package ivy-rich
291 :config (ivy-rich-mode))
295 #+begin_src emacs-lisp
297 :bind (("C-M-j" . 'counsel-switch-buffer)
298 :map minibuffer-local-map
299 ("C-r" . 'counsel-minibuffer-history))
300 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
301 :config (counsel-mode))
303 ** Remember frequent commands
304 #+begin_src emacs-lisp
305 (use-package ivy-prescient
308 (ivy-prescient-enable-filtering nil)
310 (prescient-persist-mode)
311 (ivy-prescient-mode))
314 Better search utility.
315 #+begin_src emacs-lisp
320 Use elfeed for RSS. I have another file with all the feeds in it.
321 #+begin_src emacs-lisp
323 :bind (("C-c e" . elfeed))
325 (load "~/.emacs.d/feeds.el")
326 (add-hook 'elfeed-new-entry-hook
327 (elfeed-make-tagger :feed-url "youtube\\.com"
329 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
331 (use-package elfeed-goodies
333 :config (elfeed-goodies/setup))
336 Use mu4e for reading emails.
338 I use `offlineimap` to sync my maildirs. It is slower than mbsync, but is fast enough for me, especially when ran with the =-q= option.
340 Contexts are a not very well known feature of mu4e that makes it super easy to manage multiple accounts. Much better than some of the hacky methods and external packages that I've seen.
341 #+begin_src emacs-lisp
342 (use-package smtpmail
343 :straight (:type built-in))
345 :load-path "/usr/share/emacs/site-lisp/mu4e"
346 :straight (:build nil)
347 :bind (("C-c m" . mu4e))
349 (setq user-full-name "Armaan Bhojwani"
350 smtpmail-local-domain "armaanb.net"
351 smtpmail-stream-type 'ssl
352 smtpmail-smtp-service '465
353 mu4e-change-filenames-when-moving t
354 mu4e-get-mail-command "offlineimap -q"
355 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
356 message-citation-line-function 'message-insert-formatted-citation-line
357 mu4e-completing-read-function 'ivy-completing-read
358 mu4e-confirm-quit nil
359 mail-user-agent 'mu4e-user-agent
361 `( ,(make-mu4e-context
363 :enter-func (lambda () (mu4e-message "Entering school context"))
364 :leave-func (lambda () (mu4e-message "Leaving school context"))
365 :match-func (lambda (msg)
367 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
368 :vars '((user-mail-address . "abhojwani22@nobles.edu")
369 (mu4e-sent-folder . "/school/Sent")
370 (mu4e-drafts-folder . "/school/Drafts")
371 (mu4e-trash-folder . "/school/Trash")
372 (mu4e-refile-folder . "/school/Archive")
373 (message-cite-reply-position . above)
374 (user-mail-address . "abhojwani22@nobles.edu")
375 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
376 (smtpmail-smtp-server . "smtp.gmail.com")))
379 :enter-func (lambda () (mu4e-message "Entering personal context"))
380 :leave-func (lambda () (mu4e-message "Leaving personal context"))
381 :match-func (lambda (msg)
383 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
384 :vars '((mu4e-sent-folder . "/personal/Sent")
385 (mu4e-drafts-folder . "/personal/Drafts")
386 (mu4e-trash-folder . "/personal/Trash")
387 (mu4e-refile-folder . "/personal/Archive")
388 (user-mail-address . "me@armaanb.net")
389 (message-cite-reply-position . below)
390 (smtpmail-smtp-user . "me@armaanb.net")
391 (smtpmail-smtp-server . "smtp.mailbox.org")))))
392 (add-to-list 'mu4e-bookmarks
393 '(:name "Unified inbox"
394 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
396 :hook ((mu4e-compose-mode . flyspell-mode)
397 (mu4e-compose-mode . auto-fill-mode)
398 (mu4e-view-mode-hook . turn-on-visual-line-mode)))
401 Set EWW as default browser except for videos.
402 #+begin_src emacs-lisp
403 (defun browse-url-mpv (url &optional new-window)
405 (start-process "mpv" "*mpv*" "mpv" url))
407 (setq browse-url-handlers
409 (("youtu\\.?be" . browse-url-mpv)
410 ("peertube.*" . browse-url-mpv)
411 ("vid.*" . browse-url-mpv)
412 ("vid.*" . browse-url-mpv)
413 ("." . eww-browse-url)
417 Some EWW enhancements.
418 *** Give buffer a useful name
419 #+begin_src emacs-lisp
420 ;; From https://protesilaos.com/dotemacs/
421 (defun prot-eww--rename-buffer ()
422 "Rename EWW buffer using page title or URL.
423 To be used by `eww-after-render-hook'."
424 (let ((name (if (eq "" (plist-get eww-data :title))
425 (plist-get eww-data :url)
426 (plist-get eww-data :title))))
427 (rename-buffer (format "*%s # eww*" name) t)))
430 :straight (:type built-in)
431 :bind (("C-c w" . eww))
432 :hook (eww-after-render-hook prot-eww--rename-buffer))
434 *** Better entrypoint
435 #+begin_src emacs-lisp
436 ;; From https://protesilaos.com/dotemacs/
437 (defun prot-eww-browse-dwim (url &optional arg)
438 "Visit a URL, maybe from `eww-prompt-history', with completion.
440 With optional prefix ARG (\\[universal-argument]) open URL in a
443 If URL does not look like a valid link, run a web query using
446 When called from an eww buffer, provide the current link as
450 (completing-read "Query:" eww-prompt-history
451 nil nil (plist-get eww-data :url) 'eww-prompt-history)
453 (eww url (if arg 4 nil)))
455 (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
458 #+begin_src emacs-lisp
460 :straight (:type built-in)
462 (load "~/.emacs.d/irc.el")
464 (erc-notifications-enable)
465 (erc-smiley-disable))
467 (use-package erc-hl-nicks
468 :config (erc-hl-nicks-mode 1))
471 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
472 #+begin_src emacs-lisp
473 (use-package emacs-everywhere)
477 #+begin_src emacs-lisp
479 :hook (python-mode . blacken-mode)
480 :config (setq blacken-line-length 79))
483 (use-package ws-butler
484 :config (ws-butler-global-mode))
487 #+begin_src emacs-lisp
488 (use-package flycheck
489 :config (global-flycheck-mode))
491 ** Project management
492 #+begin_src emacs-lisp
493 (use-package projectile
494 :config (projectile-mode)
495 :custom ((projectile-completion-system 'ivy))
497 ("C-c p" . projectile-command-map)
499 (when (file-directory-p "~/Code")
500 (setq projectile-project-search-path '("~/Code")))
501 (setq projectile-switch-project-action #'projectile-dired))
503 (use-package counsel-projectile
505 :config (counsel-projectile-mode))
508 #+begin_src emacs-lisp
510 :straight (:type built-in)
511 :commands (dired dired-jump)
512 :custom ((dired-listing-switches "-agho --group-directories-first"))
513 :config (evil-collection-define-key 'normal 'dired-mode-map
514 "h" 'dired-single-up-directory
515 "l" 'dired-single-buffer))
517 (use-package dired-single
518 :commands (dired dired-jump))
520 (use-package dired-open
521 :commands (dired dired-jump)
522 :custom (dired-open-extensions '(("png" . "feh")
525 (use-package dired-hide-dotfiles
526 :hook (dired-mode . dired-hide-dotfiles-mode)
528 (evil-collection-define-key 'normal 'dired-mode-map
529 "H" 'dired-hide-dotfiles-mode))
533 # TODO: Write a command that commits hunk, skipping staging step.
534 #+begin_src emacs-lisp
537 *** Colored diff in line number area
538 #+begin_src emacs-lisp
540 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
541 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
542 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
543 :config (global-diff-hl-mode))
545 * General text editing
547 Indent after every change.
548 #+begin_src emacs-lisp
549 (use-package aggressive-indent
550 :config (global-aggressive-indent-mode))
553 Spell check in text mode, and in prog-mode comments.
554 #+begin_src emacs-lisp
555 (dolist (hook '(text-mode-hook))
556 (add-hook hook (lambda () (flyspell-mode))))
557 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
558 (add-hook hook (lambda () (flyspell-mode -1))))
559 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
561 ** Expand tabs to spaces
562 #+begin_src emacs-lisp
563 (setq-default tab-width 2)
565 ** Copy kill ring to clipboard
566 #+begin_src emacs-lisp
567 (setq x-select-enable-clipboard t)
568 (defun copy-kill-ring-to-xorg ()
569 "Copy the current kill ring to the xorg clipboard."
571 (x-select-text (current-kill 0)))
574 Opens file where you left it.
575 #+begin_src emacs-lisp
579 Distraction free writing a la junegunn/goyo.
580 #+begin_src emacs-lisp
581 (use-package olivetti
583 (evil-leader/set-key "o" 'olivetti-mode))
587 #+begin_src emacs-lisp
588 (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
589 (setq save-abbrevs 'silent)
590 (setq-default abbrev-mode t)
593 #+begin_src emacs-lisp
594 (setq tramp-default-method "ssh")
596 ** Don't ask about following symlinks in vc
597 #+begin_src emacs-lisp
598 (setq vc-follow-symlinks t)
600 ** Don't ask to save custom dictionary
601 #+begin_src emacs-lisp
602 (setq ispell-silently-savep t)
606 #+begin_src emacs-lisp
607 (use-package ace-window
608 :bind ("M-o" . ace-window))
610 ** Kill current buffer
611 Makes "C-x k" binding faster.
612 #+begin_src emacs-lisp
613 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
617 #+begin_src emacs-lisp
618 (use-package scad-mode)
620 ** Control backup files
621 Stop backup files from spewing everywhere.
622 #+begin_src emacs-lisp
623 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
625 ** Make yes/no easier
626 #+begin_src emacs-lisp
627 (defalias 'yes-or-no-p 'y-or-n-p)
629 ** Move customize file
630 No more clogging up init.el.
631 #+begin_src emacs-lisp
632 (setq custom-file "~/.emacs.d/custom.el")
636 #+begin_src emacs-lisp
638 :commands (helpful-callable helpful-variable helpful-command helpful-key)
640 (counsel-describe-function-function #'helpful-callable)
641 (counsel-describe-variable-function #'helpful-variable)
643 ([remap describe-function] . counsel-describe-function)
644 ([remap describe-command] . helpful-command)
645 ([remap describe-variable] . counsel-describe-variable)
646 ([remap describe-key] . helpful-key))
649 #+begin_src emacs-lisp
650 (use-package epa-file
651 :straight (:type built-in)
653 (epa-file-select-keys nil)
654 (epa-file-encrypt-to '("me@armaanb.net"))
655 (password-cache-expiry (* 60 15)))
657 (use-package pinentry
658 :config (pinentry-start))
661 #+begin_src emacs-lisp
663 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
664 :custom (0x0-default-service 'envs)
665 :config (evil-leader/set-key
667 "0f" '0x0-upload-file
668 "0s" '0x0-upload-string
669 "0c" '0x0-upload-kill-ring
670 "0p" '0x0-upload-popup))
675 #+begin_src conf :tangle ~/.spectrwm.conf
679 autorun = ws[1]:/home/armaa/Code/scripts/autostart
682 #+begin_src conf :tangle ~/.spectrwm.conf
684 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
688 #+begin_src conf :tangle ~/.spectrwm.conf
689 program[term] = alacritty
690 program[screenshot_all] = flameshot gui
691 program[notif] = /home/armaa/Code/scripts/setter status
692 program[pass] = /home/armaa/Code/scripts/passmenu
695 bind[pass] = MOD+Shift+p
698 #+begin_src conf :tangle ~/.spectrwm.conf
699 program[paup] = /home/armaa/Code/scripts/setter audio +5
700 program[padown] = /home/armaa/Code/scripts/setter audio -5
701 program[pamute] = /home/armaa/Code/scripts/setter audio
702 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
703 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
704 program[next] = playerctl next
705 program[prev] = playerctl previous
706 program[pause] = playerctl play-pause
708 bind[padown] = XF86AudioLowerVolume
709 bind[paup] = XF86AudioRaiseVolume
710 bind[pamute] = XF86AudioMute
711 bind[brigdown] = XF86MonBrightnessDown
712 bind[brigup] = XF86MonBrightnessUp
713 bind[pause] = XF86AudioPlay
714 bind[next] = XF86AudioNext
715 bind[prev] = XF86AudioPrev
718 #+begin_src conf :tangle ~/.spectrwm.conf
719 program[h] = xdotool keyup h key --clearmodifiers Left
720 program[j] = xdotool keyup j key --clearmodifiers Down
721 program[k] = xdotool keyup k key --clearmodifiers Up
722 program[l] = xdotool keyup l key --clearmodifiers Right
724 bind[h] = MOD + Control + h
725 bind[j] = MOD + Control + j
726 bind[k] = MOD + Control + k
727 bind[l] = MOD + Control + l
730 #+begin_src conf :tangle ~/.spectrwm.conf
731 program[aerc] = alacritty -e aerc
732 program[catgirl] = alacritty --hold -e sh -c "while : ; do ssh root@armaanb.net -t abduco -A irc catgirl freenode; sleep 2; done"
733 program[emacs] = emacsclient -c
734 program[firefox] = firefox
735 program[calc] = alacritty -e because -l
736 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
738 bind[aerc] = MOD+Control+1
739 bind[catgirl] = MOD+Control+2
740 bind[firefox] = MOD+Control+3
741 bind[emacs-anywhere] = MOD+Control+4
742 bind[calc] = MOD+Control+5
743 bind[emacs] = MOD+Control+Return
746 #+begin_src conf :tangle ~/.spectrwm.conf
747 quirk[Castle Menu] = FLOAT
752 #+begin_src conf :tangle ~/.config/ash/ashrc
756 **** Update all packages
757 #+begin_src shell :tangle ~/.config/ash/ashrc
758 color=$(tput setaf 5)
762 sudo echo "${color}== upgrading with yay ==${reset}"
765 echo "${color}== checking for pacnew files ==${reset}"
768 echo "${color}== upgrading flatpaks ==${reset}"
771 echo "${color}== upgrading zsh plugins ==${reset}"
774 echo "${color}== updating nvim plugins ==${reset}"
775 nvim +PlugUpdate +PlugUpgrade +qall
776 echo "Updated nvim plugins"
778 echo "${color}You are entirely up to date!${reset}"
781 **** Clean all packages
782 #+begin_src shell :tangle ~/.config/ash/ashrc
784 sudo echo "${color}== cleaning pacman orphans ==${reset}"
785 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
787 echo "${color}== cleaning flatpaks ==${reset}"
788 flatpak remove --unused
790 echo "${color}== cleaning zsh plugins ==${reset}"
793 echo "${color}== cleaning nvim plugins ==${reset}"
794 nvim +PlugClean +qall
795 echo "Cleaned nvim plugins"
797 echo "${color}All orphans cleaned!${reset}"
800 **** Interact with 0x0
801 #+begin_src shell :tangle ~/.config/ash/ashrc
802 zxz="https://envs.sh"
803 ufile() { curl -F"file=@$1" "$zxz" ; }
804 upb() { curl -F"file=@-;" "$zxz" ; }
805 uurl() { curl -F"url=$1" "$zxz" ; }
806 ushort() { curl -F"shorten=$1" "$zxz" ; }
807 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
810 #+begin_src shell :tangle ~/.config/ash/ashrc
812 user=$(echo "$1" | cut -f 1 -d '@')
813 host=$(echo "$1" | cut -f 2 -d '@')
814 echo $user | nc "$host" 79 -N
817 **** Upload to ftp.armaanb.net
818 #+begin_src shell :tangle ~/.config/ash/ashrc
820 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
821 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
826 #+begin_src shell :tangle ~/.config/ash/ashrc
827 alias bhoji-drop='ssh -p 23 root@armaanb.net'
828 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
829 alias union='ssh 192.168.1.18'
830 alias mine='ssh -p 23 root@pickupserver.cc'
831 alias tcf='ssh root@204.48.23.68'
832 alias ngmun='ssh root@157.245.89.25'
833 alias prox='ssh root@192.168.1.224'
834 alias ncq='ssh root@143.198.123.17'
835 alias envs='ssh acheam@envs.net'
838 #+begin_src shell :tangle ~/.config/ash/ashrc
839 alias ls='exa -lh --icons --git --group-directories-first'
840 alias la='exa -lha --icons --git --group-directories-first'
841 alias df='df -h / /boot'
848 alias grep='grep -in --exclude-dir=.git --color=auto'
849 alias fname='find -name'
850 alias mkdir='mkdir -pv'
851 alias unar='atool -x'
852 alias wget='wget -e robots=off'
853 alias lanex='~/.local/share/lxc/lxc'
856 **** System management
857 #+begin_src shell :tangle ~/.config/ash/ashrc
858 alias jctl='journalctl -p 3 -xb'
859 alias pkill='pkill -i'
861 alias redoas='doas $(fc -ln -1)'
862 alias crontab='crontab-argh'
863 alias sudo='doas ' # allows aliases to be run with doas
864 alias pasu='git -C ~/.password-store push'
865 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
869 #+begin_src shell :tangle ~/.config/ash/ashrc
870 alias ping='ping -c 10'
871 alias speed='speedtest-cli'
872 alias ip='ip --color=auto'
873 alias cip='curl https://armaanb.net/ip'
874 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
875 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
876 alias plan='T=$(mktemp) && \
877 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
879 head -n -2 $T > $TT && \
881 echo "\nLast updated: $(date -R)" >> "$TT" && \
882 fold -sw 72 "$TT" > "$T"| \
883 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
884 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
887 #+begin_src shell :tangle ~/.config/ash/ashrc
888 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
889 iflag=fullblock status=progress'
890 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
891 iflag=fullblock status=progress'
892 alias ts='gen-shell -c task'
893 alias ts='gen-shell -c task'
894 alias tetris='autoload -Uz tetriscurses && tetriscurses'
895 alias news='newsboat'
896 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
897 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
898 --restrict-filenames -o '%(title)s.%(ext)s'"
899 alias cal="cal -3 --color=auto"
902 **** Virtual machines, chroots
903 #+begin_src shell :tangle ~/.config/ash/ashrc
904 alias ckiss="sudo chrooter ~/Virtual/kiss"
905 alias cdebian="sudo chrooter ~/Virtual/debian bash"
906 alias cwindows='devour qemu-system-x86_64 \
911 -device VGA,vgamem_mb=64 \
915 -net user,smb=/home/armaa/Public \
916 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
919 #+begin_src shell :tangle ~/.config/ash/ashrc
921 alias zpy="zconda && ipython"
922 alias math="ipython --profile=math"
923 alias pypi="python setup.py sdist && twine upload dist/*"
924 alias pip="python -m pip"
925 alias black="black -l 79"
928 #+begin_src shell :tangle ~/.config/ash/ashrc
929 alias words='gen-shell -c "words"'
930 alias words-e='gen-shell -c "words ~E"'
933 #+begin_src shell :tangle ~/.config/ash/ashrc
934 alias zathura='devour zathura'
935 alias mpv='devour mpv'
936 alias sql='devour sqlitebrowser'
937 alias cad='devour openscad'
938 alias feh='devour feh'
940 **** Package management (Pacman)
941 #+begin_src shell :tangle ~/.config/ash/ashrc
944 alias apii='sudo pacman -S'
947 alias apo='yay -Qttd'
948 alias azf='pacman -Q | fzf'
949 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
950 alias ufetch='ufetch-arch'
951 alias reflect='reflector --verbose --sort rate --save \
952 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
954 **** Package management (KISS)
955 #+begin_src shell :tangle ~/.config/ash/ashrc
956 alias kzf="kiss s \* | xargs -l basename | \
957 fzf --preview 'kiss search {} | xargs -l dirname'"
960 #+begin_src shell :tangle ~/.config/ash/ashrc
961 export EDITOR="emacsclient -c"
962 export VISUAL="$EDITOR"
963 export TERM=xterm-256color # for compatability
965 export GPG_TTY="$(tty)"
966 export MANPAGER='nvim +Man!'
969 export GTK_USE_PORTAL=1
971 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
972 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
973 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
974 export PATH="$PATH:/home/armaa/.cargo/bin"
975 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
976 export PATH="$PATH:/usr/sbin"
977 export PATH="$PATH:/opt/FreeTube/freetube"
979 export LC_ALL="en_US.UTF-8"
980 export LC_CTYPE="en_US.UTF-8"
981 export LANGUAGE="en_US.UTF-8"
983 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
984 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
985 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
986 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
987 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
988 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
992 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
995 family: JetBrains Mono Nerd Font
1002 ligatures: true # Requires ligature patch
1009 background_opacity: 1
1012 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1013 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1017 background: '#000000'
1018 foreground: '#ffffff'
1022 background: '#ffffff'
1024 # Normal colors (except green it is from intense colors)
1035 # Bright colors [all the faint colors in the modus theme]
1046 # dim [all the intense colors in modus theme]
1059 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1060 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1061 c.TerminalInteractiveShell.editing_mode = 'vi'
1062 c.InteractiveShell.colors = 'linux'
1063 c.TerminalInteractiveShell.confirm_exit = False
1066 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1070 return x * (180 / pi)
1073 return x * (pi / 180)
1076 return (x * (pi / 180)) / unit
1088 Make MPV play a little bit smoother.
1089 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1090 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1094 For any GNU Readline programs
1095 #+begin_src conf :tangle ~/.inputrc
1096 set editing-mode emacs
1100 #+begin_src conf :tangle ~/.gitconfig
1102 name = Armaan Bhojwani
1103 email = me@armaanb.net
1104 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1107 #+begin_src conf :tangle ~/.gitconfig
1109 defaultBranch = main
1112 #+begin_src conf :tangle ~/.gitconfig
1117 #+begin_src conf :tangle ~/.gitconfig
1119 smtpserver = smtp.mailbox.org
1120 smtpuser = me@armaanb.net
1121 smtpencryption = ssl
1122 smtpserverport = 465
1126 #+begin_src conf :tangle ~/.gitconfig
1131 #+begin_src conf :tangle ~/.gitconfig
1134 sclone = clone --depth 1
1139 quickfix = commit . --amend --no-edit
1141 subup = submodule update --remote
1142 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1143 pushnc = push -o skip-ci
1146 #+begin_src conf :tangle ~/.gitconfig
1152 Lightweight notification daemon.
1154 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1156 font = "JetBrains Mono Medium Nerd Font 11"
1158 format = "<b>%s</b>\n%b"
1160 indicate_hidden = yes
1163 show_age_threshold = 60
1166 geometry = "400x5-10+10"
1168 idle_threshold = 120
1170 sticky_history = yes
1172 separator_height = 1
1174 horizontal_padding = 8
1176 separator_color = "#ffffff"
1177 startup_notification = false
1180 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1187 close_all = mod4+shift+c
1188 history = mod4+ctrl+c
1191 background = "#222222"
1192 foreground = "#ffffff"
1193 highlight = "#ffffff"
1197 background = "#222222"
1198 foreground = "#ffffff"
1199 highlight = "#ffffff"
1203 background = "#222222"
1204 foreground = "#a60000"
1205 highlight = "#ffffff"
1210 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1212 map <A-b> toggle_statusbar
1213 set selection-clipboard clipboard
1216 set window-title-basename "true"
1217 set selection-clipboard "clipboard"
1220 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1221 set default-bg "#000000"
1222 set default-fg "#ffffff"
1223 set render-loading true
1224 set render-loading-bg "#000000"
1225 set render-loading-fg "#ffffff"
1227 set recolor-lightcolor "#000000" # bg
1228 set recolor-darkcolor "#ffffff" # fg
1232 *** Swap tab and URL bars
1233 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1235 -moz-box-ordinal-group: 1 !important;
1239 -moz-box-ordinal-group: 2 !important;
1243 -moz-box-ordinal-group: 3 !important;
1246 *** Hide URL bar when not focused.
1247 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1248 #navigator-toolbox:not(:focus-within):not(:hover) {
1252 #navigator-toolbox {
1253 transition: 0.1s margin-top ease-out;
1256 ** Black screen by default
1257 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1260 #browser vbox#appcontent tabbrowser,
1262 #tabbrowser-tabpanels,
1264 browser[type="content-primary"],
1265 browser[type="content"] > html,
1267 background: black !important;
1268 color: #fff !important;
1271 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1272 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1274 background: black !important;
1281 #+begin_src conf :tangle ~/.Xresources
1283 ,*.foreground: #ffffff
1284 ,*.background: #000000
1285 ,*.cursorColor: #ffffff
1320 #+begin_src conf :tangle ~/.Xresources
1321 xterm*VT100.Translations: #override \
1322 Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1323 Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
1324 Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
1325 Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1328 #+begin_src conf :tangle ~/.Xresources
1329 xterm*cursorBlink: true
1332 #+begin_src conf :tangle ~/.Xresources
1333 XTerm*eightBitInput: false
1334 XTerm*eightBitOutput: true