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)
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 plain :tangle ~/.gitconfig")))
303 Simple, but not too simple autocompletion.
304 #+begin_src emacs-lisp
306 :bind (("C-s" . swiper)
307 :map ivy-minibuffer-map
308 ("TAB" . ivy-alt-done)
309 :map ivy-switch-buffer-map
310 ("C-d" . ivy-switch-buffer-kill))
314 #+begin_src emacs-lisp
315 (use-package ivy-rich
317 :config (ivy-rich-mode))
321 #+begin_src emacs-lisp
323 :bind (("C-M-j" . 'counsel-switch-buffer)
324 :map minibuffer-local-map
325 ("C-r" . 'counsel-minibuffer-history))
326 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
327 :config (counsel-mode))
329 ** Remember frequent commands
330 #+begin_src emacs-lisp
331 (use-package ivy-prescient
334 (ivy-prescient-enable-filtering nil)
336 (prescient-persist-mode)
337 (ivy-prescient-mode))
340 Better search utility.
341 #+begin_src emacs-lisp
346 Use elfeed for RSS. I have another file with all the feeds in it.
347 #+begin_src emacs-lisp
349 :bind (("C-c e" . elfeed))
351 (load "~/.emacs.d/feeds.el")
352 (add-hook 'elfeed-new-entry-hook
353 (elfeed-make-tagger :feed-url "youtube\\.com"
355 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
357 (use-package elfeed-goodies
359 :config (elfeed-goodies/setup))
362 Use mu4e for reading emails.
364 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.
366 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.
367 #+begin_src emacs-lisp
368 (use-package smtpmail
369 :straight (:type built-in))
371 :load-path "/usr/share/emacs/site-lisp/mu4e"
372 :bind (("C-c m" . mu4e))
375 (setq user-full-name "Armaan Bhojwani"
376 smtpmail-local-domain "armaanb.net"
377 smtpmail-stream-type 'ssl
378 smtpmail-smtp-service '465
379 mu4e-change-filenames-when-moving t
380 message-kill-buffer-on-exit t
381 mu4e-get-mail-command "offlineimap -q"
382 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
383 message-citation-line-function 'message-insert-formatted-citation-line
384 mu4e-context-policy "pick-first"
386 `( ,(make-mu4e-context
388 :enter-func (lambda () (mu4e-message "Entering school context"))
389 :leave-func (lambda () (mu4e-message "Leaving school context"))
390 :match-func (lambda (msg)
392 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
393 :vars '( (user-mail-address . "abhojwani22@nobles.edu")
394 (mu4e-sent-folder . "/school/Sent")
395 (mu4e-drafts-folder . "/school/Drafts")
396 (mu4e-trash-folder . "/school/Trash")
397 (mu4e-refile-folder . "/school/Archive")
398 (user-mail-address . "abhojwani22@nobles.edu")
399 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
400 (smtpmail-smtp-server . "smtp.gmail.com")))
403 :enter-func (lambda () (mu4e-message "Entering personal context"))
404 :leave-func (lambda () (mu4e-message "Leaving personal context"))
405 :match-func (lambda (msg)
407 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
409 (mu4e-sent-folder . "/personal/Sent")
410 (mu4e-drafts-folder . "/personal/Drafts")
411 (mu4e-trash-folder . "/personal/Trash")
412 (mu4e-refile-folder . "/personal/Archive")
413 (user-mail-address . "me@armaanb.net")
414 (smtpmail-smtp-user . "me@armaanb.net")
415 (smtpmail-smtp-server "smtp.mailbox.org")
416 (mu4e-drafts-folder . "/school/Drafts")
417 (mu4e-trash-folder . "/school/Trash")))))
419 (add-to-list 'mu4e-bookmarks
421 :name "Unified inbox"
422 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
426 #+begin_src emacs-lisp
428 (use-package calfw-org)
429 (use-package calfw-ical)
431 (defun acheam-calendar ()
434 (shell-command "vdirsyncer sync")
435 (let ((default-directory "~/.local/share/vdirsyncer/"))
436 (cfw:open-calendar-buffer
439 (cfw:ical-create-source "School" (expand-file-name "school/abhojwani22@nobles.edu.ics") "Green")
440 (cfw:ical-create-source "Personal" (expand-file-name "mailbox/Y2FsOi8vMC8zMQ.ics") "Blue")
441 (cfw:ical-create-source "Birthdays" (expand-file-name "mailbox/Y2FsOi8vMS8w.ics") "Gray")
445 Another file has more specific network configuration.
446 #+begin_src emacs-lisp
449 (load "~/.emacs.d/irc.el"))
450 (use-package circe-color-nicks
452 :straight (:type built-in))
453 (use-package circe-chanop
455 :straight (:type built-in))
458 Set EWW as default browser except for videos
459 #+begin_src emacs-lisp
460 (defun browse-url-mpv (url &optional new-window)
462 (start-process "mpv" "*mpv*" "mpv" url))
464 (setq browse-url-browser-function
466 (("youtu\\.?be" . browse-url-mpv)
467 ("." . eww-browse-url))))
470 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to
471 "emacsclient --eval "(emacs-everywhere)".
472 #+begin_src emacs-lisp
473 (use-package emacs-everywhere)
478 #+begin_src emacs-lisp
479 (use-package lsp-mode
480 :commands (lsp lsp-deferred)
481 :custom (lsp-keymap-prefix "C-c l")
482 :hook ((lsp-mode . lsp-enable-which-key-integration)))
484 (use-package lsp-ivy)
487 :commands lsp-ui-mode
488 :custom (lsp-ui-doc-position 'bottom))
489 (use-package lsp-ui-flycheck
491 :straight (:type built-in))
494 Company-box adds icons.
495 #+begin_src emacs-lisp
498 :hook (lsp-mode . company-mode)
499 :bind (:map company-active-map
500 ("<tab>" . company-complete-selection))
502 ("<tab>" . company-indent-or-complete-common))
504 (company-minimum-prefix-length 1)
505 (setq company-dabbrev-downcase 0)
506 (company-idle-delay 0.0))
508 (use-package company-box
509 :hook (company-mode . company-box-mode))
513 #+begin_src emacs-lisp
514 (use-package lsp-pyright
515 :hook (python-mode . (lambda ()
516 (use-package lsp-pyright
517 :straight (:type built-in))
521 #+begin_src emacs-lisp
523 :hook (python-mode . blacken-mode)
525 (setq blacken-line-length 79))
528 (use-package ws-butler
530 (ws-butler-global-mode))
533 #+begin_src emacs-lisp
534 (use-package flycheck
536 (global-flycheck-mode))
538 ** Project management
539 #+begin_src emacs-lisp
540 (use-package projectile
541 :config (projectile-mode)
542 :custom ((projectile-completion-system 'ivy))
544 ("C-c p" . projectile-command-map)
546 (when (file-directory-p "~/Code")
547 (setq projectile-project-search-path '("~/Code")))
548 (setq projectile-switch-project-action #'projectile-dired))
550 (use-package counsel-projectile
552 :config (counsel-projectile-mode))
555 #+begin_src emacs-lisp
557 :straight (:type built-in)
558 :commands (dired dired-jump)
559 :custom ((dired-listing-switches "-agho --group-directories-first"))
561 (evil-collection-define-key 'normal 'dired-mode-map
562 "h" 'dired-single-up-directory
563 "l" 'dired-single-buffer))
565 (use-package dired-single
566 :commands (dired dired-jump))
568 (use-package dired-open
569 :commands (dired dired-jump)
571 (dired-open-extensions '(("png" . "feh")
574 (use-package dired-hide-dotfiles
575 :hook (dired-mode . dired-hide-dotfiles-mode)
577 (evil-collection-define-key 'normal 'dired-mode-map
578 "H" 'dired-hide-dotfiles-mode))
582 #+begin_src emacs-lisp
584 :hook (git-commit-setup-hook . pinentry-start))
586 *** Colored diff in line number area
587 #+begin_src emacs-lisp
589 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
590 :config (global-diff-hl-mode))
593 Indent after every change.
594 #+begin_src emacs-lisp
595 (use-package aggressive-indent
596 :config (global-aggressive-indent-mode))
599 ** Easily convert splits
600 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
601 #+begin_src emacs-lisp
602 (defun toggle-window-split ()
604 (if (= (count-windows) 2)
605 (let* ((this-win-buffer (window-buffer))
606 (next-win-buffer (window-buffer (next-window)))
607 (this-win-edges (window-edges (selected-window)))
608 (next-win-edges (window-edges (next-window)))
609 (this-win-2nd (not (and (<= (car this-win-edges)
610 (car next-win-edges))
611 (<= (cadr this-win-edges)
612 (cadr next-win-edges)))))
614 (if (= (car this-win-edges)
615 (car (window-edges (next-window))))
616 'split-window-horizontally
617 'split-window-vertically)))
618 (delete-other-windows)
619 (let ((first-win (selected-window)))
621 (if this-win-2nd (other-window 1))
622 (set-window-buffer (selected-window) this-win-buffer)
623 (set-window-buffer (next-window) next-win-buffer)
624 (select-window first-win)
625 (if this-win-2nd (other-window 1))))))
627 (define-key ctl-x-4-map "t" 'toggle-window-split)
630 #+begin_src emacs-lisp
631 (defun insert-date ()
633 (insert (format-time-string "%Y-%m-%d")))
637 #+begin_src emacs-lisp
638 (use-package ace-window
639 :bind ("M-o" . ace-window))
641 ** Kill current buffer
642 Makes "C-x k" binding faster.
643 #+begin_src emacs-lisp
644 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
648 Opens file where you left it.
649 #+begin_src emacs-lisp
653 Render OpenSCAD files, and add a preview window.
655 Personal fork just merges a PR.
656 #+begin_src emacs-lisp
657 (use-package scad-mode)
658 (use-package scad-preview
659 :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
662 Distraction free writing a la junegunn/goyo.
663 #+begin_src emacs-lisp
664 (use-package olivetti
666 (evil-leader/set-key "o" 'olivetti-mode))
668 ** Control backup files
669 Stop backup files from spewing everywhere.
670 #+begin_src emacs-lisp
671 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
675 #+begin_src emacs-lisp
676 (setq abbrev-file-name "~/.emacs.d/abbrevs")
677 (setq save-abbrevs 'silent)
678 (setq-default abbrev-mode t)
680 ** Expand tabs to spaces
681 #+begin_src emacs-lisp
682 (setq-default tab-width 2)
684 ** Make yes/no easier
685 #+begin_src emacs-lisp
686 (defalias 'yes-or-no-p 'y-or-n-p)
688 ** Move customize file
689 No more clogging up init.el.
690 #+begin_src emacs-lisp
691 (setq custom-file "~/.emacs.d/custom.el")
695 #+begin_src emacs-lisp
697 :commands (helpful-callable helpful-variable helpful-command helpful-key)
699 (counsel-describe-function-function #'helpful-callable)
700 (counsel-describe-variable-function #'helpful-variable)
702 ([remap describe-function] . counsel-describe-function)
703 ([remap describe-command] . helpful-command)
704 ([remap describe-variable] . counsel-describe-variable)
705 ([remap describe-key] . helpful-key))
708 #+begin_src emacs-lisp
709 (use-package epa-file
710 :straight (:type built-in))
711 (setq epa-file-select-keys nil
712 epa-file-encrypt-to '("me@armaanb.net")
713 password-cache-expiry (* 60 15))
715 (use-package pinentry)
718 #+begin_src emacs-lisp
720 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
721 :custom (0x0-default-service 'envs)
722 :config (evil-leader/set-key
724 "0f" '0x0-upload-file
725 "0s" '0x0-upload-string
726 "0c" '0x0-upload-kill-ring
727 "0p" '0x0-upload-popup))
729 ** Copy kill ring to clipboard
730 #+begin_src emacs-lisp
731 (setq x-select-enable-clipboard t)
732 (defun copy-kill-ring-to-xorg ()
733 "Copy the current kill ring to the xorg clipboard."
735 (x-select-text (current-kill 0)))
738 #+begin_src emacs-lisp
739 (use-package browse-kill-ring)
744 #+begin_src conf :tangle ~/.spectrwm.conf
750 autorun = ws[1]:/home/armaa/Code/scripts/autostart
754 #+begin_src conf :tangle ~/.spectrwm.conf
755 color_focus = rgb:83/a5/98
756 color_focus_maximized = rgb:d6/5d/0e
757 color_unfocus = rgb:58/58/58
760 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
764 #+begin_src conf :tangle ~/.spectrwm.conf
765 program[lock] = i3lock -c 000000 -ef
766 program[term] = alacritty
767 program[screenshot_all] = flameshot gui
768 program[menu] = rofi -show run # `rofi-dmenu` handles the rest
769 program[switcher] = rofi -show window
770 program[notif] = /home/armaa/Code/scripts/setter status
773 bind[switcher] = MOD+Tab
776 #+begin_src conf :tangle ~/.spectrwm.conf
777 program[paup] = /home/armaa/Code/scripts/setter audio +5
778 program[padown] = /home/armaa/Code/scripts/setter audio -5
779 program[pamute] = /home/armaa/Code/scripts/setter audio
780 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
781 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
782 program[next] = playerctl next
783 program[prev] = playerctl previous
784 program[pause] = playerctl play-pause
786 bind[padown] = XF86AudioLowerVolume
787 bind[paup] = XF86AudioRaiseVolume
788 bind[pamute] = XF86AudioMute
789 bind[brigdown] = XF86MonBrightnessDown
790 bind[brigup] = XF86MonBrightnessUp
791 bind[pause] = XF86AudioPlay
792 bind[next] = XF86AudioNext
793 bind[prev] = XF86AudioPrev
796 #+begin_src conf :tangle ~/.spectrwm.conf
797 program[h] = xdotool keyup h key --clearmodifiers Left
798 program[j] = xdotool keyup j key --clearmodifiers Down
799 program[k] = xdotool keyup k key --clearmodifiers Up
800 program[l] = xdotool keyup l key --clearmodifiers Right
802 bind[h] = MOD + Control + h
803 bind[j] = MOD + Control + j
804 bind[k] = MOD + Control + k
805 bind[l] = MOD + Control + l
808 #+begin_src conf :tangle ~/.spectrwm.conf
809 program[aerc] = alacritty -e aerc
810 program[weechat] = alacritty --hold -e sh -c "while : ; do ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat; sleep 2; done"
811 program[emacs] = emacsclient -c
812 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
813 program[firefox] = firefox
814 program[thunderbird] = thunderbird
815 program[slack] = slack
817 bind[aerc] = MOD+Control+s
818 bind[weechat] = MOD+Control+d
819 bind[emacs] = MOD+Control+f
820 bind[emacs-anywhere] = MOD+f
821 bind[firefox] = MOD+Control+u
822 bind[thunderbird] = MOD+Control+i
823 bind[slack] = MOD+Control+o
828 #+begin_src shell :tangle ~/.config/zsh/zshrc
829 autoload -Uz compinit
833 unsetopt glob_complete
836 #+begin_src shell :tangle ~/.config/zsh/zshrc
840 bindkey -M vicmd "^[[3~" delete-char
841 bindkey "^[[3~" delete-char
843 autoload edit-command-line
844 zle -N edit-command-line
845 bindkey -M vicmd ^e edit-command-line
846 bindkey ^e edit-command-line
849 #+begin_src shell :tangle ~/.config/zsh/zshrc
850 setopt extended_history
852 setopt inc_append_history
853 setopt hist_ignore_dups
854 setopt hist_reduce_blanks
858 HISTFILE=~/.local/share/zsh/history
861 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
863 #+begin_src plain :tangle ~/.config/zpe/repositories
864 https://github.com/Aloxaf/fzf-tab
865 https://github.com/zdharma/fast-syntax-highlighting
866 https://github.com/rupa/z
869 #+begin_src shell :tangle ~/.config/zsh/zshrc
870 source ~/Code/zpe/zpe.sh
871 source ~/Code/admone/admone.zsh
872 source ~/.config/zsh/fzf-bindings.zsh
874 zpe-source fzf-tab/fzf-tab.zsh
875 zstyle ':completion:*:descriptions' format '[%d]'
876 zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
877 zstyle ':completion:*' completer _complete
878 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' \
879 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
881 zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
882 export _Z_DATA="/home/armaa/.local/share/z"
886 **** Alert after long command
887 #+begin_src shell :tangle ~/.config/zsh/zshrc
889 notify-send --urgency=low -i ${(%):-%(?.terminal.error)} \
890 ${history[$HISTCMD]%[;&|][[:space:]]##alert}
893 **** Time Zsh startup
894 #+begin_src shell :tangle ~/.config/zsh/zshrc
896 for i in $(seq 1 10); do
897 time "zsh" -i -c exit;
901 **** Update all packages
902 #+begin_src shell :tangle ~/.config/zsh/zshrc
903 color=$(tput setaf 5)
907 sudo echo "${color}== upgrading with yay ==${reset}"
910 echo "${color}== checking for pacnew files ==${reset}"
913 echo "${color}== upgrading flatpaks ==${reset}"
916 echo "${color}== upgrading zsh plugins ==${reset}"
919 echo "${color}== updating nvim plugins ==${reset}"
920 nvim +PlugUpdate +PlugUpgrade +qall
921 echo "Updated nvim plugins"
923 echo "${color}You are entirely up to date!${reset}"
926 **** Clean all packages
927 #+begin_src shell :tangle ~/.config/zsh/zshrc
929 sudo echo "${color}== cleaning pacman orphans ==${reset}"
930 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
932 echo "${color}== cleaning flatpaks ==${reset}"
933 flatpak remove --unused
935 echo "${color}== cleaning zsh plugins ==${reset}"
938 echo "${color}== cleaning nvim plugins ==${reset}"
939 nvim +PlugClean +qall
940 echo "Cleaned nvim plugins"
942 echo "${color}All orphans cleaned!${reset}"
946 #+begin_src shell :tangle ~/.config/zsh/zshrc
949 exa -lh --icons --git --group-directories-first
953 #+begin_src shell :tangle ~/.config/zsh/zshrc
955 __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
956 if [ $? -eq 0 ]; then
957 eval "$__conda_setup"
959 if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
960 . "/opt/anaconda/etc/profile.d/conda.sh"
962 export PATH="/opt/anaconda/bin:$PATH"
968 **** Interact with 0x0
969 #+begin_src shell :tangle ~/.config/zsh/zshrc
970 zxz="https://envs.sh"
971 0file() { curl -F"file=@$1" "$zxz" ; }
972 0pb() { curl -F"file=@-;" "$zxz" ; }
973 0url() { curl -F"url=$1" "$zxz" ; }
974 0short() { curl -F"shorten=$1" "$zxz" ; }
975 0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
978 #+begin_src shell :tangle ~/.config/zsh/zshrc
987 #+begin_src shell :tangle ~/.config/zsh/zshrc
988 alias bhoji-drop='ssh -p 23 root@armaanb.net'
989 alias weechat='ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat'
990 alias tcf='ssh root@204.48.23.68'
991 alias ngmun='ssh root@157.245.89.25'
992 alias prox='ssh root@192.168.1.224'
993 alias dock='ssh root@192.168.1.225'
994 alias jenkins='ssh root@192.168.1.226'
995 alias envs='ssh acheam@envs.net'
998 #+begin_src shell :tangle ~/.config/zsh/zshrc
999 alias ls='exa -lh --icons --git --group-directories-first'
1000 alias la='exa -lha --icons --git --group-directories-first'
1001 alias df='df -h / /boot'
1003 alias free='free -h'
1008 alias grep='grep -in --exclude-dir=.git --color=auto'
1009 alias mkdir='mkdir -pv'
1010 alias unar='atool -x'
1011 alias wget='wget -e robots=off'
1012 alias lanex='~/.local/share/lxc/lxc'
1015 #+begin_src shell :tangle ~/.config/zsh/zshrc
1016 alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1017 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1019 alias padu='padm add -u && padm commit && padm push && yadu'
1022 #+begin_src shell :tangle ~/.config/zsh/zshrc
1025 alias vw="nvim ~/Documents/vimwiki/index.md"
1027 **** System management
1028 #+begin_src shell :tangle ~/.config/zsh/zshrc
1029 alias jctl='journalctl -p 3 -xb'
1030 alias pkill='pkill -i'
1032 alias please='sudo $(fc -ln -1)'
1033 alias sudo='sudo ' # allows aliases to be run with sudo
1036 #+begin_src shell :tangle ~/.config/zsh/zshrc
1037 alias ping='ping -c 10'
1038 alias speed='speedtest-cli'
1039 alias ip='ip --color=auto'
1040 alias cip='curl https://armaanb.net/ip'
1041 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1042 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1045 #+begin_src shell :tangle ~/.config/zsh/zshrc
1046 alias dc='docker-compose'
1047 alias dcdu='docker-compose down && docker-compose up -d'
1050 #+begin_src shell :tangle ~/.config/zsh/zshrc
1051 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1052 iflag=fullblock status=progress'
1053 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1054 iflag=fullblock status=progress'
1055 alias ts='gen-shell -c task'
1056 alias ts='gen-shell -c task'
1057 alias tetris='autoload -Uz tetriscurses && tetriscurses'
1058 alias news='newsboat'
1059 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1060 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
1061 --restrict-filenames -o '%(title)s.%(ext)s'"
1062 alias cal="cal -3 --color=auto"
1064 **** Virtual machines, chroots
1065 #+begin_src shell :tangle ~/.config/zsh/zshrc
1066 alias ckiss="sudo chrooter ~/Virtual/kiss"
1067 alias cdebian="sudo chrooter ~/Virtual/debian bash"
1068 alias cwindows='devour qemu-system-x86_64 \
1073 -device VGA,vgamem_mb=64 \
1075 -device hda-duplex \
1077 -net user,smb=/home/armaa/Public \
1078 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1081 #+begin_src shell :tangle ~/.config/zsh/zshrc
1083 alias zpy="zconda && ipython"
1084 alias math="ipython --profile=math"
1085 alias pypi="python setup.py sdist && twine upload dist/*"
1086 alias pip="python -m pip"
1087 alias black="black -l 79"
1090 #+begin_src shell :tangle ~/.config/zsh/zshrc
1091 alias words='gen-shell -c "words"'
1092 alias words-e='gen-shell -c "words ~E"'
1095 #+begin_src shell :tangle ~/.config/zsh/zshrc
1096 alias zathura='devour zathura'
1097 alias mpv='devour mpv'
1098 alias sql='devour sqlitebrowser'
1099 alias cad='devour openscad'
1100 alias feh='devour feh'
1102 **** Package management (Pacman)
1103 #+begin_src shell :tangle ~/.config/zsh/zshrc
1105 alias api='yay -Syu'
1106 alias app='yay -Rns'
1108 alias apo='yay -Qttd'
1109 alias azf='pacman -Q | fzf'
1110 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1111 alias ufetch='ufetch-arch'
1112 alias reflect='reflector --verbose --sort rate --save \
1113 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1116 #+begin_src shell :tangle ~/.config/zsh/zshrc
1117 export EDITOR="emacsclient -c" # $EDITOR opens in terminal
1118 export VISUAL="emacsclient -c -a emacs" # $VISUAL opens in GUI mode
1119 export TERM=xterm-256color # for compatability
1121 export GPG_TTY="$(tty)"
1122 export MANPAGER='nvim +Man!'
1125 # generated with "vivid generate gruvbox"
1126 export LS_COLORS="$(cat ~/.local/share/zsh/gruvbox)"
1128 export GTK_USE_PORTAL=1
1130 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1131 export PATH="$PATH:/home/armaa/Code/scripts"
1132 export PATH="$PATH:/home/armaa/.cargo/bin"
1133 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1134 export PATH="$PATH:/usr/sbin"
1135 export PATH="$PATH:/opt/FreeTube/freetube"
1137 export LC_ALL="en_US.UTF-8"
1138 export LC_CTYPE="en_US.UTF-8"
1139 export LANGUAGE="en_US.UTF-8"
1141 export KISS_PATH="/home/armaa/kiss/home/armaa/kiss-repo"
1142 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1143 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1144 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1145 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1146 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1150 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1153 family: JetBrains Mono Nerd Font
1160 ligatures: true # Requires ligature patch
1167 background_opacity: 0.6
1170 Send <RET> + modifier through
1171 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1186 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1190 background: '#000000'
1191 foreground: '#ebdbb2'
1217 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1218 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1219 c.TerminalInteractiveShell.editing_mode = 'vi'
1220 c.InteractiveShell.colors = 'linux'
1221 c.TerminalInteractiveShell.confirm_exit = False
1224 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1228 return x * (180 / pi)
1231 return x * (pi / 180)
1234 return (x * (pi / 180)) / unit
1246 Make MPV play a little bit smoother.
1247 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1248 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1253 #+begin_src conf :tangle ~/.config/picom/picom.conf
1256 shadow-offset-x = -5;
1257 shadow-offset-y = -5;
1260 #+begin_src conf :tangle ~/.config/picom/picom.conf
1265 #+begin_src conf :tangle ~/.config/picom/picom.conf
1268 method = "gaussian";
1274 Needs picom to be run with "--experimental-backends"
1275 #+begin_src conf :tangle ~/.config/picom/picom.conf
1279 For any GNU Readline programs
1280 #+begin_src plain :tangle ~/.inputrc
1284 https://github.com/sharkdp/vivid
1286 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1288 background_color: '282A36'
1300 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1317 missing_symlink_target:
1343 sticky_other_writable:
1376 continuous-integration:
1387 font-style: underline
1398 #+begin_src plain :tangle ~/.gitconfig
1400 name = Armaan Bhojwani
1401 email = me@armaanb.net
1402 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1405 #+begin_src plain :tangle ~/.gitconfig
1407 defaultBranch = main
1410 #+begin_src plain :tangle ~/.gitconfig
1415 #+begin_src plain :tangle ~/.gitconfig
1417 smtpserver = smtp.mailbox.org
1418 smtpuser = me@armaanb.net
1419 smtpencryption = ssl
1420 smtpserverport = 465
1424 #+begin_src plain :tangle ~/.gitconfig
1429 #+begin_src plain :tangle ~/.gitconfig
1432 sclone = clone --depth 1
1438 subup = submodule update --remote
1439 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1440 mirror = git config --global alias.mirrormirror
1443 #+begin_src plain :tangle ~/.gitconfig