1 #+TITLE: System Configuration
2 #+DESCRIPTION: Armaan's system configuration.
5 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!
7 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.
9 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.
11 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.
13 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.
15 *** TODO Turn keybinding and hook declarations into use-package declarations where possible
16 *** TODO Put configs with passwords in here with some kind of authentication
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-org-blocks 'rainbow
52 modus-themes-mode-line '3d
53 modus-themes-scale-headings t
54 modus-themes-region 'no-extend
55 modus-themes-diffs 'desaturated)
56 (load-theme 'modus-vivendi t)
60 Great programming font with ligatures.
61 #+begin_src emacs-lisp
62 (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
65 #+begin_src emacs-lisp
67 :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
69 (ligature-set-ligatures
70 '(prog-mode text-mode)
71 '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "///" "/=" "/=="
72 "/>" "//" "/*" "*>" "***" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
73 "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>" "<-|"
74 "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>" "</" "<*"
75 "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>" ":=" "::=" "=>>"
76 "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!==" "!!" "!=" ">]" ">:"
77 ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&" "&&" "|||>" "||>" "|>" "|]"
78 "|}" "|=>" "|->" "|=" "||-" "|-" "||=" "||" ".." ".?" ".=" ".-" "..<"
79 "..." "+++" "+>" "++" "[||]" "[<" "[|" "{|" "??" "?." "?=" "?:" "##"
80 "###" "####" "#[" "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_"
81 "__" "~~" "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
82 (global-ligature-mode t))
85 #+begin_src emacs-lisp
87 :config (global-emojify-mode))
89 ;; http://ergoemacs.org/emacs/emacs_list_and_set_font.html
94 ((member "Twitter Color Emoji" (font-family-list)) "Twitter Color Emoji")
95 ((member "Noto Color Emoji" (font-family-list)) "Noto Color Emoji")
96 ((member "Noto Emoji" (font-family-list)) "Noto Emoji")))
99 Display relative line numbers except in some modes
100 #+begin_src emacs-lisp
101 (global-display-line-numbers-mode)
102 (setq display-line-numbers-type 'relative)
103 (dolist (no-line-num '(term-mode-hook
108 (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
110 ** Highlight matching parenthesis
111 #+begin_src emacs-lisp
113 :config (show-paren-mode)
114 :custom (show-paren-style 'parenthesis))
117 *** Show current function
118 #+begin_src emacs-lisp
119 (which-function-mode)
121 *** Make position in file more descriptive
122 Show current column and file size.
123 #+begin_src emacs-lisp
125 (size-indication-mode)
128 #+begin_src emacs-lisp
130 :config (minions-mode))
133 Show a ruler at a certain number of chars depending on mode.
134 #+begin_src emacs-lisp
135 (global-display-fill-column-indicator-mode)
138 Whenever starting a key chord, show possible future steps.
139 #+begin_src emacs-lisp
140 (use-package which-key
141 :config (which-key-mode)
142 :custom (which-key-idle-delay 0.3))
144 ** Visual highlights of changes
145 Highlight when changes are made.
146 #+begin_src emacs-lisp
147 (use-package evil-goggles
148 :config (evil-goggles-mode)
149 (evil-goggles-use-diff-faces))
151 ** Highlight "TODO" comments
152 #+begin_src emacs-lisp
154 :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
155 :config (global-hl-todo-mode))
158 #+begin_src emacs-lisp
162 Soft wrap words and do operations by visual lines.
163 #+begin_src emacs-lisp
164 (add-hook 'text-mode-hook 'turn-on-visual-line-mode)
166 ** Display number of matches in search
167 #+begin_src emacs-lisp
169 :config (global-anzu-mode))
172 Inverts modeline instead of audible bell or the standard visual bell.
173 #+begin_src emacs-lisp
174 (setq visible-bell nil
175 ring-bell-function 'flash-mode-line)
176 (defun flash-mode-line ()
177 (invert-face 'mode-line)
178 (run-with-timer 0.1 nil #'invert-face 'mode-line))
182 #+begin_src emacs-lisp
184 :custom (select-enable-clipboard nil)
187 (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
188 ;; Use visual line motions even outside of visual-line-mode buffers
189 (evil-global-set-key 'motion "j" 'evil-next-visual-line)
190 (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
191 (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
194 #+begin_src emacs-lisp
195 (use-package evil-collection
197 :init (evil-collection-init)
198 :custom (evil-collection-setup-minibuffer t))
202 #+begin_src emacs-lisp
203 (use-package evil-surround
204 :config (global-evil-surround-mode))
207 #+begin_src emacs-lisp
208 (use-package evil-leader
209 :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
211 (evil-leader/set-leader "<SPC>")
212 (global-evil-leader-mode))
215 #+begin_src emacs-lisp
217 (use-package evil-nerd-commenter
218 :bind (:map evil-normal-state-map
219 ("gc" . evilnc-comment-or-uncomment-lines))
220 :custom (evilnc-invert-comment-line-by-line nil))
224 #+begin_src emacs-lisp
225 (use-package undo-tree
227 (undo-tree-auto-save-history t)
228 (undo-tree-history-directory-alist '(("." . "~/.emacs.d/undo-tree")))
230 (global-undo-tree-mode)
231 (evil-set-undo-system 'undo-tree))
233 ** Number incrementing
235 #+begin_src emacs-lisp
236 (use-package evil-numbers
237 :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
238 :bind (:map evil-normal-state-map
239 ("C-M-a" . evil-numbers/inc-at-pt)
240 ("C-M-x" . evil-numbers/dec-at-pt)))
244 #+begin_src emacs-lisp
245 (use-package evil-org
247 :hook (org-mode . evil-org-mode)
249 (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
250 (use-package evil-org-agenda
251 :straight (:type built-in)
254 (evil-org-agenda-set-keys))
257 #+begin_src emacs-lisp
258 (evil-leader/set-key-for-mode 'org-mode
259 "T" 'org-show-todo-tree
261 "c" 'org-archive-subtree)
265 #+begin_src emacs-lisp
267 :straight (:type built-in)
268 :commands (org-capture org-agenda)
270 (org-ellipsis " â–¾")
271 (org-agenda-start-with-log-mode t)
273 (org-log-into-drawer t)
274 (org-src-tab-acts-natively t)
275 (org-src-fontify-natively t)
276 (org-startup-indented t)
277 (org-hide-emphasis-markers t)
278 (org-fontify-whole-block-delimiter-line nil))
280 ** Automatically tangle
281 #+begin_src emacs-lisp
282 (add-hook 'org-mode-hook
283 (lambda () (add-hook 'after-save-hook #'org-babel-tangle
287 #+begin_src emacs-lisp
288 (use-package org-tempo
290 :straight (:type built-in)
292 ;; TODO: There's gotta be a more efficient way to write this
293 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
294 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
295 (add-to-list 'org-structure-template-alist '("zsh" . "src shell :tangle ~/.config/zsh/zshrc"))
296 (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
297 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
298 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
299 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
300 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc")))
304 Simple, but not too simple autocompletion.
305 #+begin_src emacs-lisp
307 :bind (("C-s" . swiper)
308 :map ivy-minibuffer-map
309 ("TAB" . ivy-alt-done)
310 :map ivy-switch-buffer-map
311 ("C-d" . ivy-switch-buffer-kill))
315 #+begin_src emacs-lisp
316 (use-package ivy-rich
318 :config (ivy-rich-mode))
322 #+begin_src emacs-lisp
324 :bind (("C-M-j" . 'counsel-switch-buffer)
325 :map minibuffer-local-map
326 ("C-r" . 'counsel-minibuffer-history))
327 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
328 :config (counsel-mode))
330 ** Remember frequent commands
331 #+begin_src emacs-lisp
332 (use-package ivy-prescient
335 (ivy-prescient-enable-filtering nil)
337 (prescient-persist-mode)
338 (ivy-prescient-mode))
341 Better search utility.
342 #+begin_src emacs-lisp
347 Use elfeed for RSS. I have another file with all the feeds in it.
348 #+begin_src emacs-lisp
350 :bind (("C-c e" . elfeed))
352 (load "~/.emacs.d/feeds.el")
353 (add-hook 'elfeed-new-entry-hook
354 (elfeed-make-tagger :feed-url "youtube\\.com"
356 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
358 (use-package elfeed-goodies
360 :config (elfeed-goodies/setup))
363 Use mu4e for reading emails.
365 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.
367 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.
368 #+begin_src emacs-lisp
369 (use-package smtpmail
370 :straight (:type built-in))
372 :load-path "/usr/share/emacs/site-lisp/mu4e"
373 :bind (("C-c m" . mu4e))
376 (setq user-full-name "Armaan Bhojwani"
377 smtpmail-local-domain "armaanb.net"
378 smtpmail-stream-type 'ssl
379 smtpmail-smtp-service '465
380 mu4e-change-filenames-when-moving t
381 message-kill-buffer-on-exit t
382 mu4e-get-mail-command "offlineimap -q"
383 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
384 message-citation-line-function 'message-insert-formatted-citation-line
385 mu4e-context-policy "pick-first"
387 `( ,(make-mu4e-context
389 :enter-func (lambda () (mu4e-message "Entering school context"))
390 :leave-func (lambda () (mu4e-message "Leaving school context"))
391 :match-func (lambda (msg)
393 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
394 :vars '( (user-mail-address . "abhojwani22@nobles.edu")
395 (mu4e-sent-folder . "/school/Sent")
396 (mu4e-drafts-folder . "/school/Drafts")
397 (mu4e-trash-folder . "/school/Trash")
398 (mu4e-refile-folder . "/school/Archive")
399 (user-mail-address . "abhojwani22@nobles.edu")
400 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
401 (smtpmail-smtp-server . "smtp.gmail.com")))
404 :enter-func (lambda () (mu4e-message "Entering personal context"))
405 :leave-func (lambda () (mu4e-message "Leaving personal context"))
406 :match-func (lambda (msg)
408 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
410 (mu4e-sent-folder . "/personal/Sent")
411 (mu4e-drafts-folder . "/personal/Drafts")
412 (mu4e-trash-folder . "/personal/Trash")
413 (mu4e-refile-folder . "/personal/Archive")
414 (user-mail-address . "me@armaanb.net")
415 (smtpmail-smtp-user . "me@armaanb.net")
416 (smtpmail-smtp-server "smtp.mailbox.org")
417 (mu4e-drafts-folder . "/school/Drafts")
418 (mu4e-trash-folder . "/school/Trash")))))
420 (add-to-list 'mu4e-bookmarks
422 :name "Unified inbox"
423 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
427 #+begin_src emacs-lisp
429 (use-package calfw-org)
430 (use-package calfw-ical)
432 (defun acheam-calendar ()
435 (shell-command "vdirsyncer sync")
436 (let ((default-directory "~/.local/share/vdirsyncer/"))
437 (cfw:open-calendar-buffer
440 (cfw:ical-create-source "School" (expand-file-name "school/abhojwani22@nobles.edu.ics") "Green")
441 (cfw:ical-create-source "Personal" (expand-file-name "mailbox/Y2FsOi8vMC8zMQ.ics") "Blue")
442 (cfw:ical-create-source "Birthdays" (expand-file-name "mailbox/Y2FsOi8vMS8w.ics") "Gray")
446 Another file has more specific network configuration.
447 #+begin_src emacs-lisp
450 (load "~/.emacs.d/irc.el"))
451 (use-package circe-color-nicks
453 :straight (:type built-in))
454 (use-package circe-chanop
456 :straight (:type built-in))
459 Set EWW as default browser except for videos
460 #+begin_src emacs-lisp
461 (defun browse-url-mpv (url &optional new-window)
463 (start-process "mpv" "*mpv*" "mpv" url))
465 (setq browse-url-browser-function
467 (("youtu\\.?be" . browse-url-mpv)
468 ("." . eww-browse-url))))
471 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to
472 "emacsclient --eval "(emacs-everywhere)".
473 #+begin_src emacs-lisp
474 (use-package emacs-everywhere)
479 #+begin_src emacs-lisp
480 (use-package lsp-mode
481 :commands (lsp lsp-deferred)
482 :custom (lsp-keymap-prefix "C-c l")
483 :hook ((lsp-mode . lsp-enable-which-key-integration)))
485 (use-package lsp-ivy)
488 :commands lsp-ui-mode
489 :custom (lsp-ui-doc-position 'bottom))
490 (use-package lsp-ui-flycheck
492 :straight (:type built-in))
495 Company-box adds icons.
496 #+begin_src emacs-lisp
499 :hook (lsp-mode . company-mode)
500 :bind (:map company-active-map
501 ("<tab>" . company-complete-selection))
503 ("<tab>" . company-indent-or-complete-common))
505 (company-minimum-prefix-length 1)
506 (setq company-dabbrev-downcase 0)
507 (company-idle-delay 0.0))
509 (use-package company-box
510 :hook (company-mode . company-box-mode))
514 #+begin_src emacs-lisp
515 (use-package lsp-pyright
516 :hook (python-mode . (lambda ()
517 (use-package lsp-pyright
518 :straight (:type built-in))
522 #+begin_src emacs-lisp
524 :hook (python-mode . blacken-mode)
526 (setq blacken-line-length 79))
529 (use-package ws-butler
531 (ws-butler-global-mode))
534 #+begin_src emacs-lisp
535 (use-package flycheck
537 (global-flycheck-mode))
539 ** Project management
540 #+begin_src emacs-lisp
541 (use-package projectile
542 :config (projectile-mode)
543 :custom ((projectile-completion-system 'ivy))
545 ("C-c p" . projectile-command-map)
547 (when (file-directory-p "~/Code")
548 (setq projectile-project-search-path '("~/Code")))
549 (setq projectile-switch-project-action #'projectile-dired))
551 (use-package counsel-projectile
553 :config (counsel-projectile-mode))
556 #+begin_src emacs-lisp
558 :straight (:type built-in)
559 :commands (dired dired-jump)
560 :custom ((dired-listing-switches "-agho --group-directories-first"))
562 (evil-collection-define-key 'normal 'dired-mode-map
563 "h" 'dired-single-up-directory
564 "l" 'dired-single-buffer))
566 (use-package dired-single
567 :commands (dired dired-jump))
569 (use-package dired-open
570 :commands (dired dired-jump)
572 (dired-open-extensions '(("png" . "feh")
575 (use-package dired-hide-dotfiles
576 :hook (dired-mode . dired-hide-dotfiles-mode)
578 (evil-collection-define-key 'normal 'dired-mode-map
579 "H" 'dired-hide-dotfiles-mode))
583 #+begin_src emacs-lisp
585 :hook (git-commit-setup-hook . pinentry-start))
587 *** Colored diff in line number area
588 #+begin_src emacs-lisp
590 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
591 :config (global-diff-hl-mode))
593 * General text editing
595 Indent after every change.
596 #+begin_src emacs-lisp
597 (use-package aggressive-indent
598 :config (global-aggressive-indent-mode))
601 Spell check in text mode, and in prog-mode comments.
602 #+begin_src emacs-lisp
603 (dolist (hook '(text-mode-hook))
604 (add-hook hook (lambda () (flyspell-mode))))
605 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
606 (add-hook hook (lambda () (flyspell-mode -1))))
607 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
609 ** Expand tabs to spaces
610 #+begin_src emacs-lisp
611 (setq-default tab-width 2)
613 ** Copy kill ring to clipboard
614 #+begin_src emacs-lisp
615 (setq x-select-enable-clipboard t)
616 (defun copy-kill-ring-to-xorg ()
617 "Copy the current kill ring to the xorg clipboard."
619 (x-select-text (current-kill 0)))
622 #+begin_src emacs-lisp
623 (use-package browse-kill-ring)
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")
641 (setq save-abbrevs 'silent)
642 (setq-default abbrev-mode t)
645 ** Easily convert splits
646 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
647 #+begin_src emacs-lisp
648 (defun toggle-window-split ()
650 (if (= (count-windows) 2)
651 (let* ((this-win-buffer (window-buffer))
652 (next-win-buffer (window-buffer (next-window)))
653 (this-win-edges (window-edges (selected-window)))
654 (next-win-edges (window-edges (next-window)))
655 (this-win-2nd (not (and (<= (car this-win-edges)
656 (car next-win-edges))
657 (<= (cadr this-win-edges)
658 (cadr next-win-edges)))))
660 (if (= (car this-win-edges)
661 (car (window-edges (next-window))))
662 'split-window-horizontally
663 'split-window-vertically)))
664 (delete-other-windows)
665 (let ((first-win (selected-window)))
667 (if this-win-2nd (other-window 1))
668 (set-window-buffer (selected-window) this-win-buffer)
669 (set-window-buffer (next-window) next-win-buffer)
670 (select-window first-win)
671 (if this-win-2nd (other-window 1))))))
673 (define-key ctl-x-4-map "t" 'toggle-window-split)
676 #+begin_src emacs-lisp
677 (defun insert-date ()
679 (insert (format-time-string "%Y-%m-%d")))
683 #+begin_src emacs-lisp
684 (use-package ace-window
685 :bind ("M-o" . ace-window))
687 ** Kill current buffer
688 Makes "C-x k" binding faster.
689 #+begin_src emacs-lisp
690 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
694 Render OpenSCAD files, and add a preview window.
696 Personal fork just merges a PR.
697 #+begin_src emacs-lisp
698 (use-package scad-mode)
699 (use-package scad-preview
700 :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
702 ** Control backup files
703 Stop backup files from spewing everywhere.
704 #+begin_src emacs-lisp
705 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
707 ** Make yes/no easier
708 #+begin_src emacs-lisp
709 (defalias 'yes-or-no-p 'y-or-n-p)
711 ** Move customize file
712 No more clogging up init.el.
713 #+begin_src emacs-lisp
714 (setq custom-file "~/.emacs.d/custom.el")
718 #+begin_src emacs-lisp
720 :commands (helpful-callable helpful-variable helpful-command helpful-key)
722 (counsel-describe-function-function #'helpful-callable)
723 (counsel-describe-variable-function #'helpful-variable)
725 ([remap describe-function] . counsel-describe-function)
726 ([remap describe-command] . helpful-command)
727 ([remap describe-variable] . counsel-describe-variable)
728 ([remap describe-key] . helpful-key))
731 #+begin_src emacs-lisp
732 (use-package epa-file
733 :straight (:type built-in))
734 (setq epa-file-select-keys nil
735 epa-file-encrypt-to '("me@armaanb.net")
736 password-cache-expiry (* 60 15))
738 (use-package pinentry)
741 #+begin_src emacs-lisp
743 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
744 :custom (0x0-default-service 'envs)
745 :config (evil-leader/set-key
747 "0f" '0x0-upload-file
748 "0s" '0x0-upload-string
749 "0c" '0x0-upload-kill-ring
750 "0p" '0x0-upload-popup))
755 #+begin_src conf :tangle ~/.spectrwm.conf
761 autorun = ws[1]:/home/armaa/Code/scripts/autostart
765 #+begin_src conf :tangle ~/.spectrwm.conf
766 color_focus = rgb:83/a5/98
767 color_focus_maximized = rgb:d6/5d/0e
768 color_unfocus = rgb:58/58/58
771 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
775 #+begin_src conf :tangle ~/.spectrwm.conf
776 program[lock] = i3lock -c 000000 -ef
777 program[term] = alacritty
778 program[screenshot_all] = flameshot gui
779 program[menu] = rofi -show run # `rofi-dmenu` handles the rest
780 program[switcher] = rofi -show window
781 program[notif] = /home/armaa/Code/scripts/setter status
784 bind[switcher] = MOD+Tab
787 #+begin_src conf :tangle ~/.spectrwm.conf
788 program[paup] = /home/armaa/Code/scripts/setter audio +5
789 program[padown] = /home/armaa/Code/scripts/setter audio -5
790 program[pamute] = /home/armaa/Code/scripts/setter audio
791 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
792 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
793 program[next] = playerctl next
794 program[prev] = playerctl previous
795 program[pause] = playerctl play-pause
797 bind[padown] = XF86AudioLowerVolume
798 bind[paup] = XF86AudioRaiseVolume
799 bind[pamute] = XF86AudioMute
800 bind[brigdown] = XF86MonBrightnessDown
801 bind[brigup] = XF86MonBrightnessUp
802 bind[pause] = XF86AudioPlay
803 bind[next] = XF86AudioNext
804 bind[prev] = XF86AudioPrev
807 #+begin_src conf :tangle ~/.spectrwm.conf
808 program[h] = xdotool keyup h key --clearmodifiers Left
809 program[j] = xdotool keyup j key --clearmodifiers Down
810 program[k] = xdotool keyup k key --clearmodifiers Up
811 program[l] = xdotool keyup l key --clearmodifiers Right
813 bind[h] = MOD + Control + h
814 bind[j] = MOD + Control + j
815 bind[k] = MOD + Control + k
816 bind[l] = MOD + Control + l
819 #+begin_src conf :tangle ~/.spectrwm.conf
820 program[aerc] = alacritty -e aerc
821 program[weechat] = alacritty --hold -e sh -c "while : ; do ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat; sleep 2; done"
822 program[emacs] = emacsclient -c
823 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
824 program[firefox] = firefox
825 program[thunderbird] = thunderbird
826 program[slack] = slack
828 bind[aerc] = MOD+Control+s
829 bind[weechat] = MOD+Control+d
830 bind[emacs] = MOD+Control+f
831 bind[emacs-anywhere] = MOD+f
832 bind[firefox] = MOD+Control+u
833 bind[thunderbird] = MOD+Control+i
834 bind[slack] = MOD+Control+o
839 #+begin_src shell :tangle ~/.config/zsh/zshrc
840 autoload -Uz compinit
844 unsetopt glob_complete
847 #+begin_src shell :tangle ~/.config/zsh/zshrc
851 bindkey -M vicmd "^[[3~" delete-char
852 bindkey "^[[3~" delete-char
854 autoload edit-command-line
855 zle -N edit-command-line
856 bindkey -M vicmd ^e edit-command-line
857 bindkey ^e edit-command-line
860 #+begin_src shell :tangle ~/.config/zsh/zshrc
861 setopt extended_history
863 setopt inc_append_history
864 setopt hist_ignore_dups
865 setopt hist_reduce_blanks
869 HISTFILE=~/.local/share/zsh/history
872 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
874 #+begin_src plain :tangle ~/.config/zpe/repositories
875 https://github.com/Aloxaf/fzf-tab
876 https://github.com/zdharma/fast-syntax-highlighting
877 https://github.com/rupa/z
880 #+begin_src shell :tangle ~/.config/zsh/zshrc
881 source ~/Code/zpe/zpe.sh
882 source ~/Code/admone/admone.zsh
883 source ~/.config/zsh/fzf-bindings.zsh
885 zpe-source fzf-tab/fzf-tab.zsh
886 zstyle ':completion:*:descriptions' format '[%d]'
887 zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
888 zstyle ':completion:*' completer _complete
889 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' \
890 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
892 zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
893 export _Z_DATA="/home/armaa/.local/share/z"
897 **** Alert after long command
898 #+begin_src shell :tangle ~/.config/zsh/zshrc
900 notify-send --urgency=low -i ${(%):-%(?.terminal.error)} \
901 ${history[$HISTCMD]%[;&|][[:space:]]##alert}
904 **** Time Zsh startup
905 #+begin_src shell :tangle ~/.config/zsh/zshrc
907 for i in $(seq 1 10); do
908 time "zsh" -i -c exit;
912 **** Update all packages
913 #+begin_src shell :tangle ~/.config/zsh/zshrc
914 color=$(tput setaf 5)
918 sudo echo "${color}== upgrading with yay ==${reset}"
921 echo "${color}== checking for pacnew files ==${reset}"
924 echo "${color}== upgrading flatpaks ==${reset}"
927 echo "${color}== upgrading zsh plugins ==${reset}"
930 echo "${color}== updating nvim plugins ==${reset}"
931 nvim +PlugUpdate +PlugUpgrade +qall
932 echo "Updated nvim plugins"
934 echo "${color}You are entirely up to date!${reset}"
937 **** Clean all packages
938 #+begin_src shell :tangle ~/.config/zsh/zshrc
940 sudo echo "${color}== cleaning pacman orphans ==${reset}"
941 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
943 echo "${color}== cleaning flatpaks ==${reset}"
944 flatpak remove --unused
946 echo "${color}== cleaning zsh plugins ==${reset}"
949 echo "${color}== cleaning nvim plugins ==${reset}"
950 nvim +PlugClean +qall
951 echo "Cleaned nvim plugins"
953 echo "${color}All orphans cleaned!${reset}"
957 #+begin_src shell :tangle ~/.config/zsh/zshrc
960 exa -lh --icons --git --group-directories-first
964 #+begin_src shell :tangle ~/.config/zsh/zshrc
966 __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
967 if [ $? -eq 0 ]; then
968 eval "$__conda_setup"
970 if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
971 . "/opt/anaconda/etc/profile.d/conda.sh"
973 export PATH="/opt/anaconda/bin:$PATH"
979 **** Interact with 0x0
980 #+begin_src shell :tangle ~/.config/zsh/zshrc
981 zxz="https://envs.sh"
982 0file() { curl -F"file=@$1" "$zxz" ; }
983 0pb() { curl -F"file=@-;" "$zxz" ; }
984 0url() { curl -F"url=$1" "$zxz" ; }
985 0short() { curl -F"shorten=$1" "$zxz" ; }
986 0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
989 #+begin_src shell :tangle ~/.config/zsh/zshrc
998 #+begin_src shell :tangle ~/.config/zsh/zshrc
999 alias bhoji-drop='ssh -p 23 root@armaanb.net'
1000 alias weechat='ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat'
1001 alias tcf='ssh root@204.48.23.68'
1002 alias ngmun='ssh root@157.245.89.25'
1003 alias prox='ssh root@192.168.1.224'
1004 alias dock='ssh root@192.168.1.225'
1005 alias jenkins='ssh root@192.168.1.226'
1006 alias envs='ssh acheam@envs.net'
1008 **** File management
1009 #+begin_src shell :tangle ~/.config/zsh/zshrc
1010 alias ls='exa -lh --icons --git --group-directories-first'
1011 alias la='exa -lha --icons --git --group-directories-first'
1012 alias df='df -h / /boot'
1014 alias free='free -h'
1019 alias grep='grep -in --exclude-dir=.git --color=auto'
1020 alias mkdir='mkdir -pv'
1021 alias unar='atool -x'
1022 alias wget='wget -e robots=off'
1023 alias lanex='~/.local/share/lxc/lxc'
1026 #+begin_src shell :tangle ~/.config/zsh/zshrc
1027 alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1028 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1030 alias padu='padm add -u && padm commit && padm push && yadu'
1033 #+begin_src shell :tangle ~/.config/zsh/zshrc
1036 alias vw="nvim ~/Documents/vimwiki/index.md"
1038 **** System management
1039 #+begin_src shell :tangle ~/.config/zsh/zshrc
1040 alias jctl='journalctl -p 3 -xb'
1041 alias pkill='pkill -i'
1043 alias please='sudo $(fc -ln -1)'
1044 alias sudo='sudo ' # allows aliases to be run with sudo
1047 #+begin_src shell :tangle ~/.config/zsh/zshrc
1048 alias ping='ping -c 10'
1049 alias speed='speedtest-cli'
1050 alias ip='ip --color=auto'
1051 alias cip='curl https://armaanb.net/ip'
1052 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1053 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1056 #+begin_src shell :tangle ~/.config/zsh/zshrc
1057 alias dc='docker-compose'
1058 alias dcdu='docker-compose down && docker-compose up -d'
1061 #+begin_src shell :tangle ~/.config/zsh/zshrc
1062 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1063 iflag=fullblock status=progress'
1064 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1065 iflag=fullblock status=progress'
1066 alias ts='gen-shell -c task'
1067 alias ts='gen-shell -c task'
1068 alias tetris='autoload -Uz tetriscurses && tetriscurses'
1069 alias news='newsboat'
1070 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1071 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
1072 --restrict-filenames -o '%(title)s.%(ext)s'"
1073 alias cal="cal -3 --color=auto"
1075 **** Virtual machines, chroots
1076 #+begin_src shell :tangle ~/.config/zsh/zshrc
1077 alias ckiss="sudo chrooter ~/Virtual/kiss"
1078 alias cdebian="sudo chrooter ~/Virtual/debian bash"
1079 alias cwindows='devour qemu-system-x86_64 \
1084 -device VGA,vgamem_mb=64 \
1086 -device hda-duplex \
1088 -net user,smb=/home/armaa/Public \
1089 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1092 #+begin_src shell :tangle ~/.config/zsh/zshrc
1094 alias zpy="zconda && ipython"
1095 alias math="ipython --profile=math"
1096 alias pypi="python setup.py sdist && twine upload dist/*"
1097 alias pip="python -m pip"
1098 alias black="black -l 79"
1101 #+begin_src shell :tangle ~/.config/zsh/zshrc
1102 alias words='gen-shell -c "words"'
1103 alias words-e='gen-shell -c "words ~E"'
1106 #+begin_src shell :tangle ~/.config/zsh/zshrc
1107 alias zathura='devour zathura'
1108 alias mpv='devour mpv'
1109 alias sql='devour sqlitebrowser'
1110 alias cad='devour openscad'
1111 alias feh='devour feh'
1113 **** Package management (Pacman)
1114 #+begin_src shell :tangle ~/.config/zsh/zshrc
1116 alias api='yay -Syu'
1117 alias app='yay -Rns'
1119 alias apo='yay -Qttd'
1120 alias azf='pacman -Q | fzf'
1121 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1122 alias ufetch='ufetch-arch'
1123 alias reflect='reflector --verbose --sort rate --save \
1124 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1127 #+begin_src shell :tangle ~/.config/zsh/zshrc
1128 export EDITOR="emacsclient -c" # $EDITOR opens in terminal
1129 export VISUAL="emacsclient -c -a emacs" # $VISUAL opens in GUI mode
1130 export TERM=xterm-256color # for compatability
1132 export GPG_TTY="$(tty)"
1133 export MANPAGER='nvim +Man!'
1136 # generated with "vivid generate gruvbox"
1137 export LS_COLORS="$(cat ~/.local/share/zsh/gruvbox)"
1139 export GTK_USE_PORTAL=1
1141 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1142 export PATH="$PATH:/home/armaa/Code/scripts"
1143 export PATH="$PATH:/home/armaa/.cargo/bin"
1144 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1145 export PATH="$PATH:/usr/sbin"
1146 export PATH="$PATH:/opt/FreeTube/freetube"
1148 export LC_ALL="en_US.UTF-8"
1149 export LC_CTYPE="en_US.UTF-8"
1150 export LANGUAGE="en_US.UTF-8"
1152 export KISS_PATH="/home/armaa/kiss/home/armaa/kiss-repo"
1153 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1154 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1155 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1156 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1157 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1161 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1164 family: JetBrains Mono Nerd Font
1171 ligatures: true # Requires ligature patch
1178 background_opacity: 0.6
1181 Send <RET> + modifier through
1182 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1197 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1201 background: '#000000'
1202 foreground: '#ebdbb2'
1228 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1229 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1230 c.TerminalInteractiveShell.editing_mode = 'vi'
1231 c.InteractiveShell.colors = 'linux'
1232 c.TerminalInteractiveShell.confirm_exit = False
1235 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1239 return x * (180 / pi)
1242 return x * (pi / 180)
1245 return (x * (pi / 180)) / unit
1257 Make MPV play a little bit smoother.
1258 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1259 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1264 #+begin_src conf :tangle ~/.config/picom/picom.conf
1267 shadow-offset-x = -5;
1268 shadow-offset-y = -5;
1271 #+begin_src conf :tangle ~/.config/picom/picom.conf
1276 #+begin_src conf :tangle ~/.config/picom/picom.conf
1279 method = "gaussian";
1285 Needs picom to be run with "--experimental-backends"
1286 #+begin_src conf :tangle ~/.config/picom/picom.conf
1290 For any GNU Readline programs
1291 #+begin_src plain :tangle ~/.inputrc
1295 https://github.com/sharkdp/vivid
1297 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1299 background_color: '282A36'
1311 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1328 missing_symlink_target:
1354 sticky_other_writable:
1387 continuous-integration:
1398 font-style: underline
1409 #+begin_src plain :tangle ~/.gitconfig
1411 name = Armaan Bhojwani
1412 email = me@armaanb.net
1413 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1416 #+begin_src plain :tangle ~/.gitconfig
1418 defaultBranch = main
1421 #+begin_src plain :tangle ~/.gitconfig
1426 #+begin_src plain :tangle ~/.gitconfig
1428 smtpserver = smtp.mailbox.org
1429 smtpuser = me@armaanb.net
1430 smtpencryption = ssl
1431 smtpserverport = 465
1435 #+begin_src plain :tangle ~/.gitconfig
1440 #+begin_src plain :tangle ~/.gitconfig
1443 sclone = clone --depth 1
1449 subup = submodule update --remote
1450 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1451 mirror = git config --global alias.mirrormirror
1454 #+begin_src plain :tangle ~/.gitconfig
1459 Lightweight notification daemon. Gruvbox colors, based on https://github.com/a-schaefers/i3-wm-gruvbox-theme/
1461 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1463 font = "JetBrains Mono Medium Nerd Font 11"
1465 format = "<b>%s</b>\n%b"
1467 indicate_hidden = yes
1470 show_age_threshold = 60
1473 geometry = "400x5-20+20"
1475 idle_threshold = 120
1477 sticky_history = yes
1479 separator_height = 4
1481 horizontal_padding = 8
1483 separator_color = "#585858"
1484 startup_notification = false
1487 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1494 close_all = mod4+shift+c
1495 history = mod4+ctrl+c
1498 background = "#282828"
1499 foreground = "#ebdbb2"
1500 highlight = "#ebdbb2"
1504 background = "#282828"
1505 foreground = "#ebdbb2"
1506 highlight = "#ebdbb2"
1510 background = "#282828"
1511 foreground = "#cc241d"
1512 highlight = "#ebdbb2"