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
360 mail-context-policy 'pick-first
362 `( ,(make-mu4e-context
364 :enter-func (lambda () (mu4e-message "Entering school context"))
365 :leave-func (lambda () (mu4e-message "Leaving school context"))
366 :match-func (lambda (msg)
368 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
369 :vars '((user-mail-address . "abhojwani22@nobles.edu")
370 (mu4e-sent-folder . "/school/Sent")
371 (mu4e-drafts-folder . "/school/Drafts")
372 (mu4e-trash-folder . "/school/Trash")
373 (mu4e-refile-folder . "/school/Archive")
374 (message-cite-reply-position . above)
375 (user-mail-address . "abhojwani22@nobles.edu")
376 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
377 (smtpmail-smtp-server . "smtp.gmail.com")))
380 :enter-func (lambda () (mu4e-message "Entering personal context"))
381 :leave-func (lambda () (mu4e-message "Leaving personal context"))
382 :match-func (lambda (msg)
384 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
385 :vars '((mu4e-sent-folder . "/personal/Sent")
386 (mu4e-drafts-folder . "/personal/Drafts")
387 (mu4e-trash-folder . "/personal/Trash")
388 (mu4e-refile-folder . "/personal/Archive")
389 (user-mail-address . "me@armaanb.net")
390 (message-cite-reply-position . below)
391 (smtpmail-smtp-user . "me@armaanb.net")
392 (smtpmail-smtp-server . "smtp.mailbox.org")))))
393 (add-to-list 'mu4e-bookmarks
394 '(:name "Unified inbox"
395 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
397 :hook ((mu4e-compose-mode . flyspell-mode)
398 (mu4e-compose-mode . auto-fill-mode)
399 (mu4e-view-mode-hook . turn-on-visual-line-mode)
400 (message-send-hook . (lambda () (unless (yes-or-no-p "Ya sure 'bout that?")
401 (signal 'quit nil))))))
403 Discourage Gnus from displaying HTML emails
404 #+begin_src emacs-lisp
405 (with-eval-after-load "mm-decode"
406 (add-to-list 'mm-discouraged-alternatives "text/html")
407 (add-to-list 'mm-discouraged-alternatives "text/richtext"))
410 Set EWW as default browser except for videos.
411 #+begin_src emacs-lisp
412 (defun browse-url-mpv (url &optional new-window)
414 (start-process "mpv" "*mpv*" "mpv" url))
416 (setq browse-url-handlers
418 (("youtu\\.?be" . browse-url-mpv)
419 ("peertube.*" . browse-url-mpv)
420 ("vid.*" . browse-url-mpv)
421 ("vid.*" . browse-url-mpv)
422 ("." . eww-browse-url)
426 Some EWW enhancements.
427 *** Give buffer a useful name
428 #+begin_src emacs-lisp
429 ;; From https://protesilaos.com/dotemacs/
430 (defun prot-eww--rename-buffer ()
431 "Rename EWW buffer using page title or URL.
432 To be used by `eww-after-render-hook'."
433 (let ((name (if (eq "" (plist-get eww-data :title))
434 (plist-get eww-data :url)
435 (plist-get eww-data :title))))
436 (rename-buffer (format "*%s # eww*" name) t)))
439 :straight (:type built-in)
440 :bind (("C-c w" . eww))
441 :hook (eww-after-render-hook prot-eww--rename-buffer))
444 #+begin_src emacs-lisp
445 (global-set-key (kbd "C-c w") 'eww)
448 Circe is a really nice IRC client, that claims to be above RCIRC and below ERC in terms of features. ERC felt a bit messy and finicky to me, and Circe has all the features that I need. This setup gets the password for my bouncer (Pounce) instances via my =~/.authinfo.gpg= file.
449 #+begin_src emacs-lisp
450 (defun fetch-password (&rest params)
451 (require 'auth-source)
452 (let ((match (car (apply 'auth-source-search params))))
454 (let ((secret (plist-get match :secret)))
455 (if (functionp secret)
458 (error "Password not found for %S" params))))
463 (enable-circe-color-nicks)
467 (setq circe-networks '(("libera"
468 :host "irc.armaanb.net"
473 :pass (lambda (null) (fetch-password
475 :machine "irc.armaanb.net"
478 :host "irc.armaanb.net"
483 :pass (lambda (null) (fetch-password
485 :machine "irc.armaanb.net"
488 :host "irc.armaanb.net"
493 :pass (lambda (null) (fetch-password
495 :machine "irc.armaanb.net"
498 :custom (circe-default-part-message "goodbye!")
499 :bind (:map circe-mode-map ("C-c C-r" . circe-reconnect-all)))
503 #+begin_src emacs-lisp
505 :hook (python-mode . blacken-mode)
506 :config (setq blacken-line-length 79))
509 (use-package ws-butler
510 :config (ws-butler-global-mode))
513 #+begin_src emacs-lisp
514 (use-package flycheck
515 :config (global-flycheck-mode))
517 ** Project management
518 #+begin_src emacs-lisp
519 (use-package projectile
520 :config (projectile-mode)
521 :custom ((projectile-completion-system 'ivy))
523 ("C-c p" . projectile-command-map)
525 (when (file-directory-p "~/Code")
526 (setq projectile-project-search-path '("~/Code")))
527 (setq projectile-switch-project-action #'projectile-dired))
529 (use-package counsel-projectile
531 :config (counsel-projectile-mode))
534 #+begin_src emacs-lisp
536 :straight (:type built-in)
537 :commands (dired dired-jump)
538 :custom ((dired-listing-switches "-agho --group-directories-first"))
539 :config (evil-collection-define-key 'normal 'dired-mode-map
540 "h" 'dired-single-up-directory
541 "l" 'dired-single-buffer))
543 (use-package dired-single
544 :commands (dired dired-jump))
546 (use-package dired-open
547 :commands (dired dired-jump)
548 :custom (dired-open-extensions '(("png" . "feh")
551 (use-package dired-hide-dotfiles
552 :hook (dired-mode . dired-hide-dotfiles-mode)
554 (evil-collection-define-key 'normal 'dired-mode-map
555 "H" 'dired-hide-dotfiles-mode))
559 # TODO: Write a command that commits hunk, skipping staging step.
560 #+begin_src emacs-lisp
563 *** Colored diff in line number area
564 #+begin_src emacs-lisp
566 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
567 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
568 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
569 :config (global-diff-hl-mode))
572 #+begin_src emacs-lisp
574 (use-package git-email
575 :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
576 :config (git-email-piem-mode))
579 *** Evaluate current buffer
580 Stolen from https://stackoverflow.com/questions/19953924/how-do-you-run-java-codes-in-emacs
581 #+begin_src emacs-lisp
582 (defun java-eval-buffer ()
583 "run current program (that requires no input)"
585 (let* ((source (file-name-nondirectory buffer-file-name))
586 (out (file-name-sans-extension source))
587 (class (concat out ".class")))
589 (shell-command (format "rm -f %s && javac %s" class source))
590 (if (file-exists-p class)
591 (shell-command (format "java %s" out) "*scratch*")
593 (set (make-local-variable 'compile-command)
594 (format "javac %s" source))
595 (command-execute 'compile)))))
597 * General text editing
599 Indent after every change.
600 #+begin_src emacs-lisp
601 (use-package aggressive-indent
602 :config (global-aggressive-indent-mode))
605 Spell check in text mode, and in prog-mode comments.
606 #+begin_src emacs-lisp
607 (dolist (hook '(text-mode-hook))
608 (add-hook hook (lambda () (flyspell-mode))))
609 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
610 (add-hook hook (lambda () (flyspell-mode -1))))
611 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
613 ** Expand tabs to spaces
614 #+begin_src emacs-lisp
615 (setq-default tab-width 2)
617 ** Copy kill ring to clipboard
618 #+begin_src emacs-lisp
619 (setq x-select-enable-clipboard t)
620 (defun copy-kill-ring-to-xorg ()
621 "Copy the current kill ring to the xorg clipboard."
623 (x-select-text (current-kill 0)))
626 Opens file where you left it.
627 #+begin_src emacs-lisp
631 Distraction free writing a la junegunn/goyo.
632 #+begin_src emacs-lisp
633 (use-package olivetti
635 (evil-leader/set-key "o" 'olivetti-mode))
639 #+begin_src emacs-lisp
640 (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
641 (setq save-abbrevs 'silent)
642 (setq-default abbrev-mode t)
645 #+begin_src emacs-lisp
646 (setq tramp-default-method "ssh")
648 ** Don't ask about following symlinks in vc
649 #+begin_src emacs-lisp
650 (setq vc-follow-symlinks t)
652 ** Don't ask to save custom dictionary
653 #+begin_src emacs-lisp
654 (setq ispell-silently-savep t)
657 #+begin_src emacs-lisp
658 (defun doas-edit (&optional arg)
659 "Edit currently visited file as root.
661 With a prefix ARG prompt for a file to visit.
662 Will also prompt for a file to visit if current
663 buffer is not visiting a file.
665 Modified from Emacs Redux."
667 (if (or arg (not buffer-file-name))
668 (find-file (concat "/doas:root@localhost:"
669 (ido-read-file-name "Find file(as root): ")))
670 (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
672 (global-set-key (kbd "C-x C-r") #'doas-edit)
676 #+begin_src emacs-lisp
677 (use-package ace-window
678 :bind ("M-o" . ace-window))
680 ** Kill current buffer
681 Makes "C-x k" binding faster.
682 #+begin_src emacs-lisp
683 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
687 #+begin_src emacs-lisp
688 (use-package scad-mode)
690 ** Control backup files
691 Stop backup files from spewing everywhere.
692 #+begin_src emacs-lisp
693 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
695 ** Make yes/no easier
696 #+begin_src emacs-lisp
697 (defalias 'yes-or-no-p 'y-or-n-p)
699 ** Move customize file
700 No more clogging up init.el.
701 #+begin_src emacs-lisp
702 (setq custom-file "~/.emacs.d/custom.el")
706 #+begin_src emacs-lisp
708 :commands (helpful-callable helpful-variable helpful-command helpful-key)
710 (counsel-describe-function-function #'helpful-callable)
711 (counsel-describe-variable-function #'helpful-variable)
713 ([remap describe-function] . counsel-describe-function)
714 ([remap describe-command] . helpful-command)
715 ([remap describe-variable] . counsel-describe-variable)
716 ([remap describe-key] . helpful-key))
719 #+begin_src emacs-lisp
720 (use-package epa-file
721 :straight (:type built-in)
723 (epa-file-select-keys nil)
724 (epa-file-encrypt-to '("me@armaanb.net"))
725 (password-cache-expiry (* 60 15)))
727 (use-package pinentry
728 :config (pinentry-start))
731 #+begin_src emacs-lisp
733 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
734 :custom (0x0-default-service 'envs)
735 :config (evil-leader/set-key
737 "0f" '0x0-upload-file
738 "0s" '0x0-upload-string
739 "0c" '0x0-upload-kill-ring
740 "0p" '0x0-upload-popup))
742 ** Automatically clean buffers
743 #+begin_src emacs-lisp
744 ;; Don't kill Circe buffers
745 (add-to-list 'clean-buffer-list-kill-never-regexps (lambda (buffer-name)
746 (with-current-buffer buffer-name
747 (derived-mode-p 'lui-mode))))
753 #+begin_src conf :tangle ~/.spectrwm.conf
757 autorun = ws[1]:/home/armaa/Code/scripts/autostart
760 #+begin_src conf :tangle ~/.spectrwm.conf
762 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
766 #+begin_src conf :tangle ~/.spectrwm.conf
767 program[term] = st -e tmux
768 program[screenshot_all] = flameshot gui
769 program[notif] = /home/armaa/Code/scripts/setter status
770 program[pass] = /home/armaa/Code/scripts/passmenu
773 bind[pass] = MOD+Shift+p
776 #+begin_src conf :tangle ~/.spectrwm.conf
777 program[paup] = /home/armaa/Code/scripts/setter audio +5
778 program[padown] = /home/armaa/Code/scripts/setter audio -5
779 program[pamute] = /home/armaa/Code/scripts/setter audio
780 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
781 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
782 program[next] = playerctl next
783 program[prev] = playerctl previous
784 program[pause] = playerctl play-pause
786 bind[padown] = XF86AudioLowerVolume
787 bind[paup] = XF86AudioRaiseVolume
788 bind[pamute] = XF86AudioMute
789 bind[brigdown] = XF86MonBrightnessDown
790 bind[brigup] = XF86MonBrightnessUp
791 bind[pause] = XF86AudioPlay
792 bind[next] = XF86AudioNext
793 bind[prev] = XF86AudioPrev
796 #+begin_src conf :tangle ~/.spectrwm.conf
797 program[h] = xdotool keyup h key --clearmodifiers Left
798 program[j] = xdotool keyup j key --clearmodifiers Down
799 program[k] = xdotool keyup k key --clearmodifiers Up
800 program[l] = xdotool keyup l key --clearmodifiers Right
802 bind[h] = MOD + Control + h
803 bind[j] = MOD + Control + j
804 bind[k] = MOD + Control + k
805 bind[l] = MOD + Control + l
808 #+begin_src conf :tangle ~/.spectrwm.conf
809 program[email] = emacsclient -c --eval "(mu4e)"
810 program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6698")'
811 program[rss] = emacsclient -c --eval '(elfeed)'
812 program[emacs] = emacsclient -c
813 program[firefox] = firefox
814 program[calc] = st -e because -l
816 bind[email] = MOD+Control+1
817 bind[irc] = MOD+Control+2
818 bind[rss] = MOD+Control+3
819 bind[firefox] = MOD+Control+4
820 bind[calc] = MOD+Control+5
821 bind[emacs] = MOD+Control+Return
824 #+begin_src conf :tangle ~/.spectrwm.conf
825 quirk[Castle Menu] = FLOAT
830 #+begin_src conf :tangle ~/.config/ash/ashrc
834 **** Update all packages
835 #+begin_src shell :tangle ~/.config/ash/ashrc
836 color=$(tput setaf 5)
840 doas echo "${color}== upgrading with yay ==${reset}"
843 echo "${color}== checking for pacnew files ==${reset}"
846 echo "${color}== upgrading flatpaks ==${reset}"
849 echo "${color}== updating nvim plugins ==${reset}"
850 nvim +PlugUpdate +PlugUpgrade +qall
851 echo "Updated nvim plugins"
853 echo "${color}You are entirely up to date!${reset}"
856 **** Clean all packages
857 #+begin_src shell :tangle ~/.config/ash/ashrc
859 doas echo "${color}== cleaning pacman orphans ==${reset}"
860 (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
862 echo "${color}== cleaning flatpaks ==${reset}"
863 flatpak remove --unused
865 echo "${color}== cleaning nvim plugins ==${reset}"
866 nvim +PlugClean +qall
867 echo "Cleaned nvim plugins"
869 echo "${color}All orphans cleaned!${reset}"
872 **** Interact with 0x0
873 #+begin_src shell :tangle ~/.config/ash/ashrc
874 zxz="https://envs.sh"
875 ufile() { curl -F"file=@$1" "$zxz" ; }
876 upb() { curl -F"file=@-;" "$zxz" ; }
877 uurl() { curl -F"url=$1" "$zxz" ; }
878 ushort() { curl -F"shorten=$1" "$zxz" ; }
879 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
882 #+begin_src shell :tangle ~/.config/ash/ashrc
884 user=$(echo "$1" | cut -f 1 -d '@')
885 host=$(echo "$1" | cut -f 2 -d '@')
886 echo $user | nc "$host" 79
889 **** Upload to ftp.armaanb.net
890 #+begin_src shell :tangle ~/.config/ash/ashrc
892 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
893 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
897 #+begin_src shell :tangle ~/.config/ash/ashrc
898 export EDITOR="emacsclient -c"
899 export VISUAL="$EDITOR"
900 export TERM=xterm-256color # for compatability
902 export GPG_TTY="$(tty)"
903 export MANPAGER='nvim +Man!'
906 export GTK_USE_PORTAL=1
908 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
909 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
910 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
911 export PATH="$PATH:/home/armaa/.cargo/bin"
912 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
913 export PATH="$PATH:/usr/sbin"
914 export PATH="$PATH:/opt/FreeTube/freetube"
916 export LC_ALL="en_US.UTF-8"
917 export LC_CTYPE="en_US.UTF-8"
918 export LANGUAGE="en_US.UTF-8"
920 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
921 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
922 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
923 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
924 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
925 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
929 #+begin_src shell :tangle ~/.config/ash/ashrc
930 alias bhoji-drop='ssh -p 23 root@armaanb.net'
931 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
932 alias union='ssh 192.168.1.18'
933 alias mine='ssh -p 23 root@pickupserver.cc'
934 alias tcf='ssh root@204.48.23.68'
935 alias ngmun='ssh root@157.245.89.25'
936 alias prox='ssh root@192.168.1.224'
937 alias ncq='ssh root@143.198.123.17'
938 alias envs='ssh acheam@envs.net'
941 #+begin_src shell :tangle ~/.config/ash/ashrc
942 alias ls='ls -lh --group-directories-first'
944 alias df='df -h / /boot'
951 alias grep='grep -in --color=auto'
952 alias mkdir='mkdir -pv'
953 alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
954 emacs() { $EDITOR "$@" & }
957 **** System management
958 #+begin_src shell :tangle ~/.config/ash/ashrc
959 alias crontab='crontab-argh'
961 alias pasu='git -C ~/.password-store push'
962 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
966 #+begin_src shell :tangle ~/.config/ash/ashrc
967 alias ping='ping -c 10'
968 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
969 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
970 alias plan='T=$(mktemp) && \
971 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
973 head -n -2 $T > $TT && \
975 echo "\nLast updated: $(date -R)" >> "$TT" && \
976 fold -sw 72 "$TT" > "$T"| \
977 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
979 **** Virtual machines, chroots
980 #+begin_src shell :tangle ~/.config/ash/ashrc
981 alias ckiss="doas chrooter ~/Virtual/kiss"
982 alias cdebian="doas chrooter ~/Virtual/debian bash"
983 alias cwindows='devour qemu-system-x86_64 \
988 -device VGA,vgamem_mb=64 \
992 -net user,smb=/home/armaa/Public \
993 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
996 #+begin_src shell :tangle ~/.config/ash/ashrc
997 alias pip="python -m pip"
998 alias black="black -l 79"
1001 #+begin_src shell :tangle ~/.config/ash/ashrc
1002 alias words='gen-shell -c "words"'
1003 alias words-e='gen-shell -c "words ~E"'
1006 #+begin_src shell :tangle ~/.config/ash/ashrc
1007 alias zathura='devour zathura'
1008 alias cad='devour openscad'
1009 alias feh='devour feh'
1012 #+begin_src shell :tangle ~/.config/ash/ashrc
1014 alias api='yay -Syu'
1015 alias apii='doas pacman -S'
1016 alias app='yay -Rns'
1017 alias azf='pacman -Q | fzf'
1018 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1021 #+begin_src shell :tangle ~/.config/ash/ashrc
1022 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1023 iflag=fullblock status=progress'
1024 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1025 iflag=fullblock status=progress'
1026 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
1027 --restrict-filenames -o '%(title)s.%(ext)s'"
1028 alias cal="cal -3 --color=auto"
1032 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1033 c.TerminalInteractiveShell.editing_mode = 'vi'
1034 c.InteractiveShell.colors = 'linux'
1035 c.TerminalInteractiveShell.confirm_exit = False
1038 Make MPV play a little bit smoother.
1039 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1040 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1044 For any GNU Readline programs
1045 #+begin_src conf :tangle ~/.inputrc
1046 set editing-mode emacs
1050 #+begin_src conf :tangle ~/.gitconfig
1052 name = Armaan Bhojwani
1053 email = me@armaanb.net
1054 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1057 #+begin_src conf :tangle ~/.gitconfig
1059 defaultBranch = main
1062 #+begin_src conf :tangle ~/.gitconfig
1067 #+begin_src conf :tangle ~/.gitconfig
1069 smtpserver = smtp.mailbox.org
1070 smtpuser = me@armaanb.net
1071 smtpencryption = ssl
1072 smtpserverport = 465
1076 #+begin_src conf :tangle ~/.gitconfig
1081 #+begin_src conf :tangle ~/.gitconfig
1084 sclone = clone --depth 1
1089 quickfix = commit . --amend --no-edit
1091 subup = submodule update --remote
1092 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1093 pushnc = push -o skip-ci
1096 #+begin_src conf :tangle ~/.gitconfig
1102 Lightweight notification daemon.
1104 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1106 font = "JetBrains Mono Medium Nerd Font 11"
1108 format = "<b>%s</b>\n%b"
1110 indicate_hidden = yes
1113 show_age_threshold = 60
1116 geometry = "400x5-10+10"
1118 idle_threshold = 120
1120 sticky_history = yes
1122 separator_height = 1
1124 horizontal_padding = 8
1126 separator_color = "#ffffff"
1127 startup_notification = false
1130 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1137 close_all = mod4+shift+c
1138 history = mod4+ctrl+c
1141 background = "#222222"
1142 foreground = "#ffffff"
1143 highlight = "#ffffff"
1147 background = "#222222"
1148 foreground = "#ffffff"
1149 highlight = "#ffffff"
1153 background = "#222222"
1154 foreground = "#a60000"
1155 highlight = "#ffffff"
1160 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1162 map <A-b> toggle_statusbar
1163 set selection-clipboard clipboard
1166 set window-title-basename "true"
1167 set selection-clipboard "clipboard"
1170 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1171 set default-bg "#000000"
1172 set default-fg "#ffffff"
1173 set render-loading true
1174 set render-loading-bg "#000000"
1175 set render-loading-fg "#ffffff"
1177 set recolor-lightcolor "#000000" # bg
1178 set recolor-darkcolor "#ffffff" # fg
1182 *** Swap tab and URL bars
1183 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1185 -moz-box-ordinal-group: 1 !important;
1189 -moz-box-ordinal-group: 2 !important;
1193 -moz-box-ordinal-group: 3 !important;
1196 *** Hide URL bar when not focused.
1197 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1198 #navigator-toolbox:not(:focus-within):not(:hover) {
1202 #navigator-toolbox {
1203 transition: 0.1s margin-top ease-out;
1206 *** Black screen by default
1208 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1211 #browser vbox#appcontent tabbrowser,
1213 #tabbrowser-tabpanels,
1215 browser[type="content-primary"],
1216 browser[type="content"] > html,
1218 background: black !important;
1219 color: #fff !important;
1224 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1225 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1227 background: black !important;
1232 Modus operandi theme.
1233 #+begin_src conf :tangle ~/.Xresources
1235 ,*.foreground: #ffffff
1236 ,*.background: #000000
1237 ,*.cursorColor: #ffffff
1272 #+begin_src conf :tangle ~/.tmux.conf
1275 set-window-option -g mode-keys vi
1276 bind-key -T copy-mode-vi 'v' send -X begin-selection
1277 bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
1281 #+begin_src conf :tangle ~/.gnupg/gpg.conf
1282 default-key 3C9ED82FFE788E4A
1286 #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
1287 pinentry-program /sbin/pinentry-gnome3
1289 default-cache-ttl 600
1290 allow-emacs-pinentry