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 ** Easily convert splits
594 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
595 #+begin_src emacs-lisp
596 (defun toggle-window-split ()
598 (if (= (count-windows) 2)
599 (let* ((this-win-buffer (window-buffer))
600 (next-win-buffer (window-buffer (next-window)))
601 (this-win-edges (window-edges (selected-window)))
602 (next-win-edges (window-edges (next-window)))
603 (this-win-2nd (not (and (<= (car this-win-edges)
604 (car next-win-edges))
605 (<= (cadr this-win-edges)
606 (cadr next-win-edges)))))
608 (if (= (car this-win-edges)
609 (car (window-edges (next-window))))
610 'split-window-horizontally
611 'split-window-vertically)))
612 (delete-other-windows)
613 (let ((first-win (selected-window)))
615 (if this-win-2nd (other-window 1))
616 (set-window-buffer (selected-window) this-win-buffer)
617 (set-window-buffer (next-window) next-win-buffer)
618 (select-window first-win)
619 (if this-win-2nd (other-window 1))))))
621 (define-key ctl-x-4-map "t" 'toggle-window-split)
624 #+begin_src emacs-lisp
625 (defun insert-date ()
627 (insert (format-time-string "%Y-%m-%d")))
631 #+begin_src emacs-lisp
632 (use-package ace-window
633 :bind ("M-o" . ace-window))
635 ** Kill current buffer
636 Makes "C-x k" binding faster.
637 #+begin_src emacs-lisp
638 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
642 Opens file where you left it.
643 #+begin_src emacs-lisp
647 Render OpenSCAD files, and add a preview window.
649 Personal fork just merges a PR.
650 #+begin_src emacs-lisp
651 (use-package scad-mode)
652 (use-package scad-preview
653 :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
656 Distraction free writing a la junegunn/goyo.
657 #+begin_src emacs-lisp
658 (use-package olivetti
660 (evil-leader/set-key "o" 'olivetti-mode))
662 ** Control backup files
663 Stop backup files from spewing everywhere.
664 #+begin_src emacs-lisp
665 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
669 #+begin_src emacs-lisp
670 (setq abbrev-file-name "~/.emacs.d/abbrevs")
671 (setq save-abbrevs 'silent)
672 (setq-default abbrev-mode t)
674 ** Expand tabs to spaces
675 #+begin_src emacs-lisp
676 (setq-default tab-width 2)
678 ** Make yes/no easier
679 #+begin_src emacs-lisp
680 (defalias 'yes-or-no-p 'y-or-n-p)
682 ** Move customize file
683 No more clogging up init.el.
684 #+begin_src emacs-lisp
685 (setq custom-file "~/.emacs.d/custom.el")
689 #+begin_src emacs-lisp
691 :commands (helpful-callable helpful-variable helpful-command helpful-key)
693 (counsel-describe-function-function #'helpful-callable)
694 (counsel-describe-variable-function #'helpful-variable)
696 ([remap describe-function] . counsel-describe-function)
697 ([remap describe-command] . helpful-command)
698 ([remap describe-variable] . counsel-describe-variable)
699 ([remap describe-key] . helpful-key))
702 #+begin_src emacs-lisp
703 (use-package epa-file
704 :straight (:type built-in))
705 (setq epa-file-select-keys nil
706 epa-file-encrypt-to '("me@armaanb.net")
707 password-cache-expiry (* 60 15))
709 (use-package pinentry)
712 #+begin_src emacs-lisp
714 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
715 :custom (0x0-default-service 'envs)
716 :config (evil-leader/set-key
718 "0f" '0x0-upload-file
719 "0s" '0x0-upload-string
720 "0c" '0x0-upload-kill-ring
721 "0p" '0x0-upload-popup))
723 ** Copy kill ring to clipboard
724 #+begin_src emacs-lisp
725 (setq x-select-enable-clipboard t)
726 (defun copy-kill-ring-to-xorg ()
727 "Copy the current kill ring to the xorg clipboard."
729 (x-select-text (current-kill 0)))
732 #+begin_src emacs-lisp
733 (use-package browse-kill-ring)
738 #+begin_src conf :tangle ~/.spectrwm.conf
744 autorun = ws[1]:/home/armaa/Code/scripts/autostart
748 #+begin_src conf :tangle ~/.spectrwm.conf
749 color_focus = rgb:83/a5/98
750 color_focus_maximized = rgb:d6/5d/0e
751 color_unfocus = rgb:58/58/58
754 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
758 #+begin_src conf :tangle ~/.spectrwm.conf
759 program[lock] = i3lock -c 000000 -ef
760 program[term] = alacritty
761 program[screenshot_all] = flameshot gui
762 program[menu] = rofi -show run # `rofi-dmenu` handles the rest
763 program[switcher] = rofi -show window
764 program[notif] = /home/armaa/Code/scripts/setter status
767 bind[switcher] = MOD+Tab
770 #+begin_src conf :tangle ~/.spectrwm.conf
771 program[paup] = /home/armaa/Code/scripts/setter audio +5
772 program[padown] = /home/armaa/Code/scripts/setter audio -5
773 program[pamute] = /home/armaa/Code/scripts/setter audio
774 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
775 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
776 program[next] = playerctl next
777 program[prev] = playerctl previous
778 program[pause] = playerctl play-pause
780 bind[padown] = XF86AudioLowerVolume
781 bind[paup] = XF86AudioRaiseVolume
782 bind[pamute] = XF86AudioMute
783 bind[brigdown] = XF86MonBrightnessDown
784 bind[brigup] = XF86MonBrightnessUp
785 bind[pause] = XF86AudioPlay
786 bind[next] = XF86AudioNext
787 bind[prev] = XF86AudioPrev
790 #+begin_src conf :tangle ~/.spectrwm.conf
791 program[h] = xdotool keyup h key --clearmodifiers Left
792 program[j] = xdotool keyup j key --clearmodifiers Down
793 program[k] = xdotool keyup k key --clearmodifiers Up
794 program[l] = xdotool keyup l key --clearmodifiers Right
796 bind[h] = MOD + Control + h
797 bind[j] = MOD + Control + j
798 bind[k] = MOD + Control + k
799 bind[l] = MOD + Control + l
802 #+begin_src conf :tangle ~/.spectrwm.conf
803 program[aerc] = alacritty -e aerc
804 program[weechat] = alacritty --hold -e sh -c "while : ; do ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat; sleep 2; done"
805 program[emacs] = emacsclient -c
806 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
807 program[firefox] = firefox
808 program[thunderbird] = thunderbird
809 program[slack] = slack
811 bind[aerc] = MOD+Control+s
812 bind[weechat] = MOD+Control+d
813 bind[emacs] = MOD+Control+f
814 bind[emacs-anywhere] = MOD+f
815 bind[firefox] = MOD+Control+u
816 bind[thunderbird] = MOD+Control+i
817 bind[slack] = MOD+Control+o
822 #+begin_src shell :tangle ~/.config/zsh/zshrc
823 autoload -Uz compinit
827 unsetopt glob_complete
830 #+begin_src shell :tangle ~/.config/zsh/zshrc
834 bindkey -M vicmd "^[[3~" delete-char
835 bindkey "^[[3~" delete-char
837 autoload edit-command-line
838 zle -N edit-command-line
839 bindkey -M vicmd ^e edit-command-line
840 bindkey ^e edit-command-line
843 #+begin_src shell :tangle ~/.config/zsh/zshrc
844 setopt extended_history
846 setopt inc_append_history
847 setopt hist_ignore_dups
848 setopt hist_reduce_blanks
852 HISTFILE=~/.local/share/zsh/history
855 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
857 #+begin_src plain :tangle ~/.config/zpe/repositories
858 https://github.com/Aloxaf/fzf-tab
859 https://github.com/zdharma/fast-syntax-highlighting
860 https://github.com/rupa/z
863 #+begin_src shell :tangle ~/.config/zsh/zshrc
864 source ~/Code/zpe/zpe.sh
865 source ~/Code/admone/admone.zsh
866 source ~/.config/zsh/fzf-bindings.zsh
868 zpe-source fzf-tab/fzf-tab.zsh
869 zstyle ':completion:*:descriptions' format '[%d]'
870 zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
871 zstyle ':completion:*' completer _complete
872 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' \
873 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
875 zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
876 export _Z_DATA="/home/armaa/.local/share/z"
880 **** Alert after long command
881 #+begin_src shell :tangle ~/.config/zsh/zshrc
883 notify-send --urgency=low -i ${(%):-%(?.terminal.error)} \
884 ${history[$HISTCMD]%[;&|][[:space:]]##alert}
887 **** Time Zsh startup
888 #+begin_src shell :tangle ~/.config/zsh/zshrc
890 for i in $(seq 1 10); do
891 time "zsh" -i -c exit;
895 **** Update all packages
896 #+begin_src shell :tangle ~/.config/zsh/zshrc
897 color=$(tput setaf 5)
901 sudo echo "${color}== upgrading with yay ==${reset}"
904 echo "${color}== checking for pacnew files ==${reset}"
907 echo "${color}== upgrading flatpaks ==${reset}"
910 echo "${color}== upgrading zsh plugins ==${reset}"
913 echo "${color}== updating nvim plugins ==${reset}"
914 nvim +PlugUpdate +PlugUpgrade +qall
915 echo "Updated nvim plugins"
917 echo "${color}You are entirely up to date!${reset}"
920 **** Clean all packages
921 #+begin_src shell :tangle ~/.config/zsh/zshrc
923 sudo echo "${color}== cleaning pacman orphans ==${reset}"
924 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
926 echo "${color}== cleaning flatpaks ==${reset}"
927 flatpak remove --unused
929 echo "${color}== cleaning zsh plugins ==${reset}"
932 echo "${color}== cleaning nvim plugins ==${reset}"
933 nvim +PlugClean +qall
934 echo "Cleaned nvim plugins"
936 echo "${color}All orphans cleaned!${reset}"
940 #+begin_src shell :tangle ~/.config/zsh/zshrc
943 exa -lh --icons --git --group-directories-first
947 #+begin_src shell :tangle ~/.config/zsh/zshrc
949 __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
950 if [ $? -eq 0 ]; then
951 eval "$__conda_setup"
953 if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
954 . "/opt/anaconda/etc/profile.d/conda.sh"
956 export PATH="/opt/anaconda/bin:$PATH"
962 **** Interact with 0x0
963 #+begin_src shell :tangle ~/.config/zsh/zshrc
964 zxz="https://envs.sh"
965 0file() { curl -F"file=@$1" "$zxz" ; }
966 0pb() { curl -F"file=@-;" "$zxz" ; }
967 0url() { curl -F"url=$1" "$zxz" ; }
968 0short() { curl -F"shorten=$1" "$zxz" ; }
969 0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
972 #+begin_src shell :tangle ~/.config/zsh/zshrc
981 #+begin_src shell :tangle ~/.config/zsh/zshrc
982 alias bhoji-drop='ssh -p 23 root@armaanb.net'
983 alias weechat='ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat'
984 alias tcf='ssh root@204.48.23.68'
985 alias ngmun='ssh root@157.245.89.25'
986 alias prox='ssh root@192.168.1.224'
987 alias dock='ssh root@192.168.1.225'
988 alias jenkins='ssh root@192.168.1.226'
989 alias envs='ssh acheam@envs.net'
992 #+begin_src shell :tangle ~/.config/zsh/zshrc
993 alias ls='exa -lh --icons --git --group-directories-first'
994 alias la='exa -lha --icons --git --group-directories-first'
995 alias df='df -h / /boot'
1002 alias grep='grep -in --exclude-dir=.git --color=auto'
1003 alias mkdir='mkdir -pv'
1004 alias unar='atool -x'
1005 alias wget='wget -e robots=off'
1006 alias lanex='~/.local/share/lxc/lxc'
1009 #+begin_src shell :tangle ~/.config/zsh/zshrc
1010 alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1011 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1013 alias padu='padm add -u && padm commit && padm push && yadu'
1016 #+begin_src shell :tangle ~/.config/zsh/zshrc
1019 alias vw="nvim ~/Documents/vimwiki/index.md"
1021 **** System management
1022 #+begin_src shell :tangle ~/.config/zsh/zshrc
1023 alias jctl='journalctl -p 3 -xb'
1024 alias pkill='pkill -i'
1026 alias please='sudo $(fc -ln -1)'
1027 alias sudo='sudo ' # allows aliases to be run with sudo
1030 #+begin_src shell :tangle ~/.config/zsh/zshrc
1031 alias ping='ping -c 10'
1032 alias speed='speedtest-cli'
1033 alias ip='ip --color=auto'
1034 alias cip='curl https://armaanb.net/ip'
1035 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1036 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1039 #+begin_src shell :tangle ~/.config/zsh/zshrc
1040 alias dc='docker-compose'
1041 alias dcdu='docker-compose down && docker-compose up -d'
1044 #+begin_src shell :tangle ~/.config/zsh/zshrc
1045 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1046 iflag=fullblock status=progress'
1047 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1048 iflag=fullblock status=progress'
1049 alias ts='gen-shell -c task'
1050 alias ts='gen-shell -c task'
1051 alias tetris='autoload -Uz tetriscurses && tetriscurses'
1052 alias news='newsboat'
1053 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1054 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
1055 --restrict-filenames -o '%(title)s.%(ext)s'"
1056 alias cal="cal -3 --color=auto"
1058 **** Virtual machines, chroots
1059 #+begin_src shell :tangle ~/.config/zsh/zshrc
1060 alias ckiss="sudo chrooter ~/Virtual/kiss"
1061 alias cdebian="sudo chrooter ~/Virtual/debian bash"
1062 alias cwindows='devour qemu-system-x86_64 \
1067 -device VGA,vgamem_mb=64 \
1069 -device hda-duplex \
1071 -net user,smb=/home/armaa/Public \
1072 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1075 #+begin_src shell :tangle ~/.config/zsh/zshrc
1077 alias zpy="zconda && ipython"
1078 alias math="ipython --profile=math"
1079 alias pypi="python setup.py sdist && twine upload dist/*"
1080 alias pip="python -m pip"
1081 alias black="black -l 79"
1084 #+begin_src shell :tangle ~/.config/zsh/zshrc
1085 alias words='gen-shell -c "words"'
1086 alias words-e='gen-shell -c "words ~E"'
1089 #+begin_src shell :tangle ~/.config/zsh/zshrc
1090 alias zathura='devour zathura'
1091 alias mpv='devour mpv'
1092 alias sql='devour sqlitebrowser'
1093 alias cad='devour openscad'
1094 alias feh='devour feh'
1096 **** Package management (Pacman)
1097 #+begin_src shell :tangle ~/.config/zsh/zshrc
1099 alias api='yay -Syu'
1100 alias app='yay -Rns'
1102 alias apo='yay -Qttd'
1103 alias azf='pacman -Q | fzf'
1104 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1105 alias ufetch='ufetch-arch'
1106 alias reflect='reflector --verbose --sort rate --save \
1107 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1110 #+begin_src shell :tangle ~/.config/zsh/zshrc
1111 export EDITOR="emacsclient -c" # $EDITOR opens in terminal
1112 export VISUAL="emacsclient -c -a emacs" # $VISUAL opens in GUI mode
1113 export TERM=xterm-256color # for compatability
1115 export GPG_TTY="$(tty)"
1116 export MANPAGER='nvim +Man!'
1119 # generated with "vivid generate gruvbox"
1120 export LS_COLORS="$(cat ~/.local/share/zsh/gruvbox)"
1122 export GTK_USE_PORTAL=1
1124 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1125 export PATH="$PATH:/home/armaa/Code/scripts"
1126 export PATH="$PATH:/home/armaa/.cargo/bin"
1127 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1128 export PATH="$PATH:/usr/sbin"
1129 export PATH="$PATH:/opt/FreeTube/freetube"
1131 export LC_ALL="en_US.UTF-8"
1132 export LC_CTYPE="en_US.UTF-8"
1133 export LANGUAGE="en_US.UTF-8"
1135 export KISS_PATH="/home/armaa/kiss/home/armaa/kiss-repo"
1136 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1137 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1138 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1139 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1140 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1144 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1147 family: JetBrains Mono Nerd Font
1154 ligatures: true # Requires ligature patch
1161 background_opacity: 0.6
1164 Send <RET> + modifier through
1165 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1180 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1184 background: '#000000'
1185 foreground: '#ebdbb2'
1211 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1212 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1213 c.TerminalInteractiveShell.editing_mode = 'vi'
1214 c.InteractiveShell.colors = 'linux'
1215 c.TerminalInteractiveShell.confirm_exit = False
1218 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1222 return x * (180 / pi)
1225 return x * (pi / 180)
1228 return (x * (pi / 180)) / unit
1240 Make MPV play a little bit smoother.
1241 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1242 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1247 #+begin_src conf :tangle ~/.config/picom/picom.conf
1250 shadow-offset-x = -5;
1251 shadow-offset-y = -5;
1254 #+begin_src conf :tangle ~/.config/picom/picom.conf
1259 #+begin_src conf :tangle ~/.config/picom/picom.conf
1262 method = "gaussian";
1268 Needs picom to be run with "--experimental-backends"
1269 #+begin_src conf :tangle ~/.config/picom/picom.conf
1273 For any GNU Readline programs
1274 #+begin_src plain :tangle ~/.inputrc
1278 https://github.com/sharkdp/vivid
1280 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1282 background_color: '282A36'
1294 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1311 missing_symlink_target:
1337 sticky_other_writable:
1370 continuous-integration:
1381 font-style: underline
1392 #+begin_src plain :tangle ~/.gitconfig
1394 name = Armaan Bhojwani
1395 email = me@armaanb.net
1396 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1399 #+begin_src plain :tangle ~/.gitconfig
1401 defaultBranch = main
1404 #+begin_src plain :tangle ~/.gitconfig
1409 #+begin_src plain :tangle ~/.gitconfig
1411 smtpserver = smtp.mailbox.org
1412 smtpuser = me@armaanb.net
1413 smtpencryption = ssl
1414 smtpserverport = 465
1418 #+begin_src plain :tangle ~/.gitconfig
1423 #+begin_src plain :tangle ~/.gitconfig
1426 sclone = clone --depth 1
1432 subup = submodule update --remote
1433 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1434 mirror = git config --global alias.mirrormirror
1437 #+begin_src plain :tangle ~/.gitconfig