1 #+TITLE: System Configuration
2 #+DESCRIPTION: Personal system configuration in org-mode format.
3 #+AUTHOR: Armaan Bhojwani
4 #+EMAIL: me@armaanb.net
7 Welcome to my system configuration! This file contains my Emacs configuration, but also my config files for many of the other programs on my system!
9 I am currently using GCCEmacs 28 from the feature/native-comp branch, so some settings may not be available for older versions of Emacs. This is a purely personal configuration, so while I can garuntee that it works on my setup, I can't for anything else.
11 I chose to create a powerful, yet not overly heavy Emacs configuration. Things like LSP mode are important to my workflow and help me be productive, so despite its weight, it is kept. Things like a fancy modeline or icons on the other hand, do not increase my productivity, and create visual clutter, and thus have been excluded.
13 Another important choice has been to integrate Emacs into a large part of my computing environment (see [[*EmacsOS]]). I use Email, IRC, et cetera, all through Emacs which simplifies my workflow.
15 Lastly, I use Evil mode. I think modal keybindings are simple and more ergonomic than standard Emacs style, and Vim keybindings are what I'm comfortable with and are pervasive throughout computing.
17 *** TODO Turn keybinding and hook declarations into use-package declarations where possible
18 *** TODO Put configs with passwords in here with some kind of authentication
22 Released under the [[https://opensource.org/licenses/MIT][MIT license]] by Armaan Bhojwani, 2021. Note that many snippets are taken from online, and other sources, who are credited for their work at the snippet.
24 ** Bootstrap straight.el
25 straight.el is really nice for managing package, and it integrates nicely with use-package. It uses the bootstrapping system defined here for installation.
26 #+begin_src emacs-lisp
27 (defvar bootstrap-version)
29 (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
30 (bootstrap-version 5))
31 (unless (file-exists-p bootstrap-file)
33 (url-retrieve-synchronously
34 "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
35 'silent 'inhibit-cookies)
36 (goto-char (point-max))
37 (eval-print-last-sexp)))
38 (load bootstrap-file nil 'nomessage))
40 ** Replace use-package with straight
41 #+begin_src emacs-lisp
42 (straight-use-package 'use-package)
43 (setq straight-use-package-by-default t)
47 Very nice high contrast theme.
49 Its fine to set this here because I run Emacs in daemon mode, but if I were not, then putting it in early-init.el would be a better choice to eliminate the window being white before the theme is loaded.
50 #+begin_src emacs-lisp
51 (setq modus-themes-slanted-constructs t
52 modus-themes-bold-constructs t
53 modus-themes-org-blocks 'grayscale
54 modus-themes-mode-line '3d
55 modus-themes-scale-headings t
56 modus-themes-region 'no-extend
57 modus-themes-diffs 'desaturated)
58 (load-theme 'modus-vivendi t)
61 #+begin_src emacs-lisp
62 (use-package tree-sitter-langs)
63 (use-package tree-sitter
64 :config (global-tree-sitter-mode)
65 :hook (tree-sitter-after-on-hook . tree-sitter-hl-mode))
69 Great programming font with ligatures.
70 #+begin_src emacs-lisp
71 (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
74 #+begin_src emacs-lisp
76 :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
78 (ligature-set-ligatures
79 '(prog-mode text-mode)
80 '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
81 "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
82 "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
83 "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
84 "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
85 ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
86 "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
87 "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
88 "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
89 "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
90 "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
91 "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
92 (global-ligature-mode t))
95 #+begin_src emacs-lisp
97 :config (global-emojify-mode))
99 ;; http://ergoemacs.org/emacs/emacs_list_and_set_font.html
104 ((member "Twitter Color Emoji" (font-family-list)) "Twitter Color Emoji")
105 ((member "Noto Color Emoji" (font-family-list)) "Noto Color Emoji")
106 ((member "Noto Emoji" (font-family-list)) "Noto Emoji")))
109 Display relative line numbers except in some modes
110 #+begin_src emacs-lisp
111 (global-display-line-numbers-mode)
112 (setq display-line-numbers-type 'relative)
113 (dolist (no-line-num '(term-mode-hook
118 (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
120 ** Highlight matching parenthesis
121 #+begin_src emacs-lisp
123 :config (show-paren-mode)
124 :custom (show-paren-style 'parenthesis))
127 *** Show current function
128 #+begin_src emacs-lisp
129 (which-function-mode)
131 *** Make position in file more descriptive
132 Show current column and file size.
133 #+begin_src emacs-lisp
135 (size-indication-mode)
138 #+begin_src emacs-lisp
140 :config (minions-mode))
143 #+begin_src emacs-lisp
145 :straight (wc-mode :type git :host github :repo "bnbeckwith/wc-mode")
146 :hook (text-mode-hook . wc-mode))
149 Show a ruler at a certain number of chars depending on mode.
150 #+begin_src emacs-lisp
151 (global-display-fill-column-indicator-mode)
154 Whenever starting a key chord, show possible future steps.
155 #+begin_src emacs-lisp
156 (use-package which-key
157 :config (which-key-mode)
158 :custom (which-key-idle-delay 0.3))
160 ** Highlight TODOs in comments
161 #+begin_src emacs-lisp
163 :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
164 :config (global-hl-todo-mode 1))
167 #+begin_src emacs-lisp
171 Soft wrap words and do operations by visual lines.
172 #+begin_src emacs-lisp
173 (add-hook 'text-mode-hook 'turn-on-visual-line-mode)
175 ** Display number of matches in search
176 #+begin_src emacs-lisp
178 :config (global-anzu-mode))
181 Inverts modeline instead of audible bell or the standard visual bell.
182 #+begin_src emacs-lisp
183 (setq visible-bell nil
184 ring-bell-function 'flash-mode-line)
185 (defun flash-mode-line ()
186 (invert-face 'mode-line)
187 (run-with-timer 0.1 nil #'invert-face 'mode-line))
191 #+begin_src emacs-lisp
193 :custom (select-enable-clipboard nil)
196 (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
197 ;; Use visual line motions even outside of visual-line-mode buffers
198 (evil-global-set-key 'motion "j" 'evil-next-visual-line)
199 (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
200 (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
203 #+begin_src emacs-lisp
204 (use-package evil-collection
206 :init (evil-collection-init)
207 :custom (evil-collection-setup-minibuffer t))
211 #+begin_src emacs-lisp
212 (use-package evil-surround
213 :config (global-evil-surround-mode))
216 #+begin_src emacs-lisp
217 (use-package evil-leader
218 :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
220 (evil-leader/set-leader "<SPC>")
221 (global-evil-leader-mode))
224 #+begin_src emacs-lisp
226 (use-package evil-nerd-commenter
227 :bind (:map evil-normal-state-map
228 ("gc" . evilnc-comment-or-uncomment-lines))
229 :custom (evilnc-invert-comment-line-by-line nil))
233 #+begin_src emacs-lisp
234 (evil-set-undo-system 'undo-redo)
236 ** Number incrementing
238 #+begin_src emacs-lisp
239 (use-package evil-numbers
240 :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
241 :bind (:map evil-normal-state-map
242 ("C-M-a" . evil-numbers/inc-at-pt)
243 ("C-M-x" . evil-numbers/dec-at-pt)))
247 #+begin_src emacs-lisp
248 (use-package evil-org
250 :hook (org-mode . evil-org-mode)
252 (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
253 (use-package evil-org-agenda
254 :straight (:type built-in)
257 (evil-org-agenda-set-keys))
260 #+begin_src emacs-lisp
261 (evil-leader/set-key-for-mode 'org-mode
262 "T" 'org-show-todo-tree
264 "c" 'org-archive-subtree)
268 #+begin_src emacs-lisp
270 :straight (:type built-in)
271 :commands (org-capture org-agenda)
274 (org-agenda-start-with-log-mode t)
275 (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
277 (org-log-into-drawer t)
278 (org-src-tab-acts-natively t)
279 (org-src-fontify-natively t)
280 (org-startup-indented t)
281 (org-hide-emphasis-markers t)
282 (org-fontify-whole-block-delimiter-line nil)
283 :bind ("C-c a" . org-agenda))
286 #+begin_src emacs-lisp
287 (use-package org-tempo
289 :straight (:type built-in)
291 ;; TODO: There's gotta be a more efficient way to write this
292 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
293 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
294 (add-to-list 'org-structure-template-alist '("zsh" . "src shell :tangle ~/.config/zsh/zshrc"))
295 (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
296 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
297 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
298 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
299 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
300 (add-to-list 'org-structure-template-alist '("ro" . "src javascript :tangle ~/.config/rofi/config.rasi"))
301 (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc")))
304 #+begin_src emacs-lisp
305 (use-package org-present
306 :straight (org-present :type git :host github :repo "rlister/org-present"))
310 Simple, but not too simple autocompletion.
311 #+begin_src emacs-lisp
313 :bind (("C-s" . swiper)
314 :map ivy-minibuffer-map
315 ("TAB" . ivy-alt-done)
316 :map ivy-switch-buffer-map
317 ("M-d" . ivy-switch-buffer-kill))
321 #+begin_src emacs-lisp
322 (use-package ivy-rich
324 :config (ivy-rich-mode))
328 #+begin_src emacs-lisp
330 :bind (("C-M-j" . 'counsel-switch-buffer)
331 :map minibuffer-local-map
332 ("C-r" . 'counsel-minibuffer-history))
333 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
334 :config (counsel-mode))
336 ** Remember frequent commands
337 #+begin_src emacs-lisp
338 (use-package ivy-prescient
341 (ivy-prescient-enable-filtering nil)
343 (prescient-persist-mode)
344 (ivy-prescient-mode))
347 Better search utility.
348 #+begin_src emacs-lisp
353 Use elfeed for RSS. I have another file with all the feeds in it.
354 #+begin_src emacs-lisp
356 :bind (("C-c e" . elfeed))
358 (load "~/.emacs.d/feeds.el")
359 (add-hook 'elfeed-new-entry-hook
360 (elfeed-make-tagger :feed-url "youtube\\.com"
362 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
364 (use-package elfeed-goodies
366 :config (elfeed-goodies/setup))
369 Use mu4e for reading emails.
371 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.
373 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.
374 #+begin_src emacs-lisp
375 (use-package smtpmail
376 :straight (:type built-in))
378 :load-path "/usr/share/emacs/site-lisp/mu4e"
379 :bind (("C-c m" . mu4e))
381 (setq user-full-name "Armaan Bhojwani"
382 smtpmail-local-domain "armaanb.net"
383 smtpmail-stream-type 'ssl
384 smtpmail-smtp-service '465
385 mu4e-change-filenames-when-moving t
386 mu4e-get-mail-command "offlineimap -q"
387 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
388 message-citation-line-function 'message-insert-formatted-citation-line
389 mu4e-completing-read-function 'ivy-completing-read
390 mu4e-confirm-quit nil
391 mail-user-agent 'mu4e-user-agent
393 `( ,(make-mu4e-context
395 :enter-func (lambda () (mu4e-message "Entering school context"))
396 :leave-func (lambda () (mu4e-message "Leaving school context"))
397 :match-func (lambda (msg)
399 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
400 :vars '((user-mail-address . "abhojwani22@nobles.edu")
401 (mu4e-sent-folder . "/school/Sent")
402 (mu4e-drafts-folder . "/school/Drafts")
403 (mu4e-trash-folder . "/school/Trash")
404 (mu4e-refile-folder . "/school/Archive")
405 (user-mail-address . "abhojwani22@nobles.edu")
406 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
407 (smtpmail-smtp-server . "smtp.gmail.com")))
410 :enter-func (lambda () (mu4e-message "Entering personal context"))
411 :leave-func (lambda () (mu4e-message "Leaving personal context"))
412 :match-func (lambda (msg)
414 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
415 :vars '((mu4e-sent-folder . "/personal/Sent")
416 (mu4e-drafts-folder . "/personal/Drafts")
417 (mu4e-trash-folder . "/personal/Trash")
418 (mu4e-refile-folder . "/personal/Archive")
419 (user-mail-address . "me@armaanb.net")
420 (smtpmail-smtp-user . "me@armaanb.net")
421 (smtpmail-smtp-server "smtp.mailbox.org")
422 (mu4e-drafts-folder . "/school/Drafts")
423 (mu4e-trash-folder . "/school/Trash")))))
424 (add-to-list 'mu4e-bookmarks
425 '(:name "Unified inbox"
426 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
428 :hook ((mu4e-compose-mode . flyspell-mode)
429 (mu4e-view-mode-hook . turn-on-visual-line-mode)))
432 #+begin_src emacs-lisp
434 (use-package calfw-org)
435 (use-package calfw-ical)
437 (defun acheam-calendar ()
440 (shell-command "vdirsyncer sync")
441 (let ((default-directory "~/.local/share/vdirsyncer/"))
442 (cfw:open-calendar-buffer
445 (cfw:ical-create-source "School" (expand-file-name "school/abhojwani22@nobles.edu.ics") "Green")
446 (cfw:ical-create-source "Personal" (expand-file-name "mailbox/Y2FsOi8vMC8zMQ.ics") "Blue")
447 (cfw:ical-create-source "Birthdays" (expand-file-name "mailbox/Y2FsOi8vMS8w.ics") "Gray")
451 Another file has more specific network configuration.
452 #+begin_src emacs-lisp
454 :config (load-file "~/.emacs.d/irc.el"))
456 (use-package circe-chanop
457 :straight (:type built-in)
460 (use-package circe-color-nicks
461 :straight (:type built-in)
465 Set EWW as default browser except for videos.
466 #+begin_src emacs-lisp
467 (defun browse-url-mpv (url &optional new-window)
469 (start-process "mpv" "*mpv*" "mpv" url))
471 (setq browse-url-handlers
473 (("youtu\\.?be" . browse-url-mpv)
474 ("." . eww-browse-url)
478 Some EWW enhancements.
479 *** Give buffer a useful name
480 #+begin_src emacs-lisp
481 ;; From https://protesilaos.com/dotemacs/
482 (defun prot-eww--rename-buffer ()
483 "Rename EWW buffer using page title or URL.
484 To be used by `eww-after-render-hook'."
485 (let ((name (if (eq "" (plist-get eww-data :title))
486 (plist-get eww-data :url)
487 (plist-get eww-data :title))))
488 (rename-buffer (format "*%s # eww*" name) t)))
490 (add-hook 'eww-after-render-hook #'prot-eww--rename-buffer)
492 *** Better entrypoint
493 #+begin_src emacs-lisp
494 ;; From https://protesilaos.com/dotemacs/
495 (defun prot-eww-browse-dwim (url &optional arg)
496 "Visit a URL, maybe from `eww-prompt-history', with completion.
498 With optional prefix ARG (\\[universal-argument]) open URL in a
501 If URL does not look like a valid link, run a web query using
504 When called from an eww buffer, provide the current link as
508 (completing-read "Query:" eww-prompt-history
509 nil nil (plist-get eww-data :url) 'eww-prompt-history)
511 (eww url (if arg 4 nil)))
513 (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
516 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to
517 =emacsclient --eval "(emacs-everywhere)"=.
518 #+begin_src emacs-lisp
519 (use-package emacs-everywhere)
522 #+begin_src emacs-lisp
523 (setq eshell-prompt-function
526 "\n" (eshell/pwd) " ➤ ")
527 'face '(:foreground "cyan")))
528 eshell-highlight-prompt nil)
532 #+begin_src emacs-lisp
534 :hook (python-mode . blacken-mode)
536 (setq blacken-line-length 79))
539 (use-package ws-butler
541 (ws-butler-global-mode))
544 #+begin_src emacs-lisp
545 (use-package flycheck
547 (global-flycheck-mode))
549 ** Project management
550 #+begin_src emacs-lisp
551 (use-package projectile
552 :config (projectile-mode)
553 :custom ((projectile-completion-system 'ivy))
555 ("C-c p" . projectile-command-map)
557 (when (file-directory-p "~/Code")
558 (setq projectile-project-search-path '("~/Code")))
559 (setq projectile-switch-project-action #'projectile-dired))
561 (use-package counsel-projectile
563 :config (counsel-projectile-mode))
566 #+begin_src emacs-lisp
568 :straight (:type built-in)
569 :commands (dired dired-jump)
570 :custom ((dired-listing-switches "-agho --group-directories-first"))
572 (evil-collection-define-key 'normal 'dired-mode-map
573 "h" 'dired-single-up-directory
574 "l" 'dired-single-buffer))
576 (use-package dired-single
577 :commands (dired dired-jump))
579 (use-package dired-open
580 :commands (dired dired-jump)
582 (dired-open-extensions '(("png" . "feh")
585 (use-package dired-hide-dotfiles
586 :hook (dired-mode . dired-hide-dotfiles-mode)
588 (evil-collection-define-key 'normal 'dired-mode-map
589 "H" 'dired-hide-dotfiles-mode))
593 # TODO: Write a command that commits hunk, skipping staging step.
594 #+begin_src emacs-lisp
597 *** Colored diff in line number area
598 #+begin_src emacs-lisp
600 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
601 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
602 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
603 :config (global-diff-hl-mode))
605 * General text editing
607 Indent after every change.
608 #+begin_src emacs-lisp
609 (use-package aggressive-indent
610 :config (global-aggressive-indent-mode))
613 Spell check in text mode, and in prog-mode comments.
614 #+begin_src emacs-lisp
615 (dolist (hook '(text-mode-hook))
616 (add-hook hook (lambda () (flyspell-mode))))
617 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
618 (add-hook hook (lambda () (flyspell-mode -1))))
619 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
621 ** Expand tabs to spaces
622 #+begin_src emacs-lisp
623 (setq-default tab-width 2)
625 ** Copy kill ring to clipboard
626 #+begin_src emacs-lisp
627 (setq x-select-enable-clipboard t)
628 (defun copy-kill-ring-to-xorg ()
629 "Copy the current kill ring to the xorg clipboard."
631 (x-select-text (current-kill 0)))
634 #+begin_src emacs-lisp
635 (use-package browse-kill-ring)
638 Opens file where you left it.
639 #+begin_src emacs-lisp
643 Distraction free writing a la junegunn/goyo.
644 #+begin_src emacs-lisp
645 (use-package olivetti
647 (evil-leader/set-key "o" 'olivetti-mode))
651 #+begin_src emacs-lisp
652 (setq abbrev-file-name "~/.emacs.d/abbrevs")
653 (setq save-abbrevs 'silent)
654 (setq-default abbrev-mode t)
657 #+begin_src emacs-lisp
658 (setq tramp-default-method "ssh")
660 ** Don't ask about following symlinks in vc
661 #+begin_src emacs-lisp
662 (setq vc-follow-symlinks t)
665 ** Easily convert splits
666 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
667 #+begin_src emacs-lisp
668 (defun toggle-window-split ()
670 (if (= (count-windows) 2)
671 (let* ((this-win-buffer (window-buffer))
672 (next-win-buffer (window-buffer (next-window)))
673 (this-win-edges (window-edges (selected-window)))
674 (next-win-edges (window-edges (next-window)))
675 (this-win-2nd (not (and (<= (car this-win-edges)
676 (car next-win-edges))
677 (<= (cadr this-win-edges)
678 (cadr next-win-edges)))))
680 (if (= (car this-win-edges)
681 (car (window-edges (next-window))))
682 'split-window-horizontally
683 'split-window-vertically)))
684 (delete-other-windows)
685 (let ((first-win (selected-window)))
687 (if this-win-2nd (other-window 1))
688 (set-window-buffer (selected-window) this-win-buffer)
689 (set-window-buffer (next-window) next-win-buffer)
690 (select-window first-win)
691 (if this-win-2nd (other-window 1))))))
693 (define-key ctl-x-4-map "t" 'toggle-window-split)
696 #+begin_src emacs-lisp
697 (defun insert-date ()
699 (insert (format-time-string "%Y-%m-%d")))
703 #+begin_src emacs-lisp
704 (use-package ace-window
705 :bind ("M-o" . ace-window))
707 ** Kill current buffer
708 Makes "C-x k" binding faster.
709 #+begin_src emacs-lisp
710 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
714 Render OpenSCAD files, and add a preview window.
716 Personal fork just merges a PR.
717 #+begin_src emacs-lisp
718 (use-package scad-mode)
719 (use-package scad-preview
720 :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
722 ** Control backup files
723 Stop backup files from spewing everywhere.
724 #+begin_src emacs-lisp
725 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
727 ** Make yes/no easier
728 #+begin_src emacs-lisp
729 (defalias 'yes-or-no-p 'y-or-n-p)
731 ** Move customize file
732 No more clogging up init.el.
733 #+begin_src emacs-lisp
734 (setq custom-file "~/.emacs.d/custom.el")
738 #+begin_src emacs-lisp
740 :commands (helpful-callable helpful-variable helpful-command helpful-key)
742 (counsel-describe-function-function #'helpful-callable)
743 (counsel-describe-variable-function #'helpful-variable)
745 ([remap describe-function] . counsel-describe-function)
746 ([remap describe-command] . helpful-command)
747 ([remap describe-variable] . counsel-describe-variable)
748 ([remap describe-key] . helpful-key))
751 #+begin_src emacs-lisp
752 (use-package epa-file
753 :straight (:type built-in)
755 (epa-file-select-keys nil)
756 (epa-file-encrypt-to '("me@armaanb.net"))
757 (password-cache-expiry (* 60 15)))
759 (use-package pinentry
760 :config (pinentry-start))
763 #+begin_src emacs-lisp
765 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
766 :custom (0x0-default-service 'envs)
767 :config (evil-leader/set-key
769 "0f" '0x0-upload-file
770 "0s" '0x0-upload-string
771 "0c" '0x0-upload-kill-ring
772 "0p" '0x0-upload-popup))
777 #+begin_src conf :tangle ~/.spectrwm.conf
782 autorun = ws[1]:/home/armaa/Code/scripts/autostart
785 #+begin_src conf :tangle ~/.spectrwm.conf
786 color_focus = rgb:ff/ff/ff
787 color_focus_maximized = rgb:ee/cc/00
788 color_unfocus = rgb:55/55/55
791 #+begin_src conf :tangle ~/.spectrwm.conf
793 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
797 #+begin_src conf :tangle ~/.spectrwm.conf
798 program[lock] = i3lock -c 000000 -ef
799 program[term] = alacritty
800 program[screenshot_all] = flameshot gui
801 program[menu] = rofi -show run # `rofi-dmenu` handles the rest
802 program[switcher] = rofi -show window
803 program[notif] = /home/armaa/Code/scripts/setter status
806 bind[switcher] = MOD+Tab
809 #+begin_src conf :tangle ~/.spectrwm.conf
810 program[paup] = /home/armaa/Code/scripts/setter audio +5
811 program[padown] = /home/armaa/Code/scripts/setter audio -5
812 program[pamute] = /home/armaa/Code/scripts/setter audio
813 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
814 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
815 program[next] = playerctl next
816 program[prev] = playerctl previous
817 program[pause] = playerctl play-pause
819 bind[padown] = XF86AudioLowerVolume
820 bind[paup] = XF86AudioRaiseVolume
821 bind[pamute] = XF86AudioMute
822 bind[brigdown] = XF86MonBrightnessDown
823 bind[brigup] = XF86MonBrightnessUp
824 bind[pause] = XF86AudioPlay
825 bind[next] = XF86AudioNext
826 bind[prev] = XF86AudioPrev
829 #+begin_src conf :tangle ~/.spectrwm.conf
830 program[h] = xdotool keyup h key --clearmodifiers Left
831 program[j] = xdotool keyup j key --clearmodifiers Down
832 program[k] = xdotool keyup k key --clearmodifiers Up
833 program[l] = xdotool keyup l key --clearmodifiers Right
835 bind[h] = MOD + Control + h
836 bind[j] = MOD + Control + j
837 bind[k] = MOD + Control + k
838 bind[l] = MOD + Control + l
841 #+begin_src conf :tangle ~/.spectrwm.conf
842 program[aerc] = alacritty -e aerc
843 program[catgirl] = alacritty --hold -e sh -c "while : ; do ssh root@armaanb.net -t abduco -A irc catgirl freenode; sleep 2; done"
844 program[emacs] = emacsclient -c
845 program[firefox] = firefox
846 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
848 bind[aerc] = MOD+Control+1
849 bind[catgirl] = MOD+Control+2
850 bind[firefox] = MOD+Control+3
851 bind[emacs-anywhere] = MOD+Control+4
852 bind[emacs] = MOD+Control+Return
857 #+begin_src shell :tangle ~/.config/zsh/zshrc
858 autoload -Uz compinit
862 unsetopt glob_complete
865 #+begin_src shell :tangle ~/.config/zsh/zshrc
869 bindkey -M vicmd "^[[3~" delete-char
870 bindkey "^[[3~" delete-char
872 autoload edit-command-line
873 zle -N edit-command-line
874 bindkey -M vicmd ^e edit-command-line
875 bindkey ^e edit-command-line
878 #+begin_src shell :tangle ~/.config/zsh/zshrc
879 setopt extended_history
881 setopt inc_append_history
882 setopt hist_ignore_dups
883 setopt hist_reduce_blanks
887 HISTFILE=~/.local/share/zsh/history
890 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
892 #+begin_src conf :tangle ~/.config/zpe/repositories
893 https://github.com/Aloxaf/fzf-tab
894 https://github.com/zdharma/fast-syntax-highlighting
895 https://github.com/rupa/z
898 #+begin_src shell :tangle ~/.config/zsh/zshrc
899 source ~/Code/zpe/zpe.sh
900 source ~/Code/admone/admone.zsh
901 source ~/.config/zsh/fzf-bindings.zsh
903 zpe-source fzf-tab/fzf-tab.zsh
904 zstyle ':completion:*:descriptions' format '[%d]'
905 zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
906 zstyle ':completion:*' completer _complete
907 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' \
908 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
910 zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
911 export _Z_DATA="/home/armaa/.local/share/z"
915 **** Alert after long command
916 #+begin_src shell :tangle ~/.config/zsh/zshrc
918 notify-send --urgency=low -i ${(%):-%(?.terminal.error)} \
919 ${history[$HISTCMD]%[;&|][[:space:]]##alert}
922 **** Time Zsh startup
923 #+begin_src shell :tangle ~/.config/zsh/zshrc
925 for i in $(seq 1 10); do
926 time "zsh" -i -c exit;
930 **** Update all packages
931 #+begin_src shell :tangle ~/.config/zsh/zshrc
932 color=$(tput setaf 5)
936 sudo echo "${color}== upgrading with yay ==${reset}"
939 echo "${color}== checking for pacnew files ==${reset}"
942 echo "${color}== upgrading flatpaks ==${reset}"
945 echo "${color}== upgrading zsh plugins ==${reset}"
948 echo "${color}== updating nvim plugins ==${reset}"
949 nvim +PlugUpdate +PlugUpgrade +qall
950 echo "Updated nvim plugins"
952 echo "${color}You are entirely up to date!${reset}"
955 **** Clean all packages
956 #+begin_src shell :tangle ~/.config/zsh/zshrc
958 sudo echo "${color}== cleaning pacman orphans ==${reset}"
959 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
961 echo "${color}== cleaning flatpaks ==${reset}"
962 flatpak remove --unused
964 echo "${color}== cleaning zsh plugins ==${reset}"
967 echo "${color}== cleaning nvim plugins ==${reset}"
968 nvim +PlugClean +qall
969 echo "Cleaned nvim plugins"
971 echo "${color}All orphans cleaned!${reset}"
975 #+begin_src shell :tangle ~/.config/zsh/zshrc
978 exa -lh --icons --git --group-directories-first
981 **** Change default enter behavior
982 If no command given, =ls=, if in a Git repo, =git status= as well.
983 #+begin_src shell :tangle ~/.config/zsh/zshrc
984 acheam-accept-line () {
986 if [ ${#${(z)BUFFER}} -eq 0 ]; then
988 exa -lh --icons --git --group-directories-first
989 [ -d ".git" ] && git status
992 zle -N acheam-accept-line
993 bindkey '^M' acheam-accept-line
996 #+begin_src shell :tangle ~/.config/zsh/zshrc
998 __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
999 if [ $? -eq 0 ]; then
1000 eval "$__conda_setup"
1002 if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
1003 . "/opt/anaconda/etc/profile.d/conda.sh"
1005 export PATH="/opt/anaconda/bin:$PATH"
1011 **** Interact with 0x0
1012 #+begin_src shell :tangle ~/.config/zsh/zshrc
1013 zxz="https://envs.sh"
1014 0file() { curl -F"file=@$1" "$zxz" ; }
1015 0pb() { curl -F"file=@-;" "$zxz" ; }
1016 0url() { curl -F"url=$1" "$zxz" ; }
1017 0short() { curl -F"shorten=$1" "$zxz" ; }
1018 0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
1021 #+begin_src shell :tangle ~/.config/zsh/zshrc
1029 #+begin_src shell :tangle ~/.config/zsh/zshrc
1031 user=$(echo "$1" | cut -f 1 -d '@')
1032 host=$(echo "$1" | cut -f 2 -d '@')
1033 echo $user | nc "$host" 79 -N
1038 #+begin_src shell :tangle ~/.config/zsh/zshrc
1039 alias bhoji-drop='ssh -p 23 root@armaanb.net'
1040 alias catgirl='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
1041 alias union='ssh 192.168.1.18'
1042 alias tcf='ssh root@204.48.23.68'
1043 alias ngmun='ssh root@157.245.89.25'
1044 alias prox='ssh root@192.168.1.224'
1045 alias ncq='ssh root@143.198.123.17'
1046 alias dock='ssh root@192.168.1.225'
1047 alias jenkins='ssh root@192.168.1.226'
1048 alias envs='ssh acheam@envs.net'
1050 **** File management
1051 #+begin_src shell :tangle ~/.config/zsh/zshrc
1052 alias ls='exa -lh --icons --git --group-directories-first'
1053 alias la='exa -lha --icons --git --group-directories-first'
1054 alias df='df -h / /boot'
1056 alias free='free -h'
1061 alias grep='grep -in --exclude-dir=.git --color=auto'
1062 alias fname='find -name'
1063 alias mkdir='mkdir -pv'
1064 alias unar='atool -x'
1065 alias wget='wget -e robots=off'
1066 alias lanex='~/.local/share/lxc/lxc'
1069 #+begin_src shell :tangle ~/.config/zsh/zshrc
1070 alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1071 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1073 alias padu='padm add -u && padm commit && padm push && yadu'
1076 #+begin_src shell :tangle ~/.config/zsh/zshrc
1079 alias vw="nvim ~/Documents/vimwiki/index.md"
1081 **** System management
1082 #+begin_src shell :tangle ~/.config/zsh/zshrc
1083 alias jctl='journalctl -p 3 -xb'
1084 alias pkill='pkill -i'
1086 alias redoas='doas $(fc -ln -1)'
1087 alias crontab='crontab-argh'
1088 alias sudo='doas ' # allows aliases to be run with doas
1091 #+begin_src shell :tangle ~/.config/zsh/zshrc
1092 alias ping='ping -c 10'
1093 alias speed='speedtest-cli'
1094 alias ip='ip --color=auto'
1095 alias cip='curl https://armaanb.net/ip'
1096 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1097 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1098 alias plan='T=$(mktemp) && \
1099 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
1101 head -n -2 $T > $TT && \
1103 echo "\nLast updated: $(date -R)" >> "$TT" && \
1104 rsync "$TT" root@armaanb.net:/etc/finger/plan.txt'
1105 alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
1108 #+begin_src shell :tangle ~/.config/zsh/zshrc
1109 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1110 iflag=fullblock status=progress'
1111 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1112 iflag=fullblock status=progress'
1113 alias ts='gen-shell -c task'
1114 alias ts='gen-shell -c task'
1115 alias tetris='autoload -Uz tetriscurses && tetriscurses'
1116 alias news='newsboat'
1117 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1118 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
1119 --restrict-filenames -o '%(title)s.%(ext)s'"
1120 alias cal="cal -3 --color=auto"
1122 **** Virtual machines, chroots
1123 #+begin_src shell :tangle ~/.config/zsh/zshrc
1124 alias ckiss="sudo chrooter ~/Virtual/kiss"
1125 alias cdebian="sudo chrooter ~/Virtual/debian bash"
1126 alias cwindows='devour qemu-system-x86_64 \
1131 -device VGA,vgamem_mb=64 \
1133 -device hda-duplex \
1135 -net user,smb=/home/armaa/Public \
1136 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1139 #+begin_src shell :tangle ~/.config/zsh/zshrc
1141 alias zpy="zconda && ipython"
1142 alias math="ipython --profile=math"
1143 alias pypi="python setup.py sdist && twine upload dist/*"
1144 alias pip="python -m pip"
1145 alias black="black -l 79"
1148 #+begin_src shell :tangle ~/.config/zsh/zshrc
1149 alias words='gen-shell -c "words"'
1150 alias words-e='gen-shell -c "words ~E"'
1153 #+begin_src shell :tangle ~/.config/zsh/zshrc
1154 alias zathura='devour zathura'
1155 alias mpv='devour mpv'
1156 alias sql='devour sqlitebrowser'
1157 alias cad='devour openscad'
1158 alias feh='devour feh'
1160 **** Package management (Pacman)
1161 #+begin_src shell :tangle ~/.config/zsh/zshrc
1163 alias api='yay -Syu'
1164 alias apii='sudo pacman -S'
1165 alias app='yay -Rns'
1167 alias apo='yay -Qttd'
1168 alias azf='pacman -Q | fzf'
1169 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1170 alias ufetch='ufetch-arch'
1171 alias reflect='reflector --verbose --sort rate --save \
1172 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1174 **** Package management (KISS)
1175 #+begin_src shell :tangle ~/.config/zsh/zshrc
1176 alias kzf="kiss s \* | xargs -l basename | \
1177 fzf --preview 'kiss search {} | xargs -l dirname'"
1180 #+begin_src shell :tangle ~/.config/zsh/zshrc
1181 export EDITOR="emacsclient -c"
1182 export VISUAL="$EDITOR"
1183 export TERM=xterm-256color # for compatability
1185 export GPG_TTY="$(tty)"
1186 export MANPAGER='nvim +Man!'
1189 export GTK_USE_PORTAL=1
1191 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1192 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
1193 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
1194 export PATH="$PATH:/home/armaa/.cargo/bin"
1195 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1196 export PATH="$PATH:/usr/sbin"
1197 export PATH="$PATH:/opt/FreeTube/freetube"
1199 export LC_ALL="en_US.UTF-8"
1200 export LC_CTYPE="en_US.UTF-8"
1201 export LANGUAGE="en_US.UTF-8"
1203 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
1204 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1205 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1206 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1207 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1208 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1212 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1215 family: JetBrains Mono Nerd Font
1222 ligatures: true # Requires ligature patch
1229 background_opacity: 1
1232 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1233 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1237 background: '#000000'
1238 foreground: '#ffffff'
1242 background: '#ffffff'
1244 # Normal colors (except green it is from intense colors)
1255 # Bright colors [all the faint colors in the modus theme]
1266 # dim [all the intense colors in modus theme]
1279 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1280 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1281 c.TerminalInteractiveShell.editing_mode = 'vi'
1282 c.InteractiveShell.colors = 'linux'
1283 c.TerminalInteractiveShell.confirm_exit = False
1286 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1290 return x * (180 / pi)
1293 return x * (pi / 180)
1296 return (x * (pi / 180)) / unit
1308 Make MPV play a little bit smoother.
1309 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1310 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1314 For any GNU Readline programs
1315 #+begin_src conf :tangle ~/.inputrc
1320 #+begin_src conf :tangle ~/.gitconfig
1322 name = Armaan Bhojwani
1323 email = me@armaanb.net
1324 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1327 #+begin_src conf :tangle ~/.gitconfig
1329 defaultBranch = main
1332 #+begin_src conf :tangle ~/.gitconfig
1337 #+begin_src conf :tangle ~/.gitconfig
1339 smtpserver = smtp.mailbox.org
1340 smtpuser = me@armaanb.net
1341 smtpencryption = ssl
1342 smtpserverport = 465
1346 #+begin_src conf :tangle ~/.gitconfig
1351 #+begin_src conf :tangle ~/.gitconfig
1354 sclone = clone --depth 1
1360 subup = submodule update --remote
1361 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1362 mirror = git config --global alias.mirrormirror
1365 #+begin_src conf :tangle ~/.gitconfig
1371 Lightweight notification daemon.
1373 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1375 font = "JetBrains Mono Medium Nerd Font 11"
1377 format = "<b>%s</b>\n%b"
1379 indicate_hidden = yes
1382 show_age_threshold = 60
1385 geometry = "400x5-10+10"
1387 idle_threshold = 120
1389 sticky_history = yes
1391 separator_height = 4
1393 horizontal_padding = 8
1395 separator_color = "#ffffff"
1396 startup_notification = false
1399 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1406 close_all = mod4+shift+c
1407 history = mod4+ctrl+c
1410 background = "#222222"
1411 foreground = "#ffffff"
1412 highlight = "#ffffff"
1416 background = "#222222"
1417 foreground = "#ffffff"
1418 highlight = "#ffffff"
1422 background = "#222222"
1423 foreground = "#a60000"
1424 highlight = "#ffffff"
1428 Modus vivendi theme that extends DarkBlue.
1429 #+begin_src javascript :tangle ~/.config/rofi/config.rasi
1430 @import "/usr/share/rofi/themes/DarkBlue.rasi"
1432 white: rgba ( 255, 255, 255, 100 % );
1434 selected-normal-background: @white;
1435 separatorcolor: @white;
1436 background: rgba ( 34, 34, 34, 100 % );
1445 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1447 map <A-b> toggle_statusbar
1448 set selection-clipboard clipboard
1451 set window-title-basename "true"
1452 set selection-clipboard "clipboard"
1455 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1456 set default-bg "#000000"
1457 set default-fg "#ffffff"
1458 set render-loading true
1459 set render-loading-bg "#000000"
1460 set render-loading-fg "#ffffff"
1462 set recolor-lightcolor "#000000" # bg
1463 set recolor-darkcolor "#ffffff" # fg