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 #+begin_src emacs-lisp
436 (use-package calfw-org)
437 (use-package calfw-ical)
439 (defun acheam-calendar ()
442 (shell-command "vdirsyncer sync")
443 (let ((default-directory "~/.local/share/vdirsyncer/"))
444 (cfw:open-calendar-buffer
447 (cfw:ical-create-source "School" (expand-file-name "school/abhojwani22@nobles.edu.ics") "Green")
448 (cfw:ical-create-source "Personal" (expand-file-name "mailbox/Y2FsOi8vMC8zMQ.ics") "Blue")
449 (cfw:ical-create-source "Birthdays" (expand-file-name "mailbox/Y2FsOi8vMS8w.ics") "Gray")
453 Another file has more specific network configuration.
454 #+begin_src emacs-lisp
456 :config (load-file "~/.emacs.d/irc.el"))
458 (use-package circe-chanop
459 :straight (:type built-in)
462 (use-package circe-color-nicks
463 :straight (:type built-in)
467 Set EWW as default browser except for videos.
468 #+begin_src emacs-lisp
469 (defun browse-url-mpv (url &optional new-window)
471 (start-process "mpv" "*mpv*" "mpv" url))
473 (setq browse-url-handlers
475 (("youtu\\.?be" . browse-url-mpv)
476 ("peertube.*" . browse-url-mpv)
477 ("vid.*" . browse-url-mpv)
478 ("vid.*" . browse-url-mpv)
479 ("." . eww-browse-url)
483 Some EWW enhancements.
484 *** Give buffer a useful name
485 #+begin_src emacs-lisp
486 ;; From https://protesilaos.com/dotemacs/
487 (defun prot-eww--rename-buffer ()
488 "Rename EWW buffer using page title or URL.
489 To be used by `eww-after-render-hook'."
490 (let ((name (if (eq "" (plist-get eww-data :title))
491 (plist-get eww-data :url)
492 (plist-get eww-data :title))))
493 (rename-buffer (format "*%s # eww*" name) t)))
495 (add-hook 'eww-after-render-hook #'prot-eww--rename-buffer)
497 *** Better entrypoint
498 #+begin_src emacs-lisp
499 ;; From https://protesilaos.com/dotemacs/
500 (defun prot-eww-browse-dwim (url &optional arg)
501 "Visit a URL, maybe from `eww-prompt-history', with completion.
503 With optional prefix ARG (\\[universal-argument]) open URL in a
506 If URL does not look like a valid link, run a web query using
509 When called from an eww buffer, provide the current link as
513 (completing-read "Query:" eww-prompt-history
514 nil nil (plist-get eww-data :url) 'eww-prompt-history)
516 (eww url (if arg 4 nil)))
518 (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
521 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to
522 =emacsclient --eval "(emacs-everywhere)"=.
523 #+begin_src emacs-lisp
524 (use-package emacs-everywhere)
527 #+begin_src emacs-lisp
528 (setq eshell-prompt-function
531 "\n" (eshell/pwd) " ➤ ")
532 'face '(:foreground "cyan")))
533 eshell-highlight-prompt nil)
537 #+begin_src emacs-lisp
539 :hook (python-mode . blacken-mode)
541 (setq blacken-line-length 79))
544 (use-package ws-butler
546 (ws-butler-global-mode))
549 #+begin_src emacs-lisp
550 (use-package flycheck
552 (global-flycheck-mode))
554 ** Project management
555 #+begin_src emacs-lisp
556 (use-package projectile
557 :config (projectile-mode)
558 :custom ((projectile-completion-system 'ivy))
560 ("C-c p" . projectile-command-map)
562 (when (file-directory-p "~/Code")
563 (setq projectile-project-search-path '("~/Code")))
564 (setq projectile-switch-project-action #'projectile-dired))
566 (use-package counsel-projectile
568 :config (counsel-projectile-mode))
571 #+begin_src emacs-lisp
573 :straight (:type built-in)
574 :commands (dired dired-jump)
575 :custom ((dired-listing-switches "-agho --group-directories-first"))
577 (evil-collection-define-key 'normal 'dired-mode-map
578 "h" 'dired-single-up-directory
579 "l" 'dired-single-buffer))
581 (use-package dired-single
582 :commands (dired dired-jump))
584 (use-package dired-open
585 :commands (dired dired-jump)
587 (dired-open-extensions '(("png" . "feh")
590 (use-package dired-hide-dotfiles
591 :hook (dired-mode . dired-hide-dotfiles-mode)
593 (evil-collection-define-key 'normal 'dired-mode-map
594 "H" 'dired-hide-dotfiles-mode))
598 # TODO: Write a command that commits hunk, skipping staging step.
599 #+begin_src emacs-lisp
602 *** Colored diff in line number area
603 #+begin_src emacs-lisp
605 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
606 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
607 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
608 :config (global-diff-hl-mode))
610 * General text editing
612 Indent after every change.
613 #+begin_src emacs-lisp
614 (use-package aggressive-indent
615 :config (global-aggressive-indent-mode))
618 Spell check in text mode, and in prog-mode comments.
619 #+begin_src emacs-lisp
620 (dolist (hook '(text-mode-hook))
621 (add-hook hook (lambda () (flyspell-mode))))
622 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
623 (add-hook hook (lambda () (flyspell-mode -1))))
624 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
626 ** Expand tabs to spaces
627 #+begin_src emacs-lisp
628 (setq-default tab-width 2)
630 ** Copy kill ring to clipboard
631 #+begin_src emacs-lisp
632 (setq x-select-enable-clipboard t)
633 (defun copy-kill-ring-to-xorg ()
634 "Copy the current kill ring to the xorg clipboard."
636 (x-select-text (current-kill 0)))
639 #+begin_src emacs-lisp
640 (use-package browse-kill-ring)
643 Opens file where you left it.
644 #+begin_src emacs-lisp
648 Distraction free writing a la junegunn/goyo.
649 #+begin_src emacs-lisp
650 (use-package olivetti
652 (evil-leader/set-key "o" 'olivetti-mode))
656 #+begin_src emacs-lisp
657 (setq abbrev-file-name "~/.emacs.d/abbrevs")
658 (setq save-abbrevs 'silent)
659 (setq-default abbrev-mode t)
662 #+begin_src emacs-lisp
663 (setq tramp-default-method "ssh")
665 ** Don't ask about following symlinks in vc
666 #+begin_src emacs-lisp
667 (setq vc-follow-symlinks t)
670 ** Easily convert splits
671 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
672 #+begin_src emacs-lisp
673 (defun toggle-window-split ()
675 (if (= (count-windows) 2)
676 (let* ((this-win-buffer (window-buffer))
677 (next-win-buffer (window-buffer (next-window)))
678 (this-win-edges (window-edges (selected-window)))
679 (next-win-edges (window-edges (next-window)))
680 (this-win-2nd (not (and (<= (car this-win-edges)
681 (car next-win-edges))
682 (<= (cadr this-win-edges)
683 (cadr next-win-edges)))))
685 (if (= (car this-win-edges)
686 (car (window-edges (next-window))))
687 'split-window-horizontally
688 'split-window-vertically)))
689 (delete-other-windows)
690 (let ((first-win (selected-window)))
692 (if this-win-2nd (other-window 1))
693 (set-window-buffer (selected-window) this-win-buffer)
694 (set-window-buffer (next-window) next-win-buffer)
695 (select-window first-win)
696 (if this-win-2nd (other-window 1))))))
698 (define-key ctl-x-4-map "t" 'toggle-window-split)
701 #+begin_src emacs-lisp
702 (defun insert-date ()
704 (insert (format-time-string "%Y-%m-%d")))
708 #+begin_src emacs-lisp
709 (use-package ace-window
710 :bind ("M-o" . ace-window))
712 ** Kill current buffer
713 Makes "C-x k" binding faster.
714 #+begin_src emacs-lisp
715 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
719 Render OpenSCAD files, and add a preview window.
721 Personal fork just merges a PR.
722 #+begin_src emacs-lisp
723 (use-package scad-mode)
724 (use-package scad-preview
725 :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
727 ** Control backup files
728 Stop backup files from spewing everywhere.
729 #+begin_src emacs-lisp
730 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
732 ** Make yes/no easier
733 #+begin_src emacs-lisp
734 (defalias 'yes-or-no-p 'y-or-n-p)
736 ** Move customize file
737 No more clogging up init.el.
738 #+begin_src emacs-lisp
739 (setq custom-file "~/.emacs.d/custom.el")
743 #+begin_src emacs-lisp
745 :commands (helpful-callable helpful-variable helpful-command helpful-key)
747 (counsel-describe-function-function #'helpful-callable)
748 (counsel-describe-variable-function #'helpful-variable)
750 ([remap describe-function] . counsel-describe-function)
751 ([remap describe-command] . helpful-command)
752 ([remap describe-variable] . counsel-describe-variable)
753 ([remap describe-key] . helpful-key))
756 #+begin_src emacs-lisp
757 (use-package epa-file
758 :straight (:type built-in)
760 (epa-file-select-keys nil)
761 (epa-file-encrypt-to '("me@armaanb.net"))
762 (password-cache-expiry (* 60 15)))
764 (use-package pinentry
765 :config (pinentry-start))
768 #+begin_src emacs-lisp
770 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
771 :custom (0x0-default-service 'envs)
772 :config (evil-leader/set-key
774 "0f" '0x0-upload-file
775 "0s" '0x0-upload-string
776 "0c" '0x0-upload-kill-ring
777 "0p" '0x0-upload-popup))
782 #+begin_src conf :tangle ~/.spectrwm.conf
786 autorun = ws[1]:/home/armaa/Code/scripts/autostart
789 #+begin_src conf :tangle ~/.spectrwm.conf
791 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
795 #+begin_src conf :tangle ~/.spectrwm.conf
796 program[lock] = i3lock -c 000000 -ef
797 program[term] = alacritty
798 program[screenshot_all] = flameshot gui
799 program[menu] = rofi -show run # `rofi-dmenu` handles the rest
800 program[switcher] = rofi -show window
801 program[notif] = /home/armaa/Code/scripts/setter status
804 bind[switcher] = MOD+Tab
807 #+begin_src conf :tangle ~/.spectrwm.conf
808 program[paup] = /home/armaa/Code/scripts/setter audio +5
809 program[padown] = /home/armaa/Code/scripts/setter audio -5
810 program[pamute] = /home/armaa/Code/scripts/setter audio
811 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
812 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
813 program[next] = playerctl next
814 program[prev] = playerctl previous
815 program[pause] = playerctl play-pause
817 bind[padown] = XF86AudioLowerVolume
818 bind[paup] = XF86AudioRaiseVolume
819 bind[pamute] = XF86AudioMute
820 bind[brigdown] = XF86MonBrightnessDown
821 bind[brigup] = XF86MonBrightnessUp
822 bind[pause] = XF86AudioPlay
823 bind[next] = XF86AudioNext
824 bind[prev] = XF86AudioPrev
827 #+begin_src conf :tangle ~/.spectrwm.conf
828 program[h] = xdotool keyup h key --clearmodifiers Left
829 program[j] = xdotool keyup j key --clearmodifiers Down
830 program[k] = xdotool keyup k key --clearmodifiers Up
831 program[l] = xdotool keyup l key --clearmodifiers Right
833 bind[h] = MOD + Control + h
834 bind[j] = MOD + Control + j
835 bind[k] = MOD + Control + k
836 bind[l] = MOD + Control + l
839 #+begin_src conf :tangle ~/.spectrwm.conf
840 program[aerc] = alacritty -e aerc
841 program[catgirl] = alacritty --hold -e sh -c "while : ; do ssh root@armaanb.net -t abduco -A irc catgirl freenode; sleep 2; done"
842 program[emacs] = emacsclient -c
843 program[firefox] = firefox
844 program[calc] = alacritty -e bc
845 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
847 bind[aerc] = MOD+Control+1
848 bind[catgirl] = MOD+Control+2
849 bind[firefox] = MOD+Control+3
850 bind[emacs-anywhere] = MOD+Control+4
851 bind[calc] = MOD+Control+5
852 bind[emacs] = MOD+Control+Return
857 #+begin_src shell :tangle ~/.config/zsh/zshrc
858 autoload -Uz compinit
862 unsetopt glob_complete
864 # Fragment completions
865 zstyle ':completion:*' list-suffixes
zstyle ':completion:*' expand prefix suffix
868 zstyle ':completion:*' menu select
869 zmodload zsh/complist
870 bindkey -M menuselect '^n' expand-or-complete
871 bindkey -M menuselect '^p' reverse-menu-complete
875 #+begin_src shell :tangle ~/.config/zsh/zshrc
879 bindkey -M vicmd "^[[3~" delete-char
880 bindkey "^[[3~" delete-char
882 autoload edit-command-line
883 zle -N edit-command-line
884 bindkey -M vicmd ^e edit-command-line
885 bindkey ^e edit-command-line
888 #+begin_src shell :tangle ~/.config/zsh/zshrc
889 setopt extended_history
891 setopt inc_append_history
892 setopt hist_ignore_dups
893 setopt hist_reduce_blanks
897 HISTFILE=~/.local/share/zsh/history
900 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
902 Right now, I'm only using fast-syntax-highlighting. It's a really nice visual addition.
904 #+begin_src conf :tangle ~/.config/zpe/repositories
905 https://github.com/zdharma/fast-syntax-highlighting
908 #+begin_src shell :tangle ~/.config/zsh/zshrc
909 source ~/Code/zpe/zpe.sh
910 source ~/Code/admone/admone.zsh
911 source ~/.config/zsh/fzf-bindings.zsh
913 zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
916 **** Time Zsh startup
917 #+begin_src shell :tangle ~/.config/zsh/zshrc
919 for i in $(seq 1 10); do
920 time "zsh" -i -c exit;
924 **** Update all packages
925 #+begin_src shell :tangle ~/.config/zsh/zshrc
926 color=$(tput setaf 5)
930 sudo echo "${color}== upgrading with yay ==${reset}"
933 echo "${color}== checking for pacnew files ==${reset}"
936 echo "${color}== upgrading flatpaks ==${reset}"
939 echo "${color}== upgrading zsh plugins ==${reset}"
942 echo "${color}== updating nvim plugins ==${reset}"
943 nvim +PlugUpdate +PlugUpgrade +qall
944 echo "Updated nvim plugins"
946 echo "${color}You are entirely up to date!${reset}"
949 **** Clean all packages
950 #+begin_src shell :tangle ~/.config/zsh/zshrc
952 sudo echo "${color}== cleaning pacman orphans ==${reset}"
953 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
955 echo "${color}== cleaning flatpaks ==${reset}"
956 flatpak remove --unused
958 echo "${color}== cleaning zsh plugins ==${reset}"
961 echo "${color}== cleaning nvim plugins ==${reset}"
962 nvim +PlugClean +qall
963 echo "Cleaned nvim plugins"
965 echo "${color}All orphans cleaned!${reset}"
969 #+begin_src shell :tangle ~/.config/zsh/zshrc
971 __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
972 if [ $? -eq 0 ]; then
973 eval "$__conda_setup"
975 if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
976 . "/opt/anaconda/etc/profile.d/conda.sh"
978 export PATH="/opt/anaconda/bin:$PATH"
984 **** Interact with 0x0
985 #+begin_src shell :tangle ~/.config/zsh/zshrc
986 zxz="https://envs.sh"
987 0file() { curl -F"file=@$1" "$zxz" ; }
988 0pb() { curl -F"file=@-;" "$zxz" ; }
989 0url() { curl -F"url=$1" "$zxz" ; }
990 0short() { curl -F"shorten=$1" "$zxz" ; }
991 0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
994 #+begin_src shell :tangle ~/.config/zsh/zshrc
996 user=$(echo "$1" | cut -f 1 -d '@')
997 host=$(echo "$1" | cut -f 2 -d '@')
998 echo $user | nc "$host" 79 -N
1003 #+begin_src shell :tangle ~/.config/zsh/zshrc
1004 alias bhoji-drop='ssh -p 23 root@armaanb.net'
1005 alias catgirl='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
1006 alias union='ssh 192.168.1.18'
1007 alias mine='ssh -p 23 root@71.184.142.155'
1008 alias minec='ssh -p 23 root@71.184.142.155 su minecraft -c "tmux a -t minecraft"'
1009 alias tcf='ssh root@204.48.23.68'
1010 alias ngmun='ssh root@157.245.89.25'
1011 alias prox='ssh root@192.168.1.224'
1012 alias ncq='ssh root@143.198.123.17'
1013 alias dock='ssh root@192.168.1.225'
1014 alias jenkins='ssh root@192.168.1.226'
1015 alias envs='ssh acheam@envs.net'
1017 **** File management
1018 #+begin_src shell :tangle ~/.config/zsh/zshrc
1019 alias ls='exa -lh --icons --git --group-directories-first'
1020 alias la='exa -lha --icons --git --group-directories-first'
1021 alias df='df -h / /boot'
1023 alias free='free -h'
1028 alias grep='grep -in --exclude-dir=.git --color=auto'
1029 alias fname='find -name'
1030 alias mkdir='mkdir -pv'
1031 alias unar='atool -x'
1032 alias wget='wget -e robots=off'
1033 alias lanex='~/.local/share/lxc/lxc'
1036 #+begin_src shell :tangle ~/.config/zsh/zshrc
1037 alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1038 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1040 alias padu='padm add -u && padm commit && padm push && yadu'
1043 #+begin_src shell :tangle ~/.config/zsh/zshrc
1046 alias vw="nvim ~/Documents/vimwiki/index.md"
1048 **** System management
1049 #+begin_src shell :tangle ~/.config/zsh/zshrc
1050 alias jctl='journalctl -p 3 -xb'
1051 alias pkill='pkill -i'
1053 alias redoas='doas $(fc -ln -1)'
1054 alias crontab='crontab-argh'
1055 alias sudo='doas ' # allows aliases to be run with doas
1058 #+begin_src shell :tangle ~/.config/zsh/zshrc
1059 alias ping='ping -c 10'
1060 alias speed='speedtest-cli'
1061 alias ip='ip --color=auto'
1062 alias cip='curl https://armaanb.net/ip'
1063 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1064 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1065 alias plan='T=$(mktemp) && \
1066 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
1068 head -n -2 $T > $TT && \
1070 echo "\nLast updated: $(date -R)" >> "$TT" && \
1071 rsync "$TT" root@armaanb.net:/etc/finger/plan.txt'
1072 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
1075 #+begin_src shell :tangle ~/.config/zsh/zshrc
1076 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1077 iflag=fullblock status=progress'
1078 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1079 iflag=fullblock status=progress'
1080 alias ts='gen-shell -c task'
1081 alias ts='gen-shell -c task'
1082 alias tetris='autoload -Uz tetriscurses && tetriscurses'
1083 alias news='newsboat'
1084 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1085 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
1086 --restrict-filenames -o '%(title)s.%(ext)s'"
1087 alias cal="cal -3 --color=auto"
1090 **** Virtual machines, chroots
1091 #+begin_src shell :tangle ~/.config/zsh/zshrc
1092 alias ckiss="sudo chrooter ~/Virtual/kiss"
1093 alias cdebian="sudo chrooter ~/Virtual/debian bash"
1094 alias cwindows='devour qemu-system-x86_64 \
1099 -device VGA,vgamem_mb=64 \
1101 -device hda-duplex \
1103 -net user,smb=/home/armaa/Public \
1104 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1107 #+begin_src shell :tangle ~/.config/zsh/zshrc
1109 alias zpy="zconda && ipython"
1110 alias math="ipython --profile=math"
1111 alias pypi="python setup.py sdist && twine upload dist/*"
1112 alias pip="python -m pip"
1113 alias black="black -l 79"
1116 #+begin_src shell :tangle ~/.config/zsh/zshrc
1117 alias words='gen-shell -c "words"'
1118 alias words-e='gen-shell -c "words ~E"'
1121 #+begin_src shell :tangle ~/.config/zsh/zshrc
1122 alias zathura='devour zathura'
1123 alias mpv='devour mpv'
1124 alias sql='devour sqlitebrowser'
1125 alias cad='devour openscad'
1126 alias feh='devour feh'
1128 **** Package management (Pacman)
1129 #+begin_src shell :tangle ~/.config/zsh/zshrc
1131 alias api='yay -Syu'
1132 alias apii='sudo pacman -S'
1133 alias app='yay -Rns'
1135 alias apo='yay -Qttd'
1136 alias azf='pacman -Q | fzf'
1137 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1138 alias ufetch='ufetch-arch'
1139 alias reflect='reflector --verbose --sort rate --save \
1140 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1142 **** Package management (KISS)
1143 #+begin_src shell :tangle ~/.config/zsh/zshrc
1144 alias kzf="kiss s \* | xargs -l basename | \
1145 fzf --preview 'kiss search {} | xargs -l dirname'"
1148 #+begin_src shell :tangle ~/.config/zsh/zshrc
1149 export EDITOR="emacsclient -c"
1150 export VISUAL="$EDITOR"
1151 export TERM=xterm-256color # for compatability
1153 export GPG_TTY="$(tty)"
1154 export MANPAGER='nvim +Man!'
1157 export GTK_USE_PORTAL=1
1159 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1160 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
1161 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
1162 export PATH="$PATH:/home/armaa/.cargo/bin"
1163 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1164 export PATH="$PATH:/usr/sbin"
1165 export PATH="$PATH:/opt/FreeTube/freetube"
1167 export LC_ALL="en_US.UTF-8"
1168 export LC_CTYPE="en_US.UTF-8"
1169 export LANGUAGE="en_US.UTF-8"
1171 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
1172 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1173 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1174 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1175 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1176 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1180 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1183 family: JetBrains Mono Nerd Font
1190 ligatures: true # Requires ligature patch
1197 background_opacity: 1
1200 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1201 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1205 background: '#000000'
1206 foreground: '#ffffff'
1210 background: '#ffffff'
1212 # Normal colors (except green it is from intense colors)
1223 # Bright colors [all the faint colors in the modus theme]
1234 # dim [all the intense colors in modus theme]
1247 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1248 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1249 c.TerminalInteractiveShell.editing_mode = 'vi'
1250 c.InteractiveShell.colors = 'linux'
1251 c.TerminalInteractiveShell.confirm_exit = False
1254 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1258 return x * (180 / pi)
1261 return x * (pi / 180)
1264 return (x * (pi / 180)) / unit
1276 Make MPV play a little bit smoother.
1277 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1278 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1282 For any GNU Readline programs
1283 #+begin_src conf :tangle ~/.inputrc
1288 #+begin_src conf :tangle ~/.gitconfig
1290 name = Armaan Bhojwani
1291 email = me@armaanb.net
1292 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1295 #+begin_src conf :tangle ~/.gitconfig
1297 defaultBranch = main
1300 #+begin_src conf :tangle ~/.gitconfig
1305 #+begin_src conf :tangle ~/.gitconfig
1307 smtpserver = smtp.mailbox.org
1308 smtpuser = me@armaanb.net
1309 smtpencryption = ssl
1310 smtpserverport = 465
1314 #+begin_src conf :tangle ~/.gitconfig
1319 #+begin_src conf :tangle ~/.gitconfig
1322 sclone = clone --depth 1
1328 subup = submodule update --remote
1329 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1330 mirror = git config --global alias.mirrormirror
1333 #+begin_src conf :tangle ~/.gitconfig
1339 Lightweight notification daemon.
1341 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1343 font = "JetBrains Mono Medium Nerd Font 11"
1345 format = "<b>%s</b>\n%b"
1347 indicate_hidden = yes
1350 show_age_threshold = 60
1353 geometry = "400x5-10+10"
1355 idle_threshold = 120
1357 sticky_history = yes
1359 separator_height = 1
1361 horizontal_padding = 8
1363 separator_color = "#ffffff"
1364 startup_notification = false
1367 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1374 close_all = mod4+shift+c
1375 history = mod4+ctrl+c
1378 background = "#222222"
1379 foreground = "#ffffff"
1380 highlight = "#ffffff"
1384 background = "#222222"
1385 foreground = "#ffffff"
1386 highlight = "#ffffff"
1390 background = "#222222"
1391 foreground = "#a60000"
1392 highlight = "#ffffff"
1396 Modus vivendi theme that extends DarkBlue.
1397 #+begin_src javascript :tangle ~/.config/rofi/config.rasi
1398 @import "/usr/share/rofi/themes/DarkBlue.rasi"
1400 white: rgba ( 255, 255, 255, 100 % );
1402 selected-normal-background: @white;
1403 separatorcolor: @white;
1404 background: rgba ( 34, 34, 34, 100 % );
1409 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1411 map <A-b> toggle_statusbar
1412 set selection-clipboard clipboard
1415 set window-title-basename "true"
1416 set selection-clipboard "clipboard"
1419 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1420 set default-bg "#000000"
1421 set default-fg "#ffffff"
1422 set render-loading true
1423 set render-loading-bg "#000000"
1424 set render-loading-fg "#ffffff"
1426 set recolor-lightcolor "#000000" # bg
1427 set recolor-darkcolor "#ffffff" # fg
1431 *** Swap tab and URL bars
1432 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1434 -moz-box-ordinal-group: 1 !important;
1438 -moz-box-ordinal-group: 2 !important;
1442 -moz-box-ordinal-group: 3 !important;
1445 *** Hide URL bar when not focused.
1446 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1447 #navigator-toolbox:not(:focus-within):not(:hover) {
1451 #navigator-toolbox {
1452 transition: 0.1s margin-top ease-out;
1455 ** Black screen by default
1456 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1459 #browser vbox#appcontent tabbrowser,
1461 #tabbrowser-tabpanels,
1463 browser[type="content-primary"],
1464 browser[type="content"] > html,
1466 background: black !important;
1467 color: #fff !important;
1470 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1471 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1473 background: black !important;