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 'grayscale
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 (evil-set-undo-system 'undo-tree)
227 ** Number incrementing
229 #+begin_src emacs-lisp
230 (use-package evil-numbers
231 :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
232 :bind (:map evil-normal-state-map
233 ("C-M-a" . evil-numbers/inc-at-pt)
234 ("C-M-x" . evil-numbers/dec-at-pt)))
238 #+begin_src emacs-lisp
239 (use-package evil-org
241 :hook (org-mode . evil-org-mode)
243 (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
244 (use-package evil-org-agenda
245 :straight (:type built-in)
248 (evil-org-agenda-set-keys))
251 #+begin_src emacs-lisp
252 (evil-leader/set-key-for-mode 'org-mode
253 "T" 'org-show-todo-tree
255 "c" 'org-archive-subtree)
259 #+begin_src emacs-lisp
261 :straight (:type built-in)
262 :commands (org-capture org-agenda)
265 (org-agenda-start-with-log-mode t)
266 (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
268 (org-log-into-drawer t)
269 (org-src-tab-acts-natively t)
270 (org-src-fontify-natively t)
271 (org-startup-indented t)
272 (org-hide-emphasis-markers t)
273 (org-fontify-whole-block-delimiter-line nil)
274 :bind ("C-c a" . org-agenda))
277 #+begin_src emacs-lisp
278 (use-package org-tempo
280 :straight (:type built-in)
282 ;; TODO: There's gotta be a more efficient way to write this
283 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
284 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
285 (add-to-list 'org-structure-template-alist '("zsh" . "src shell :tangle ~/.config/zsh/zshrc"))
286 (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
287 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
288 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
289 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
290 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
291 (add-to-list 'org-structure-template-alist '("ro" . "src plain :tangle ~/.config/rofi/config.rasi")))
295 Simple, but not too simple autocompletion.
296 #+begin_src emacs-lisp
298 :bind (("C-s" . swiper)
299 :map ivy-minibuffer-map
300 ("TAB" . ivy-alt-done)
301 :map ivy-switch-buffer-map
302 ("M-d" . ivy-switch-buffer-kill))
306 #+begin_src emacs-lisp
307 (use-package ivy-rich
309 :config (ivy-rich-mode))
313 #+begin_src emacs-lisp
315 :bind (("C-M-j" . 'counsel-switch-buffer)
316 :map minibuffer-local-map
317 ("C-r" . 'counsel-minibuffer-history))
318 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
319 :config (counsel-mode))
321 ** Remember frequent commands
322 #+begin_src emacs-lisp
323 (use-package ivy-prescient
326 (ivy-prescient-enable-filtering nil)
328 (prescient-persist-mode)
329 (ivy-prescient-mode))
332 Better search utility.
333 #+begin_src emacs-lisp
338 Use elfeed for RSS. I have another file with all the feeds in it.
339 #+begin_src emacs-lisp
341 :bind (("C-c e" . elfeed))
343 (load "~/.emacs.d/feeds.el")
344 (add-hook 'elfeed-new-entry-hook
345 (elfeed-make-tagger :feed-url "youtube\\.com"
347 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
349 (use-package elfeed-goodies
351 :config (elfeed-goodies/setup))
354 Use mu4e for reading emails.
356 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.
358 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.
359 #+begin_src emacs-lisp
360 (use-package smtpmail
361 :straight (:type built-in))
363 :load-path "/usr/share/emacs/site-lisp/mu4e"
364 :bind (("C-c m" . mu4e))
366 (setq user-full-name "Armaan Bhojwani"
367 smtpmail-local-domain "armaanb.net"
368 smtpmail-stream-type 'ssl
369 smtpmail-smtp-service '465
370 mu4e-change-filenames-when-moving t
371 mu4e-get-mail-command "offlineimap -q"
372 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
373 message-citation-line-function 'message-insert-formatted-citation-line
374 mu4e-completing-read-function 'ivy-completing-read
375 mu4e-confirm-quit nil
376 mail-user-agent 'mu4e-user-agent
378 `( ,(make-mu4e-context
380 :enter-func (lambda () (mu4e-message "Entering school context"))
381 :leave-func (lambda () (mu4e-message "Leaving school context"))
382 :match-func (lambda (msg)
384 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
385 :vars '((user-mail-address . "abhojwani22@nobles.edu")
386 (mu4e-sent-folder . "/school/Sent")
387 (mu4e-drafts-folder . "/school/Drafts")
388 (mu4e-trash-folder . "/school/Trash")
389 (mu4e-refile-folder . "/school/Archive")
390 (user-mail-address . "abhojwani22@nobles.edu")
391 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
392 (smtpmail-smtp-server . "smtp.gmail.com")))
395 :enter-func (lambda () (mu4e-message "Entering personal context"))
396 :leave-func (lambda () (mu4e-message "Leaving personal context"))
397 :match-func (lambda (msg)
399 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
400 :vars '((mu4e-sent-folder . "/personal/Sent")
401 (mu4e-drafts-folder . "/personal/Drafts")
402 (mu4e-trash-folder . "/personal/Trash")
403 (mu4e-refile-folder . "/personal/Archive")
404 (user-mail-address . "me@armaanb.net")
405 (smtpmail-smtp-user . "me@armaanb.net")
406 (smtpmail-smtp-server "smtp.mailbox.org")
407 (mu4e-drafts-folder . "/school/Drafts")
408 (mu4e-trash-folder . "/school/Trash")))))
409 (add-to-list 'mu4e-bookmarks
410 '(:name "Unified inbox"
411 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
413 :hook ((mu4e-compose-mode . flyspell-mode)
414 (mu4e-view-mode-hook . turn-on-visual-line-mode)))
417 #+begin_src emacs-lisp
419 (use-package calfw-org)
420 (use-package calfw-ical)
422 (defun acheam-calendar ()
425 (shell-command "vdirsyncer sync")
426 (let ((default-directory "~/.local/share/vdirsyncer/"))
427 (cfw:open-calendar-buffer
430 (cfw:ical-create-source "School" (expand-file-name "school/abhojwani22@nobles.edu.ics") "Green")
431 (cfw:ical-create-source "Personal" (expand-file-name "mailbox/Y2FsOi8vMC8zMQ.ics") "Blue")
432 (cfw:ical-create-source "Birthdays" (expand-file-name "mailbox/Y2FsOi8vMS8w.ics") "Gray")
436 Another file has more specific network configuration.
437 #+begin_src emacs-lisp
439 :config (load-file "~/.emacs.d/irc.el"))
441 (use-package circe-chanop
442 :straight (:type built-in)
445 (use-package circe-color-nicks
446 :straight (:type built-in)
450 Set EWW as default browser except for videos.
451 #+begin_src emacs-lisp
452 (defun browse-url-mpv (url &optional new-window)
454 (start-process "mpv" "*mpv*" "mpv" url))
456 (setq browse-url-handlers
458 (("youtu\\.?be" . browse-url-mpv)
459 ("." . eww-browse-url)
463 Some EWW enhancements.
464 *** Give buffer a useful name
465 #+begin_src emacs-lisp
466 ;; From https://protesilaos.com/dotemacs/
467 (defun prot-eww--rename-buffer ()
468 "Rename EWW buffer using page title or URL.
469 To be used by `eww-after-render-hook'."
470 (let ((name (if (eq "" (plist-get eww-data :title))
471 (plist-get eww-data :url)
472 (plist-get eww-data :title))))
473 (rename-buffer (format "*%s # eww*" name) t)))
475 (add-hook 'eww-after-render-hook #'prot-eww--rename-buffer)
477 *** Better entrypoint
478 #+begin_src emacs-lisp
479 ;; From https://protesilaos.com/dotemacs/
480 (defun prot-eww-browse-dwim (url &optional arg)
481 "Visit a URL, maybe from `eww-prompt-history', with completion.
483 With optional prefix ARG (\\[universal-argument]) open URL in a
486 If URL does not look like a valid link, run a web query using
489 When called from an eww buffer, provide the current link as
493 (completing-read "Query:" eww-prompt-history
494 nil nil (plist-get eww-data :url) 'eww-prompt-history)
496 (eww url (if arg 4 nil)))
498 (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
501 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to
502 =emacsclient --eval "(emacs-everywhere)"=.
503 #+begin_src emacs-lisp
504 (use-package emacs-everywhere)
509 #+begin_src emacs-lisp
510 (use-package lsp-mode
511 :commands (lsp lsp-deferred)
512 :custom (lsp-keymap-prefix "C-c l")
513 :hook ((lsp-mode . lsp-enable-which-key-integration)))
515 (use-package lsp-ivy)
518 :commands lsp-ui-mode
519 :custom (lsp-ui-doc-position 'bottom))
520 (use-package lsp-ui-flycheck
522 :straight (:type built-in))
525 Company-box adds icons.
526 #+begin_src emacs-lisp
529 :hook (lsp-mode . company-mode)
530 :bind (:map company-active-map
531 ("<tab>" . company-complete-selection))
533 ("<tab>" . company-indent-or-complete-common))
535 (company-minimum-prefix-length 1)
536 (setq company-dabbrev-downcase 0)
537 (company-idle-delay 0.0))
539 (use-package company-box
540 :hook (company-mode . company-box-mode))
544 #+begin_src emacs-lisp
545 (use-package lsp-pyright
546 :hook (python-mode . (lambda ()
547 (use-package lsp-pyright
548 :straight (:type built-in))
552 #+begin_src emacs-lisp
554 :hook (python-mode . blacken-mode)
556 (setq blacken-line-length 79))
559 (use-package ws-butler
561 (ws-butler-global-mode))
564 #+begin_src emacs-lisp
565 (use-package flycheck
567 (global-flycheck-mode))
569 ** Project management
570 #+begin_src emacs-lisp
571 (use-package projectile
572 :config (projectile-mode)
573 :custom ((projectile-completion-system 'ivy))
575 ("C-c p" . projectile-command-map)
577 (when (file-directory-p "~/Code")
578 (setq projectile-project-search-path '("~/Code")))
579 (setq projectile-switch-project-action #'projectile-dired))
581 (use-package counsel-projectile
583 :config (counsel-projectile-mode))
586 #+begin_src emacs-lisp
588 :straight (:type built-in)
589 :commands (dired dired-jump)
590 :custom ((dired-listing-switches "-agho --group-directories-first"))
592 (evil-collection-define-key 'normal 'dired-mode-map
593 "h" 'dired-single-up-directory
594 "l" 'dired-single-buffer))
596 (use-package dired-single
597 :commands (dired dired-jump))
599 (use-package dired-open
600 :commands (dired dired-jump)
602 (dired-open-extensions '(("png" . "feh")
605 (use-package dired-hide-dotfiles
606 :hook (dired-mode . dired-hide-dotfiles-mode)
608 (evil-collection-define-key 'normal 'dired-mode-map
609 "H" 'dired-hide-dotfiles-mode))
613 # TODO: Write a command that commits hunk, skipping staging step.
614 #+begin_src emacs-lisp
617 *** Colored diff in line number area
618 #+begin_src emacs-lisp
620 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
621 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
622 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
623 :config (global-diff-hl-mode))
625 * General text editing
627 Indent after every change.
628 #+begin_src emacs-lisp
629 (use-package aggressive-indent
630 :config (global-aggressive-indent-mode))
633 Spell check in text mode, and in prog-mode comments.
634 #+begin_src emacs-lisp
635 (dolist (hook '(text-mode-hook))
636 (add-hook hook (lambda () (flyspell-mode))))
637 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
638 (add-hook hook (lambda () (flyspell-mode -1))))
639 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
641 ** Expand tabs to spaces
642 #+begin_src emacs-lisp
643 (setq-default tab-width 2)
645 ** Copy kill ring to clipboard
646 #+begin_src emacs-lisp
647 (setq x-select-enable-clipboard t)
648 (defun copy-kill-ring-to-xorg ()
649 "Copy the current kill ring to the xorg clipboard."
651 (x-select-text (current-kill 0)))
654 #+begin_src emacs-lisp
655 (use-package browse-kill-ring)
658 Opens file where you left it.
659 #+begin_src emacs-lisp
663 Distraction free writing a la junegunn/goyo.
664 #+begin_src emacs-lisp
665 (use-package olivetti
667 (evil-leader/set-key "o" 'olivetti-mode))
671 #+begin_src emacs-lisp
672 (setq abbrev-file-name "~/.emacs.d/abbrevs")
673 (setq save-abbrevs 'silent)
674 (setq-default abbrev-mode t)
677 #+begin_src emacs-lisp
678 (setq tramp-default-method "ssh")
680 ** Don't ask about following symlinks in vc
681 #+begin_src emacs-lisp
682 (setq vc-follow-symlinks t)
685 ** Easily convert splits
686 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
687 #+begin_src emacs-lisp
688 (defun toggle-window-split ()
690 (if (= (count-windows) 2)
691 (let* ((this-win-buffer (window-buffer))
692 (next-win-buffer (window-buffer (next-window)))
693 (this-win-edges (window-edges (selected-window)))
694 (next-win-edges (window-edges (next-window)))
695 (this-win-2nd (not (and (<= (car this-win-edges)
696 (car next-win-edges))
697 (<= (cadr this-win-edges)
698 (cadr next-win-edges)))))
700 (if (= (car this-win-edges)
701 (car (window-edges (next-window))))
702 'split-window-horizontally
703 'split-window-vertically)))
704 (delete-other-windows)
705 (let ((first-win (selected-window)))
707 (if this-win-2nd (other-window 1))
708 (set-window-buffer (selected-window) this-win-buffer)
709 (set-window-buffer (next-window) next-win-buffer)
710 (select-window first-win)
711 (if this-win-2nd (other-window 1))))))
713 (define-key ctl-x-4-map "t" 'toggle-window-split)
716 #+begin_src emacs-lisp
717 (defun insert-date ()
719 (insert (format-time-string "%Y-%m-%d")))
723 #+begin_src emacs-lisp
724 (use-package ace-window
725 :bind ("M-o" . ace-window))
727 ** Kill current buffer
728 Makes "C-x k" binding faster.
729 #+begin_src emacs-lisp
730 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
734 Render OpenSCAD files, and add a preview window.
736 Personal fork just merges a PR.
737 #+begin_src emacs-lisp
738 (use-package scad-mode)
739 (use-package scad-preview
740 :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
742 ** Control backup files
743 Stop backup files from spewing everywhere.
744 #+begin_src emacs-lisp
745 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
747 ** Make yes/no easier
748 #+begin_src emacs-lisp
749 (defalias 'yes-or-no-p 'y-or-n-p)
751 ** Move customize file
752 No more clogging up init.el.
753 #+begin_src emacs-lisp
754 (setq custom-file "~/.emacs.d/custom.el")
758 #+begin_src emacs-lisp
760 :commands (helpful-callable helpful-variable helpful-command helpful-key)
762 (counsel-describe-function-function #'helpful-callable)
763 (counsel-describe-variable-function #'helpful-variable)
765 ([remap describe-function] . counsel-describe-function)
766 ([remap describe-command] . helpful-command)
767 ([remap describe-variable] . counsel-describe-variable)
768 ([remap describe-key] . helpful-key))
771 #+begin_src emacs-lisp
772 (use-package epa-file
773 :straight (:type built-in)
775 (epa-file-select-keys nil)
776 (epa-file-encrypt-to '("me@armaanb.net"))
777 (password-cache-expiry (* 60 15)))
779 (use-package pinentry
780 :config (pinentry-start))
783 #+begin_src emacs-lisp
785 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
786 :custom (0x0-default-service 'envs)
787 :config (evil-leader/set-key
789 "0f" '0x0-upload-file
790 "0s" '0x0-upload-string
791 "0c" '0x0-upload-kill-ring
792 "0p" '0x0-upload-popup))
797 #+begin_src conf :tangle ~/.spectrwm.conf
802 autorun = ws[1]:/home/armaa/Code/scripts/autostart
805 #+begin_src conf :tangle ~/.spectrwm.conf
806 color_focus = rgb:00/d3/d0
807 color_focus_maximized = rgb:ee/cc/00
808 color_unfocus = rgb:55/55/55
811 #+begin_src conf :tangle ~/.spectrwm.conf
813 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
817 #+begin_src conf :tangle ~/.spectrwm.conf
818 program[lock] = i3lock -c 000000 -ef
819 program[term] = alacritty
820 program[screenshot_all] = flameshot gui
821 program[menu] = rofi -show run # `rofi-dmenu` handles the rest
822 program[switcher] = rofi -show window
823 program[notif] = /home/armaa/Code/scripts/setter status
826 bind[switcher] = MOD+Tab
829 #+begin_src conf :tangle ~/.spectrwm.conf
830 program[paup] = /home/armaa/Code/scripts/setter audio +5
831 program[padown] = /home/armaa/Code/scripts/setter audio -5
832 program[pamute] = /home/armaa/Code/scripts/setter audio
833 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
834 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
835 program[next] = playerctl next
836 program[prev] = playerctl previous
837 program[pause] = playerctl play-pause
839 bind[padown] = XF86AudioLowerVolume
840 bind[paup] = XF86AudioRaiseVolume
841 bind[pamute] = XF86AudioMute
842 bind[brigdown] = XF86MonBrightnessDown
843 bind[brigup] = XF86MonBrightnessUp
844 bind[pause] = XF86AudioPlay
845 bind[next] = XF86AudioNext
846 bind[prev] = XF86AudioPrev
849 #+begin_src conf :tangle ~/.spectrwm.conf
850 program[h] = xdotool keyup h key --clearmodifiers Left
851 program[j] = xdotool keyup j key --clearmodifiers Down
852 program[k] = xdotool keyup k key --clearmodifiers Up
853 program[l] = xdotool keyup l key --clearmodifiers Right
855 bind[h] = Mod1 + Tab + h
856 bind[j] = Mod1 + Tab + j
857 bind[k] = Mod1 + Tab + k
858 bind[l] = Mod1 + Tab + l
861 #+begin_src conf :tangle ~/.spectrwm.conf
862 program[aerc] = alacritty -e aerc
863 program[weechat] = alacritty --hold -e sh -c "while : ; do ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat; sleep 2; done"
864 program[emacs] = emacsclient -c
865 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
866 program[firefox] = firefox
867 program[thunderbird] = thunderbird
868 program[slack] = slack
870 bind[aerc] = MOD+Control+s
871 bind[weechat] = MOD+Control+d
872 bind[emacs] = MOD+Control+Return
873 bind[emacs-anywhere] = MOD+Control+f
874 bind[firefox] = MOD+Control+u
875 bind[thunderbird] = MOD+Control+i
876 bind[slack] = MOD+Control+o
881 #+begin_src shell :tangle ~/.config/zsh/zshrc
882 autoload -Uz compinit
886 unsetopt glob_complete
889 #+begin_src shell :tangle ~/.config/zsh/zshrc
893 bindkey -M vicmd "^[[3~" delete-char
894 bindkey "^[[3~" delete-char
896 autoload edit-command-line
897 zle -N edit-command-line
898 bindkey -M vicmd ^e edit-command-line
899 bindkey ^e edit-command-line
902 #+begin_src shell :tangle ~/.config/zsh/zshrc
903 setopt extended_history
905 setopt inc_append_history
906 setopt hist_ignore_dups
907 setopt hist_reduce_blanks
911 HISTFILE=~/.local/share/zsh/history
914 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
916 #+begin_src plain :tangle ~/.config/zpe/repositories
917 https://github.com/Aloxaf/fzf-tab
918 https://github.com/zdharma/fast-syntax-highlighting
919 https://github.com/rupa/z
922 #+begin_src shell :tangle ~/.config/zsh/zshrc
923 source ~/Code/zpe/zpe.sh
924 source ~/Code/admone/admone.zsh
925 source ~/.config/zsh/fzf-bindings.zsh
927 zpe-source fzf-tab/fzf-tab.zsh
928 zstyle ':completion:*:descriptions' format '[%d]'
929 zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
930 zstyle ':completion:*' completer _complete
931 zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' \
932 'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
934 zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
935 export _Z_DATA="/home/armaa/.local/share/z"
939 **** Alert after long command
940 #+begin_src shell :tangle ~/.config/zsh/zshrc
942 notify-send --urgency=low -i ${(%):-%(?.terminal.error)} \
943 ${history[$HISTCMD]%[;&|][[:space:]]##alert}
946 **** Time Zsh startup
947 #+begin_src shell :tangle ~/.config/zsh/zshrc
949 for i in $(seq 1 10); do
950 time "zsh" -i -c exit;
954 **** Update all packages
955 #+begin_src shell :tangle ~/.config/zsh/zshrc
956 color=$(tput setaf 5)
960 sudo echo "${color}== upgrading with yay ==${reset}"
963 echo "${color}== checking for pacnew files ==${reset}"
966 echo "${color}== upgrading flatpaks ==${reset}"
969 echo "${color}== upgrading zsh plugins ==${reset}"
972 echo "${color}== updating nvim plugins ==${reset}"
973 nvim +PlugUpdate +PlugUpgrade +qall
974 echo "Updated nvim plugins"
976 echo "${color}You are entirely up to date!${reset}"
979 **** Clean all packages
980 #+begin_src shell :tangle ~/.config/zsh/zshrc
982 sudo echo "${color}== cleaning pacman orphans ==${reset}"
983 (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
985 echo "${color}== cleaning flatpaks ==${reset}"
986 flatpak remove --unused
988 echo "${color}== cleaning zsh plugins ==${reset}"
991 echo "${color}== cleaning nvim plugins ==${reset}"
992 nvim +PlugClean +qall
993 echo "Cleaned nvim plugins"
995 echo "${color}All orphans cleaned!${reset}"
999 #+begin_src shell :tangle ~/.config/zsh/zshrc
1002 exa -lh --icons --git --group-directories-first
1006 #+begin_src shell :tangle ~/.config/zsh/zshrc
1008 __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
1009 if [ $? -eq 0 ]; then
1010 eval "$__conda_setup"
1012 if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
1013 . "/opt/anaconda/etc/profile.d/conda.sh"
1015 export PATH="/opt/anaconda/bin:$PATH"
1021 **** Interact with 0x0
1022 #+begin_src shell :tangle ~/.config/zsh/zshrc
1023 zxz="https://envs.sh"
1024 0file() { curl -F"file=@$1" "$zxz" ; }
1025 0pb() { curl -F"file=@-;" "$zxz" ; }
1026 0url() { curl -F"url=$1" "$zxz" ; }
1027 0short() { curl -F"shorten=$1" "$zxz" ; }
1028 0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
1031 #+begin_src shell :tangle ~/.config/zsh/zshrc
1040 #+begin_src shell :tangle ~/.config/zsh/zshrc
1041 alias bhoji-drop='ssh -p 23 root@armaanb.net'
1042 alias weechat='ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat'
1043 alias tcf='ssh root@204.48.23.68'
1044 alias ngmun='ssh root@157.245.89.25'
1045 alias prox='ssh root@192.168.1.224'
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 mkdir='mkdir -pv'
1063 alias unar='atool -x'
1064 alias wget='wget -e robots=off'
1065 alias lanex='~/.local/share/lxc/lxc'
1068 #+begin_src shell :tangle ~/.config/zsh/zshrc
1069 alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1070 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1072 alias padu='padm add -u && padm commit && padm push && yadu'
1075 #+begin_src shell :tangle ~/.config/zsh/zshrc
1078 alias vw="nvim ~/Documents/vimwiki/index.md"
1080 **** System management
1081 #+begin_src shell :tangle ~/.config/zsh/zshrc
1082 alias jctl='journalctl -p 3 -xb'
1083 alias pkill='pkill -i'
1085 alias please='sudo $(fc -ln -1)'
1086 alias sudo='sudo ' # allows aliases to be run with sudo
1089 #+begin_src shell :tangle ~/.config/zsh/zshrc
1090 alias ping='ping -c 10'
1091 alias speed='speedtest-cli'
1092 alias ip='ip --color=auto'
1093 alias cip='curl https://armaanb.net/ip'
1094 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1095 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1098 #+begin_src shell :tangle ~/.config/zsh/zshrc
1099 alias dc='docker-compose'
1100 alias dcdu='docker-compose down && docker-compose up -d'
1103 #+begin_src shell :tangle ~/.config/zsh/zshrc
1104 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1105 iflag=fullblock status=progress'
1106 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1107 iflag=fullblock status=progress'
1108 alias ts='gen-shell -c task'
1109 alias ts='gen-shell -c task'
1110 alias tetris='autoload -Uz tetriscurses && tetriscurses'
1111 alias news='newsboat'
1112 alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1113 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
1114 --restrict-filenames -o '%(title)s.%(ext)s'"
1115 alias cal="cal -3 --color=auto"
1117 **** Virtual machines, chroots
1118 #+begin_src shell :tangle ~/.config/zsh/zshrc
1119 alias ckiss="sudo chrooter ~/Virtual/kiss"
1120 alias cdebian="sudo chrooter ~/Virtual/debian bash"
1121 alias cwindows='devour qemu-system-x86_64 \
1126 -device VGA,vgamem_mb=64 \
1128 -device hda-duplex \
1130 -net user,smb=/home/armaa/Public \
1131 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1134 #+begin_src shell :tangle ~/.config/zsh/zshrc
1136 alias zpy="zconda && ipython"
1137 alias math="ipython --profile=math"
1138 alias pypi="python setup.py sdist && twine upload dist/*"
1139 alias pip="python -m pip"
1140 alias black="black -l 79"
1143 #+begin_src shell :tangle ~/.config/zsh/zshrc
1144 alias words='gen-shell -c "words"'
1145 alias words-e='gen-shell -c "words ~E"'
1148 #+begin_src shell :tangle ~/.config/zsh/zshrc
1149 alias zathura='devour zathura'
1150 alias mpv='devour mpv'
1151 alias sql='devour sqlitebrowser'
1152 alias cad='devour openscad'
1153 alias feh='devour feh'
1155 **** Package management (Pacman)
1156 #+begin_src shell :tangle ~/.config/zsh/zshrc
1158 alias api='yay -Syu'
1159 alias apii='sudo pacman -S'
1160 alias app='yay -Rns'
1162 alias apo='yay -Qttd'
1163 alias azf='pacman -Q | fzf'
1164 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1165 alias ufetch='ufetch-arch'
1166 alias reflect='reflector --verbose --sort rate --save \
1167 ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1170 #+begin_src shell :tangle ~/.config/zsh/zshrc
1171 export EDITOR="emacsclient -c"
1172 export VISUAL="$VISUAL"
1173 export TERM=xterm-256color # for compatability
1175 export GPG_TTY="$(tty)"
1176 export MANPAGER='nvim +Man!'
1179 export GTK_USE_PORTAL=1
1181 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1182 export PATH="$PATH:/home/armaa/Code/scripts"
1183 export PATH="$PATH:/home/armaa/.cargo/bin"
1184 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1185 export PATH="$PATH:/usr/sbin"
1186 export PATH="$PATH:/opt/FreeTube/freetube"
1188 export LC_ALL="en_US.UTF-8"
1189 export LC_CTYPE="en_US.UTF-8"
1190 export LANGUAGE="en_US.UTF-8"
1192 export KISS_PATH="/home/armaa/kiss/home/armaa/kiss-repo"
1193 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1194 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1195 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1196 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1197 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1201 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1204 family: JetBrains Mono Nerd Font
1211 ligatures: true # Requires ligature patch
1218 background_opacity: 1
1221 Send <RET> + modifier through
1222 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1236 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1237 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1241 background: '#000000'
1242 foreground: '#ffffff'
1246 background: '#777777'
1248 # Normal colors (except green it is from intense colors)
1259 # Bright colors [all the faint colors in the modus theme]
1270 # dim [all the intense colors in modus theme]
1283 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1284 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1285 c.TerminalInteractiveShell.editing_mode = 'vi'
1286 c.InteractiveShell.colors = 'linux'
1287 c.TerminalInteractiveShell.confirm_exit = False
1290 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1294 return x * (180 / pi)
1297 return x * (pi / 180)
1300 return (x * (pi / 180)) / unit
1312 Make MPV play a little bit smoother.
1313 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1314 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1318 For any GNU Readline programs
1319 #+begin_src plain :tangle ~/.inputrc
1324 #+begin_src conf :tangle ~/.gitconfig
1326 name = Armaan Bhojwani
1327 email = me@armaanb.net
1328 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1331 #+begin_src conf :tangle ~/.gitconfig
1333 defaultBranch = main
1336 #+begin_src conf :tangle ~/.gitconfig
1341 #+begin_src conf :tangle ~/.gitconfig
1343 smtpserver = smtp.mailbox.org
1344 smtpuser = me@armaanb.net
1345 smtpencryption = ssl
1346 smtpserverport = 465
1350 #+begin_src conf :tangle ~/.gitconfig
1355 #+begin_src conf :tangle ~/.gitconfig
1358 sclone = clone --depth 1
1364 subup = submodule update --remote
1365 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1366 mirror = git config --global alias.mirrormirror
1369 #+begin_src conf :tangle ~/.gitconfig
1374 Lightweight notification daemon.
1376 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1378 font = "JetBrains Mono Medium Nerd Font 11"
1380 format = "<b>%s</b>\n%b"
1382 indicate_hidden = yes
1385 show_age_threshold = 60
1388 geometry = "400x5-10+10"
1390 idle_threshold = 120
1392 sticky_history = yes
1394 separator_height = 4
1396 horizontal_padding = 8
1398 separator_color = "#777777"
1399 startup_notification = false
1402 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1409 close_all = mod4+shift+c
1410 history = mod4+ctrl+c
1413 background = "#222222"
1414 foreground = "#ffffff"
1415 highlight = "#777777"
1419 background = "#222222"
1420 foreground = "#ffffff"
1421 highlight = "#777777"
1425 background = "#222222"
1426 foreground = "#a60000"
1427 highlight = "#777777"
1431 Modus vivendi theme that extends DarkBlue.
1432 #+begin_src plain :tangle ~/.config/rofi/config.rasi
1433 @import "/usr/share/rofi/themes/DarkBlue.rasi"
1435 selected-normal-foreground: rgba ( 0, 0, 0, 100 % );
1436 foreground: rgba ( 255, 255, 255, 100 % );
1437 background: rgba ( 0, 0, 0, 100 % );
1438 lightfg: rgba ( 255, 255, 255, 100 % );
1439 selected-normal-background: rgba ( 255, 255, 255, 100 % );