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)
243 (org-ellipsis " â–¾")
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")
274 (add-to-list 'org-structure-template-alist '("gp" . "src conf :tangle ~/.gnupg/gpg.conf")
275 (add-to-list 'org-structure-template-alist '("ag" . "src conf :tangle ~/.gnupg/gpg-agent.conf")))
279 Simple, but not too simple autocompletion.
280 #+begin_src emacs-lisp
282 :bind (("C-s" . swiper)
283 :map ivy-minibuffer-map
284 ("TAB" . ivy-alt-done)
285 :map ivy-switch-buffer-map
286 ("M-d" . ivy-switch-buffer-kill))
290 #+begin_src emacs-lisp
291 (use-package ivy-rich
293 :config (ivy-rich-mode))
297 #+begin_src emacs-lisp
299 :bind (("C-M-j" . 'counsel-switch-buffer)
300 :map minibuffer-local-map
301 ("C-r" . 'counsel-minibuffer-history))
302 :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
303 :config (counsel-mode))
305 ** Remember frequent commands
306 #+begin_src emacs-lisp
307 (use-package ivy-prescient
309 :custom (ivy-prescient-enable-filtering nil)
311 (prescient-persist-mode)
312 (ivy-prescient-mode))
315 Better search utility.
316 #+begin_src emacs-lisp
321 Use elfeed for RSS. I have another file with all the feeds in it.
322 #+begin_src emacs-lisp
324 :bind (("C-c e" . elfeed))
326 (load "~/.emacs.d/feeds.el")
327 (add-hook 'elfeed-new-entry-hook
328 (elfeed-make-tagger :feed-url "youtube\\.com"
330 :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
332 (use-package elfeed-goodies
334 :config (elfeed-goodies/setup))
337 Use mu4e for reading emails.
339 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.
341 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.
342 #+begin_src emacs-lisp
343 (use-package smtpmail
344 :straight (:type built-in))
346 :load-path "/usr/share/emacs/site-lisp/mu4e"
347 :straight (:build nil)
348 :bind (("C-c m" . mu4e))
350 (setq user-full-name "Armaan Bhojwani"
351 smtpmail-local-domain "armaanb.net"
352 smtpmail-stream-type 'ssl
353 smtpmail-smtp-service '465
354 mu4e-change-filenames-when-moving t
355 mu4e-get-mail-command "offlineimap -q"
356 message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
357 message-citation-line-function 'message-insert-formatted-citation-line
358 mu4e-completing-read-function 'ivy-completing-read
359 mu4e-confirm-quit nil
361 mail-user-agent 'mu4e-user-agent
363 `( ,(make-mu4e-context
365 :enter-func (lambda () (mu4e-message "Entering school context"))
366 :leave-func (lambda () (mu4e-message "Leaving school context"))
367 :match-func (lambda (msg)
369 (string-match-p "^/school" (mu4e-message-field msg :maildir))))
370 :vars '((user-mail-address . "abhojwani22@nobles.edu")
371 (mu4e-sent-folder . "/school/Sent")
372 (mu4e-drafts-folder . "/school/Drafts")
373 (mu4e-trash-folder . "/school/Trash")
374 (mu4e-refile-folder . "/school/Archive")
375 (message-cite-reply-position . above)
376 (user-mail-address . "abhojwani22@nobles.edu")
377 (smtpmail-smtp-user . "abhojwani22@nobles.edu")
378 (smtpmail-smtp-server . "smtp.gmail.com")))
381 :enter-func (lambda () (mu4e-message "Entering personal context"))
382 :leave-func (lambda () (mu4e-message "Leaving personal context"))
383 :match-func (lambda (msg)
385 (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
386 :vars '((mu4e-sent-folder . "/personal/Sent")
387 (mu4e-drafts-folder . "/personal/Drafts")
388 (mu4e-trash-folder . "/personal/Trash")
389 (mu4e-refile-folder . "/personal/Archive")
390 (user-mail-address . "me@armaanb.net")
391 (message-cite-reply-position . below)
392 (smtpmail-smtp-user . "me@armaanb.net")
393 (smtpmail-smtp-server . "smtp.mailbox.org")))))
394 (add-to-list 'mu4e-bookmarks
395 '(:name "Unified inbox"
396 :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
398 :hook ((mu4e-compose-mode . flyspell-mode)
399 (mu4e-compose-mode . auto-fill-mode)
400 (mu4e-view-mode-hook . turn-on-visual-line-mode)))
403 Discourage Gnus from displaying HTML emails
404 #+begin_src emacs-lisp
405 (with-eval-after-load "mm-decode"
406 (add-to-list 'mm-discouraged-alternatives "text/html")
407 (add-to-list 'mm-discouraged-alternatives "text/richtext"))
410 Set EWW as default browser except for videos.
411 #+begin_src emacs-lisp
412 (defun browse-url-mpv (url &optional new-window)
414 (start-process "mpv" "*mpv*" "mpv" url))
416 (setq browse-url-handlers
418 (("youtu\\.?be" . browse-url-mpv)
419 ("peertube.*" . browse-url-mpv)
420 ("vid.*" . browse-url-mpv)
421 ("vid.*" . browse-url-mpv)
422 ("." . eww-browse-url)
426 Some EWW enhancements.
427 *** Give buffer a useful name
428 #+begin_src emacs-lisp
429 ;; From https://protesilaos.com/dotemacs/
430 (defun prot-eww--rename-buffer ()
431 "Rename EWW buffer using page title or URL.
432 To be used by `eww-after-render-hook'."
433 (let ((name (if (eq "" (plist-get eww-data :title))
434 (plist-get eww-data :url)
435 (plist-get eww-data :title))))
436 (rename-buffer (format "*%s # eww*" name) t)))
439 :straight (:type built-in)
440 :bind (("C-c w" . eww))
441 :hook (eww-after-render-hook prot-eww--rename-buffer))
444 #+begin_src emacs-lisp
445 (global-set-key (kbd "C-c w") 'eww)
449 #+begin_src emacs-lisp
451 :straight (:type built-in)
453 (erc-notifications-mode 1)
456 :custom (erc-prompt-for-password . nil))
458 (use-package erc-hl-nicks
459 :config (erc-hl-nicks-mode 1))
464 (erc-tls :server "irc.armaanb.net" :nick "emacs"))
469 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
470 #+begin_src emacs-lisp
471 (use-package emacs-everywhere)
475 #+begin_src emacs-lisp
477 :hook (python-mode . blacken-mode)
478 :config (setq blacken-line-length 79))
481 (use-package ws-butler
482 :config (ws-butler-global-mode))
485 #+begin_src emacs-lisp
486 (use-package flycheck
487 :config (global-flycheck-mode))
489 ** Project management
490 #+begin_src emacs-lisp
491 (use-package projectile
492 :config (projectile-mode)
493 :custom ((projectile-completion-system 'ivy))
495 ("C-c p" . projectile-command-map)
497 (when (file-directory-p "~/Code")
498 (setq projectile-project-search-path '("~/Code")))
499 (setq projectile-switch-project-action #'projectile-dired))
501 (use-package counsel-projectile
503 :config (counsel-projectile-mode))
506 #+begin_src emacs-lisp
508 :straight (:type built-in)
509 :commands (dired dired-jump)
510 :custom ((dired-listing-switches "-agho --group-directories-first"))
511 :config (evil-collection-define-key 'normal 'dired-mode-map
512 "h" 'dired-single-up-directory
513 "l" 'dired-single-buffer))
515 (use-package dired-single
516 :commands (dired dired-jump))
518 (use-package dired-open
519 :commands (dired dired-jump)
520 :custom (dired-open-extensions '(("png" . "feh")
523 (use-package dired-hide-dotfiles
524 :hook (dired-mode . dired-hide-dotfiles-mode)
526 (evil-collection-define-key 'normal 'dired-mode-map
527 "H" 'dired-hide-dotfiles-mode))
531 # TODO: Write a command that commits hunk, skipping staging step.
532 #+begin_src emacs-lisp
535 *** Colored diff in line number area
536 #+begin_src emacs-lisp
538 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
539 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
540 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
541 :config (global-diff-hl-mode))
544 #+begin_src emacs-lisp
546 (use-package git-email
547 :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
548 :config (git-email-piem-mode))
550 * General text editing
552 Indent after every change.
553 #+begin_src emacs-lisp
554 (use-package aggressive-indent
555 :config (global-aggressive-indent-mode))
558 Spell check in text mode, and in prog-mode comments.
559 #+begin_src emacs-lisp
560 (dolist (hook '(text-mode-hook))
561 (add-hook hook (lambda () (flyspell-mode))))
562 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
563 (add-hook hook (lambda () (flyspell-mode -1))))
564 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
566 ** Expand tabs to spaces
567 #+begin_src emacs-lisp
568 (setq-default tab-width 2)
570 ** Copy kill ring to clipboard
571 #+begin_src emacs-lisp
572 (setq x-select-enable-clipboard t)
573 (defun copy-kill-ring-to-xorg ()
574 "Copy the current kill ring to the xorg clipboard."
576 (x-select-text (current-kill 0)))
579 Opens file where you left it.
580 #+begin_src emacs-lisp
584 Distraction free writing a la junegunn/goyo.
585 #+begin_src emacs-lisp
586 (use-package olivetti
588 (evil-leader/set-key "o" 'olivetti-mode))
592 #+begin_src emacs-lisp
593 (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
594 (setq save-abbrevs 'silent)
595 (setq-default abbrev-mode t)
598 #+begin_src emacs-lisp
599 (setq tramp-default-method "ssh")
601 ** Don't ask about following symlinks in vc
602 #+begin_src emacs-lisp
603 (setq vc-follow-symlinks t)
605 ** Don't ask to save custom dictionary
606 #+begin_src emacs-lisp
607 (setq ispell-silently-savep t)
610 #+begin_src emacs-lisp
611 (defun doas-edit (&optional arg)
612 "Edit currently visited file as root.
614 With a prefix ARG prompt for a file to visit.
615 Will also prompt for a file to visit if current
616 buffer is not visiting a file.
618 Modified from Emacs Redux."
620 (if (or arg (not buffer-file-name))
621 (find-file (concat "/doas:root@localhost:"
622 (ido-read-file-name "Find file(as root): ")))
623 (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
625 (global-set-key (kbd "C-x C-r") #'doas-edit)
629 #+begin_src emacs-lisp
630 (use-package ace-window
631 :bind ("M-o" . ace-window))
633 ** Kill current buffer
634 Makes "C-x k" binding faster.
635 #+begin_src emacs-lisp
636 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
640 #+begin_src emacs-lisp
641 (use-package scad-mode)
643 ** Control backup files
644 Stop backup files from spewing everywhere.
645 #+begin_src emacs-lisp
646 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
648 ** Make yes/no easier
649 #+begin_src emacs-lisp
650 (defalias 'yes-or-no-p 'y-or-n-p)
652 ** Move customize file
653 No more clogging up init.el.
654 #+begin_src emacs-lisp
655 (setq custom-file "~/.emacs.d/custom.el")
659 #+begin_src emacs-lisp
661 :commands (helpful-callable helpful-variable helpful-command helpful-key)
663 (counsel-describe-function-function #'helpful-callable)
664 (counsel-describe-variable-function #'helpful-variable)
666 ([remap describe-function] . counsel-describe-function)
667 ([remap describe-command] . helpful-command)
668 ([remap describe-variable] . counsel-describe-variable)
669 ([remap describe-key] . helpful-key))
672 #+begin_src emacs-lisp
673 (use-package epa-file
674 :straight (:type built-in)
676 (epa-file-select-keys nil)
677 (epa-file-encrypt-to '("me@armaanb.net"))
678 (password-cache-expiry (* 60 15)))
680 (use-package pinentry
681 :config (pinentry-start))
684 #+begin_src emacs-lisp
686 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
687 :custom (0x0-default-service 'envs)
688 :config (evil-leader/set-key
690 "0f" '0x0-upload-file
691 "0s" '0x0-upload-string
692 "0c" '0x0-upload-kill-ring
693 "0p" '0x0-upload-popup))
698 #+begin_src conf :tangle ~/.spectrwm.conf
702 autorun = ws[1]:/home/armaa/Code/scripts/autostart
705 #+begin_src conf :tangle ~/.spectrwm.conf
707 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
711 #+begin_src conf :tangle ~/.spectrwm.conf
712 program[term] = st -e tmux
713 program[screenshot_all] = flameshot gui
714 program[notif] = /home/armaa/Code/scripts/setter status
715 program[pass] = /home/armaa/Code/scripts/passmenu
718 bind[pass] = MOD+Shift+p
721 #+begin_src conf :tangle ~/.spectrwm.conf
722 program[paup] = /home/armaa/Code/scripts/setter audio +5
723 program[padown] = /home/armaa/Code/scripts/setter audio -5
724 program[pamute] = /home/armaa/Code/scripts/setter audio
725 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
726 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
727 program[next] = playerctl next
728 program[prev] = playerctl previous
729 program[pause] = playerctl play-pause
731 bind[padown] = XF86AudioLowerVolume
732 bind[paup] = XF86AudioRaiseVolume
733 bind[pamute] = XF86AudioMute
734 bind[brigdown] = XF86MonBrightnessDown
735 bind[brigup] = XF86MonBrightnessUp
736 bind[pause] = XF86AudioPlay
737 bind[next] = XF86AudioNext
738 bind[prev] = XF86AudioPrev
741 #+begin_src conf :tangle ~/.spectrwm.conf
742 program[h] = xdotool keyup h key --clearmodifiers Left
743 program[j] = xdotool keyup j key --clearmodifiers Down
744 program[k] = xdotool keyup k key --clearmodifiers Up
745 program[l] = xdotool keyup l key --clearmodifiers Right
747 bind[h] = MOD + Control + h
748 bind[j] = MOD + Control + j
749 bind[k] = MOD + Control + k
750 bind[l] = MOD + Control + l
753 #+begin_src conf :tangle ~/.spectrwm.conf
754 program[email] = emacsclient -c --eval "(mu4e)"
755 program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6697")'
756 program[emacs] = emacsclient -c
757 program[firefox] = firefox
758 program[calc] = st -e because -l
759 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
761 bind[email] = MOD+Control+1
762 bind[irc] = MOD+Control+2
763 bind[firefox] = MOD+Control+3
764 bind[emacs-anywhere] = MOD+Control+4
765 bind[calc] = MOD+Control+5
766 bind[emacs] = MOD+Control+Return
769 #+begin_src conf :tangle ~/.spectrwm.conf
770 quirk[Castle Menu] = FLOAT
775 #+begin_src conf :tangle ~/.config/ash/ashrc
779 **** Update all packages
780 #+begin_src shell :tangle ~/.config/ash/ashrc
781 color=$(tput setaf 5)
785 doas echo "${color}== upgrading with yay ==${reset}"
788 echo "${color}== checking for pacnew files ==${reset}"
791 echo "${color}== upgrading flatpaks ==${reset}"
794 echo "${color}== updating nvim plugins ==${reset}"
795 nvim +PlugUpdate +PlugUpgrade +qall
796 echo "Updated nvim plugins"
798 echo "${color}You are entirely up to date!${reset}"
801 **** Clean all packages
802 #+begin_src shell :tangle ~/.config/ash/ashrc
804 doas echo "${color}== cleaning pacman orphans ==${reset}"
805 (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
807 echo "${color}== cleaning flatpaks ==${reset}"
808 flatpak remove --unused
810 echo "${color}== cleaning nvim plugins ==${reset}"
811 nvim +PlugClean +qall
812 echo "Cleaned nvim plugins"
814 echo "${color}All orphans cleaned!${reset}"
817 **** Interact with 0x0
818 #+begin_src shell :tangle ~/.config/ash/ashrc
819 zxz="https://envs.sh"
820 ufile() { curl -F"file=@$1" "$zxz" ; }
821 upb() { curl -F"file=@-;" "$zxz" ; }
822 uurl() { curl -F"url=$1" "$zxz" ; }
823 ushort() { curl -F"shorten=$1" "$zxz" ; }
824 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
827 #+begin_src shell :tangle ~/.config/ash/ashrc
829 user=$(echo "$1" | cut -f 1 -d '@')
830 host=$(echo "$1" | cut -f 2 -d '@')
831 echo $user | nc "$host" 79
834 **** Upload to ftp.armaanb.net
835 #+begin_src shell :tangle ~/.config/ash/ashrc
837 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
838 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
842 #+begin_src shell :tangle ~/.config/ash/ashrc
843 export EDITOR="emacsclient -c"
844 export VISUAL="$EDITOR"
845 export TERM=xterm-256color # for compatability
847 export GPG_TTY="$(tty)"
848 export MANPAGER='nvim +Man!'
851 export GTK_USE_PORTAL=1
853 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
854 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
855 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
856 export PATH="$PATH:/home/armaa/.cargo/bin"
857 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
858 export PATH="$PATH:/usr/sbin"
859 export PATH="$PATH:/opt/FreeTube/freetube"
861 export LC_ALL="en_US.UTF-8"
862 export LC_CTYPE="en_US.UTF-8"
863 export LANGUAGE="en_US.UTF-8"
865 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
866 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
867 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
868 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
869 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
870 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
874 #+begin_src shell :tangle ~/.config/ash/ashrc
875 alias bhoji-drop='ssh -p 23 root@armaanb.net'
876 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
877 alias union='ssh 192.168.1.18'
878 alias mine='ssh -p 23 root@pickupserver.cc'
879 alias tcf='ssh root@204.48.23.68'
880 alias ngmun='ssh root@157.245.89.25'
881 alias prox='ssh root@192.168.1.224'
882 alias ncq='ssh root@143.198.123.17'
883 alias envs='ssh acheam@envs.net'
886 #+begin_src shell :tangle ~/.config/ash/ashrc
887 alias ls='ls -lh --group-directories-first'
889 alias df='df -h / /boot'
896 alias grep='grep -in --color=auto'
897 alias mkdir='mkdir -pv'
898 alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
902 **** System management
903 #+begin_src shell :tangle ~/.config/ash/ashrc
904 alias pkill='pkill -i'
905 alias crontab='crontab-argh'
907 alias pasu='git -C ~/.password-store push'
908 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
912 #+begin_src shell :tangle ~/.config/ash/ashrc
913 alias ping='ping -c 10'
914 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
915 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
916 alias plan='T=$(mktemp) && \
917 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
919 head -n -2 $T > $TT && \
921 echo "\nLast updated: $(date -R)" >> "$TT" && \
922 fold -sw 72 "$TT" > "$T"| \
923 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
925 **** Virtual machines, chroots
926 #+begin_src shell :tangle ~/.config/ash/ashrc
927 alias ckiss="doas chrooter ~/Virtual/kiss"
928 alias cdebian="doas chrooter ~/Virtual/debian bash"
929 alias cwindows='devour qemu-system-x86_64 \
934 -device VGA,vgamem_mb=64 \
938 -net user,smb=/home/armaa/Public \
939 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
942 #+begin_src shell :tangle ~/.config/ash/ashrc
943 alias pip="python -m pip"
944 alias black="black -l 79"
947 #+begin_src shell :tangle ~/.config/ash/ashrc
948 alias words='gen-shell -c "words"'
949 alias words-e='gen-shell -c "words ~E"'
952 #+begin_src shell :tangle ~/.config/ash/ashrc
953 alias zathura='devour zathura'
954 alias cad='devour openscad'
955 alias feh='devour feh'
958 #+begin_src shell :tangle ~/.config/ash/ashrc
961 alias apii='doas pacman -S'
963 alias azf='pacman -Q | fzf'
964 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
967 #+begin_src shell :tangle ~/.config/ash/ashrc
968 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
969 iflag=fullblock status=progress'
970 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
971 iflag=fullblock status=progress'
972 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
973 --restrict-filenames -o '%(title)s.%(ext)s'"
974 alias cal="cal -3 --color=auto"
978 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
979 c.TerminalInteractiveShell.editing_mode = 'vi'
980 c.InteractiveShell.colors = 'linux'
981 c.TerminalInteractiveShell.confirm_exit = False
984 Make MPV play a little bit smoother.
985 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
986 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
990 For any GNU Readline programs
991 #+begin_src conf :tangle ~/.inputrc
992 set editing-mode emacs
996 #+begin_src conf :tangle ~/.gitconfig
998 name = Armaan Bhojwani
999 email = me@armaanb.net
1000 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1003 #+begin_src conf :tangle ~/.gitconfig
1005 defaultBranch = main
1008 #+begin_src conf :tangle ~/.gitconfig
1013 #+begin_src conf :tangle ~/.gitconfig
1015 smtpserver = smtp.mailbox.org
1016 smtpuser = me@armaanb.net
1017 smtpencryption = ssl
1018 smtpserverport = 465
1022 #+begin_src conf :tangle ~/.gitconfig
1027 #+begin_src conf :tangle ~/.gitconfig
1030 sclone = clone --depth 1
1035 quickfix = commit . --amend --no-edit
1037 subup = submodule update --remote
1038 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1039 pushnc = push -o skip-ci
1042 #+begin_src conf :tangle ~/.gitconfig
1048 Lightweight notification daemon.
1050 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1052 font = "JetBrains Mono Medium Nerd Font 11"
1054 format = "<b>%s</b>\n%b"
1056 indicate_hidden = yes
1059 show_age_threshold = 60
1062 geometry = "400x5-10+10"
1064 idle_threshold = 120
1066 sticky_history = yes
1068 separator_height = 1
1070 horizontal_padding = 8
1072 separator_color = "#ffffff"
1073 startup_notification = false
1076 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1083 close_all = mod4+shift+c
1084 history = mod4+ctrl+c
1087 background = "#222222"
1088 foreground = "#ffffff"
1089 highlight = "#ffffff"
1093 background = "#222222"
1094 foreground = "#ffffff"
1095 highlight = "#ffffff"
1099 background = "#222222"
1100 foreground = "#a60000"
1101 highlight = "#ffffff"
1106 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1108 map <A-b> toggle_statusbar
1109 set selection-clipboard clipboard
1112 set window-title-basename "true"
1113 set selection-clipboard "clipboard"
1116 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1117 set default-bg "#000000"
1118 set default-fg "#ffffff"
1119 set render-loading true
1120 set render-loading-bg "#000000"
1121 set render-loading-fg "#ffffff"
1123 set recolor-lightcolor "#000000" # bg
1124 set recolor-darkcolor "#ffffff" # fg
1128 *** Swap tab and URL bars
1129 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1131 -moz-box-ordinal-group: 1 !important;
1135 -moz-box-ordinal-group: 2 !important;
1139 -moz-box-ordinal-group: 3 !important;
1142 *** Hide URL bar when not focused.
1143 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1144 #navigator-toolbox:not(:focus-within):not(:hover) {
1148 #navigator-toolbox {
1149 transition: 0.1s margin-top ease-out;
1152 *** Black screen by default
1154 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1157 #browser vbox#appcontent tabbrowser,
1159 #tabbrowser-tabpanels,
1161 browser[type="content-primary"],
1162 browser[type="content"] > html,
1164 background: black !important;
1165 color: #fff !important;
1170 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1171 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1173 background: black !important;
1178 Modus operandi theme.
1179 #+begin_src conf :tangle ~/.Xresources
1181 ,*.foreground: #ffffff
1182 ,*.background: #000000
1183 ,*.cursorColor: #ffffff
1218 #+begin_src conf :tangle ~/.tmux.conf
1221 set-window-option -g mode-keys vi
1225 #+begin_src conf :tangle ~/.gnupg/gpg.conf
1226 default-key 3C9ED82FFE788E4A
1230 #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
1231 pinentry-program /sbin/pinentry-gnome3
1233 default-cache-ttl 600
1234 allow-emacs-pinentry