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 Include offlineimap config
20 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.
22 ** Bootstrap straight.el
23 straight.el is really nice for managing package, and it integrates nicely with use-package. It uses the bootstrapping system defined here for installation.
24 #+begin_src emacs-lisp
25 (defvar bootstrap-version)
27 (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
28 (bootstrap-version 5))
29 (unless (file-exists-p bootstrap-file)
31 (url-retrieve-synchronously
32 "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
33 'silent 'inhibit-cookies)
34 (goto-char (point-max))
35 (eval-print-last-sexp)))
36 (load bootstrap-file nil 'nomessage))
38 ** Replace use-package with straight
39 #+begin_src emacs-lisp
40 (straight-use-package 'use-package)
41 (setq straight-use-package-by-default t)
45 Very nice high contrast theme.
47 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.
48 #+begin_src emacs-lisp
49 (setq modus-themes-slanted-constructs t
50 modus-themes-bold-constructs t
51 modus-themes-mode-line '3d
52 modus-themes-scale-headings t
53 modus-themes-diffs 'desaturated)
54 (load-theme 'modus-vivendi t)
58 Great programming font with ligatures.
59 #+begin_src emacs-lisp
60 (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
63 #+begin_src emacs-lisp
65 :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
67 (ligature-set-ligatures
68 '(prog-mode text-mode)
69 '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
70 "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
71 "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
72 "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
73 "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
74 ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
75 "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
76 "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
77 "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
78 "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
79 "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
80 "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
81 (global-ligature-mode t))
84 Display relative line numbers except in some modes
85 #+begin_src emacs-lisp
86 (global-display-line-numbers-mode)
87 (setq display-line-numbers-type 'relative)
88 (dolist (no-line-num '(term-mode-hook
93 (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
95 ** Highlight matching parenthesis
96 #+begin_src emacs-lisp
98 :config (show-paren-mode)
99 :custom (show-paren-style 'parenthesis))
102 *** Show current function
103 #+begin_src emacs-lisp
104 (which-function-mode)
106 *** Make position in file more descriptive
107 Show current column and file size.
108 #+begin_src emacs-lisp
110 (size-indication-mode)
113 #+begin_src emacs-lisp
115 :config (minions-mode))
118 Show a ruler at a certain number of chars depending on mode.
119 #+begin_src emacs-lisp
120 (setq display-fill-column-indicator-column 80)
121 (global-display-fill-column-indicator-mode)
124 Whenever starting a key chord, show possible future steps.
125 #+begin_src emacs-lisp
126 (use-package which-key
127 :config (which-key-mode)
128 :custom (which-key-idle-delay 0.3))
130 ** Highlight TODOs in comments
131 #+begin_src emacs-lisp
133 :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
134 :config (global-hl-todo-mode 1))
137 #+begin_src emacs-lisp
141 Soft wrap words and do operations by visual lines.
142 #+begin_src emacs-lisp
143 (add-hook 'text-mode-hook 'visual-line-mode 1)
145 ** Display number of matches in search
146 #+begin_src emacs-lisp
148 :config (global-anzu-mode))
151 Inverts modeline instead of audible bell or the standard visual bell.
152 #+begin_src emacs-lisp
153 (setq visible-bell nil
155 (lambda () (invert-face 'mode-line)
156 (run-with-timer 0.1 nil #'invert-face 'mode-line)))
160 #+begin_src emacs-lisp
162 :custom (select-enable-clipboard nil)
165 (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
166 ;; Use visual line motions even outside of visual-line-mode buffers
167 (evil-global-set-key 'motion "j" 'evil-next-visual-line)
168 (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
169 (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
172 #+begin_src emacs-lisp
173 (use-package evil-collection
175 :init (evil-collection-init)
176 :custom (evil-collection-setup-minibuffer t))
180 #+begin_src emacs-lisp
181 (use-package evil-surround
182 :config (global-evil-surround-mode))
185 #+begin_src emacs-lisp
186 (use-package evil-leader
187 :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
189 (evil-leader/set-leader "<SPC>")
190 (global-evil-leader-mode))
193 #+begin_src emacs-lisp
195 (use-package evil-nerd-commenter
196 :bind (:map evil-normal-state-map
197 ("gc" . evilnc-comment-or-uncomment-lines))
198 :custom (evilnc-invert-comment-line-by-line nil))
202 #+begin_src emacs-lisp
203 (evil-set-undo-system 'undo-redo)
205 ** Number incrementing
207 #+begin_src emacs-lisp
208 (use-package evil-numbers
209 :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
210 :bind (:map evil-normal-state-map
211 ("C-M-a" . evil-numbers/inc-at-pt)
212 ("C-M-x" . evil-numbers/dec-at-pt)))
216 #+begin_src emacs-lisp
217 (use-package evil-org
219 :hook (org-mode . evil-org-mode)
221 (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
222 (use-package evil-org-agenda
223 :straight (:type built-in)
225 :config (evil-org-agenda-set-keys))
228 #+begin_src emacs-lisp
229 (evil-leader/set-key-for-mode 'org-mode
230 "T" 'org-show-todo-tree
232 "c" 'org-archive-subtree)
236 #+begin_src emacs-lisp
238 :straight (:type built-in)
239 :commands (org-capture org-agenda)
242 (org-agenda-start-with-log-mode t)
243 (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
245 (org-log-into-drawer t)
246 (org-src-tab-acts-natively t)
247 (org-src-fontify-natively t)
248 (org-startup-indented t)
249 (org-hide-emphasis-markers t)
250 (org-fontify-whole-block-delimiter-line nil)
251 :bind ("C-c a" . org-agenda))
254 #+begin_src emacs-lisp
255 (use-package org-tempo
257 :straight (:type built-in)
259 ;; TODO: There's gotta be a more efficient way to write this
260 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
261 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
262 (add-to-list 'org-structure-template-alist '("ash" . "src shell :tangle ~/.config/ash/ashrc"))
263 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
264 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
265 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
266 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
267 (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
268 (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
269 (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
270 (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources"))
271 (add-to-list 'org-structure-template-alist '("tm" . "src conf :tangle ~/.tmux.conf"))
272 (add-to-list 'org-structure-template-alist '("gp" . "src conf :tangle ~/.gnupg/gpg.conf"))
273 (add-to-list 'org-structure-template-alist '("ag" . "src conf :tangle ~/.gnupg/gpg-agent.conf")))
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
307 :custom (ivy-prescient-enable-filtering nil)
309 (prescient-persist-mode)
310 (ivy-prescient-mode))
313 Better search utility.
314 #+begin_src emacs-lisp
319 Use elfeed for RSS. I have another file with all the feeds in it.
320 #+begin_src emacs-lisp
322 :bind (("C-c e" . elfeed))
324 (load "~/.emacs.d/feeds.el")
325 (add-hook 'elfeed-new-entry-hook
326 (elfeed-make-tagger :feed-url "youtube\\.com"
328 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
330 (use-package elfeed-goodies
332 :config (elfeed-goodies/setup))
335 Use mu4e for reading emails.
337 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.
339 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.
340 #+begin_src emacs-lisp
341 (use-package smtpmail
342 :straight (:type built-in))
344 :load-path "/usr/share/emacs/site-lisp/mu4e"
345 :straight (:build nil)
346 :bind (("C-c m" . mu4e))
348 (setq user-full-name "Armaan Bhojwani"
349 smtpmail-local-domain "armaanb.net"
350 smtpmail-stream-type 'ssl
351 smtpmail-smtp-service '465
352 mu4e-change-filenames-when-moving t
353 mu4e-get-mail-command "offlineimap -q"
354 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
355 message-citation-line-function 'message-insert-formatted-citation-line
356 mu4e-completing-read-function 'ivy-completing-read
357 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 Discourage Gnus from displaying HTML emails
402 #+begin_src emacs-lisp
403 (with-eval-after-load "mm-decode"
404 (add-to-list 'mm-discouraged-alternatives "text/html")
405 (add-to-list 'mm-discouraged-alternatives "text/richtext"))
408 Set EWW as default browser except for videos.
409 #+begin_src emacs-lisp
410 (defun browse-url-mpv (url &optional new-window)
412 (start-process "mpv" "*mpv*" "mpv" url))
414 (setq browse-url-handlers
416 (("youtu\\.?be" . browse-url-mpv)
417 ("peertube.*" . browse-url-mpv)
418 ("vid.*" . browse-url-mpv)
419 ("vid.*" . browse-url-mpv)
420 ("." . eww-browse-url)
424 Some EWW enhancements.
425 *** Give buffer a useful name
426 #+begin_src emacs-lisp
427 ;; From https://protesilaos.com/dotemacs/
428 (defun prot-eww--rename-buffer ()
429 "Rename EWW buffer using page title or URL.
430 To be used by `eww-after-render-hook'."
431 (let ((name (if (eq "" (plist-get eww-data :title))
432 (plist-get eww-data :url)
433 (plist-get eww-data :title))))
434 (rename-buffer (format "*%s # eww*" name) t)))
437 :straight (:type built-in)
438 :bind (("C-c w" . eww))
439 :hook (eww-after-render-hook prot-eww--rename-buffer))
442 #+begin_src emacs-lisp
443 (global-set-key (kbd "C-c w") 'eww)
446 #+begin_src emacs-lisp
450 (enable-circe-color-nicks))
452 (defun fetch-password (&rest params)
453 (require 'auth-source)
454 (let ((match (car (apply 'auth-source-search params))))
456 (let ((secret (plist-get match :secret)))
457 (if (functionp secret)
460 (error "Password not found for %S" params))))
462 (setq circe-network-options
464 :host "irc.armaanb.net"
468 :pass (lambda (fetch-password
470 :machine "irc.armaanb.net"
476 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
477 #+begin_src emacs-lisp
478 (use-package emacs-everywhere)
482 #+begin_src emacs-lisp
484 :hook (python-mode . blacken-mode)
485 :config (setq blacken-line-length 79))
488 (use-package ws-butler
489 :config (ws-butler-global-mode))
492 #+begin_src emacs-lisp
493 (use-package flycheck
494 :config (global-flycheck-mode))
496 ** Project management
497 #+begin_src emacs-lisp
498 (use-package projectile
499 :config (projectile-mode)
500 :custom ((projectile-completion-system 'ivy))
502 ("C-c p" . projectile-command-map)
504 (when (file-directory-p "~/Code")
505 (setq projectile-project-search-path '("~/Code")))
506 (setq projectile-switch-project-action #'projectile-dired))
508 (use-package counsel-projectile
510 :config (counsel-projectile-mode))
513 #+begin_src emacs-lisp
515 :straight (:type built-in)
516 :commands (dired dired-jump)
517 :custom ((dired-listing-switches "-agho --group-directories-first"))
518 :config (evil-collection-define-key 'normal 'dired-mode-map
519 "h" 'dired-single-up-directory
520 "l" 'dired-single-buffer))
522 (use-package dired-single
523 :commands (dired dired-jump))
525 (use-package dired-open
526 :commands (dired dired-jump)
527 :custom (dired-open-extensions '(("png" . "feh")
530 (use-package dired-hide-dotfiles
531 :hook (dired-mode . dired-hide-dotfiles-mode)
533 (evil-collection-define-key 'normal 'dired-mode-map
534 "H" 'dired-hide-dotfiles-mode))
538 # TODO: Write a command that commits hunk, skipping staging step.
539 #+begin_src emacs-lisp
542 *** Colored diff in line number area
543 #+begin_src emacs-lisp
545 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
546 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
547 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
548 :config (global-diff-hl-mode))
551 #+begin_src emacs-lisp
553 (use-package git-email
554 :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
555 :config (git-email-piem-mode))
558 *** Evaluate current buffer
559 Stolen from https://stackoverflow.com/questions/19953924/how-do-you-run-java-codes-in-emacs
560 #+begin_src emacs-lisp
561 (defun java-eval-buffer ()
562 "run current program (that requires no input)"
564 (let* ((source (file-name-nondirectory buffer-file-name))
565 (out (file-name-sans-extension source))
566 (class (concat out ".class")))
568 (shell-command (format "rm -f %s && javac %s" class source))
569 (if (file-exists-p class)
570 (shell-command (format "java %s" out) "*scratch*")
572 (set (make-local-variable 'compile-command)
573 (format "javac %s" source))
574 (command-execute 'compile)))))
576 * General text editing
578 Indent after every change.
579 #+begin_src emacs-lisp
580 (use-package aggressive-indent
581 :config (global-aggressive-indent-mode))
584 Spell check in text mode, and in prog-mode comments.
585 #+begin_src emacs-lisp
586 (dolist (hook '(text-mode-hook))
587 (add-hook hook (lambda () (flyspell-mode))))
588 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
589 (add-hook hook (lambda () (flyspell-mode -1))))
590 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
592 ** Expand tabs to spaces
593 #+begin_src emacs-lisp
594 (setq-default tab-width 2)
596 ** Copy kill ring to clipboard
597 #+begin_src emacs-lisp
598 (setq x-select-enable-clipboard t)
599 (defun copy-kill-ring-to-xorg ()
600 "Copy the current kill ring to the xorg clipboard."
602 (x-select-text (current-kill 0)))
605 Opens file where you left it.
606 #+begin_src emacs-lisp
610 Distraction free writing a la junegunn/goyo.
611 #+begin_src emacs-lisp
612 (use-package olivetti
614 (evil-leader/set-key "o" 'olivetti-mode))
618 #+begin_src emacs-lisp
619 (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
620 (setq save-abbrevs 'silent)
621 (setq-default abbrev-mode t)
624 #+begin_src emacs-lisp
625 (setq tramp-default-method "ssh")
627 ** Don't ask about following symlinks in vc
628 #+begin_src emacs-lisp
629 (setq vc-follow-symlinks t)
631 ** Don't ask to save custom dictionary
632 #+begin_src emacs-lisp
633 (setq ispell-silently-savep t)
636 #+begin_src emacs-lisp
637 (defun doas-edit (&optional arg)
638 "Edit currently visited file as root.
640 With a prefix ARG prompt for a file to visit.
641 Will also prompt for a file to visit if current
642 buffer is not visiting a file.
644 Modified from Emacs Redux."
646 (if (or arg (not buffer-file-name))
647 (find-file (concat "/doas:root@localhost:"
648 (ido-read-file-name "Find file(as root): ")))
649 (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
651 (global-set-key (kbd "C-x C-r") #'doas-edit)
655 #+begin_src emacs-lisp
656 (use-package ace-window
657 :bind ("M-o" . ace-window))
659 ** Kill current buffer
660 Makes "C-x k" binding faster.
661 #+begin_src emacs-lisp
662 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
666 #+begin_src emacs-lisp
667 (use-package scad-mode)
669 ** Control backup files
670 Stop backup files from spewing everywhere.
671 #+begin_src emacs-lisp
672 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
674 ** Make yes/no easier
675 #+begin_src emacs-lisp
676 (defalias 'yes-or-no-p 'y-or-n-p)
678 ** Move customize file
679 No more clogging up init.el.
680 #+begin_src emacs-lisp
681 (setq custom-file "~/.emacs.d/custom.el")
685 #+begin_src emacs-lisp
687 :commands (helpful-callable helpful-variable helpful-command helpful-key)
689 (counsel-describe-function-function #'helpful-callable)
690 (counsel-describe-variable-function #'helpful-variable)
692 ([remap describe-function] . counsel-describe-function)
693 ([remap describe-command] . helpful-command)
694 ([remap describe-variable] . counsel-describe-variable)
695 ([remap describe-key] . helpful-key))
698 #+begin_src emacs-lisp
699 (use-package epa-file
700 :straight (:type built-in)
702 (epa-file-select-keys nil)
703 (epa-file-encrypt-to '("me@armaanb.net"))
704 (password-cache-expiry (* 60 15)))
706 (use-package pinentry
707 :config (pinentry-start))
710 #+begin_src emacs-lisp
712 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
713 :custom (0x0-default-service 'envs)
714 :config (evil-leader/set-key
716 "0f" '0x0-upload-file
717 "0s" '0x0-upload-string
718 "0c" '0x0-upload-kill-ring
719 "0p" '0x0-upload-popup))
724 #+begin_src conf :tangle ~/.spectrwm.conf
728 autorun = ws[1]:/home/armaa/Code/scripts/autostart
731 #+begin_src conf :tangle ~/.spectrwm.conf
733 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
737 #+begin_src conf :tangle ~/.spectrwm.conf
738 program[term] = st -e tmux
739 program[screenshot_all] = flameshot gui
740 program[notif] = /home/armaa/Code/scripts/setter status
741 program[pass] = /home/armaa/Code/scripts/passmenu
744 bind[pass] = MOD+Shift+p
747 #+begin_src conf :tangle ~/.spectrwm.conf
748 program[paup] = /home/armaa/Code/scripts/setter audio +5
749 program[padown] = /home/armaa/Code/scripts/setter audio -5
750 program[pamute] = /home/armaa/Code/scripts/setter audio
751 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
752 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
753 program[next] = playerctl next
754 program[prev] = playerctl previous
755 program[pause] = playerctl play-pause
757 bind[padown] = XF86AudioLowerVolume
758 bind[paup] = XF86AudioRaiseVolume
759 bind[pamute] = XF86AudioMute
760 bind[brigdown] = XF86MonBrightnessDown
761 bind[brigup] = XF86MonBrightnessUp
762 bind[pause] = XF86AudioPlay
763 bind[next] = XF86AudioNext
764 bind[prev] = XF86AudioPrev
767 #+begin_src conf :tangle ~/.spectrwm.conf
768 program[h] = xdotool keyup h key --clearmodifiers Left
769 program[j] = xdotool keyup j key --clearmodifiers Down
770 program[k] = xdotool keyup k key --clearmodifiers Up
771 program[l] = xdotool keyup l key --clearmodifiers Right
773 bind[h] = MOD + Control + h
774 bind[j] = MOD + Control + j
775 bind[k] = MOD + Control + k
776 bind[l] = MOD + Control + l
779 #+begin_src conf :tangle ~/.spectrwm.conf
780 program[email] = emacsclient -c --eval "(mu4e)"
781 program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6697")'
782 program[emacs] = emacsclient -c
783 program[firefox] = firefox
784 program[calc] = st -e because -l
785 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
787 bind[email] = MOD+Control+1
788 bind[irc] = MOD+Control+2
789 bind[firefox] = MOD+Control+3
790 bind[emacs-anywhere] = MOD+Control+4
791 bind[calc] = MOD+Control+5
792 bind[emacs] = MOD+Control+Return
795 #+begin_src conf :tangle ~/.spectrwm.conf
796 quirk[Castle Menu] = FLOAT
801 #+begin_src conf :tangle ~/.config/ash/ashrc
805 **** Update all packages
806 #+begin_src shell :tangle ~/.config/ash/ashrc
807 color=$(tput setaf 5)
811 doas echo "${color}== upgrading with yay ==${reset}"
814 echo "${color}== checking for pacnew files ==${reset}"
817 echo "${color}== upgrading flatpaks ==${reset}"
820 echo "${color}== updating nvim plugins ==${reset}"
821 nvim +PlugUpdate +PlugUpgrade +qall
822 echo "Updated nvim plugins"
824 echo "${color}You are entirely up to date!${reset}"
827 **** Clean all packages
828 #+begin_src shell :tangle ~/.config/ash/ashrc
830 doas echo "${color}== cleaning pacman orphans ==${reset}"
831 (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
833 echo "${color}== cleaning flatpaks ==${reset}"
834 flatpak remove --unused
836 echo "${color}== cleaning nvim plugins ==${reset}"
837 nvim +PlugClean +qall
838 echo "Cleaned nvim plugins"
840 echo "${color}All orphans cleaned!${reset}"
843 **** Interact with 0x0
844 #+begin_src shell :tangle ~/.config/ash/ashrc
845 zxz="https://envs.sh"
846 ufile() { curl -F"file=@$1" "$zxz" ; }
847 upb() { curl -F"file=@-;" "$zxz" ; }
848 uurl() { curl -F"url=$1" "$zxz" ; }
849 ushort() { curl -F"shorten=$1" "$zxz" ; }
850 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
853 #+begin_src shell :tangle ~/.config/ash/ashrc
855 user=$(echo "$1" | cut -f 1 -d '@')
856 host=$(echo "$1" | cut -f 2 -d '@')
857 echo $user | nc "$host" 79
860 **** Upload to ftp.armaanb.net
861 #+begin_src shell :tangle ~/.config/ash/ashrc
863 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
864 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
868 #+begin_src shell :tangle ~/.config/ash/ashrc
869 export EDITOR="emacsclient -c"
870 export VISUAL="$EDITOR"
871 export TERM=xterm-256color # for compatability
873 export GPG_TTY="$(tty)"
874 export MANPAGER='nvim +Man!'
877 export GTK_USE_PORTAL=1
879 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
880 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
881 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
882 export PATH="$PATH:/home/armaa/.cargo/bin"
883 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
884 export PATH="$PATH:/usr/sbin"
885 export PATH="$PATH:/opt/FreeTube/freetube"
887 export LC_ALL="en_US.UTF-8"
888 export LC_CTYPE="en_US.UTF-8"
889 export LANGUAGE="en_US.UTF-8"
891 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
892 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
893 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
894 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
895 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
896 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
900 #+begin_src shell :tangle ~/.config/ash/ashrc
901 alias bhoji-drop='ssh -p 23 root@armaanb.net'
902 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
903 alias union='ssh 192.168.1.18'
904 alias mine='ssh -p 23 root@pickupserver.cc'
905 alias tcf='ssh root@204.48.23.68'
906 alias ngmun='ssh root@157.245.89.25'
907 alias prox='ssh root@192.168.1.224'
908 alias ncq='ssh root@143.198.123.17'
909 alias envs='ssh acheam@envs.net'
912 #+begin_src shell :tangle ~/.config/ash/ashrc
913 alias ls='ls -lh --group-directories-first'
915 alias df='df -h / /boot'
922 alias grep='grep -in --color=auto'
923 alias mkdir='mkdir -pv'
924 alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
928 **** System management
929 #+begin_src shell :tangle ~/.config/ash/ashrc
930 alias pkill='pkill -i'
931 alias crontab='crontab-argh'
933 alias pasu='git -C ~/.password-store push'
934 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
938 #+begin_src shell :tangle ~/.config/ash/ashrc
939 alias ping='ping -c 10'
940 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
941 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
942 alias plan='T=$(mktemp) && \
943 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
945 head -n -2 $T > $TT && \
947 echo "\nLast updated: $(date -R)" >> "$TT" && \
948 fold -sw 72 "$TT" > "$T"| \
949 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
951 **** Virtual machines, chroots
952 #+begin_src shell :tangle ~/.config/ash/ashrc
953 alias ckiss="doas chrooter ~/Virtual/kiss"
954 alias cdebian="doas chrooter ~/Virtual/debian bash"
955 alias cwindows='devour qemu-system-x86_64 \
960 -device VGA,vgamem_mb=64 \
964 -net user,smb=/home/armaa/Public \
965 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
968 #+begin_src shell :tangle ~/.config/ash/ashrc
969 alias pip="python -m pip"
970 alias black="black -l 79"
973 #+begin_src shell :tangle ~/.config/ash/ashrc
974 alias words='gen-shell -c "words"'
975 alias words-e='gen-shell -c "words ~E"'
978 #+begin_src shell :tangle ~/.config/ash/ashrc
979 alias zathura='devour zathura'
980 alias cad='devour openscad'
981 alias feh='devour feh'
984 #+begin_src shell :tangle ~/.config/ash/ashrc
987 alias apii='doas pacman -S'
989 alias azf='pacman -Q | fzf'
990 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
993 #+begin_src shell :tangle ~/.config/ash/ashrc
994 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
995 iflag=fullblock status=progress'
996 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
997 iflag=fullblock status=progress'
998 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
999 --restrict-filenames -o '%(title)s.%(ext)s'"
1000 alias cal="cal -3 --color=auto"
1004 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1005 c.TerminalInteractiveShell.editing_mode = 'vi'
1006 c.InteractiveShell.colors = 'linux'
1007 c.TerminalInteractiveShell.confirm_exit = False
1010 Make MPV play a little bit smoother.
1011 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1012 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1016 For any GNU Readline programs
1017 #+begin_src conf :tangle ~/.inputrc
1018 set editing-mode emacs
1022 #+begin_src conf :tangle ~/.gitconfig
1024 name = Armaan Bhojwani
1025 email = me@armaanb.net
1026 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1029 #+begin_src conf :tangle ~/.gitconfig
1031 defaultBranch = main
1034 #+begin_src conf :tangle ~/.gitconfig
1039 #+begin_src conf :tangle ~/.gitconfig
1041 smtpserver = smtp.mailbox.org
1042 smtpuser = me@armaanb.net
1043 smtpencryption = ssl
1044 smtpserverport = 465
1048 #+begin_src conf :tangle ~/.gitconfig
1053 #+begin_src conf :tangle ~/.gitconfig
1056 sclone = clone --depth 1
1061 quickfix = commit . --amend --no-edit
1063 subup = submodule update --remote
1064 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1065 pushnc = push -o skip-ci
1068 #+begin_src conf :tangle ~/.gitconfig
1074 Lightweight notification daemon.
1076 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1078 font = "JetBrains Mono Medium Nerd Font 11"
1080 format = "<b>%s</b>\n%b"
1082 indicate_hidden = yes
1085 show_age_threshold = 60
1088 geometry = "400x5-10+10"
1090 idle_threshold = 120
1092 sticky_history = yes
1094 separator_height = 1
1096 horizontal_padding = 8
1098 separator_color = "#ffffff"
1099 startup_notification = false
1102 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1109 close_all = mod4+shift+c
1110 history = mod4+ctrl+c
1113 background = "#222222"
1114 foreground = "#ffffff"
1115 highlight = "#ffffff"
1119 background = "#222222"
1120 foreground = "#ffffff"
1121 highlight = "#ffffff"
1125 background = "#222222"
1126 foreground = "#a60000"
1127 highlight = "#ffffff"
1132 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1134 map <A-b> toggle_statusbar
1135 set selection-clipboard clipboard
1138 set window-title-basename "true"
1139 set selection-clipboard "clipboard"
1142 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1143 set default-bg "#000000"
1144 set default-fg "#ffffff"
1145 set render-loading true
1146 set render-loading-bg "#000000"
1147 set render-loading-fg "#ffffff"
1149 set recolor-lightcolor "#000000" # bg
1150 set recolor-darkcolor "#ffffff" # fg
1154 *** Swap tab and URL bars
1155 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1157 -moz-box-ordinal-group: 1 !important;
1161 -moz-box-ordinal-group: 2 !important;
1165 -moz-box-ordinal-group: 3 !important;
1168 *** Hide URL bar when not focused.
1169 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1170 #navigator-toolbox:not(:focus-within):not(:hover) {
1174 #navigator-toolbox {
1175 transition: 0.1s margin-top ease-out;
1178 *** Black screen by default
1180 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1183 #browser vbox#appcontent tabbrowser,
1185 #tabbrowser-tabpanels,
1187 browser[type="content-primary"],
1188 browser[type="content"] > html,
1190 background: black !important;
1191 color: #fff !important;
1196 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1197 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1199 background: black !important;
1204 Modus operandi theme.
1205 #+begin_src conf :tangle ~/.Xresources
1207 ,*.foreground: #ffffff
1208 ,*.background: #000000
1209 ,*.cursorColor: #ffffff
1244 #+begin_src conf :tangle ~/.tmux.conf
1247 set-window-option -g mode-keys vi
1251 #+begin_src conf :tangle ~/.gnupg/gpg.conf
1252 default-key 3C9ED82FFE788E4A
1256 #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
1257 pinentry-program /sbin/pinentry-gnome3
1259 default-cache-ttl 600
1260 allow-emacs-pinentry