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))
442 #+begin_src emacs-lisp
443 (global-set-key (kbd "C-c w") 'eww)
447 #+begin_src emacs-lisp
449 :straight (:type built-in)
451 (erc-notifications-mode 1)
454 :custom (erc-prompt-for-password . nil))
456 (use-package erc-hl-nicks
457 :config (erc-hl-nicks-mode 1))
462 (erc-tls :server "irc.armaanb.net" :nick "emacs"))
467 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to =emacsclient --eval "(emacs-everywhere)"=.
468 #+begin_src emacs-lisp
469 (use-package emacs-everywhere)
473 #+begin_src emacs-lisp
475 :hook (python-mode . blacken-mode)
476 :config (setq blacken-line-length 79))
479 (use-package ws-butler
480 :config (ws-butler-global-mode))
483 #+begin_src emacs-lisp
484 (use-package flycheck
485 :config (global-flycheck-mode))
487 ** Project management
488 #+begin_src emacs-lisp
489 (use-package projectile
490 :config (projectile-mode)
491 :custom ((projectile-completion-system 'ivy))
493 ("C-c p" . projectile-command-map)
495 (when (file-directory-p "~/Code")
496 (setq projectile-project-search-path '("~/Code")))
497 (setq projectile-switch-project-action #'projectile-dired))
499 (use-package counsel-projectile
501 :config (counsel-projectile-mode))
504 #+begin_src emacs-lisp
506 :straight (:type built-in)
507 :commands (dired dired-jump)
508 :custom ((dired-listing-switches "-agho --group-directories-first"))
509 :config (evil-collection-define-key 'normal 'dired-mode-map
510 "h" 'dired-single-up-directory
511 "l" 'dired-single-buffer))
513 (use-package dired-single
514 :commands (dired dired-jump))
516 (use-package dired-open
517 :commands (dired dired-jump)
518 :custom (dired-open-extensions '(("png" . "feh")
521 (use-package dired-hide-dotfiles
522 :hook (dired-mode . dired-hide-dotfiles-mode)
524 (evil-collection-define-key 'normal 'dired-mode-map
525 "H" 'dired-hide-dotfiles-mode))
529 # TODO: Write a command that commits hunk, skipping staging step.
530 #+begin_src emacs-lisp
533 *** Colored diff in line number area
534 #+begin_src emacs-lisp
536 :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
537 :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
538 (magit-post-refresh-hook . diff-hl-magit-post-refresh))
539 :config (global-diff-hl-mode))
542 #+begin_src emacs-lisp
544 (use-package git-email
545 :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
546 :config (git-email-piem-mode))
548 * General text editing
550 Indent after every change.
551 #+begin_src emacs-lisp
552 (use-package aggressive-indent
553 :config (global-aggressive-indent-mode))
556 Spell check in text mode, and in prog-mode comments.
557 #+begin_src emacs-lisp
558 (dolist (hook '(text-mode-hook))
559 (add-hook hook (lambda () (flyspell-mode))))
560 (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
561 (add-hook hook (lambda () (flyspell-mode -1))))
562 (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
564 ** Expand tabs to spaces
565 #+begin_src emacs-lisp
566 (setq-default tab-width 2)
568 ** Copy kill ring to clipboard
569 #+begin_src emacs-lisp
570 (setq x-select-enable-clipboard t)
571 (defun copy-kill-ring-to-xorg ()
572 "Copy the current kill ring to the xorg clipboard."
574 (x-select-text (current-kill 0)))
577 Opens file where you left it.
578 #+begin_src emacs-lisp
582 Distraction free writing a la junegunn/goyo.
583 #+begin_src emacs-lisp
584 (use-package olivetti
586 (evil-leader/set-key "o" 'olivetti-mode))
590 #+begin_src emacs-lisp
591 (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
592 (setq save-abbrevs 'silent)
593 (setq-default abbrev-mode t)
596 #+begin_src emacs-lisp
597 (setq tramp-default-method "ssh")
599 ** Don't ask about following symlinks in vc
600 #+begin_src emacs-lisp
601 (setq vc-follow-symlinks t)
603 ** Don't ask to save custom dictionary
604 #+begin_src emacs-lisp
605 (setq ispell-silently-savep t)
608 #+begin_src emacs-lisp
609 (defun doas-edit (&optional arg)
610 "Edit currently visited file as root.
612 With a prefix ARG prompt for a file to visit.
613 Will also prompt for a file to visit if current
614 buffer is not visiting a file.
616 Modified from Emacs Redux."
618 (if (or arg (not buffer-file-name))
619 (find-file (concat "/doas:root@localhost:"
620 (ido-read-file-name "Find file(as root): ")))
621 (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
623 (global-set-key (kbd "C-x C-r") #'doas-edit)
627 #+begin_src emacs-lisp
628 (use-package ace-window
629 :bind ("M-o" . ace-window))
631 ** Kill current buffer
632 Makes "C-x k" binding faster.
633 #+begin_src emacs-lisp
634 (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
638 #+begin_src emacs-lisp
639 (use-package scad-mode)
641 ** Control backup files
642 Stop backup files from spewing everywhere.
643 #+begin_src emacs-lisp
644 (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
646 ** Make yes/no easier
647 #+begin_src emacs-lisp
648 (defalias 'yes-or-no-p 'y-or-n-p)
650 ** Move customize file
651 No more clogging up init.el.
652 #+begin_src emacs-lisp
653 (setq custom-file "~/.emacs.d/custom.el")
657 #+begin_src emacs-lisp
659 :commands (helpful-callable helpful-variable helpful-command helpful-key)
661 (counsel-describe-function-function #'helpful-callable)
662 (counsel-describe-variable-function #'helpful-variable)
664 ([remap describe-function] . counsel-describe-function)
665 ([remap describe-command] . helpful-command)
666 ([remap describe-variable] . counsel-describe-variable)
667 ([remap describe-key] . helpful-key))
670 #+begin_src emacs-lisp
671 (use-package epa-file
672 :straight (:type built-in)
674 (epa-file-select-keys nil)
675 (epa-file-encrypt-to '("me@armaanb.net"))
676 (password-cache-expiry (* 60 15)))
678 (use-package pinentry
679 :config (pinentry-start))
682 #+begin_src emacs-lisp
684 :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
685 :custom (0x0-default-service 'envs)
686 :config (evil-leader/set-key
688 "0f" '0x0-upload-file
689 "0s" '0x0-upload-string
690 "0c" '0x0-upload-kill-ring
691 "0p" '0x0-upload-popup))
696 #+begin_src conf :tangle ~/.spectrwm.conf
700 autorun = ws[1]:/home/armaa/Code/scripts/autostart
703 #+begin_src conf :tangle ~/.spectrwm.conf
705 bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
709 #+begin_src conf :tangle ~/.spectrwm.conf
710 program[term] = st -e tmux
711 program[screenshot_all] = flameshot gui
712 program[notif] = /home/armaa/Code/scripts/setter status
713 program[pass] = /home/armaa/Code/scripts/passmenu
716 bind[pass] = MOD+Shift+p
719 #+begin_src conf :tangle ~/.spectrwm.conf
720 program[paup] = /home/armaa/Code/scripts/setter audio +5
721 program[padown] = /home/armaa/Code/scripts/setter audio -5
722 program[pamute] = /home/armaa/Code/scripts/setter audio
723 program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
724 program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
725 program[next] = playerctl next
726 program[prev] = playerctl previous
727 program[pause] = playerctl play-pause
729 bind[padown] = XF86AudioLowerVolume
730 bind[paup] = XF86AudioRaiseVolume
731 bind[pamute] = XF86AudioMute
732 bind[brigdown] = XF86MonBrightnessDown
733 bind[brigup] = XF86MonBrightnessUp
734 bind[pause] = XF86AudioPlay
735 bind[next] = XF86AudioNext
736 bind[prev] = XF86AudioPrev
739 #+begin_src conf :tangle ~/.spectrwm.conf
740 program[h] = xdotool keyup h key --clearmodifiers Left
741 program[j] = xdotool keyup j key --clearmodifiers Down
742 program[k] = xdotool keyup k key --clearmodifiers Up
743 program[l] = xdotool keyup l key --clearmodifiers Right
745 bind[h] = MOD + Control + h
746 bind[j] = MOD + Control + j
747 bind[k] = MOD + Control + k
748 bind[l] = MOD + Control + l
751 #+begin_src conf :tangle ~/.spectrwm.conf
752 program[email] = emacsclient -c --eval "(mu4e)"
753 program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6697")'
754 program[emacs] = emacsclient -c
755 program[firefox] = firefox
756 program[calc] = st -e because -l
757 program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
759 bind[email] = MOD+Control+1
760 bind[irc] = MOD+Control+2
761 bind[firefox] = MOD+Control+3
762 bind[emacs-anywhere] = MOD+Control+4
763 bind[calc] = MOD+Control+5
764 bind[emacs] = MOD+Control+Return
767 #+begin_src conf :tangle ~/.spectrwm.conf
768 quirk[Castle Menu] = FLOAT
773 #+begin_src conf :tangle ~/.config/ash/ashrc
777 **** Update all packages
778 #+begin_src shell :tangle ~/.config/ash/ashrc
779 color=$(tput setaf 5)
783 doas echo "${color}== upgrading with yay ==${reset}"
786 echo "${color}== checking for pacnew files ==${reset}"
789 echo "${color}== upgrading flatpaks ==${reset}"
792 echo "${color}== updating nvim plugins ==${reset}"
793 nvim +PlugUpdate +PlugUpgrade +qall
794 echo "Updated nvim plugins"
796 echo "${color}You are entirely up to date!${reset}"
799 **** Clean all packages
800 #+begin_src shell :tangle ~/.config/ash/ashrc
802 doas echo "${color}== cleaning pacman orphans ==${reset}"
803 (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
805 echo "${color}== cleaning flatpaks ==${reset}"
806 flatpak remove --unused
808 echo "${color}== cleaning nvim plugins ==${reset}"
809 nvim +PlugClean +qall
810 echo "Cleaned nvim plugins"
812 echo "${color}All orphans cleaned!${reset}"
815 **** Interact with 0x0
816 #+begin_src shell :tangle ~/.config/ash/ashrc
817 zxz="https://envs.sh"
818 ufile() { curl -F"file=@$1" "$zxz" ; }
819 upb() { curl -F"file=@-;" "$zxz" ; }
820 uurl() { curl -F"url=$1" "$zxz" ; }
821 ushort() { curl -F"shorten=$1" "$zxz" ; }
822 uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
825 #+begin_src shell :tangle ~/.config/ash/ashrc
827 user=$(echo "$1" | cut -f 1 -d '@')
828 host=$(echo "$1" | cut -f 2 -d '@')
829 echo $user | nc "$host" 79
832 **** Upload to ftp.armaanb.net
833 #+begin_src shell :tangle ~/.config/ash/ashrc
835 rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
836 echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
840 #+begin_src shell :tangle ~/.config/ash/ashrc
841 export EDITOR="emacsclient -c"
842 export VISUAL="$EDITOR"
843 export TERM=xterm-256color # for compatability
845 export GPG_TTY="$(tty)"
846 export MANPAGER='nvim +Man!'
849 export GTK_USE_PORTAL=1
851 export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
852 export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
853 export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
854 export PATH="$PATH:/home/armaa/.cargo/bin"
855 export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
856 export PATH="$PATH:/usr/sbin"
857 export PATH="$PATH:/opt/FreeTube/freetube"
859 export LC_ALL="en_US.UTF-8"
860 export LC_CTYPE="en_US.UTF-8"
861 export LANGUAGE="en_US.UTF-8"
863 export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
864 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
865 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
866 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
867 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
868 export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
872 #+begin_src shell :tangle ~/.config/ash/ashrc
873 alias bhoji-drop='ssh -p 23 root@armaanb.net'
874 alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
875 alias union='ssh 192.168.1.18'
876 alias mine='ssh -p 23 root@pickupserver.cc'
877 alias tcf='ssh root@204.48.23.68'
878 alias ngmun='ssh root@157.245.89.25'
879 alias prox='ssh root@192.168.1.224'
880 alias ncq='ssh root@143.198.123.17'
881 alias envs='ssh acheam@envs.net'
884 #+begin_src shell :tangle ~/.config/ash/ashrc
885 alias ls='ls -lh --group-directories-first'
887 alias df='df -h / /boot'
894 alias grep='grep -in --color=auto'
895 alias mkdir='mkdir -pv'
896 alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
900 **** System management
901 #+begin_src shell :tangle ~/.config/ash/ashrc
902 alias pkill='pkill -i'
903 alias crontab='crontab-argh'
905 alias pasu='git -C ~/.password-store push'
906 alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
910 #+begin_src shell :tangle ~/.config/ash/ashrc
911 alias ping='ping -c 10'
912 alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
913 alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
914 alias plan='T=$(mktemp) && \
915 rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
917 head -n -2 $T > $TT && \
919 echo "\nLast updated: $(date -R)" >> "$TT" && \
920 fold -sw 72 "$TT" > "$T"| \
921 rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
923 **** Virtual machines, chroots
924 #+begin_src shell :tangle ~/.config/ash/ashrc
925 alias ckiss="doas chrooter ~/Virtual/kiss"
926 alias cdebian="doas chrooter ~/Virtual/debian bash"
927 alias cwindows='devour qemu-system-x86_64 \
932 -device VGA,vgamem_mb=64 \
936 -net user,smb=/home/armaa/Public \
937 -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
940 #+begin_src shell :tangle ~/.config/ash/ashrc
941 alias pip="python -m pip"
942 alias black="black -l 79"
945 #+begin_src shell :tangle ~/.config/ash/ashrc
946 alias words='gen-shell -c "words"'
947 alias words-e='gen-shell -c "words ~E"'
950 #+begin_src shell :tangle ~/.config/ash/ashrc
951 alias zathura='devour zathura'
952 alias cad='devour openscad'
953 alias feh='devour feh'
956 #+begin_src shell :tangle ~/.config/ash/ashrc
959 alias apii='doas pacman -S'
961 alias azf='pacman -Q | fzf'
962 alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
965 #+begin_src shell :tangle ~/.config/ash/ashrc
966 alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
967 iflag=fullblock status=progress'
968 alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
969 iflag=fullblock status=progress'
970 alias ytmusic="youtube-dl -x --add-metadata --audio-format aac \
971 --restrict-filenames -o '%(title)s.%(ext)s'"
972 alias cal="cal -3 --color=auto"
976 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
977 c.TerminalInteractiveShell.editing_mode = 'vi'
978 c.InteractiveShell.colors = 'linux'
979 c.TerminalInteractiveShell.confirm_exit = False
982 Make MPV play a little bit smoother.
983 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
984 ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
988 For any GNU Readline programs
989 #+begin_src conf :tangle ~/.inputrc
990 set editing-mode emacs
994 #+begin_src conf :tangle ~/.gitconfig
996 name = Armaan Bhojwani
997 email = me@armaanb.net
998 signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1001 #+begin_src conf :tangle ~/.gitconfig
1003 defaultBranch = main
1006 #+begin_src conf :tangle ~/.gitconfig
1011 #+begin_src conf :tangle ~/.gitconfig
1013 smtpserver = smtp.mailbox.org
1014 smtpuser = me@armaanb.net
1015 smtpencryption = ssl
1016 smtpserverport = 465
1020 #+begin_src conf :tangle ~/.gitconfig
1025 #+begin_src conf :tangle ~/.gitconfig
1028 sclone = clone --depth 1
1033 quickfix = commit . --amend --no-edit
1035 subup = submodule update --remote
1036 loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1037 pushnc = push -o skip-ci
1040 #+begin_src conf :tangle ~/.gitconfig
1046 Lightweight notification daemon.
1048 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1050 font = "JetBrains Mono Medium Nerd Font 11"
1052 format = "<b>%s</b>\n%b"
1054 indicate_hidden = yes
1057 show_age_threshold = 60
1060 geometry = "400x5-10+10"
1062 idle_threshold = 120
1064 sticky_history = yes
1066 separator_height = 1
1068 horizontal_padding = 8
1070 separator_color = "#ffffff"
1071 startup_notification = false
1074 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1081 close_all = mod4+shift+c
1082 history = mod4+ctrl+c
1085 background = "#222222"
1086 foreground = "#ffffff"
1087 highlight = "#ffffff"
1091 background = "#222222"
1092 foreground = "#ffffff"
1093 highlight = "#ffffff"
1097 background = "#222222"
1098 foreground = "#a60000"
1099 highlight = "#ffffff"
1104 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1106 map <A-b> toggle_statusbar
1107 set selection-clipboard clipboard
1110 set window-title-basename "true"
1111 set selection-clipboard "clipboard"
1114 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1115 set default-bg "#000000"
1116 set default-fg "#ffffff"
1117 set render-loading true
1118 set render-loading-bg "#000000"
1119 set render-loading-fg "#ffffff"
1121 set recolor-lightcolor "#000000" # bg
1122 set recolor-darkcolor "#ffffff" # fg
1126 *** Swap tab and URL bars
1127 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1129 -moz-box-ordinal-group: 1 !important;
1133 -moz-box-ordinal-group: 2 !important;
1137 -moz-box-ordinal-group: 3 !important;
1140 *** Hide URL bar when not focused.
1141 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1142 #navigator-toolbox:not(:focus-within):not(:hover) {
1146 #navigator-toolbox {
1147 transition: 0.1s margin-top ease-out;
1150 *** Black screen by default
1152 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1155 #browser vbox#appcontent tabbrowser,
1157 #tabbrowser-tabpanels,
1159 browser[type="content-primary"],
1160 browser[type="content"] > html,
1162 background: black !important;
1163 color: #fff !important;
1168 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1169 @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1171 background: black !important;
1176 Modus operandi theme.
1177 #+begin_src conf :tangle ~/.Xresources
1179 ,*.foreground: #ffffff
1180 ,*.background: #000000
1181 ,*.cursorColor: #ffffff
1216 #+begin_src conf :tangle ~/.tmux.conf
1218 set-window-option -g mode-keys vi