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-mode-line '3d
54 modus-themes-scale-headings t
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 "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
83 (global-ligature-mode t))
86 Display relative line numbers except in some modes
87 #+begin_src emacs-lisp
88 (global-display-line-numbers-mode)
89 (setq display-line-numbers-type 'relative)
90 (dolist (no-line-num '(term-mode-hook
95 (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
97 ** Highlight matching parenthesis
98 #+begin_src emacs-lisp
100 :config (show-paren-mode)
101 :custom (show-paren-style 'parenthesis))
104 *** Show current function
105 #+begin_src emacs-lisp
106 (which-function-mode)
108 *** Make position in file more descriptive
109 Show current column and file size.
110 #+begin_src emacs-lisp
112 (size-indication-mode)
115 #+begin_src emacs-lisp
117 :config (minions-mode))
120 Show a ruler at a certain number of chars depending on mode.
121 #+begin_src emacs-lisp
122 (setq display-fill-column-indicator-column 80)
123 (global-display-fill-column-indicator-mode)
126 Whenever starting a key chord, show possible future steps.
127 #+begin_src emacs-lisp
128 (use-package which-key
129 :config (which-key-mode)
130 :custom (which-key-idle-delay 0.3))
132 ** Highlight TODOs in comments
133 #+begin_src emacs-lisp
135 :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
136 :config (global-hl-todo-mode 1))
139 #+begin_src emacs-lisp
143 Soft wrap words and do operations by visual lines.
144 #+begin_src emacs-lisp
145 (add-hook 'text-mode-hook 'visual-line-mode 1)
147 ** Display number of matches in search
148 #+begin_src emacs-lisp
150 :config (global-anzu-mode))
153 Inverts modeline instead of audible bell or the standard visual bell.
154 #+begin_src emacs-lisp
155 (setq visible-bell nil
157 (lambda () (invert-face 'mode-line)
158 (run-with-timer 0.1 nil #'invert-face 'mode-line)))
162 #+begin_src emacs-lisp
164 :custom (select-enable-clipboard nil)
167 (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
168 ;; Use visual line motions even outside of visual-line-mode buffers
169 (evil-global-set-key 'motion "j" 'evil-next-visual-line)
170 (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
171 (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
174 #+begin_src emacs-lisp
175 (use-package evil-collection
177 :init (evil-collection-init)
178 :custom (evil-collection-setup-minibuffer t))
182 #+begin_src emacs-lisp
183 (use-package evil-surround
184 :config (global-evil-surround-mode))
187 #+begin_src emacs-lisp
188 (use-package evil-leader
189 :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
191 (evil-leader/set-leader "<SPC>")
192 (global-evil-leader-mode))
195 #+begin_src emacs-lisp
197 (use-package evil-nerd-commenter
198 :bind (:map evil-normal-state-map
199 ("gc" . evilnc-comment-or-uncomment-lines))
200 :custom (evilnc-invert-comment-line-by-line nil))
204 #+begin_src emacs-lisp
205 (evil-set-undo-system 'undo-redo)
207 ** Number incrementing
209 #+begin_src emacs-lisp
210 (use-package evil-numbers
211 :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
212 :bind (:map evil-normal-state-map
213 ("C-M-a" . evil-numbers/inc-at-pt)
214 ("C-M-x" . evil-numbers/dec-at-pt)))
218 #+begin_src emacs-lisp
219 (use-package evil-org
221 :hook (org-mode . evil-org-mode)
223 (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
224 (use-package evil-org-agenda
225 :straight (:type built-in)
227 :config (evil-org-agenda-set-keys))
230 #+begin_src emacs-lisp
231 (evil-leader/set-key-for-mode 'org-mode
232 "T" 'org-show-todo-tree
234 "c" 'org-archive-subtree)
238 #+begin_src emacs-lisp
240 :straight (:type built-in)
241 :commands (org-capture org-agenda)
244 (org-agenda-start-with-log-mode t)
245 (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
247 (org-log-into-drawer t)
248 (org-src-tab-acts-natively t)
249 (org-src-fontify-natively t)
250 (org-startup-indented t)
251 (org-hide-emphasis-markers t)
252 (org-fontify-whole-block-delimiter-line nil)
253 :bind ("C-c a" . org-agenda))
256 #+begin_src emacs-lisp
257 (use-package org-tempo
259 :straight (:type built-in)
261 ;; TODO: There's gotta be a more efficient way to write this
262 (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
263 (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
264 (add-to-list 'org-structure-template-alist '("ash" . "src shell :tangle ~/.config/ash/ashrc"))
265 (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
266 (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
267 (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
268 (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
269 (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
270 (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
271 (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
272 (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources")
273 (add-to-list 'org-structure-template-alist '("tm" . "src conf :tangle ~/.tmux.conf")))
277 Simple, but not too simple autocompletion.
278 #+begin_src emacs-lisp
280 :bind (("C-s" . swiper)
281 :map ivy-minibuffer-map
282 ("TAB" . ivy-alt-done)
283 :map ivy-switch-buffer-map
284 ("M-d" . ivy-switch-buffer-kill))
288 #+begin_src emacs-lisp
289 (use-package ivy-rich
291 :config (ivy-rich-mode))
295 #+begin_src emacs-lisp
297 :bind (("C-M-j" . 'counsel-switch-buffer)
298 :map minibuffer-local-map
299 ("C-r" . 'counsel-minibuffer-history))
300 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
301 :config (counsel-mode))
303 ** Remember frequent commands
304 #+begin_src emacs-lisp
305 (use-package ivy-prescient
307 :custom (ivy-prescient-enable-filtering nil)
309 (prescient-persist-mode)
310 (ivy-prescient-mode))
313 Better search utility.
314 #+begin_src emacs-lisp
319 Use elfeed for RSS. I have another file with all the feeds in it.
320 #+begin_src emacs-lisp
322 :bind (("C-c e" . elfeed))
324 (load "~/.emacs.d/feeds.el")
325 (add-hook 'elfeed-new-entry-hook
326 (elfeed-make-tagger :feed-url "youtube\\.com"
328 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
330 (use-package elfeed-goodies
332 :config (elfeed-goodies/setup))
335 Use mu4e for reading emails.
337 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.
339 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.
340 #+begin_src emacs-lisp
341 (use-package smtpmail
342 :straight (:type built-in))
344 :load-path "/usr/share/emacs/site-lisp/mu4e"
345 :straight (:build nil)
346 :bind (("C-c m" . mu4e))
348 (setq user-full-name "Armaan Bhojwani"
349 smtpmail-local-domain "armaanb.net"
350 smtpmail-stream-type 'ssl
351 smtpmail-smtp-service '465
352 mu4e-change-filenames-when-moving t
353 mu4e-get-mail-command "offlineimap -q"
354 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
355 message-citation-line-function 'message-insert-formatted-citation-line
356 mu4e-completing-read-function 'ivy-completing-read
357 mu4e-confirm-quit nil
359 mail-user-agent 'mu4e-user-agent
361 `( ,(make-mu4e-context
363 :enter-func (lambda () (mu4e-message "Entering school context"))
364 :leave-func (lambda () (mu4e-message "Leaving school context"))
365 :match-func (lambda (msg)
367 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
368 :vars '((user-mail-address . "abhojwani22@nobles.edu")
369 (mu4e-sent-folder . "/school/Sent")
370 (mu4e-drafts-folder . "/school/Drafts")
371 (mu4e-trash-folder . "/school/Trash")
372 (mu4e-refile-folder . "/school/Archive")
373 (message-cite-reply-position . above)
374 (user-mail-address . "abhojwani22@nobles.edu")
375 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
376 (smtpmail-smtp-server . "smtp.gmail.com")))
379 :enter-func (lambda () (mu4e-message "Entering personal context"))
380 :leave-func (lambda () (mu4e-message "Leaving personal context"))
381 :match-func (lambda (msg)
383 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
384 :vars '((mu4e-sent-folder . "/personal/Sent")
385 (mu4e-drafts-folder . "/personal/Drafts")
386 (mu4e-trash-folder . "/personal/Trash")
387 (mu4e-refile-folder . "/personal/Archive")
388 (user-mail-address . "me@armaanb.net")
389 (message-cite-reply-position . below)
390 (smtpmail-smtp-user . "me@armaanb.net")
391 (smtpmail-smtp-server . "smtp.mailbox.org")))))
392 (add-to-list 'mu4e-bookmarks
393 '(:name "Unified inbox"
394 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
396 :hook ((mu4e-compose-mode . flyspell-mode)
397 (mu4e-compose-mode . auto-fill-mode)
398 (mu4e-view-mode-hook . turn-on-visual-line-mode)))
401 Discourage Gnus from displaying HTML emails
402 #+begin_src emacs-lisp
403 (with-eval-after-load "mm-decode"
404 (add-to-list 'mm-discouraged-alternatives "text/html")
405 (add-to-list 'mm-discouraged-alternatives "text/richtext"))
408 Set EWW as default browser except for videos.
409 #+begin_src emacs-lisp
410 (defun browse-url-mpv (url &optional new-window)
412 (start-process "mpv" "*mpv*" "mpv" url))
414 (setq browse-url-handlers
416 (("youtu\\.?be" . browse-url-mpv)
417 ("peertube.*" . browse-url-mpv)
418 ("vid.*" . browse-url-mpv)
419 ("vid.*" . browse-url-mpv)
420 ("." . eww-browse-url)
424 Some EWW enhancements.
425 *** Give buffer a useful name
426 #+begin_src emacs-lisp
427 ;; From https://protesilaos.com/dotemacs/
428 (defun prot-eww--rename-buffer ()
429 "Rename EWW buffer using page title or URL.
430 To be used by `eww-after-render-hook'."
431 (let ((name (if (eq "" (plist-get eww-data :title))
432 (plist-get eww-data :url)
433 (plist-get eww-data :title))))
434 (rename-buffer (format "*%s # eww*" name) t)))
437 :straight (:type built-in)
438 :bind (("C-c w" . eww))
439 :hook (eww-after-render-hook prot-eww--rename-buffer))
441 *** Better entrypoint
442 #+begin_src emacs-lisp
443 ;; From https://protesilaos.com/dotemacs/
444 (defun prot-eww-browse-dwim (url &optional arg)
445 "Visit a URL, maybe from `eww-prompt-history', with completion.
447 With optional prefix ARG (\\[universal-argument]) open URL in a
450 If URL does not look like a valid link, run a web query using
453 When called from an eww buffer, provide the current link as
457 (completing-read "Query:" eww-prompt-history
458 nil nil (plist-get eww-data :url) 'eww-prompt-history)
460 (eww url (if arg 4 nil)))
462 (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
465 #+begin_src emacs-lisp
467 :straight (:type built-in)
469 (load "~/.emacs.d/irc.el")
470 (erc-notifications-mode 1)
472 :custom (erc-prompt-for-password . nil))
474 (use-package erc-hl-nicks
475 :config (erc-hl-nicks-mode 1))
480 (erc-tls :server "irc.armaanb.net" :nick "emacs"))
485 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
486 #+begin_src emacs-lisp
487 (use-package emacs-everywhere)
491 #+begin_src emacs-lisp
493 :hook (python-mode . blacken-mode)
494 :config (setq blacken-line-length 79))
497 (use-package ws-butler
498 :config (ws-butler-global-mode))
501 #+begin_src emacs-lisp
502 (use-package flycheck
503 :config (global-flycheck-mode))
505 ** Project management
506 #+begin_src emacs-lisp
507 (use-package projectile
508 :config (projectile-mode)
509 :custom ((projectile-completion-system 'ivy))
511 ("C-c p" . projectile-command-map)
513 (when (file-directory-p "~/Code")
514 (setq projectile-project-search-path '("~/Code")))
515 (setq projectile-switch-project-action #'projectile-dired))
517 (use-package counsel-projectile
519 :config (counsel-projectile-mode))
522 #+begin_src emacs-lisp
524 :straight (:type built-in)
525 :commands (dired dired-jump)
526 :custom ((dired-listing-switches "-agho --group-directories-first"))
527 :config (evil-collection-define-key 'normal 'dired-mode-map
528 "h" 'dired-single-up-directory
529 "l" 'dired-single-buffer))
531 (use-package dired-single
532 :commands (dired dired-jump))
534 (use-package dired-open
535 :commands (dired dired-jump)
536 :custom (dired-open-extensions '(("png" . "feh")
539 (use-package dired-hide-dotfiles
540 :hook (dired-mode . dired-hide-dotfiles-mode)
542 (evil-collection-define-key 'normal 'dired-mode-map
543 "H" 'dired-hide-dotfiles-mode))
547 # TODO: Write a command that commits hunk, skipping staging step.
548 #+begin_src emacs-lisp
551 *** Colored diff in line number area
552 #+begin_src emacs-lisp
554 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
555 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
556 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
557 :config (global-diff-hl-mode))
560 #+begin_src emacs-lisp
562 (use-package git-email
563 :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
564 :config (git-email-piem-mode))
566 * General text editing
568 Indent after every change.
569 #+begin_src emacs-lisp
570 (use-package aggressive-indent
571 :config (global-aggressive-indent-mode))
574 Spell check in text mode, and in prog-mode comments.
575 #+begin_src emacs-lisp
576 (dolist (hook '(text-mode-hook))
577 (add-hook hook (lambda () (flyspell-mode))))
578 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
579 (add-hook hook (lambda () (flyspell-mode -1))))
580 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
582 ** Expand tabs to spaces
583 #+begin_src emacs-lisp
584 (setq-default tab-width 2)
586 ** Copy kill ring to clipboard
587 #+begin_src emacs-lisp
588 (setq x-select-enable-clipboard t)
589 (defun copy-kill-ring-to-xorg ()
590 "Copy the current kill ring to the xorg clipboard."
592 (x-select-text (current-kill 0)))
595 Opens file where you left it.
596 #+begin_src emacs-lisp
600 Distraction free writing a la junegunn/goyo.
601 #+begin_src emacs-lisp
602 (use-package olivetti
604 (evil-leader/set-key "o" 'olivetti-mode))
608 #+begin_src emacs-lisp
609 (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
610 (setq save-abbrevs 'silent)
611 (setq-default abbrev-mode t)
614 #+begin_src emacs-lisp
615 (setq tramp-default-method "ssh")
617 ** Don't ask about following symlinks in vc
618 #+begin_src emacs-lisp
619 (setq vc-follow-symlinks t)
621 ** Don't ask to save custom dictionary
622 #+begin_src emacs-lisp
623 (setq ispell-silently-savep t)
626 #+begin_src emacs-lisp
627 (defun doas-edit (&optional arg)
628 "Edit currently visited file as root.
630 With a prefix ARG prompt for a file to visit.
631 Will also prompt for a file to visit if current
632 buffer is not visiting a file.
634 Modified from Emacs Redux."
636 (if (or arg (not buffer-file-name))
637 (find-file (concat "/doas:root@localhost:"
638 (ido-read-file-name "Find file(as root): ")))
639 (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
641 (global-set-key (kbd "C-x C-r") #'doas-edit)
645 #+begin_src emacs-lisp
646 (use-package ace-window
647 :bind ("M-o" . ace-window))
649 ** Kill current buffer
650 Makes "C-x k" binding faster.
651 #+begin_src emacs-lisp
652 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
656 #+begin_src emacs-lisp
657 (use-package scad-mode)
659 ** Control backup files
660 Stop backup files from spewing everywhere.
661 #+begin_src emacs-lisp
662 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
664 ** Make yes/no easier
665 #+begin_src emacs-lisp
666 (defalias 'yes-or-no-p 'y-or-n-p)
668 ** Move customize file
669 No more clogging up init.el.
670 #+begin_src emacs-lisp
671 (setq custom-file "~/.emacs.d/custom.el")
675 #+begin_src emacs-lisp
677 :commands (helpful-callable helpful-variable helpful-command helpful-key)
679 (counsel-describe-function-function #'helpful-callable)
680 (counsel-describe-variable-function #'helpful-variable)
682 ([remap describe-function] . counsel-describe-function)
683 ([remap describe-command] . helpful-command)
684 ([remap describe-variable] . counsel-describe-variable)
685 ([remap describe-key] . helpful-key))
688 #+begin_src emacs-lisp
689 (use-package epa-file
690 :straight (:type built-in)
692 (epa-file-select-keys nil)
693 (epa-file-encrypt-to '("me@armaanb.net"))
694 (password-cache-expiry (* 60 15)))
696 (use-package pinentry
697 :config (pinentry-start))
700 #+begin_src emacs-lisp
702 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
703 :custom (0x0-default-service 'envs)
704 :config (evil-leader/set-key
706 "0f" '0x0-upload-file
707 "0s" '0x0-upload-string
708 "0c" '0x0-upload-kill-ring
709 "0p" '0x0-upload-popup))
714 #+begin_src conf :tangle ~/.spectrwm.conf
718 autorun = ws[1]:/home/armaa/Code/scripts/autostart
721 #+begin_src conf :tangle ~/.spectrwm.conf
723 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
727 #+begin_src conf :tangle ~/.spectrwm.conf
728 program[term] = st -e tmux
729 program[screenshot_all] = flameshot gui
730 program[notif] = /home/armaa/Code/scripts/setter status
731 program[pass] = /home/armaa/Code/scripts/passmenu
734 bind[pass] = MOD+Shift+p
737 #+begin_src conf :tangle ~/.spectrwm.conf
738 program[paup] = /home/armaa/Code/scripts/setter audio +5
739 program[padown] = /home/armaa/Code/scripts/setter audio -5
740 program[pamute] = /home/armaa/Code/scripts/setter audio
741 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
742 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
743 program[next] = playerctl next
744 program[prev] = playerctl previous
745 program[pause] = playerctl play-pause
747 bind[padown] = XF86AudioLowerVolume
748 bind[paup] = XF86AudioRaiseVolume
749 bind[pamute] = XF86AudioMute
750 bind[brigdown] = XF86MonBrightnessDown
751 bind[brigup] = XF86MonBrightnessUp
752 bind[pause] = XF86AudioPlay
753 bind[next] = XF86AudioNext
754 bind[prev] = XF86AudioPrev
757 #+begin_src conf :tangle ~/.spectrwm.conf
758 program[h] = xdotool keyup h key --clearmodifiers Left
759 program[j] = xdotool keyup j key --clearmodifiers Down
760 program[k] = xdotool keyup k key --clearmodifiers Up
761 program[l] = xdotool keyup l key --clearmodifiers Right
763 bind[h] = MOD + Control + h
764 bind[j] = MOD + Control + j
765 bind[k] = MOD + Control + k
766 bind[l] = MOD + Control + l
769 #+begin_src conf :tangle ~/.spectrwm.conf
770 program[email] = emacsclient -c --eval "(mu4e)"
771 program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6697")'
772 program[emacs] = emacsclient -c
773 program[firefox] = firefox
774 program[calc] = st -e because -l
775 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
777 bind[email] = MOD+Control+1
778 bind[irc] = MOD+Control+2
779 bind[firefox] = MOD+Control+3
780 bind[emacs-anywhere] = MOD+Control+4
781 bind[calc] = MOD+Control+5
782 bind[emacs] = MOD+Control+Return
785 #+begin_src conf :tangle ~/.spectrwm.conf
786 quirk[Castle Menu] = FLOAT
791 #+begin_src conf :tangle ~/.config/ash/ashrc
795 **** Update all packages
796 #+begin_src shell :tangle ~/.config/ash/ashrc
797 color=$(tput setaf 5)
801 doas echo "${color}== upgrading with yay ==${reset}"
804 echo "${color}== checking for pacnew files ==${reset}"
807 echo "${color}== upgrading flatpaks ==${reset}"
810 echo "${color}== updating nvim plugins ==${reset}"
811 nvim +PlugUpdate +PlugUpgrade +qall
812 echo "Updated nvim plugins"
814 echo "${color}You are entirely up to date!${reset}"
817 **** Clean all packages
818 #+begin_src shell :tangle ~/.config/ash/ashrc
820 doas echo "${color}== cleaning pacman orphans ==${reset}"
821 (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
823 echo "${color}== cleaning flatpaks ==${reset}"
824 flatpak remove --unused
826 echo "${color}== cleaning nvim plugins ==${reset}"
827 nvim +PlugClean +qall
828 echo "Cleaned nvim plugins"
830 echo "${color}All orphans cleaned!${reset}"
833 **** Interact with 0x0
834 #+begin_src shell :tangle ~/.config/ash/ashrc
835 zxz="https://envs.sh"
836 ufile() { curl -F"file=@$1" "$zxz" ; }
837 upb() { curl -F"file=@-;" "$zxz" ; }
838 uurl() { curl -F"url=$1" "$zxz" ; }
839 ushort() { curl -F"shorten=$1" "$zxz" ; }
840 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
843 #+begin_src shell :tangle ~/.config/ash/ashrc
845 user=$(echo "$1" | cut -f 1 -d '@')
846 host=$(echo "$1" | cut -f 2 -d '@')
847 echo $user | nc "$host" 79
850 **** Upload to ftp.armaanb.net
851 #+begin_src shell :tangle ~/.config/ash/ashrc
853 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
854 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
858 #+begin_src shell :tangle ~/.config/ash/ashrc
859 export EDITOR="emacsclient -c"
860 export VISUAL="$EDITOR"
861 export TERM=xterm-256color # for compatability
863 export GPG_TTY="$(tty)"
864 export MANPAGER='nvim +Man!'
867 export GTK_USE_PORTAL=1
869 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
870 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
871 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
872 export PATH="$PATH:/home/armaa/.cargo/bin"
873 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
874 export PATH="$PATH:/usr/sbin"
875 export PATH="$PATH:/opt/FreeTube/freetube"
877 export LC_ALL="en_US.UTF-8"
878 export LC_CTYPE="en_US.UTF-8"
879 export LANGUAGE="en_US.UTF-8"
881 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
882 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
883 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
884 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
885 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
886 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
890 #+begin_src shell :tangle ~/.config/ash/ashrc
891 alias bhoji-drop='ssh -p 23 root@armaanb.net'
892 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
893 alias union='ssh 192.168.1.18'
894 alias mine='ssh -p 23 root@pickupserver.cc'
895 alias tcf='ssh root@204.48.23.68'
896 alias ngmun='ssh root@157.245.89.25'
897 alias prox='ssh root@192.168.1.224'
898 alias ncq='ssh root@143.198.123.17'
899 alias envs='ssh acheam@envs.net'
902 #+begin_src shell :tangle ~/.config/ash/ashrc
903 alias ls='ls -lh --group-directories-first'
905 alias df='df -h / /boot'
912 alias grep='grep -in --color=auto'
913 alias mkdir='mkdir -pv'
914 alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
918 **** System management
919 #+begin_src shell :tangle ~/.config/ash/ashrc
920 alias pkill='pkill -i'
921 alias crontab='crontab-argh'
923 alias pasu='git -C ~/.password-store push'
924 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
928 #+begin_src shell :tangle ~/.config/ash/ashrc
929 alias ping='ping -c 10'
930 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
931 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
932 alias plan='T=$(mktemp) && \
933 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
935 head -n -2 $T > $TT && \
937 echo "\nLast updated: $(date -R)" >> "$TT" && \
938 fold -sw 72 "$TT" > "$T"| \
939 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
941 **** Virtual machines, chroots
942 #+begin_src shell :tangle ~/.config/ash/ashrc
943 alias ckiss="doas chrooter ~/Virtual/kiss"
944 alias cdebian="doas chrooter ~/Virtual/debian bash"
945 alias cwindows='devour qemu-system-x86_64 \
950 -device VGA,vgamem_mb=64 \
954 -net user,smb=/home/armaa/Public \
955 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
958 #+begin_src shell :tangle ~/.config/ash/ashrc
959 alias pip="python -m pip"
960 alias black="black -l 79"
963 #+begin_src shell :tangle ~/.config/ash/ashrc
964 alias words='gen-shell -c "words"'
965 alias words-e='gen-shell -c "words ~E"'
968 #+begin_src shell :tangle ~/.config/ash/ashrc
969 alias zathura='devour zathura'
970 alias cad='devour openscad'
971 alias feh='devour feh'
974 #+begin_src shell :tangle ~/.config/ash/ashrc
977 alias apii='doas pacman -S'
979 alias azf='pacman -Q | fzf'
980 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
983 #+begin_src shell :tangle ~/.config/ash/ashrc
984 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
985 iflag=fullblock status=progress'
986 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
987 iflag=fullblock status=progress'
988 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
989 --restrict-filenames -o '%(title)s.%(ext)s'"
990 alias cal="cal -3 --color=auto"
994 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
995 c.TerminalInteractiveShell.editing_mode = 'vi'
996 c.InteractiveShell.colors = 'linux'
997 c.TerminalInteractiveShell.confirm_exit = False
1000 Make MPV play a little bit smoother.
1001 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1002 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1006 For any GNU Readline programs
1007 #+begin_src conf :tangle ~/.inputrc
1008 set editing-mode emacs
1012 #+begin_src conf :tangle ~/.gitconfig
1014 name = Armaan Bhojwani
1015 email = me@armaanb.net
1016 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1019 #+begin_src conf :tangle ~/.gitconfig
1021 defaultBranch = main
1024 #+begin_src conf :tangle ~/.gitconfig
1029 #+begin_src conf :tangle ~/.gitconfig
1031 smtpserver = smtp.mailbox.org
1032 smtpuser = me@armaanb.net
1033 smtpencryption = ssl
1034 smtpserverport = 465
1038 #+begin_src conf :tangle ~/.gitconfig
1043 #+begin_src conf :tangle ~/.gitconfig
1046 sclone = clone --depth 1
1051 quickfix = commit . --amend --no-edit
1053 subup = submodule update --remote
1054 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1055 pushnc = push -o skip-ci
1058 #+begin_src conf :tangle ~/.gitconfig
1064 Lightweight notification daemon.
1066 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1068 font = "JetBrains Mono Medium Nerd Font 11"
1070 format = "<b>%s</b>\n%b"
1072 indicate_hidden = yes
1075 show_age_threshold = 60
1078 geometry = "400x5-10+10"
1080 idle_threshold = 120
1082 sticky_history = yes
1084 separator_height = 1
1086 horizontal_padding = 8
1088 separator_color = "#ffffff"
1089 startup_notification = false
1092 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1099 close_all = mod4+shift+c
1100 history = mod4+ctrl+c
1103 background = "#222222"
1104 foreground = "#ffffff"
1105 highlight = "#ffffff"
1109 background = "#222222"
1110 foreground = "#ffffff"
1111 highlight = "#ffffff"
1115 background = "#222222"
1116 foreground = "#a60000"
1117 highlight = "#ffffff"
1122 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1124 map <A-b> toggle_statusbar
1125 set selection-clipboard clipboard
1128 set window-title-basename "true"
1129 set selection-clipboard "clipboard"
1132 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1133 set default-bg "#000000"
1134 set default-fg "#ffffff"
1135 set render-loading true
1136 set render-loading-bg "#000000"
1137 set render-loading-fg "#ffffff"
1139 set recolor-lightcolor "#000000" # bg
1140 set recolor-darkcolor "#ffffff" # fg
1144 *** Swap tab and URL bars
1145 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1147 -moz-box-ordinal-group: 1 !important;
1151 -moz-box-ordinal-group: 2 !important;
1155 -moz-box-ordinal-group: 3 !important;
1158 *** Hide URL bar when not focused.
1159 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1160 #navigator-toolbox:not(:focus-within):not(:hover) {
1164 #navigator-toolbox {
1165 transition: 0.1s margin-top ease-out;
1168 *** Black screen by default
1169 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1172 #browser vbox#appcontent tabbrowser,
1174 #tabbrowser-tabpanels,
1176 browser[type="content-primary"],
1177 browser[type="content"] > html,
1179 background: black !important;
1180 color: #fff !important;
1183 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1184 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1186 background: black !important;
1193 #+begin_src conf :tangle ~/.Xresources
1195 ,*.foreground: #ffffff
1196 ,*.background: #000000
1197 ,*.cursorColor: #ffffff
1232 #+begin_src conf :tangle ~/.Xresources
1233 xterm*VT100.Translations: #override \
1234 Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1235 Ctrl Shift <Key>V: insert-selection(CLIPBOARD) \n\
1236 Ctrl Shift <Key>C: copy-selection(CLIPBOARD) \n\
1237 Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1240 #+begin_src conf :tangle ~/.Xresources
1241 xterm*cursorBlink: true
1244 #+begin_src conf :tangle ~/.Xresources
1245 XTerm*eightBitInput: false
1246 XTerm*eightBitOutput: true
1249 #+begin_src conf :tangle ~/.tmux.conf
1251 set-window-option -g mode-keys vi