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-org-blocks 'grayscale
54 modus-themes-mode-line '3d
55 modus-themes-scale-headings t
56 modus-themes-region 'no-extend
57 modus-themes-diffs 'desaturated)
58 (load-theme 'modus-vivendi t)
61 #+begin_src emacs-lisp
62 (use-package tree-sitter-langs)
63 (use-package tree-sitter
64 :config (global-tree-sitter-mode)
65 :hook (tree-sitter-after-on-hook . tree-sitter-hl-mode))
69 Great programming font with ligatures.
70 #+begin_src emacs-lisp
71 (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
74 #+begin_src emacs-lisp
76 :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
78 (ligature-set-ligatures
79 '(prog-mode text-mode)
80 '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
81 "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
82 "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
83 "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
84 "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
85 ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
86 "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
87 "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
88 "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
89 "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
90 "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
91 "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
92 (global-ligature-mode t))
95 #+begin_src emacs-lisp
97 :config (global-emojify-mode))
99 ;; http://ergoemacs.org/emacs/emacs_list_and_set_font.html
104 ((member "Twitter Color Emoji" (font-family-list)) "Twitter Color Emoji")
105 ((member "Noto Color Emoji" (font-family-list)) "Noto Color Emoji")
106 ((member "Noto Emoji" (font-family-list)) "Noto Emoji")))
109 Display relative line numbers except in some modes
110 #+begin_src emacs-lisp
111 (global-display-line-numbers-mode)
112 (setq display-line-numbers-type 'relative)
113 (dolist (no-line-num '(term-mode-hook
118 (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
120 ** Highlight matching parenthesis
121 #+begin_src emacs-lisp
123 :config (show-paren-mode)
124 :custom (show-paren-style 'parenthesis))
127 *** Show current function
128 #+begin_src emacs-lisp
129 (which-function-mode)
131 *** Make position in file more descriptive
132 Show current column and file size.
133 #+begin_src emacs-lisp
135 (size-indication-mode)
138 #+begin_src emacs-lisp
140 :config (minions-mode))
143 #+begin_src emacs-lisp
145 :straight (wc-mode :type git :host github :repo "bnbeckwith/wc-mode")
146 :hook (text-mode-hook . wc-mode))
149 Show a ruler at a certain number of chars depending on mode.
150 #+begin_src emacs-lisp
151 (global-display-fill-column-indicator-mode)
154 Whenever starting a key chord, show possible future steps.
155 #+begin_src emacs-lisp
156 (use-package which-key
157 :config (which-key-mode)
158 :custom (which-key-idle-delay 0.3))
160 ** Highlight TODOs in comments
161 #+begin_src emacs-lisp
163 :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
164 :config (global-hl-todo-mode 1))
167 #+begin_src emacs-lisp
171 Soft wrap words and do operations by visual lines.
172 #+begin_src emacs-lisp
173 (add-hook 'text-mode-hook 'turn-on-visual-line-mode)
175 ** Display number of matches in search
176 #+begin_src emacs-lisp
178 :config (global-anzu-mode))
181 Inverts modeline instead of audible bell or the standard visual bell.
182 #+begin_src emacs-lisp
183 (setq visible-bell nil
184 ring-bell-function 'flash-mode-line)
185 (defun flash-mode-line ()
186 (invert-face 'mode-line)
187 (run-with-timer 0.1 nil #'invert-face 'mode-line))
191 #+begin_src emacs-lisp
193 :custom (select-enable-clipboard nil)
196 (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
197 ;; Use visual line motions even outside of visual-line-mode buffers
198 (evil-global-set-key 'motion "j" 'evil-next-visual-line)
199 (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
200 (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
203 #+begin_src emacs-lisp
204 (use-package evil-collection
206 :init (evil-collection-init)
207 :custom (evil-collection-setup-minibuffer t))
211 #+begin_src emacs-lisp
212 (use-package evil-surround
213 :config (global-evil-surround-mode))
216 #+begin_src emacs-lisp
217 (use-package evil-leader
218 :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
220 (evil-leader/set-leader "<SPC>")
221 (global-evil-leader-mode))
224 #+begin_src emacs-lisp
226 (use-package evil-nerd-commenter
227 :bind (:map evil-normal-state-map
228 ("gc" . evilnc-comment-or-uncomment-lines))
229 :custom (evilnc-invert-comment-line-by-line nil))
233 #+begin_src emacs-lisp
234 (evil-set-undo-system 'undo-redo)
236 ** Number incrementing
238 #+begin_src emacs-lisp
239 (use-package evil-numbers
240 :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
241 :bind (:map evil-normal-state-map
242 ("C-M-a" . evil-numbers/inc-at-pt)
243 ("C-M-x" . evil-numbers/dec-at-pt)))
247 #+begin_src emacs-lisp
248 (use-package evil-org
250 :hook (org-mode . evil-org-mode)
252 (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
253 (use-package evil-org-agenda
254 :straight (:type built-in)
257 (evil-org-agenda-set-keys))
260 #+begin_src emacs-lisp
261 (evil-leader/set-key-for-mode 'org-mode
262 "T" 'org-show-todo-tree
264 "c" 'org-archive-subtree)
268 #+begin_src emacs-lisp
270 :straight (:type built-in)
271 :commands (org-capture org-agenda)
274 (org-agenda-start-with-log-mode t)
275 (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
277 (org-log-into-drawer t)
278 (org-src-tab-acts-natively t)
279 (org-src-fontify-natively t)
280 (org-startup-indented t)
281 (org-hide-emphasis-markers t)
282 (org-fontify-whole-block-delimiter-line nil)
283 :bind ("C-c a" . org-agenda))
286 #+begin_src emacs-lisp
287 (use-package org-tempo
289 :straight (:type built-in)
291 ;; TODO: There's gotta be a more efficient way to write this
292 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
293 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
294 (add-to-list 'org-structure-template-alist '("zsh" . "src shell :tangle ~/.config/zsh/zshrc"))
295 (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
296 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
297 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
298 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
299 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
300 (add-to-list 'org-structure-template-alist '("ro" . "src javascript :tangle ~/.config/rofi/config.rasi"))
301 (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
302 (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
303 (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css")))
306 #+begin_src emacs-lisp
307 (use-package org-present
308 :straight (org-present :type git :host github :repo "rlister/org-present"))
312 Simple, but not too simple autocompletion.
313 #+begin_src emacs-lisp
315 :bind (("C-s" . swiper)
316 :map ivy-minibuffer-map
317 ("TAB" . ivy-alt-done)
318 :map ivy-switch-buffer-map
319 ("M-d" . ivy-switch-buffer-kill))
323 #+begin_src emacs-lisp
324 (use-package ivy-rich
326 :config (ivy-rich-mode))
330 #+begin_src emacs-lisp
332 :bind (("C-M-j" . 'counsel-switch-buffer)
333 :map minibuffer-local-map
334 ("C-r" . 'counsel-minibuffer-history))
335 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
336 :config (counsel-mode))
338 ** Remember frequent commands
339 #+begin_src emacs-lisp
340 (use-package ivy-prescient
343 (ivy-prescient-enable-filtering nil)
345 (prescient-persist-mode)
346 (ivy-prescient-mode))
349 Better search utility.
350 #+begin_src emacs-lisp
355 Use elfeed for RSS. I have another file with all the feeds in it.
356 #+begin_src emacs-lisp
358 :bind (("C-c e" . elfeed))
360 (load "~/.emacs.d/feeds.el")
361 (add-hook 'elfeed-new-entry-hook
362 (elfeed-make-tagger :feed-url "youtube\\.com"
364 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
366 (use-package elfeed-goodies
368 :config (elfeed-goodies/setup))
371 Use mu4e for reading emails.
373 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.
375 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.
376 #+begin_src emacs-lisp
377 (use-package smtpmail
378 :straight (:type built-in))
380 :load-path "/usr/share/emacs/site-lisp/mu4e"
381 :bind (("C-c m" . mu4e))
383 (setq user-full-name "Armaan Bhojwani"
384 smtpmail-local-domain "armaanb.net"
385 smtpmail-stream-type 'ssl
386 smtpmail-smtp-service '465
387 mu4e-change-filenames-when-moving t
388 mu4e-get-mail-command "offlineimap -q"
389 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
390 message-citation-line-function 'message-insert-formatted-citation-line
391 mu4e-completing-read-function 'ivy-completing-read
392 mu4e-confirm-quit nil
393 mail-user-agent 'mu4e-user-agent
395 `( ,(make-mu4e-context
397 :enter-func (lambda () (mu4e-message "Entering school context"))
398 :leave-func (lambda () (mu4e-message "Leaving school context"))
399 :match-func (lambda (msg)
401 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
402 :vars '((user-mail-address . "abhojwani22@nobles.edu")
403 (mu4e-sent-folder . "/school/Sent")
404 (mu4e-drafts-folder . "/school/Drafts")
405 (mu4e-trash-folder . "/school/Trash")
406 (mu4e-refile-folder . "/school/Archive")
407 (user-mail-address . "abhojwani22@nobles.edu")
408 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
409 (smtpmail-smtp-server . "smtp.gmail.com")))
412 :enter-func (lambda () (mu4e-message "Entering personal context"))
413 :leave-func (lambda () (mu4e-message "Leaving personal context"))
414 :match-func (lambda (msg)
416 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
417 :vars '((mu4e-sent-folder . "/personal/Sent")
418 (mu4e-drafts-folder . "/personal/Drafts")
419 (mu4e-trash-folder . "/personal/Trash")
420 (mu4e-refile-folder . "/personal/Archive")
421 (user-mail-address . "me@armaanb.net")
422 (smtpmail-smtp-user . "me@armaanb.net")
423 (smtpmail-smtp-server "smtp.mailbox.org")
424 (mu4e-drafts-folder . "/school/Drafts")
425 (mu4e-trash-folder . "/school/Trash")))))
426 (add-to-list 'mu4e-bookmarks
427 '(:name "Unified inbox"
428 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
430 :hook ((mu4e-compose-mode . flyspell-mode)
431 (mu4e-view-mode-hook . turn-on-visual-line-mode)))
434 Set EWW as default browser except for videos.
435 #+begin_src emacs-lisp
436 (defun browse-url-mpv (url &optional new-window)
438 (start-process "mpv" "*mpv*" "mpv" url))
440 (setq browse-url-handlers
442 (("youtu\\.?be" . browse-url-mpv)
443 ("peertube.*" . browse-url-mpv)
444 ("vid.*" . browse-url-mpv)
445 ("vid.*" . browse-url-mpv)
446 ("." . eww-browse-url)
450 Some EWW enhancements.
451 *** Give buffer a useful name
452 #+begin_src emacs-lisp
453 ;; From https://protesilaos.com/dotemacs/
454 (defun prot-eww--rename-buffer ()
455 "Rename EWW buffer using page title or URL.
456 To be used by `eww-after-render-hook'."
457 (let ((name (if (eq "" (plist-get eww-data :title))
458 (plist-get eww-data :url)
459 (plist-get eww-data :title))))
460 (rename-buffer (format "*%s # eww*" name) t)))
462 (add-hook 'eww-after-render-hook #'prot-eww--rename-buffer)
464 *** Better entrypoint
465 #+begin_src emacs-lisp
466 ;; From https://protesilaos.com/dotemacs/
467 (defun prot-eww-browse-dwim (url &optional arg)
468 "Visit a URL, maybe from `eww-prompt-history', with completion.
470 With optional prefix ARG (\\[universal-argument]) open URL in a
473 If URL does not look like a valid link, run a web query using
476 When called from an eww buffer, provide the current link as
480 (completing-read "Query:" eww-prompt-history
481 nil nil (plist-get eww-data :url) 'eww-prompt-history)
483 (eww url (if arg 4 nil)))
485 (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
488 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to
489 =emacsclient --eval "(emacs-everywhere)"=.
490 #+begin_src emacs-lisp
491 (use-package emacs-everywhere)
495 #+begin_src emacs-lisp
497 :hook (python-mode . blacken-mode)
499 (setq blacken-line-length 79))
502 (use-package ws-butler
504 (ws-butler-global-mode))
507 #+begin_src emacs-lisp
508 (use-package flycheck
510 (global-flycheck-mode))
512 ** Project management
513 #+begin_src emacs-lisp
514 (use-package projectile
515 :config (projectile-mode)
516 :custom ((projectile-completion-system 'ivy))
518 ("C-c p" . projectile-command-map)
520 (when (file-directory-p "~/Code")
521 (setq projectile-project-search-path '("~/Code")))
522 (setq projectile-switch-project-action #'projectile-dired))
524 (use-package counsel-projectile
526 :config (counsel-projectile-mode))
529 #+begin_src emacs-lisp
531 :straight (:type built-in)
532 :commands (dired dired-jump)
533 :custom ((dired-listing-switches "-agho --group-directories-first"))
535 (evil-collection-define-key 'normal 'dired-mode-map
536 "h" 'dired-single-up-directory
537 "l" 'dired-single-buffer))
539 (use-package dired-single
540 :commands (dired dired-jump))
542 (use-package dired-open
543 :commands (dired dired-jump)
545 (dired-open-extensions '(("png" . "feh")
548 (use-package dired-hide-dotfiles
549 :hook (dired-mode . dired-hide-dotfiles-mode)
551 (evil-collection-define-key 'normal 'dired-mode-map
552 "H" 'dired-hide-dotfiles-mode))
556 # TODO: Write a command that commits hunk, skipping staging step.
557 #+begin_src emacs-lisp
560 *** Colored diff in line number area
561 #+begin_src emacs-lisp
563 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
564 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
565 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
566 :config (global-diff-hl-mode))
568 * General text editing
570 Indent after every change.
571 #+begin_src emacs-lisp
572 (use-package aggressive-indent
573 :config (global-aggressive-indent-mode))
576 Spell check in text mode, and in prog-mode comments.
577 #+begin_src emacs-lisp
578 (dolist (hook '(text-mode-hook))
579 (add-hook hook (lambda () (flyspell-mode))))
580 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
581 (add-hook hook (lambda () (flyspell-mode -1))))
582 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
584 ** Expand tabs to spaces
585 #+begin_src emacs-lisp
586 (setq-default tab-width 2)
588 ** Copy kill ring to clipboard
589 #+begin_src emacs-lisp
590 (setq x-select-enable-clipboard t)
591 (defun copy-kill-ring-to-xorg ()
592 "Copy the current kill ring to the xorg clipboard."
594 (x-select-text (current-kill 0)))
597 #+begin_src emacs-lisp
598 (use-package browse-kill-ring)
601 Opens file where you left it.
602 #+begin_src emacs-lisp
606 Distraction free writing a la junegunn/goyo.
607 #+begin_src emacs-lisp
608 (use-package olivetti
610 (evil-leader/set-key "o" 'olivetti-mode))
614 #+begin_src emacs-lisp
615 (setq abbrev-file-name "~/.emacs.d/abbrevs")
616 (setq save-abbrevs 'silent)
617 (setq-default abbrev-mode t)
620 #+begin_src emacs-lisp
621 (setq tramp-default-method "ssh")
623 ** Don't ask about following symlinks in vc
624 #+begin_src emacs-lisp
625 (setq vc-follow-symlinks t)
628 ** Easily convert splits
629 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
630 #+begin_src emacs-lisp
631 (defun toggle-window-split ()
633 (if (= (count-windows) 2)
634 (let* ((this-win-buffer (window-buffer))
635 (next-win-buffer (window-buffer (next-window)))
636 (this-win-edges (window-edges (selected-window)))
637 (next-win-edges (window-edges (next-window)))
638 (this-win-2nd (not (and (<= (car this-win-edges)
639 (car next-win-edges))
640 (<= (cadr this-win-edges)
641 (cadr next-win-edges)))))
643 (if (= (car this-win-edges)
644 (car (window-edges (next-window))))
645 'split-window-horizontally
646 'split-window-vertically)))
647 (delete-other-windows)
648 (let ((first-win (selected-window)))
650 (if this-win-2nd (other-window 1))
651 (set-window-buffer (selected-window) this-win-buffer)
652 (set-window-buffer (next-window) next-win-buffer)
653 (select-window first-win)
654 (if this-win-2nd (other-window 1))))))
656 (define-key ctl-x-4-map "t" 'toggle-window-split)
659 #+begin_src emacs-lisp
660 (defun insert-date ()
662 (insert (format-time-string "%Y-%m-%d")))
666 #+begin_src emacs-lisp
667 (use-package ace-window
668 :bind ("M-o" . ace-window))
670 ** Kill current buffer
671 Makes "C-x k" binding faster.
672 #+begin_src emacs-lisp
673 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
677 Render OpenSCAD files, and add a preview window.
679 Personal fork just merges a PR.
680 #+begin_src emacs-lisp
681 (use-package scad-mode)
682 (use-package scad-preview
683 :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
685 ** Control backup files
686 Stop backup files from spewing everywhere.
687 #+begin_src emacs-lisp
688 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
690 ** Make yes/no easier
691 #+begin_src emacs-lisp
692 (defalias 'yes-or-no-p 'y-or-n-p)
694 ** Move customize file
695 No more clogging up init.el.
696 #+begin_src emacs-lisp
697 (setq custom-file "~/.emacs.d/custom.el")
701 #+begin_src emacs-lisp
703 :commands (helpful-callable helpful-variable helpful-command helpful-key)
705 (counsel-describe-function-function #'helpful-callable)
706 (counsel-describe-variable-function #'helpful-variable)
708 ([remap describe-function] . counsel-describe-function)
709 ([remap describe-command] . helpful-command)
710 ([remap describe-variable] . counsel-describe-variable)
711 ([remap describe-key] . helpful-key))
714 #+begin_src emacs-lisp
715 (use-package epa-file
716 :straight (:type built-in)
718 (epa-file-select-keys nil)
719 (epa-file-encrypt-to '("me@armaanb.net"))
720 (password-cache-expiry (* 60 15)))
722 (use-package pinentry
723 :config (pinentry-start))
726 #+begin_src emacs-lisp
728 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
729 :custom (0x0-default-service 'envs)
730 :config (evil-leader/set-key
732 "0f" '0x0-upload-file
733 "0s" '0x0-upload-string
734 "0c" '0x0-upload-kill-ring
735 "0p" '0x0-upload-popup))
740 #+begin_src conf :tangle ~/.spectrwm.conf
744 autorun = ws[1]:/home/armaa/Code/scripts/autostart
747 #+begin_src conf :tangle ~/.spectrwm.conf
749 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
753 #+begin_src conf :tangle ~/.spectrwm.conf
754 program[lock] = i3lock -c 000000 -ef
755 program[term] = alacritty
756 program[screenshot_all] = flameshot gui
757 program[menu] = rofi -show run # `rofi-dmenu` handles the rest
758 program[switcher] = rofi -show window
759 program[notif] = /home/armaa/Code/scripts/setter status
762 bind[switcher] = MOD+Tab
765 #+begin_src conf :tangle ~/.spectrwm.conf
766 program[paup] = /home/armaa/Code/scripts/setter audio +5
767 program[padown] = /home/armaa/Code/scripts/setter audio -5
768 program[pamute] = /home/armaa/Code/scripts/setter audio
769 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
770 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
771 program[next] = playerctl next
772 program[prev] = playerctl previous
773 program[pause] = playerctl play-pause
775 bind[padown] = XF86AudioLowerVolume
776 bind[paup] = XF86AudioRaiseVolume
777 bind[pamute] = XF86AudioMute
778 bind[brigdown] = XF86MonBrightnessDown
779 bind[brigup] = XF86MonBrightnessUp
780 bind[pause] = XF86AudioPlay
781 bind[next] = XF86AudioNext
782 bind[prev] = XF86AudioPrev
785 #+begin_src conf :tangle ~/.spectrwm.conf
786 program[h] = xdotool keyup h key --clearmodifiers Left
787 program[j] = xdotool keyup j key --clearmodifiers Down
788 program[k] = xdotool keyup k key --clearmodifiers Up
789 program[l] = xdotool keyup l key --clearmodifiers Right
791 bind[h] = MOD + Control + h
792 bind[j] = MOD + Control + j
793 bind[k] = MOD + Control + k
794 bind[l] = MOD + Control + l
797 #+begin_src conf :tangle ~/.spectrwm.conf
798 program[aerc] = alacritty -e aerc
799 program[catgirl] = alacritty --hold -e sh -c "while : ; do ssh root@armaanb.net -t abduco -A irc catgirl freenode; sleep 2; done"
800 program[emacs] = emacsclient -c
801 program[firefox] = firefox
802 program[calc] = alacritty -e bc
803 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
804 program[pass] = rofi-pass
806 bind[aerc] = MOD+Control+1
807 bind[catgirl] = MOD+Control+2
808 bind[firefox] = MOD+Control+3
809 bind[emacs-anywhere] = MOD+Control+4
810 bind[calc] = MOD+Control+5
811 bind[emacs] = MOD+Control+Return
812 bind[pass] = MOD+Shift+P
817 #+begin_src shell :tangle ~/.config/zsh/zshrc
818 autoload -Uz compinit
822 unsetopt glob_complete
824 # Fragment completions
825 zstyle ':completion:*' list-suffixes
zstyle ':completion:*' expand prefix suffix
828 zstyle ':completion:*' menu select
829 zmodload zsh/complist
830 bindkey -M menuselect '^n' expand-or-complete
831 bindkey -M menuselect '^p' reverse-menu-complete
835 #+begin_src shell :tangle ~/.config/zsh/zshrc
839 bindkey -M vicmd "^[[3~" delete-char
840 bindkey "^[[3~" delete-char
842 autoload edit-command-line
843 zle -N edit-command-line
844 bindkey -M vicmd ^e edit-command-line
845 bindkey ^e edit-command-line
848 #+begin_src shell :tangle ~/.config/zsh/zshrc
849 setopt extended_history
851 setopt inc_append_history
852 setopt hist_ignore_dups
853 setopt hist_reduce_blanks
857 HISTFILE=~/.local/share/zsh/history
860 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
862 Right now, I'm only using fast-syntax-highlighting. It's a really nice visual addition.
864 #+begin_src conf :tangle ~/.config/zpe/repositories
865 https://github.com/zdharma/fast-syntax-highlighting
868 #+begin_src shell :tangle ~/.config/zsh/zshrc
869 source ~/Code/zpe/zpe.sh
870 source ~/Code/admone/admone.zsh
871 source ~/.config/zsh/fzf-bindings.zsh
873 zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
876 **** Time Zsh startup
877 #+begin_src shell :tangle ~/.config/zsh/zshrc
879 for i in $(seq 1 10); do time "$1" -i -c exit; done
882 **** Update all packages
883 #+begin_src shell :tangle ~/.config/zsh/zshrc
884 color=$(tput setaf 5)
888 sudo echo "${color}== upgrading with yay ==${reset}"
891 echo "${color}== checking for pacnew files ==${reset}"
894 echo "${color}== upgrading flatpaks ==${reset}"
897 echo "${color}== upgrading zsh plugins ==${reset}"
900 echo "${color}== updating nvim plugins ==${reset}"
901 nvim +PlugUpdate +PlugUpgrade +qall
902 echo "Updated nvim plugins"
904 echo "${color}You are entirely up to date!${reset}"
907 **** Clean all packages
908 #+begin_src shell :tangle ~/.config/zsh/zshrc
910 sudo echo "${color}== cleaning pacman orphans ==${reset}"
911 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
913 echo "${color}== cleaning flatpaks ==${reset}"
914 flatpak remove --unused
916 echo "${color}== cleaning zsh plugins ==${reset}"
919 echo "${color}== cleaning nvim plugins ==${reset}"
920 nvim +PlugClean +qall
921 echo "Cleaned nvim plugins"
923 echo "${color}All orphans cleaned!${reset}"
927 #+begin_src shell :tangle ~/.config/zsh/zshrc
929 __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
930 if [ $? -eq 0 ]; then
931 eval "$__conda_setup"
933 if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
934 . "/opt/anaconda/etc/profile.d/conda.sh"
936 export PATH="/opt/anaconda/bin:$PATH"
942 **** Interact with 0x0
943 #+begin_src shell :tangle ~/.config/zsh/zshrc
944 zxz="https://envs.sh"
945 0file() { curl -F"file=@$1" "$zxz" ; }
946 0pb() { curl -F"file=@-;" "$zxz" ; }
947 0url() { curl -F"url=$1" "$zxz" ; }
948 0short() { curl -F"shorten=$1" "$zxz" ; }
949 0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
952 #+begin_src shell :tangle ~/.config/zsh/zshrc
954 user=$(echo "$1" | cut -f 1 -d '@')
955 host=$(echo "$1" | cut -f 2 -d '@')
956 echo $user | nc "$host" 79 -N
961 #+begin_src shell :tangle ~/.config/zsh/zshrc
962 alias bhoji-drop='ssh -p 23 root@armaanb.net'
963 alias catgirl='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
964 alias union='ssh 192.168.1.18'
965 alias mine='ssh -p 23 root@pickupserver.cc'
966 alias tcf='ssh root@204.48.23.68'
967 alias ngmun='ssh root@157.245.89.25'
968 alias prox='ssh root@192.168.1.224'
969 alias ncq='ssh root@143.198.123.17'
970 alias dock='ssh root@192.168.1.225'
971 alias jenkins='ssh root@192.168.1.226'
972 alias envs='ssh acheam@envs.net'
975 #+begin_src shell :tangle ~/.config/zsh/zshrc
976 alias ls='exa -lh --icons --git --group-directories-first'
977 alias la='exa -lha --icons --git --group-directories-first'
978 alias df='df -h / /boot'
985 alias grep='grep -in --exclude-dir=.git --color=auto'
986 alias fname='find -name'
987 alias mkdir='mkdir -pv'
988 alias unar='atool -x'
989 alias wget='wget -e robots=off'
990 alias lanex='~/.local/share/lxc/lxc'
992 #+begin_src shell :tangle ~/.config/zsh/zshrc
995 alias vw="nvim ~/Documents/vimwiki/index.md"
997 **** System management
998 #+begin_src shell :tangle ~/.config/zsh/zshrc
999 alias jctl='journalctl -p 3 -xb'
1000 alias pkill='pkill -i'
1002 alias redoas='doas $(fc -ln -1)'
1003 alias crontab='crontab-argh'
1004 alias sudo='doas ' # allows aliases to be run with doas
1005 alias pasc='pass -c'
1006 alias pasu='\pass git push'
1007 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1011 #+begin_src shell :tangle ~/.config/zsh/zshrc
1012 alias ping='ping -c 10'
1013 alias speed='speedtest-cli'
1014 alias ip='ip --color=auto'
1015 alias cip='curl https://armaanb.net/ip'
1016 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1017 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1018 alias plan='T=$(mktemp) && \
1019 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
1021 head -n -2 $T > $TT && \
1023 echo "\nLast updated: $(date -R)" >> "$TT" && \
1024 rsync "$TT" root@armaanb.net:/etc/finger/plan.txt'
1025 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
1028 #+begin_src shell :tangle ~/.config/zsh/zshrc
1029 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1030 iflag=fullblock status=progress'
1031 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1032 iflag=fullblock status=progress'
1033 alias ts='gen-shell -c task'
1034 alias ts='gen-shell -c task'
1035 alias tetris='autoload -Uz tetriscurses && tetriscurses'
1036 alias news='newsboat'
1037 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1038 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
1039 --restrict-filenames -o '%(title)s.%(ext)s'"
1040 alias cal="cal -3 --color=auto"
1043 **** Virtual machines, chroots
1044 #+begin_src shell :tangle ~/.config/zsh/zshrc
1045 alias ckiss="sudo chrooter ~/Virtual/kiss"
1046 alias cdebian="sudo chrooter ~/Virtual/debian bash"
1047 alias cwindows='devour qemu-system-x86_64 \
1052 -device VGA,vgamem_mb=64 \
1054 -device hda-duplex \
1056 -net user,smb=/home/armaa/Public \
1057 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1060 #+begin_src shell :tangle ~/.config/zsh/zshrc
1062 alias zpy="zconda && ipython"
1063 alias math="ipython --profile=math"
1064 alias pypi="python setup.py sdist && twine upload dist/*"
1065 alias pip="python -m pip"
1066 alias black="black -l 79"
1069 #+begin_src shell :tangle ~/.config/zsh/zshrc
1070 alias words='gen-shell -c "words"'
1071 alias words-e='gen-shell -c "words ~E"'
1074 #+begin_src shell :tangle ~/.config/zsh/zshrc
1075 alias zathura='devour zathura'
1076 alias mpv='devour mpv'
1077 alias sql='devour sqlitebrowser'
1078 alias cad='devour openscad'
1079 alias feh='devour feh'
1081 **** Package management (Pacman)
1082 #+begin_src shell :tangle ~/.config/zsh/zshrc
1084 alias api='yay -Syu'
1085 alias apii='sudo pacman -S'
1086 alias app='yay -Rns'
1088 alias apo='yay -Qttd'
1089 alias azf='pacman -Q | fzf'
1090 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1091 alias ufetch='ufetch-arch'
1092 alias reflect='reflector --verbose --sort rate --save \
1093 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1095 **** Package management (KISS)
1096 #+begin_src shell :tangle ~/.config/zsh/zshrc
1097 alias kzf="kiss s \* | xargs -l basename | \
1098 fzf --preview 'kiss search {} | xargs -l dirname'"
1101 #+begin_src shell :tangle ~/.config/zsh/zshrc
1102 export EDITOR="emacsclient -c"
1103 export VISUAL="$EDITOR"
1104 export TERM=xterm-256color # for compatability
1106 export GPG_TTY="$(tty)"
1107 export MANPAGER='nvim +Man!'
1110 export GTK_USE_PORTAL=1
1112 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1113 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
1114 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
1115 export PATH="$PATH:/home/armaa/.cargo/bin"
1116 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1117 export PATH="$PATH:/usr/sbin"
1118 export PATH="$PATH:/opt/FreeTube/freetube"
1120 export LC_ALL="en_US.UTF-8"
1121 export LC_CTYPE="en_US.UTF-8"
1122 export LANGUAGE="en_US.UTF-8"
1124 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
1125 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1126 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1127 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1128 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1129 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1133 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1136 family: JetBrains Mono Nerd Font
1143 ligatures: true # Requires ligature patch
1150 background_opacity: 1
1153 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1154 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1158 background: '#000000'
1159 foreground: '#ffffff'
1163 background: '#ffffff'
1165 # Normal colors (except green it is from intense colors)
1176 # Bright colors [all the faint colors in the modus theme]
1187 # dim [all the intense colors in modus theme]
1200 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1201 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1202 c.TerminalInteractiveShell.editing_mode = 'vi'
1203 c.InteractiveShell.colors = 'linux'
1204 c.TerminalInteractiveShell.confirm_exit = False
1207 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1211 return x * (180 / pi)
1214 return x * (pi / 180)
1217 return (x * (pi / 180)) / unit
1229 Make MPV play a little bit smoother.
1230 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1231 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1235 For any GNU Readline programs
1236 #+begin_src conf :tangle ~/.inputrc
1241 #+begin_src conf :tangle ~/.gitconfig
1243 name = Armaan Bhojwani
1244 email = me@armaanb.net
1245 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1248 #+begin_src conf :tangle ~/.gitconfig
1250 defaultBranch = main
1253 #+begin_src conf :tangle ~/.gitconfig
1258 #+begin_src conf :tangle ~/.gitconfig
1260 smtpserver = smtp.mailbox.org
1261 smtpuser = me@armaanb.net
1262 smtpencryption = ssl
1263 smtpserverport = 465
1267 #+begin_src conf :tangle ~/.gitconfig
1272 #+begin_src conf :tangle ~/.gitconfig
1275 sclone = clone --depth 1
1281 subup = submodule update --remote
1282 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1283 mirror = git config --global alias.mirrormirror
1286 #+begin_src conf :tangle ~/.gitconfig
1292 Lightweight notification daemon.
1294 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1296 font = "JetBrains Mono Medium Nerd Font 11"
1298 format = "<b>%s</b>\n%b"
1300 indicate_hidden = yes
1303 show_age_threshold = 60
1306 geometry = "400x5-10+10"
1308 idle_threshold = 120
1310 sticky_history = yes
1312 separator_height = 1
1314 horizontal_padding = 8
1316 separator_color = "#ffffff"
1317 startup_notification = false
1320 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1327 close_all = mod4+shift+c
1328 history = mod4+ctrl+c
1331 background = "#222222"
1332 foreground = "#ffffff"
1333 highlight = "#ffffff"
1337 background = "#222222"
1338 foreground = "#ffffff"
1339 highlight = "#ffffff"
1343 background = "#222222"
1344 foreground = "#a60000"
1345 highlight = "#ffffff"
1349 Modus vivendi theme that extends DarkBlue.
1350 #+begin_src javascript :tangle ~/.config/rofi/config.rasi
1351 @import "/usr/share/rofi/themes/DarkBlue.rasi"
1353 white: rgba ( 255, 255, 255, 100 % );
1355 selected-normal-background: @white;
1356 separatorcolor: @white;
1357 background: rgba ( 34, 34, 34, 100 % );
1362 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1364 map <A-b> toggle_statusbar
1365 set selection-clipboard clipboard
1368 set window-title-basename "true"
1369 set selection-clipboard "clipboard"
1372 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1373 set default-bg "#000000"
1374 set default-fg "#ffffff"
1375 set render-loading true
1376 set render-loading-bg "#000000"
1377 set render-loading-fg "#ffffff"
1379 set recolor-lightcolor "#000000" # bg
1380 set recolor-darkcolor "#ffffff" # fg
1384 *** Swap tab and URL bars
1385 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1387 -moz-box-ordinal-group: 1 !important;
1391 -moz-box-ordinal-group: 2 !important;
1395 -moz-box-ordinal-group: 3 !important;
1398 *** Hide URL bar when not focused.
1399 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1400 #navigator-toolbox:not(:focus-within):not(:hover) {
1404 #navigator-toolbox {
1405 transition: 0.1s margin-top ease-out;
1408 ** Black screen by default
1409 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1412 #browser vbox#appcontent tabbrowser,
1414 #tabbrowser-tabpanels,
1416 browser[type="content-primary"],
1417 browser[type="content"] > html,
1419 background: black !important;
1420 color: #fff !important;
1423 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1424 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1426 background: black !important;