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 TODOs in comments
152 #+begin_src emacs-lisp
154 :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
155 :config (global-hl-todo-mode 1))
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))
281 #+begin_src emacs-lisp
282 (use-package org-tempo
284 :straight (:type built-in)
286 ;; TODO: There's gotta be a more efficient way to write this
287 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
288 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
289 (add-to-list 'org-structure-template-alist '("zsh" . "src shell :tangle ~/.config/zsh/zshrc"))
290 (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
291 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
292 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
293 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
294 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc")))
298 Simple, but not too simple autocompletion.
299 #+begin_src emacs-lisp
301 :bind (("C-s" . swiper)
302 :map ivy-minibuffer-map
303 ("TAB" . ivy-alt-done)
304 :map ivy-switch-buffer-map
305 ("M-d" . ivy-switch-buffer-kill))
309 #+begin_src emacs-lisp
310 (use-package ivy-rich
312 :config (ivy-rich-mode))
316 #+begin_src emacs-lisp
318 :bind (("C-M-j" . 'counsel-switch-buffer)
319 :map minibuffer-local-map
320 ("C-r" . 'counsel-minibuffer-history))
321 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
322 :config (counsel-mode))
324 ** Remember frequent commands
325 #+begin_src emacs-lisp
326 (use-package ivy-prescient
329 (ivy-prescient-enable-filtering nil)
331 (prescient-persist-mode)
332 (ivy-prescient-mode))
335 Better search utility.
336 #+begin_src emacs-lisp
341 Use elfeed for RSS. I have another file with all the feeds in it.
342 #+begin_src emacs-lisp
344 :bind (("C-c e" . elfeed))
346 (load "~/.emacs.d/feeds.el")
347 (add-hook 'elfeed-new-entry-hook
348 (elfeed-make-tagger :feed-url "youtube\\.com"
350 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
352 (use-package elfeed-goodies
354 :config (elfeed-goodies/setup))
357 Use mu4e for reading emails.
359 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.
361 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.
362 #+begin_src emacs-lisp
363 (use-package smtpmail
364 :straight (:type built-in))
366 :load-path "/usr/share/emacs/site-lisp/mu4e"
367 :bind (("C-c m" . mu4e))
369 (setq user-full-name "Armaan Bhojwani"
370 smtpmail-local-domain "armaanb.net"
371 smtpmail-stream-type 'ssl
372 smtpmail-smtp-service '465
373 mu4e-change-filenames-when-moving t
374 message-kill-buffer-on-exit t
375 mu4e-get-mail-command "offlineimap -q"
376 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
377 message-citation-line-function 'message-insert-formatted-citation-line
378 mu4e-context-policy "pick-first"
380 `( ,(make-mu4e-context
382 :enter-func (lambda () (mu4e-message "Entering school context"))
383 :leave-func (lambda () (mu4e-message "Leaving school context"))
384 :match-func (lambda (msg)
386 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
387 :vars '( (user-mail-address . "abhojwani22@nobles.edu")
388 (mu4e-sent-folder . "/school/Sent")
389 (mu4e-drafts-folder . "/school/Drafts")
390 (mu4e-trash-folder . "/school/Trash")
391 (mu4e-refile-folder . "/school/Archive")
392 (user-mail-address . "abhojwani22@nobles.edu")
393 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
394 (smtpmail-smtp-server . "smtp.gmail.com")))
397 :enter-func (lambda () (mu4e-message "Entering personal context"))
398 :leave-func (lambda () (mu4e-message "Leaving personal context"))
399 :match-func (lambda (msg)
401 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
403 (mu4e-sent-folder . "/personal/Sent")
404 (mu4e-drafts-folder . "/personal/Drafts")
405 (mu4e-trash-folder . "/personal/Trash")
406 (mu4e-refile-folder . "/personal/Archive")
407 (user-mail-address . "me@armaanb.net")
408 (smtpmail-smtp-user . "me@armaanb.net")
409 (smtpmail-smtp-server "smtp.mailbox.org")
410 (mu4e-drafts-folder . "/school/Drafts")
411 (mu4e-trash-folder . "/school/Trash")))))
412 (add-to-list 'mu4e-bookmarks
413 '(:name "Unified inbox"
414 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
418 #+begin_src emacs-lisp
420 (use-package calfw-org)
421 (use-package calfw-ical)
423 (defun acheam-calendar ()
426 (shell-command "vdirsyncer sync")
427 (let ((default-directory "~/.local/share/vdirsyncer/"))
428 (cfw:open-calendar-buffer
431 (cfw:ical-create-source "School" (expand-file-name "school/abhojwani22@nobles.edu.ics") "Green")
432 (cfw:ical-create-source "Personal" (expand-file-name "mailbox/Y2FsOi8vMC8zMQ.ics") "Blue")
433 (cfw:ical-create-source "Birthdays" (expand-file-name "mailbox/Y2FsOi8vMS8w.ics") "Gray")
437 Another file has more specific network configuration.
438 #+begin_src emacs-lisp
440 :config (load-file "~/.emacs.d/irc.el"))
442 (use-package circe-chanop
443 :straight (:type built-in)
446 (use-package circe-color-nicks
447 :straight (:type built-in)
451 Set EWW as default browser except for videos.
452 #+begin_src emacs-lisp
453 (defun browse-url-mpv (url &optional new-window)
455 (start-process "mpv" "*mpv*" "mpv" url))
457 (setq browse-url-handlers
459 (("youtu\\.?be" . browse-url-mpv)
460 ("." . eww-browse-url)
464 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to
465 "emacsclient --eval "(emacs-everywhere)".
466 #+begin_src emacs-lisp
467 (use-package emacs-everywhere)
472 #+begin_src emacs-lisp
473 (use-package lsp-mode
474 :commands (lsp lsp-deferred)
475 :custom (lsp-keymap-prefix "C-c l")
476 :hook ((lsp-mode . lsp-enable-which-key-integration)))
478 (use-package lsp-ivy)
481 :commands lsp-ui-mode
482 :custom (lsp-ui-doc-position 'bottom))
483 (use-package lsp-ui-flycheck
485 :straight (:type built-in))
488 Company-box adds icons.
489 #+begin_src emacs-lisp
492 :hook (lsp-mode . company-mode)
493 :bind (:map company-active-map
494 ("<tab>" . company-complete-selection))
496 ("<tab>" . company-indent-or-complete-common))
498 (company-minimum-prefix-length 1)
499 (setq company-dabbrev-downcase 0)
500 (company-idle-delay 0.0))
502 (use-package company-box
503 :hook (company-mode . company-box-mode))
507 #+begin_src emacs-lisp
508 (use-package lsp-pyright
509 :hook (python-mode . (lambda ()
510 (use-package lsp-pyright
511 :straight (:type built-in))
515 #+begin_src emacs-lisp
517 :hook (python-mode . blacken-mode)
519 (setq blacken-line-length 79))
522 (use-package ws-butler
524 (ws-butler-global-mode))
527 #+begin_src emacs-lisp
528 (use-package flycheck
530 (global-flycheck-mode))
532 ** Project management
533 #+begin_src emacs-lisp
534 (use-package projectile
535 :config (projectile-mode)
536 :custom ((projectile-completion-system 'ivy))
538 ("C-c p" . projectile-command-map)
540 (when (file-directory-p "~/Code")
541 (setq projectile-project-search-path '("~/Code")))
542 (setq projectile-switch-project-action #'projectile-dired))
544 (use-package counsel-projectile
546 :config (counsel-projectile-mode))
549 #+begin_src emacs-lisp
551 :straight (:type built-in)
552 :commands (dired dired-jump)
553 :custom ((dired-listing-switches "-agho --group-directories-first"))
555 (evil-collection-define-key 'normal 'dired-mode-map
556 "h" 'dired-single-up-directory
557 "l" 'dired-single-buffer))
559 (use-package dired-single
560 :commands (dired dired-jump))
562 (use-package dired-open
563 :commands (dired dired-jump)
565 (dired-open-extensions '(("png" . "feh")
568 (use-package dired-hide-dotfiles
569 :hook (dired-mode . dired-hide-dotfiles-mode)
571 (evil-collection-define-key 'normal 'dired-mode-map
572 "H" 'dired-hide-dotfiles-mode))
576 # TODO: Write a command that commits hunk, skipping staging step.
577 #+begin_src emacs-lisp
579 :hook (magit-mode-hook. pinentry-start))
581 *** Colored diff in line number area
582 #+begin_src emacs-lisp
584 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
585 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
586 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
587 :config (global-diff-hl-mode))
589 * General text editing
591 Indent after every change.
592 #+begin_src emacs-lisp
593 (use-package aggressive-indent
594 :config (global-aggressive-indent-mode))
597 Spell check in text mode, and in prog-mode comments.
598 #+begin_src emacs-lisp
599 (dolist (hook '(text-mode-hook))
600 (add-hook hook (lambda () (flyspell-mode))))
601 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
602 (add-hook hook (lambda () (flyspell-mode -1))))
603 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
605 ** Expand tabs to spaces
606 #+begin_src emacs-lisp
607 (setq-default tab-width 2)
609 ** Copy kill ring to clipboard
610 #+begin_src emacs-lisp
611 (setq x-select-enable-clipboard t)
612 (defun copy-kill-ring-to-xorg ()
613 "Copy the current kill ring to the xorg clipboard."
615 (x-select-text (current-kill 0)))
618 #+begin_src emacs-lisp
619 (use-package browse-kill-ring)
622 Opens file where you left it.
623 #+begin_src emacs-lisp
627 Distraction free writing a la junegunn/goyo.
628 #+begin_src emacs-lisp
629 (use-package olivetti
631 (evil-leader/set-key "o" 'olivetti-mode))
635 #+begin_src emacs-lisp
636 (setq abbrev-file-name "~/.emacs.d/abbrevs")
637 (setq save-abbrevs 'silent)
638 (setq-default abbrev-mode t)
641 ** Easily convert splits
642 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
643 #+begin_src emacs-lisp
644 (defun toggle-window-split ()
646 (if (= (count-windows) 2)
647 (let* ((this-win-buffer (window-buffer))
648 (next-win-buffer (window-buffer (next-window)))
649 (this-win-edges (window-edges (selected-window)))
650 (next-win-edges (window-edges (next-window)))
651 (this-win-2nd (not (and (<= (car this-win-edges)
652 (car next-win-edges))
653 (<= (cadr this-win-edges)
654 (cadr next-win-edges)))))
656 (if (= (car this-win-edges)
657 (car (window-edges (next-window))))
658 'split-window-horizontally
659 'split-window-vertically)))
660 (delete-other-windows)
661 (let ((first-win (selected-window)))
663 (if this-win-2nd (other-window 1))
664 (set-window-buffer (selected-window) this-win-buffer)
665 (set-window-buffer (next-window) next-win-buffer)
666 (select-window first-win)
667 (if this-win-2nd (other-window 1))))))
669 (define-key ctl-x-4-map "t" 'toggle-window-split)
672 #+begin_src emacs-lisp
673 (defun insert-date ()
675 (insert (format-time-string "%Y-%m-%d")))
679 #+begin_src emacs-lisp
680 (use-package ace-window
681 :bind ("M-o" . ace-window))
683 ** Kill current buffer
684 Makes "C-x k" binding faster.
685 #+begin_src emacs-lisp
686 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
690 Render OpenSCAD files, and add a preview window.
692 Personal fork just merges a PR.
693 #+begin_src emacs-lisp
694 (use-package scad-mode)
695 (use-package scad-preview
696 :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
698 ** Control backup files
699 Stop backup files from spewing everywhere.
700 #+begin_src emacs-lisp
701 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
703 ** Make yes/no easier
704 #+begin_src emacs-lisp
705 (defalias 'yes-or-no-p 'y-or-n-p)
707 ** Move customize file
708 No more clogging up init.el.
709 #+begin_src emacs-lisp
710 (setq custom-file "~/.emacs.d/custom.el")
714 #+begin_src emacs-lisp
716 :commands (helpful-callable helpful-variable helpful-command helpful-key)
718 (counsel-describe-function-function #'helpful-callable)
719 (counsel-describe-variable-function #'helpful-variable)
721 ([remap describe-function] . counsel-describe-function)
722 ([remap describe-command] . helpful-command)
723 ([remap describe-variable] . counsel-describe-variable)
724 ([remap describe-key] . helpful-key))
727 #+begin_src emacs-lisp
728 (use-package epa-file
729 :straight (:type built-in))
730 (setq epa-file-select-keys nil
731 epa-file-encrypt-to '("me@armaanb.net")
732 password-cache-expiry (* 60 15))
734 (use-package pinentry)
737 #+begin_src emacs-lisp
739 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
740 :custom (0x0-default-service 'envs)
741 :config (evil-leader/set-key
743 "0f" '0x0-upload-file
744 "0s" '0x0-upload-string
745 "0c" '0x0-upload-kill-ring
746 "0p" '0x0-upload-popup))
751 #+begin_src conf :tangle ~/.spectrwm.conf
757 autorun = ws[1]:/home/armaa/Code/scripts/autostart
761 #+begin_src conf :tangle ~/.spectrwm.conf
762 color_focus = rgb:83/a5/98
763 color_focus_maximized = rgb:d6/5d/0e
764 color_unfocus = rgb:58/58/58
767 #+begin_src conf :tangle ~/.spectrwm.conf
769 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
773 #+begin_src conf :tangle ~/.spectrwm.conf
774 program[lock] = i3lock -c 000000 -ef
775 program[term] = alacritty
776 program[screenshot_all] = flameshot gui
777 program[menu] = rofi -show run # `rofi-dmenu` handles the rest
778 program[switcher] = rofi -show window
779 program[notif] = /home/armaa/Code/scripts/setter status
782 bind[switcher] = MOD+Tab
785 #+begin_src conf :tangle ~/.spectrwm.conf
786 program[paup] = /home/armaa/Code/scripts/setter audio +5
787 program[padown] = /home/armaa/Code/scripts/setter audio -5
788 program[pamute] = /home/armaa/Code/scripts/setter audio
789 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
790 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
791 program[next] = playerctl next
792 program[prev] = playerctl previous
793 program[pause] = playerctl play-pause
795 bind[padown] = XF86AudioLowerVolume
796 bind[paup] = XF86AudioRaiseVolume
797 bind[pamute] = XF86AudioMute
798 bind[brigdown] = XF86MonBrightnessDown
799 bind[brigup] = XF86MonBrightnessUp
800 bind[pause] = XF86AudioPlay
801 bind[next] = XF86AudioNext
802 bind[prev] = XF86AudioPrev
805 #+begin_src conf :tangle ~/.spectrwm.conf
806 program[h] = xdotool keyup h key --clearmodifiers Left
807 program[j] = xdotool keyup j key --clearmodifiers Down
808 program[k] = xdotool keyup k key --clearmodifiers Up
809 program[l] = xdotool keyup l key --clearmodifiers Right
811 bind[h] = MOD + Control + h
812 bind[j] = MOD + Control + j
813 bind[k] = MOD + Control + k
814 bind[l] = MOD + Control + l
817 #+begin_src conf :tangle ~/.spectrwm.conf
818 program[aerc] = alacritty -e aerc
819 program[weechat] = alacritty --hold -e sh -c "while : ; do ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat; sleep 2; done"
820 program[emacs] = emacsclient -c
821 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
822 program[firefox] = firefox
823 program[thunderbird] = thunderbird
824 program[slack] = slack
826 bind[aerc] = MOD+Control+s
827 bind[weechat] = MOD+Control+d
828 bind[emacs] = MOD+Control+f
829 bind[emacs-anywhere] = MOD+f
830 bind[firefox] = MOD+Control+u
831 bind[thunderbird] = MOD+Control+i
832 bind[slack] = MOD+Control+o
837 #+begin_src shell :tangle ~/.config/zsh/zshrc
838 autoload -Uz compinit
842 unsetopt glob_complete
845 #+begin_src shell :tangle ~/.config/zsh/zshrc
849 bindkey -M vicmd "^[[3~" delete-char
850 bindkey "^[[3~" delete-char
852 autoload edit-command-line
853 zle -N edit-command-line
854 bindkey -M vicmd ^e edit-command-line
855 bindkey ^e edit-command-line
858 #+begin_src shell :tangle ~/.config/zsh/zshrc
859 setopt extended_history
861 setopt inc_append_history
862 setopt hist_ignore_dups
863 setopt hist_reduce_blanks
867 HISTFILE=~/.local/share/zsh/history
870 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
872 #+begin_src plain :tangle ~/.config/zpe/repositories
873 https://github.com/Aloxaf/fzf-tab
874 https://github.com/zdharma/fast-syntax-highlighting
875 https://github.com/rupa/z
878 #+begin_src shell :tangle ~/.config/zsh/zshrc
879 source ~/Code/zpe/zpe.sh
880 source ~/Code/admone/admone.zsh
881 source ~/.config/zsh/fzf-bindings.zsh
883 zpe-source fzf-tab/fzf-tab.zsh
884 zstyle ':completion:*:descriptions' format '[%d]'
885 zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
886 zstyle ':completion:*' completer _complete
887 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' \
888 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
890 zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
891 export _Z_DATA="/home/armaa/.local/share/z"
895 **** Alert after long command
896 #+begin_src shell :tangle ~/.config/zsh/zshrc
898 notify-send --urgency=low -i ${(%):-%(?.terminal.error)} \
899 ${history[$HISTCMD]%[;&|][[:space:]]##alert}
902 **** Time Zsh startup
903 #+begin_src shell :tangle ~/.config/zsh/zshrc
905 for i in $(seq 1 10); do
906 time "zsh" -i -c exit;
910 **** Update all packages
911 #+begin_src shell :tangle ~/.config/zsh/zshrc
912 color=$(tput setaf 5)
916 sudo echo "${color}== upgrading with yay ==${reset}"
919 echo "${color}== checking for pacnew files ==${reset}"
922 echo "${color}== upgrading flatpaks ==${reset}"
925 echo "${color}== upgrading zsh plugins ==${reset}"
928 echo "${color}== updating nvim plugins ==${reset}"
929 nvim +PlugUpdate +PlugUpgrade +qall
930 echo "Updated nvim plugins"
932 echo "${color}You are entirely up to date!${reset}"
935 **** Clean all packages
936 #+begin_src shell :tangle ~/.config/zsh/zshrc
938 sudo echo "${color}== cleaning pacman orphans ==${reset}"
939 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
941 echo "${color}== cleaning flatpaks ==${reset}"
942 flatpak remove --unused
944 echo "${color}== cleaning zsh plugins ==${reset}"
947 echo "${color}== cleaning nvim plugins ==${reset}"
948 nvim +PlugClean +qall
949 echo "Cleaned nvim plugins"
951 echo "${color}All orphans cleaned!${reset}"
955 #+begin_src shell :tangle ~/.config/zsh/zshrc
958 exa -lh --icons --git --group-directories-first
962 #+begin_src shell :tangle ~/.config/zsh/zshrc
964 __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
965 if [ $? -eq 0 ]; then
966 eval "$__conda_setup"
968 if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
969 . "/opt/anaconda/etc/profile.d/conda.sh"
971 export PATH="/opt/anaconda/bin:$PATH"
977 **** Interact with 0x0
978 #+begin_src shell :tangle ~/.config/zsh/zshrc
979 zxz="https://envs.sh"
980 0file() { curl -F"file=@$1" "$zxz" ; }
981 0pb() { curl -F"file=@-;" "$zxz" ; }
982 0url() { curl -F"url=$1" "$zxz" ; }
983 0short() { curl -F"shorten=$1" "$zxz" ; }
984 0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
987 #+begin_src shell :tangle ~/.config/zsh/zshrc
996 #+begin_src shell :tangle ~/.config/zsh/zshrc
997 alias bhoji-drop='ssh -p 23 root@armaanb.net'
998 alias weechat='ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat'
999 alias tcf='ssh root@204.48.23.68'
1000 alias ngmun='ssh root@157.245.89.25'
1001 alias prox='ssh root@192.168.1.224'
1002 alias dock='ssh root@192.168.1.225'
1003 alias jenkins='ssh root@192.168.1.226'
1004 alias envs='ssh acheam@envs.net'
1006 **** File management
1007 #+begin_src shell :tangle ~/.config/zsh/zshrc
1008 alias ls='exa -lh --icons --git --group-directories-first'
1009 alias la='exa -lha --icons --git --group-directories-first'
1010 alias df='df -h / /boot'
1012 alias free='free -h'
1017 alias grep='grep -in --exclude-dir=.git --color=auto'
1018 alias mkdir='mkdir -pv'
1019 alias unar='atool -x'
1020 alias wget='wget -e robots=off'
1021 alias lanex='~/.local/share/lxc/lxc'
1024 #+begin_src shell :tangle ~/.config/zsh/zshrc
1025 alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1026 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1028 alias padu='padm add -u && padm commit && padm push && yadu'
1031 #+begin_src shell :tangle ~/.config/zsh/zshrc
1034 alias vw="nvim ~/Documents/vimwiki/index.md"
1036 **** System management
1037 #+begin_src shell :tangle ~/.config/zsh/zshrc
1038 alias jctl='journalctl -p 3 -xb'
1039 alias pkill='pkill -i'
1041 alias please='sudo $(fc -ln -1)'
1042 alias sudo='sudo ' # allows aliases to be run with sudo
1045 #+begin_src shell :tangle ~/.config/zsh/zshrc
1046 alias ping='ping -c 10'
1047 alias speed='speedtest-cli'
1048 alias ip='ip --color=auto'
1049 alias cip='curl https://armaanb.net/ip'
1050 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1051 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1054 #+begin_src shell :tangle ~/.config/zsh/zshrc
1055 alias dc='docker-compose'
1056 alias dcdu='docker-compose down && docker-compose up -d'
1059 #+begin_src shell :tangle ~/.config/zsh/zshrc
1060 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1061 iflag=fullblock status=progress'
1062 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1063 iflag=fullblock status=progress'
1064 alias ts='gen-shell -c task'
1065 alias ts='gen-shell -c task'
1066 alias tetris='autoload -Uz tetriscurses && tetriscurses'
1067 alias news='newsboat'
1068 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1069 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
1070 --restrict-filenames -o '%(title)s.%(ext)s'"
1071 alias cal="cal -3 --color=auto"
1073 **** Virtual machines, chroots
1074 #+begin_src shell :tangle ~/.config/zsh/zshrc
1075 alias ckiss="sudo chrooter ~/Virtual/kiss"
1076 alias cdebian="sudo chrooter ~/Virtual/debian bash"
1077 alias cwindows='devour qemu-system-x86_64 \
1082 -device VGA,vgamem_mb=64 \
1084 -device hda-duplex \
1086 -net user,smb=/home/armaa/Public \
1087 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1090 #+begin_src shell :tangle ~/.config/zsh/zshrc
1092 alias zpy="zconda && ipython"
1093 alias math="ipython --profile=math"
1094 alias pypi="python setup.py sdist && twine upload dist/*"
1095 alias pip="python -m pip"
1096 alias black="black -l 79"
1099 #+begin_src shell :tangle ~/.config/zsh/zshrc
1100 alias words='gen-shell -c "words"'
1101 alias words-e='gen-shell -c "words ~E"'
1104 #+begin_src shell :tangle ~/.config/zsh/zshrc
1105 alias zathura='devour zathura'
1106 alias mpv='devour mpv'
1107 alias sql='devour sqlitebrowser'
1108 alias cad='devour openscad'
1109 alias feh='devour feh'
1111 **** Package management (Pacman)
1112 #+begin_src shell :tangle ~/.config/zsh/zshrc
1114 alias api='yay -Syu'
1115 alias app='yay -Rns'
1117 alias apo='yay -Qttd'
1118 alias azf='pacman -Q | fzf'
1119 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1120 alias ufetch='ufetch-arch'
1121 alias reflect='reflector --verbose --sort rate --save \
1122 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1125 #+begin_src shell :tangle ~/.config/zsh/zshrc
1126 export EDITOR="emacsclient -c" # $EDITOR opens in terminal
1127 export VISUAL="emacsclient -c -a emacs" # $VISUAL opens in GUI mode
1128 export TERM=xterm-256color # for compatability
1130 export GPG_TTY="$(tty)"
1131 export MANPAGER='nvim +Man!'
1134 # generated with "vivid generate gruvbox"
1135 export LS_COLORS="$(cat ~/.local/share/zsh/gruvbox)"
1137 export GTK_USE_PORTAL=1
1139 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1140 export PATH="$PATH:/home/armaa/Code/scripts"
1141 export PATH="$PATH:/home/armaa/.cargo/bin"
1142 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1143 export PATH="$PATH:/usr/sbin"
1144 export PATH="$PATH:/opt/FreeTube/freetube"
1146 export LC_ALL="en_US.UTF-8"
1147 export LC_CTYPE="en_US.UTF-8"
1148 export LANGUAGE="en_US.UTF-8"
1150 export KISS_PATH="/home/armaa/kiss/home/armaa/kiss-repo"
1151 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1152 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1153 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1154 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1155 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1159 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1162 family: JetBrains Mono Nerd Font
1169 ligatures: true # Requires ligature patch
1176 background_opacity: 0.6
1179 Send <RET> + modifier through
1180 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1195 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1199 background: '#000000'
1200 foreground: '#ebdbb2'
1226 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1227 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1228 c.TerminalInteractiveShell.editing_mode = 'vi'
1229 c.InteractiveShell.colors = 'linux'
1230 c.TerminalInteractiveShell.confirm_exit = False
1233 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1237 return x * (180 / pi)
1240 return x * (pi / 180)
1243 return (x * (pi / 180)) / unit
1255 Make MPV play a little bit smoother.
1256 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1257 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1262 #+begin_src conf :tangle ~/.config/picom/picom.conf
1265 shadow-offset-x = -5;
1266 shadow-offset-y = -5;
1269 #+begin_src conf :tangle ~/.config/picom/picom.conf
1274 #+begin_src conf :tangle ~/.config/picom/picom.conf
1277 method = "gaussian";
1283 Needs picom to be run with "--experimental-backends"
1284 #+begin_src conf :tangle ~/.config/picom/picom.conf
1288 For any GNU Readline programs
1289 #+begin_src plain :tangle ~/.inputrc
1293 https://github.com/sharkdp/vivid
1295 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1297 background_color: '282A36'
1309 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1326 missing_symlink_target:
1352 sticky_other_writable:
1385 continuous-integration:
1396 font-style: underline
1407 #+begin_src plain :tangle ~/.gitconfig
1409 name = Armaan Bhojwani
1410 email = me@armaanb.net
1411 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1414 #+begin_src plain :tangle ~/.gitconfig
1416 defaultBranch = main
1419 #+begin_src plain :tangle ~/.gitconfig
1424 #+begin_src plain :tangle ~/.gitconfig
1426 smtpserver = smtp.mailbox.org
1427 smtpuser = me@armaanb.net
1428 smtpencryption = ssl
1429 smtpserverport = 465
1433 #+begin_src plain :tangle ~/.gitconfig
1438 #+begin_src plain :tangle ~/.gitconfig
1441 sclone = clone --depth 1
1447 subup = submodule update --remote
1448 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1449 mirror = git config --global alias.mirrormirror
1452 #+begin_src plain :tangle ~/.gitconfig
1457 Lightweight notification daemon. Gruvbox colors, based on https://github.com/a-schaefers/i3-wm-gruvbox-theme/
1459 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1461 font = "JetBrains Mono Medium Nerd Font 11"
1463 format = "<b>%s</b>\n%b"
1465 indicate_hidden = yes
1468 show_age_threshold = 60
1471 geometry = "400x5-20+20"
1473 idle_threshold = 120
1475 sticky_history = yes
1477 separator_height = 4
1479 horizontal_padding = 8
1481 separator_color = "#585858"
1482 startup_notification = false
1485 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1492 close_all = mod4+shift+c
1493 history = mod4+ctrl+c
1496 background = "#282828"
1497 foreground = "#ebdbb2"
1498 highlight = "#ebdbb2"
1502 background = "#282828"
1503 foreground = "#ebdbb2"
1504 highlight = "#ebdbb2"
1508 background = "#282828"
1509 foreground = "#cc241d"
1510 highlight = "#ebdbb2"