]> git.armaanb.net Git - config.org.git/blob - config.org
Don't ask to save custom spellings
[config.org.git] / config.org
1 #+TITLE: System Configuration
2 #+DESCRIPTION: Personal system configuration in org-mode format.
3 #+AUTHOR: Armaan Bhojwani
4 #+EMAIL: me@armaanb.net
5
6 * Welcome
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!
8 ** Compatability
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.
10 ** Choices
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.
12
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.
14
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.
16 ** TODOs
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
19 - Offlineimap
20 - irc.el
21 ** License
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.
23 * Package management
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)
28   (let ((bootstrap-file
29          (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
30         (bootstrap-version 5))
31     (unless (file-exists-p bootstrap-file)
32       (with-current-buffer
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))
39 #+end_src
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)
44 #+end_src
45 * Visual options
46 ** Theme
47 Very nice high contrast theme.
48
49 Its fine to set this here because I run Emacs in daemon mode, but if I were not, then putting it in early-init.el would be a better choice to eliminate the window being white before the theme is loaded.
50 #+begin_src emacs-lisp
51   (setq modus-themes-slanted-constructs t
52         modus-themes-bold-constructs t
53         modus-themes-org-blocks 'grayscale
54         modus-themes-mode-line '3d
55         modus-themes-scale-headings t
56         modus-themes-region 'no-extend
57         modus-themes-diffs 'desaturated)
58   (load-theme 'modus-vivendi t)
59 #+end_src
60 ** Typography
61 *** Font
62 Great programming font with ligatures.
63 #+begin_src emacs-lisp
64   (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
65 #+end_src
66 *** Ligatures
67 #+begin_src emacs-lisp
68   (use-package ligature
69     :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
70     :config
71     (ligature-set-ligatures
72      '(prog-mode text-mode)
73      '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
74        "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
75        "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
76        "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
77        "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
78        ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
79        "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
80        "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
81        "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
82        "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
83        "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
84        "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
85     (global-ligature-mode t))
86 #+end_src
87 *** Emoji
88 #+begin_src emacs-lisp
89   (use-package emojify
90     :config (global-emojify-mode))
91
92   ;; http://ergoemacs.org/emacs/emacs_list_and_set_font.html
93   (set-fontset-font
94    t
95    '(#x1f300 . #x1fad0)
96    (cond
97     ((member "Twitter Color Emoji" (font-family-list)) "Twitter Color Emoji")
98     ((member "Noto Color Emoji" (font-family-list)) "Noto Color Emoji")
99     ((member "Noto Emoji" (font-family-list)) "Noto Emoji")))
100 #+end_src
101 ** Line numbers
102 Display relative line numbers except in some modes
103 #+begin_src emacs-lisp
104   (global-display-line-numbers-mode)
105   (setq display-line-numbers-type 'relative)
106   (dolist (no-line-num '(term-mode-hook
107                          pdf-view-mode-hook
108                          shell-mode-hook
109                          org-mode-hook
110                          eshell-mode-hook))
111     (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
112 #+end_src
113 ** Highlight matching parenthesis
114 #+begin_src emacs-lisp
115   (use-package paren
116     :config (show-paren-mode)
117     :custom (show-paren-style 'parenthesis))
118 #+end_src
119 ** Modeline
120 *** Show current function
121 #+begin_src emacs-lisp
122   (which-function-mode)
123 #+end_src
124 *** Make position in file more descriptive
125 Show current column and file size.
126 #+begin_src emacs-lisp
127   (column-number-mode)
128   (size-indication-mode)
129 #+end_src
130 *** Hide minor modes
131 #+begin_src emacs-lisp
132   (use-package minions
133     :config (minions-mode))
134 #+end_src
135 ** Word count
136 #+begin_src emacs-lisp
137  (use-package wc-mode
138    :straight (wc-mode :type git :host github :repo "bnbeckwith/wc-mode")
139    :hook (text-mode-hook . wc-mode))
140 #+end_src
141 ** Ruler
142 Show a ruler at a certain number of chars depending on mode.
143 #+begin_src emacs-lisp
144   (global-display-fill-column-indicator-mode)
145 #+end_src
146 ** Keybinding hints
147 Whenever starting a key chord, show possible future steps.
148 #+begin_src emacs-lisp
149   (use-package which-key
150     :config (which-key-mode)
151     :custom (which-key-idle-delay 0.3))
152 #+end_src
153 ** Highlight TODOs in comments
154 #+begin_src emacs-lisp
155   (use-package hl-todo
156     :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
157     :config (global-hl-todo-mode 1))
158 #+end_src
159 ** Don't lose cursor
160 #+begin_src emacs-lisp
161   (blink-cursor-mode)
162 #+end_src
163 ** Visual line mode
164 Soft wrap words and do operations by visual lines.
165 #+begin_src emacs-lisp
166   (add-hook 'text-mode-hook 'turn-on-visual-line-mode)
167 #+end_src
168 ** Display number of matches in search
169 #+begin_src emacs-lisp
170   (use-package anzu
171     :config (global-anzu-mode))
172 #+end_src
173 ** Visual bell
174 Inverts modeline instead of audible bell or the standard visual bell.
175 #+begin_src emacs-lisp
176   (setq visible-bell nil
177         ring-bell-function 'flash-mode-line)
178   (defun flash-mode-line ()
179     (invert-face 'mode-line)
180     (run-with-timer 0.1 nil #'invert-face 'mode-line))
181 #+end_src
182 * Evil mode
183 ** General
184 #+begin_src emacs-lisp
185   (use-package evil
186     :custom (select-enable-clipboard nil)
187     :config
188     (evil-mode)
189     (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
190     ;; Use visual line motions even outside of visual-line-mode buffers
191     (evil-global-set-key 'motion "j" 'evil-next-visual-line)
192     (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
193     (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
194 #+end_src
195 ** Evil collection
196 #+begin_src emacs-lisp
197   (use-package evil-collection
198     :after evil
199     :init (evil-collection-init)
200     :custom (evil-collection-setup-minibuffer t))
201 #+end_src
202 ** Surround
203 tpope prevails!
204 #+begin_src emacs-lisp
205   (use-package evil-surround
206     :config (global-evil-surround-mode))
207 #+end_src
208 ** Leader key
209 #+begin_src emacs-lisp
210   (use-package evil-leader
211     :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
212     :config
213     (evil-leader/set-leader "<SPC>")
214     (global-evil-leader-mode))
215 #+end_src
216 ** Nerd commenter
217 #+begin_src emacs-lisp
218   ;; Nerd commenter
219   (use-package evil-nerd-commenter
220     :bind (:map evil-normal-state-map
221                 ("gc" . evilnc-comment-or-uncomment-lines))
222     :custom (evilnc-invert-comment-line-by-line nil))
223 #+end_src
224 ** Undo redo
225 Fix the oopsies!
226 #+begin_src emacs-lisp
227   (evil-set-undo-system 'undo-redo)
228 #+end_src
229 ** Number incrementing
230 Add back C-a/C-x
231 #+begin_src emacs-lisp
232   (use-package evil-numbers
233     :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
234     :bind (:map evil-normal-state-map
235                 ("C-M-a" . evil-numbers/inc-at-pt)
236                 ("C-M-x" . evil-numbers/dec-at-pt)))
237 #+end_src
238 ** Evil org
239 *** Init
240 #+begin_src emacs-lisp
241   (use-package evil-org
242     :after org
243     :hook (org-mode . evil-org-mode)
244     :config
245     (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
246   (use-package evil-org-agenda
247     :straight (:type built-in)
248     :after evil-org
249     :config
250     (evil-org-agenda-set-keys))
251 #+end_src
252 *** Leader maps
253 #+begin_src emacs-lisp
254   (evil-leader/set-key-for-mode 'org-mode
255     "T" 'org-show-todo-tree
256     "a" 'org-agenda
257     "c" 'org-archive-subtree)
258 #+end_src
259 * Org mode
260 ** General
261 #+begin_src emacs-lisp
262   (use-package org
263     :straight (:type built-in)
264     :commands (org-capture org-agenda)
265     :custom
266     (org-ellipsis " ▾")
267     (org-agenda-start-with-log-mode t)
268     (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
269     (org-log-done 'time)
270     (org-log-into-drawer t)
271     (org-src-tab-acts-natively t)
272     (org-src-fontify-natively t)
273     (org-startup-indented t)
274     (org-hide-emphasis-markers t)
275     (org-fontify-whole-block-delimiter-line nil)
276     :bind ("C-c a" . org-agenda))
277 #+end_src
278 ** Tempo
279 #+begin_src emacs-lisp
280   (use-package org-tempo
281     :after org
282     :straight (:type built-in)
283     :config
284     ;; TODO: There's gotta be a more efficient way to write this
285     (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
286     (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
287     (add-to-list 'org-structure-template-alist '("zsh" . "src shell :tangle ~/.config/zsh/zshrc"))
288     (add-to-list 'org-structure-template-alist '("al" . "src yml :tangle ~/.config/alacritty/alacritty.yml"))
289     (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
290     (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
291     (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
292     (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
293     (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
294     (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
295     (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
296     (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources")))
297 #+end_src
298 ** Presentations
299 #+begin_src emacs-lisp
300   (use-package org-present
301     :straight (org-present :type git :host github :repo "rlister/org-present"))
302 #+end_src
303 * Autocompletion
304 ** Ivy
305 Simple, but not too simple autocompletion.
306 #+begin_src emacs-lisp
307   (use-package ivy
308     :bind (("C-s" . swiper)
309            :map ivy-minibuffer-map
310            ("TAB" . ivy-alt-done)
311            :map ivy-switch-buffer-map
312            ("M-d" . ivy-switch-buffer-kill))
313     :config (ivy-mode))
314 #+end_src
315 ** Ivy-rich
316 #+begin_src emacs-lisp
317   (use-package ivy-rich
318     :after (ivy counsel)
319     :config (ivy-rich-mode))
320 #+end_src
321 ** Counsel
322 Ivy everywhere.
323 #+begin_src emacs-lisp
324   (use-package counsel
325     :bind (("C-M-j" . 'counsel-switch-buffer)
326            :map minibuffer-local-map
327            ("C-r" . 'counsel-minibuffer-history))
328     :custom (counsel-linux-app-format-function #'counsel-linux-app-format-function-name-only)
329     :config (counsel-mode))
330 #+end_src
331 ** Remember frequent commands
332 #+begin_src emacs-lisp
333   (use-package ivy-prescient
334     :after counsel
335     :custom
336     (ivy-prescient-enable-filtering nil)
337     :config
338     (prescient-persist-mode)
339     (ivy-prescient-mode))
340 #+end_src
341 ** Swiper
342 Better search utility.
343 #+begin_src emacs-lisp
344   (use-package swiper)
345 #+end_src
346 * EmacsOS
347 ** RSS
348 Use elfeed for RSS. I have another file with all the feeds in it.
349 #+begin_src emacs-lisp
350   (use-package elfeed
351     :bind (("C-c e" . elfeed))
352     :config
353     (load "~/.emacs.d/feeds.el")
354     (add-hook 'elfeed-new-entry-hook
355               (elfeed-make-tagger :feed-url "youtube\\.com"
356                                   :add '(youtube)))
357     :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
358
359   (use-package elfeed-goodies
360     :after elfeed
361     :config (elfeed-goodies/setup))
362 #+end_src
363 ** Email
364 Use mu4e for reading emails.
365
366 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.
367
368 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.
369 #+begin_src emacs-lisp
370   (use-package smtpmail
371     :straight (:type built-in))
372   (use-package mu4e
373     :load-path "/usr/share/emacs/site-lisp/mu4e"
374     :straight (:build nil)
375     :bind (("C-c m" . mu4e))
376     :config
377     (setq user-full-name "Armaan Bhojwani"
378           smtpmail-local-domain "armaanb.net"
379           smtpmail-stream-type 'ssl
380           smtpmail-smtp-service '465
381           mu4e-change-filenames-when-moving t
382           mu4e-get-mail-command "offlineimap -q"
383           message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
384           message-citation-line-function 'message-insert-formatted-citation-line
385           mu4e-completing-read-function 'ivy-completing-read
386           mu4e-confirm-quit nil
387           mail-user-agent 'mu4e-user-agent
388           mu4e-contexts
389           `( ,(make-mu4e-context
390                :name "school"
391                :enter-func (lambda () (mu4e-message "Entering school context"))
392                :leave-func (lambda () (mu4e-message "Leaving school context"))
393                :match-func (lambda (msg)
394                              (when msg
395                                (string-match-p "^/school" (mu4e-message-field msg :maildir))))
396                :vars '((user-mail-address . "abhojwani22@nobles.edu")
397                        (mu4e-sent-folder . "/school/Sent")
398                        (mu4e-drafts-folder . "/school/Drafts")
399                        (mu4e-trash-folder . "/school/Trash")
400                        (mu4e-refile-folder . "/school/Archive")
401                        (user-mail-address . "abhojwani22@nobles.edu")
402                        (smtpmail-smtp-user . "abhojwani22@nobles.edu")
403                        (smtpmail-smtp-server . "smtp.gmail.com")))
404              ,(make-mu4e-context
405                :name "personal"
406                :enter-func (lambda () (mu4e-message "Entering personal context"))
407                :leave-func (lambda () (mu4e-message "Leaving personal context"))
408                :match-func (lambda (msg)
409                              (when msg
410                                (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
411                :vars '((mu4e-sent-folder . "/personal/Sent")
412                        (mu4e-drafts-folder . "/personal/Drafts")
413                        (mu4e-trash-folder . "/personal/Trash")
414                        (mu4e-refile-folder . "/personal/Archive")
415                        (user-mail-address . "me@armaanb.net")
416                        (smtpmail-smtp-user . "me@armaanb.net")
417                        (smtpmail-smtp-server "smtp.mailbox.org")
418                        (mu4e-drafts-folder . "/school/Drafts")
419                        (mu4e-trash-folder . "/school/Trash")))))
420     (add-to-list 'mu4e-bookmarks
421                  '(:name "Unified inbox"
422                          :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
423                          :key ?b))
424     :hook ((mu4e-compose-mode . flyspell-mode)
425            (mu4e-view-mode-hook . turn-on-visual-line-mode)))
426 #+end_src
427 ** Default browser
428 Set EWW as default browser except for videos.
429 #+begin_src emacs-lisp
430   (defun browse-url-mpv (url &optional new-window)
431     "Open URL in MPV."
432     (start-process "mpv" "*mpv*" "mpv" url))
433
434   (setq browse-url-handlers
435         (quote
436          (("youtu\\.?be" . browse-url-mpv)
437           ("peertube.*" . browse-url-mpv)
438           ("vid.*" . browse-url-mpv)
439           ("vid.*" . browse-url-mpv)
440           ("." . eww-browse-url)
441           )))
442 #+end_src
443 ** EWW
444 Some EWW enhancements.
445 *** Give buffer a useful name
446 #+begin_src emacs-lisp
447   ;; From https://protesilaos.com/dotemacs/
448   (defun prot-eww--rename-buffer ()
449     "Rename EWW buffer using page title or URL.
450   To be used by `eww-after-render-hook'."
451     (let ((name (if (eq "" (plist-get eww-data :title))
452                     (plist-get eww-data :url)
453                   (plist-get eww-data :title))))
454       (rename-buffer (format "*%s # eww*" name) t)))
455
456   (add-hook 'eww-after-render-hook #'prot-eww--rename-buffer)
457 #+end_src
458 *** Better entrypoint
459 #+begin_src emacs-lisp
460   ;; From https://protesilaos.com/dotemacs/
461   (defun prot-eww-browse-dwim (url &optional arg)
462     "Visit a URL, maybe from `eww-prompt-history', with completion.
463
464   With optional prefix ARG (\\[universal-argument]) open URL in a
465   new eww buffer.
466
467   If URL does not look like a valid link, run a web query using
468   `eww-search-prefix'.
469
470   When called from an eww buffer, provide the current link as
471   initial input."
472     (interactive
473      (list
474       (completing-read "Query:" eww-prompt-history
475                        nil nil (plist-get eww-data :url) 'eww-prompt-history)
476       current-prefix-arg))
477     (eww url (if arg 4 nil)))
478
479   (global-set-key (kbd "C-c w") 'prot-eww-browse-dwim)
480 #+end_src
481 ** IRC
482 #+begin_src emacs-lisp
483   (use-package erc
484     :straight (:type built-in)
485     :config
486     (load "~/.emacs.d/irc.el")
487     (acheam-irc)
488     (erc-notifications-enable)
489     (erc-smiley-disable))
490
491   (use-package erc-hl-nicks
492     :config (erc-hl-nicks-mode 1))
493 #+end_src
494 ** Emacs Anywhere
495 Use Emacs globally. Use the Emacs daemon and bind a key in your wm to
496 =emacsclient --eval "(emacs-everywhere)"=.
497 #+begin_src emacs-lisp
498   (use-package emacs-everywhere)
499 #+end_src
500 * Emacs IDE
501 ** Code cleanup
502 #+begin_src emacs-lisp
503   (use-package blacken
504     :hook (python-mode . blacken-mode)
505     :config
506     (setq blacken-line-length 79))
507
508   ;; Purge whitespace
509   (use-package ws-butler
510     :config
511     (ws-butler-global-mode))
512 #+end_src
513 ** Flycheck
514 #+begin_src emacs-lisp
515   (use-package flycheck
516     :config
517     (global-flycheck-mode))
518 #+end_src
519 ** Project management
520 #+begin_src emacs-lisp
521   (use-package projectile
522     :config (projectile-mode)
523     :custom ((projectile-completion-system 'ivy))
524     :bind-keymap
525     ("C-c p" . projectile-command-map)
526     :init
527     (when (file-directory-p "~/Code")
528       (setq projectile-project-search-path '("~/Code")))
529     (setq projectile-switch-project-action #'projectile-dired))
530
531   (use-package counsel-projectile
532     :after projectile
533     :config (counsel-projectile-mode))
534 #+end_src
535 ** Dired
536 #+begin_src emacs-lisp
537   (use-package dired
538     :straight (:type built-in)
539     :commands (dired dired-jump)
540     :custom ((dired-listing-switches "-agho --group-directories-first"))
541     :config
542     (evil-collection-define-key 'normal 'dired-mode-map
543       "h" 'dired-single-up-directory
544       "l" 'dired-single-buffer))
545
546   (use-package dired-single
547     :commands (dired dired-jump))
548
549   (use-package dired-open
550     :commands (dired dired-jump)
551     :custom
552     (dired-open-extensions '(("png" . "feh")
553                              ("mkv" . "mpv"))))
554
555   (use-package dired-hide-dotfiles
556     :hook (dired-mode . dired-hide-dotfiles-mode)
557     :config
558     (evil-collection-define-key 'normal 'dired-mode-map
559       "H" 'dired-hide-dotfiles-mode))
560 #+end_src
561 ** Git
562 *** Magit
563 # TODO: Write a command that commits hunk, skipping staging step.
564 #+begin_src emacs-lisp
565   (use-package magit)
566 #+end_src
567 *** Colored diff in line number area
568 #+begin_src emacs-lisp
569   (use-package diff-hl
570     :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
571     :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
572            (magit-post-refresh-hook . diff-hl-magit-post-refresh))
573     :config (global-diff-hl-mode))
574 #+end_src
575 * General text editing
576 ** Indentation
577 Indent after every change.
578 #+begin_src emacs-lisp
579   (use-package aggressive-indent
580     :config (global-aggressive-indent-mode))
581 #+end_src
582 ** Spell checking
583 Spell check in text mode, and in prog-mode comments.
584 #+begin_src emacs-lisp
585   (dolist (hook '(text-mode-hook))
586     (add-hook hook (lambda () (flyspell-mode))))
587   (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
588     (add-hook hook (lambda () (flyspell-mode -1))))
589   (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
590 #+end_src
591 ** Expand tabs to spaces
592 #+begin_src emacs-lisp
593   (setq-default tab-width 2)
594 #+end_src
595 ** Copy kill ring to clipboard
596 #+begin_src emacs-lisp
597   (setq x-select-enable-clipboard t)
598   (defun copy-kill-ring-to-xorg ()
599     "Copy the current kill ring to the xorg clipboard."
600     (interactive)
601     (x-select-text (current-kill 0)))
602 #+end_src
603 ** Browse kill ring
604 #+begin_src emacs-lisp
605   (use-package browse-kill-ring)
606 #+end_src
607 ** Save place
608 Opens file where you left it.
609 #+begin_src emacs-lisp
610   (save-place-mode)
611 #+end_src
612 ** Writing mode
613 Distraction free writing a la junegunn/goyo.
614 #+begin_src emacs-lisp
615   (use-package olivetti
616     :config
617     (evil-leader/set-key "o" 'olivetti-mode))
618 #+end_src
619 ** Abbreviations
620 Abbreviate things!
621 #+begin_src emacs-lisp
622   (setq abbrev-file-name "~/.emacs.d/abbrevs")
623   (setq save-abbrevs 'silent)
624   (setq-default abbrev-mode t)
625 #+end_src
626 ** TRAMP
627 #+begin_src emacs-lisp
628   (setq tramp-default-method "ssh")
629 #+end_src
630 ** Don't ask about following symlinks in vc
631 #+begin_src emacs-lisp
632   (setq vc-follow-symlinks t)
633 #+end_src
634 ** Don't ask to save custom dictionary
635 #+begin_src emacs-lisp
636   (setq ispell-silently-savep t)
637 #+end_src
638 * Functions
639 ** Easily convert splits
640 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
641 #+begin_src emacs-lisp
642   (defun toggle-window-split ()
643     (interactive)
644     (if (= (count-windows) 2)
645         (let* ((this-win-buffer (window-buffer))
646                (next-win-buffer (window-buffer (next-window)))
647                (this-win-edges (window-edges (selected-window)))
648                (next-win-edges (window-edges (next-window)))
649                (this-win-2nd (not (and (<= (car this-win-edges)
650                                            (car next-win-edges))
651                                        (<= (cadr this-win-edges)
652                                            (cadr next-win-edges)))))
653                (splitter
654                 (if (= (car this-win-edges)
655                        (car (window-edges (next-window))))
656                     'split-window-horizontally
657                   'split-window-vertically)))
658           (delete-other-windows)
659           (let ((first-win (selected-window)))
660             (funcall splitter)
661             (if this-win-2nd (other-window 1))
662             (set-window-buffer (selected-window) this-win-buffer)
663             (set-window-buffer (next-window) next-win-buffer)
664             (select-window first-win)
665             (if this-win-2nd (other-window 1))))))
666
667   (define-key ctl-x-4-map "t" 'toggle-window-split)
668 #+end_src
669 ** Insert date
670 #+begin_src emacs-lisp
671   (defun insert-date ()
672     (interactive)
673     (insert (format-time-string "%Y-%m-%d")))
674 #+end_src
675 * Keybindings
676 ** Switch windows
677 #+begin_src emacs-lisp
678   (use-package ace-window
679     :bind ("M-o" . ace-window))
680 #+end_src
681 ** Kill current buffer
682 Makes "C-x k" binding faster.
683 #+begin_src emacs-lisp
684   (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
685 #+end_src
686 * Other settings
687 ** OpenSCAD
688 Render OpenSCAD files, and add a preview window.
689
690 Personal fork just merges a PR.
691 #+begin_src emacs-lisp
692   (use-package scad-mode)
693   (use-package scad-preview
694     :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
695 #+end_src
696 ** Control backup files
697 Stop backup files from spewing everywhere.
698 #+begin_src emacs-lisp
699   (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
700 #+end_src
701 ** Make yes/no easier
702 #+begin_src emacs-lisp
703   (defalias 'yes-or-no-p 'y-or-n-p)
704 #+end_src
705 ** Move customize file
706 No more clogging up init.el.
707 #+begin_src emacs-lisp
708   (setq custom-file "~/.emacs.d/custom.el")
709   (load custom-file)
710 #+end_src
711 ** Better help
712 #+begin_src emacs-lisp
713   (use-package helpful
714     :commands (helpful-callable helpful-variable helpful-command helpful-key)
715     :custom
716     (counsel-describe-function-function #'helpful-callable)
717     (counsel-describe-variable-function #'helpful-variable)
718     :bind
719     ([remap describe-function] . counsel-describe-function)
720     ([remap describe-command] . helpful-command)
721     ([remap describe-variable] . counsel-describe-variable)
722     ([remap describe-key] . helpful-key))
723 #+end_src
724 ** GPG
725 #+begin_src emacs-lisp
726   (use-package epa-file
727     :straight (:type built-in)
728     :custom
729     (epa-file-select-keys nil)
730     (epa-file-encrypt-to '("me@armaanb.net"))
731     (password-cache-expiry (* 60 15)))
732
733   (use-package pinentry
734     :config (pinentry-start))
735 #+end_src
736 ** Pastebin
737 #+begin_src emacs-lisp
738   (use-package 0x0
739     :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
740     :custom (0x0-default-service 'envs)
741     :config (evil-leader/set-key
742               "00" '0x0-upload
743               "0f" '0x0-upload-file
744               "0s" '0x0-upload-string
745               "0c" '0x0-upload-kill-ring
746               "0p" '0x0-upload-popup))
747 #+end_src
748 * Tangles
749 ** Spectrwm
750 *** General settings
751 #+begin_src conf :tangle ~/.spectrwm.conf
752   workspace_limit = 5
753   warp_pointer = 1
754   modkey = Mod4
755   autorun = ws[1]:/home/armaa/Code/scripts/autostart
756 #+end_src
757 *** Bar
758 #+begin_src conf :tangle ~/.spectrwm.conf
759   bar_enabled = 0
760   bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
761 #+end_src
762 *** Keybindings
763 **** WM actions
764 #+begin_src conf :tangle ~/.spectrwm.conf
765   program[term] = alacritty
766   program[screenshot_all] = flameshot gui
767   program[notif] = /home/armaa/Code/scripts/setter status
768
769   bind[notif] = MOD+n
770 #+end_src
771 **** Media keys
772 #+begin_src conf :tangle ~/.spectrwm.conf
773   program[paup] = /home/armaa/Code/scripts/setter audio +5
774   program[padown] = /home/armaa/Code/scripts/setter audio -5
775   program[pamute] = /home/armaa/Code/scripts/setter audio
776   program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
777   program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
778   program[next] = playerctl next
779   program[prev] = playerctl previous
780   program[pause] = playerctl play-pause
781
782   bind[padown] = XF86AudioLowerVolume
783   bind[paup] = XF86AudioRaiseVolume
784   bind[pamute] = XF86AudioMute
785   bind[brigdown] = XF86MonBrightnessDown
786   bind[brigup] = XF86MonBrightnessUp
787   bind[pause] = XF86AudioPlay
788   bind[next] = XF86AudioNext
789   bind[prev] = XF86AudioPrev
790 #+end_src
791 **** HJKL
792 #+begin_src conf :tangle ~/.spectrwm.conf
793   program[h] = xdotool keyup h key --clearmodifiers Left
794   program[j] = xdotool keyup j key --clearmodifiers Down
795   program[k] = xdotool keyup k key --clearmodifiers Up
796   program[l] = xdotool keyup l key --clearmodifiers Right
797
798   bind[h] = MOD + Control + h
799   bind[j] = MOD + Control + j
800   bind[k] = MOD + Control + k
801   bind[l] = MOD + Control + l
802 #+end_src
803 **** Programs
804 #+begin_src conf :tangle ~/.spectrwm.conf
805   program[aerc] = alacritty -e aerc
806   program[catgirl] = alacritty --hold -e sh -c "while : ; do ssh root@armaanb.net -t abduco -A irc catgirl freenode; sleep 2; done"
807   program[emacs] = emacsclient -c
808   program[firefox] = firefox
809   program[calc] = alacritty -e bc
810   program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
811
812   bind[aerc] = MOD+Control+1
813   bind[catgirl] = MOD+Control+2
814   bind[firefox] = MOD+Control+3
815   bind[emacs-anywhere] = MOD+Control+4
816   bind[calc] = MOD+Control+5
817   bind[emacs] = MOD+Control+Return
818 #+end_src
819 ** Zsh
820 *** Settings
821 **** Completions
822 #+begin_src shell :tangle ~/.config/zsh/zshrc
823   autoload -Uz compinit
824   compinit
825
826   setopt no_case_glob
827   unsetopt glob_complete
828
829   # Fragment completions
830   zstyle ':completion:*' list-suffixes
zstyle ':completion:*' expand prefix suffix
831
832   # Menu completions
833   zstyle ':completion:*' menu select
834   zmodload zsh/complist
835   bindkey -M menuselect '^n' expand-or-complete
836   bindkey -M menuselect '^p' reverse-menu-complete
837
838 #+end_src
839 **** Vim bindings
840 #+begin_src shell :tangle ~/.config/zsh/zshrc
841   bindkey -v
842   KEYTIMEOUT=1
843
844   bindkey -M vicmd "^[[3~" delete-char
845   bindkey "^[[3~" delete-char
846
847   autoload edit-command-line
848   zle -N edit-command-line
849   bindkey -M vicmd ^e edit-command-line
850   bindkey ^e edit-command-line
851 #+end_src
852 **** History
853 #+begin_src shell :tangle ~/.config/zsh/zshrc
854   setopt extended_history
855   setopt share_history
856   setopt inc_append_history
857   setopt hist_ignore_dups
858   setopt hist_reduce_blanks
859
860   HISTSIZE=100000
861   SAVEHIST=100000
862   HISTFILE=~/.local/share/zsh/history
863 #+end_src
864 *** Plugins
865 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
866
867 Right now, I'm only using fast-syntax-highlighting. It's a really nice visual addition.
868 **** ZPE
869 #+begin_src conf :tangle ~/.config/zpe/repositories
870   https://github.com/zdharma/fast-syntax-highlighting
871 #+end_src
872 **** Zshrc
873 #+begin_src shell :tangle ~/.config/zsh/zshrc
874   source ~/Code/zpe/zpe.sh
875   source ~/Code/admone/admone.zsh
876   source ~/.config/zsh/fzf-bindings.zsh
877
878   zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
879 #+end_src
880 *** Functions
881 **** Time Zsh startup
882 #+begin_src shell :tangle ~/.config/zsh/zshrc
883   timer() {
884       for i in $(seq 1 10); do time "$1" -i -c exit; done
885   }
886 #+end_src
887 **** Update all packages
888 #+begin_src shell :tangle ~/.config/zsh/zshrc
889   color=$(tput setaf 5)
890   reset=$(tput sgr0)
891
892   apu() {
893       sudo echo "${color}== upgrading with yay ==${reset}"
894       yay
895       echo ""
896       echo "${color}== checking for pacnew files ==${reset}"
897       sudo pacdiff
898       echo
899       echo "${color}== upgrading flatpaks ==${reset}"
900       flatpak update
901       echo ""
902       echo "${color}== upgrading zsh plugins ==${reset}"
903       zpe-pull
904       echo ""
905       echo "${color}== updating nvim plugins ==${reset}"
906       nvim +PlugUpdate +PlugUpgrade +qall
907       echo "Updated nvim plugins"
908       echo ""
909       echo "${color}You are entirely up to date!${reset}"
910   }
911 #+end_src
912 **** Clean all packages
913 #+begin_src shell :tangle ~/.config/zsh/zshrc
914   apap() {
915       sudo echo "${color}== cleaning pacman orphans ==${reset}"
916       (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
917       echo ""
918       echo "${color}== cleaning flatpaks ==${reset}"
919       flatpak remove --unused
920       echo ""
921       echo "${color}== cleaning zsh plugins ==${reset}"
922       zpe-clean
923       echo ""
924       echo "${color}== cleaning nvim plugins ==${reset}"
925       nvim +PlugClean +qall
926       echo "Cleaned nvim plugins"
927       echo ""
928       echo "${color}All orphans cleaned!${reset}"
929   }
930 #+end_src
931 **** Setup anaconda
932 #+begin_src shell :tangle ~/.config/zsh/zshrc
933   zconda() {
934       __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
935       if [ $? -eq 0 ]; then
936           eval "$__conda_setup"
937       else
938           if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
939               . "/opt/anaconda/etc/profile.d/conda.sh"
940           else
941               export PATH="/opt/anaconda/bin:$PATH"
942           fi
943       fi
944       unset __conda_setup
945   }
946 #+end_src
947 **** Interact with 0x0
948 #+begin_src shell :tangle ~/.config/zsh/zshrc
949   zxz="https://envs.sh"
950   0file() { curl -F"file=@$1" "$zxz" ; }
951   0pb() { curl -F"file=@-;" "$zxz" ; }
952   0url() { curl -F"url=$1" "$zxz" ; }
953   0short() { curl -F"shorten=$1" "$zxz" ; }
954   0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
955 #+end_src
956 **** Finger
957 #+begin_src shell :tangle ~/.config/zsh/zshrc
958   finger() {
959       user=$(echo "$1" | cut -f 1 -d '@')
960       host=$(echo "$1" | cut -f 2 -d '@')
961       echo $user | nc "$host" 79 -N
962   }
963 #+end_src
964 **** Upload to ftp.armaanb.net
965 #+begin_src shell :tangle ~/.config/zsh/zshrc
966   pubup() {
967       rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
968       echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
969   }
970 #+end_src
971 *** Aliases
972 **** SSH
973 #+begin_src shell :tangle ~/.config/zsh/zshrc
974   alias bhoji-drop='ssh -p 23 root@armaanb.net'
975   alias catgirl='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
976   alias union='ssh 192.168.1.18'
977   alias mine='ssh -p 23 root@pickupserver.cc'
978   alias tcf='ssh root@204.48.23.68'
979   alias ngmun='ssh root@157.245.89.25'
980   alias prox='ssh root@192.168.1.224'
981   alias ncq='ssh root@143.198.123.17'
982   alias dock='ssh root@192.168.1.225'
983   alias jenkins='ssh root@192.168.1.226'
984   alias envs='ssh acheam@envs.net'
985 #+end_src
986 **** File management
987 #+begin_src shell :tangle ~/.config/zsh/zshrc
988   alias ls='exa -lh --icons --git --group-directories-first'
989   alias la='exa -lha --icons --git --group-directories-first'
990   alias df='df -h / /boot'
991   alias du='du -h'
992   alias free='free -h'
993   alias cp='cp -riv'
994   alias rm='rm -Iv'
995   alias mv='mv -iv'
996   alias ln='ln -iv'
997   alias grep='grep -in --exclude-dir=.git --color=auto'
998   alias fname='find -name'
999   alias mkdir='mkdir -pv'
1000   alias unar='atool -x'
1001   alias wget='wget -e robots=off'
1002   alias lanex='~/.local/share/lxc/lxc'
1003 #+end_src
1004 **** Editing
1005 #+begin_src shell :tangle ~/.config/zsh/zshrc
1006   alias v='nvim'
1007   alias vim='nvim'
1008   alias vw="nvim ~/Documents/vimwiki/index.md"
1009 #+end_src
1010 **** System management
1011 #+begin_src shell :tangle ~/.config/zsh/zshrc
1012   alias jctl='journalctl -p 3 -xb'
1013   alias pkill='pkill -i'
1014   alias cx='chmod +x'
1015   alias redoas='doas $(fc -ln -1)'
1016   alias crontab='crontab-argh'
1017   alias sudo='doas ' # allows aliases to be run with doas
1018   alias pasc='pass -c'
1019   alias pasu='\pass git push'
1020   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1021     yadm push'
1022 #+end_src
1023 **** Networking
1024 #+begin_src shell :tangle ~/.config/zsh/zshrc
1025   alias ping='ping -c 10'
1026   alias speed='speedtest-cli'
1027   alias ip='ip --color=auto'
1028   alias cip='curl https://armaanb.net/ip'
1029   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1030   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1031   alias plan='T=$(mktemp) && \
1032         rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
1033         TT=$(mktemp) && \
1034         head -n -2 $T > $TT && \
1035         vim $TT && \
1036         echo "\nLast updated: $(date -R)" >> "$TT" && \
1037         rsync "$TT" root@armaanb.net:/etc/finger/plan.txt'
1038   alias wttr='curl -s "wttr.in/02445?n" | head -n -3'
1039 #+end_src
1040 **** Other
1041 #+begin_src shell :tangle ~/.config/zsh/zshrc
1042   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1043     iflag=fullblock status=progress'
1044   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1045     iflag=fullblock status=progress'
1046   alias ts='gen-shell -c task'
1047   alias ts='gen-shell -c task'
1048   alias tetris='autoload -Uz tetriscurses && tetriscurses'
1049   alias news='newsboat'
1050   alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1051   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
1052     --restrict-filenames -o '%(title)s.%(ext)s'"
1053   alias cal="cal -3 --color=auto"
1054   alias bc='bc -l'
1055 #+end_src
1056 **** Virtual machines, chroots
1057 #+begin_src shell :tangle ~/.config/zsh/zshrc
1058   alias ckiss="sudo chrooter ~/Virtual/kiss"
1059   alias cdebian="sudo chrooter ~/Virtual/debian bash"
1060   alias cwindows='devour qemu-system-x86_64 \
1061     -smp 3 \
1062     -cpu host \
1063     -enable-kvm \
1064     -m 3G \
1065     -device VGA,vgamem_mb=64 \
1066     -device intel-hda \
1067     -device hda-duplex \
1068     -net nic \
1069     -net user,smb=/home/armaa/Public \
1070     -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1071 #+end_src
1072 **** Python
1073 #+begin_src shell :tangle ~/.config/zsh/zshrc
1074   alias ipy="ipython"
1075   alias zpy="zconda && ipython"
1076   alias math="ipython --profile=math"
1077   alias pypi="python setup.py sdist && twine upload dist/*"
1078   alias pip="python -m pip"
1079   alias black="black -l 79"
1080 #+end_src
1081 **** Latin
1082 #+begin_src shell :tangle ~/.config/zsh/zshrc
1083   alias words='gen-shell -c "words"'
1084   alias words-e='gen-shell -c "words ~E"'
1085 #+end_src
1086 **** Devour
1087 #+begin_src shell :tangle ~/.config/zsh/zshrc
1088   alias zathura='devour zathura'
1089   alias mpv='devour mpv'
1090   alias sql='devour sqlitebrowser'
1091   alias cad='devour openscad'
1092   alias feh='devour feh'
1093 #+end_src
1094 **** Package management (Pacman)
1095 #+begin_src shell :tangle ~/.config/zsh/zshrc
1096   alias aps='yay -Ss'
1097   alias api='yay -Syu'
1098   alias apii='sudo pacman -S'
1099   alias app='yay -Rns'
1100   alias apc='yay -Sc'
1101   alias apo='yay -Qttd'
1102   alias azf='pacman -Q | fzf'
1103   alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1104   alias ufetch='ufetch-arch'
1105   alias reflect='reflector --verbose --sort rate --save \
1106      ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1107 #+end_src
1108 **** Package management (KISS)
1109 #+begin_src shell :tangle ~/.config/zsh/zshrc
1110   alias kzf="kiss s \* | xargs -l basename | \
1111     fzf --preview 'kiss search {} | xargs -l dirname'"
1112 #+end_src
1113 *** Exports
1114 #+begin_src shell :tangle ~/.config/zsh/zshrc
1115   export EDITOR="emacsclient -c"
1116   export VISUAL="$EDITOR"
1117   export TERM=xterm-256color # for compatability
1118
1119   export GPG_TTY="$(tty)"
1120   export MANPAGER='nvim +Man!'
1121   export PAGER='less'
1122
1123   export GTK_USE_PORTAL=1
1124
1125   export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1126   export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
1127   export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
1128   export PATH="$PATH:/home/armaa/.cargo/bin"
1129   export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1130   export PATH="$PATH:/usr/sbin"
1131   export PATH="$PATH:/opt/FreeTube/freetube"
1132
1133   export LC_ALL="en_US.UTF-8"
1134   export LC_CTYPE="en_US.UTF-8"
1135   export LANGUAGE="en_US.UTF-8"
1136
1137   export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
1138   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1139   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1140   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1141   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1142   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1143 #+end_src
1144 ** Alacritty
1145 *** Appearance
1146 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1147 font:
1148   normal:
1149     family: JetBrains Mono Nerd Font
1150     style: Medium
1151   italic:
1152     style: Italic
1153   Bold:
1154     style: Bold
1155   size: 7
1156   ligatures: true # Requires ligature patch
1157
1158 window:
1159   padding:
1160     x: 5
1161     y: 5
1162
1163 background_opacity: 1
1164 #+end_src
1165 *** Color scheme
1166 Modus vivendi. Source: https://github.com/ishan9299/Nixos/blob/d4bbb7536be95b59466bb9cca4d671be46e04e81/user/alacritty/alacritty.yml#L30-L118
1167 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1168 colors:
1169   # Default colors
1170   primary:
1171     background: '#000000'
1172     foreground: '#ffffff'
1173
1174   cursor:
1175     text: '#000000'
1176     background: '#ffffff'
1177
1178   # Normal colors (except green it is from intense colors)
1179   normal:
1180     black:   '#000000'
1181     red:     '#ff8059'
1182     green:   '#00fc50'
1183     yellow:  '#eecc00'
1184     blue:    '#29aeff'
1185     magenta: '#feacd0'
1186     cyan:    '#00d3d0'
1187     white:   '#eeeeee'
1188
1189   # Bright colors [all the faint colors in the modus theme]
1190   bright:
1191     black:   '#555555'
1192     red:     '#ffa0a0'
1193     green:   '#88cf88'
1194     yellow:  '#d2b580'
1195     blue:    '#92baff'
1196     magenta: '#e0b2d6'
1197     cyan:    '#a0bfdf'
1198     white:   '#ffffff'
1199
1200   # dim [all the intense colors in modus theme]
1201   dim:
1202     black:   '#222222'
1203     red:     '#fb6859'
1204     green:   '#00fc50'
1205     yellow:  '#ffdd00'
1206     blue:    '#00a2ff'
1207     magenta: '#ff8bd4'
1208     cyan:    '#30ffc0'
1209     white:   '#dddddd'
1210 #+end_src
1211 ** IPython
1212 *** General
1213 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1214 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1215   c.TerminalInteractiveShell.editing_mode = 'vi'
1216   c.InteractiveShell.colors = 'linux'
1217   c.TerminalInteractiveShell.confirm_exit = False
1218 #+end_src
1219 *** Math
1220 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1221   from math import *
1222
1223   def deg(x):
1224       return x * (180 /  pi)
1225
1226   def rad(x):
1227       return x * (pi / 180)
1228
1229   def rad(x, unit):
1230       return (x * (pi / 180)) / unit
1231
1232   def csc(x):
1233       return 1 / sin(x)
1234
1235   def sec(x):
1236       return 1 / cos(x)
1237
1238   def cot(x):
1239       return 1 / tan(x)
1240 #+end_src
1241 ** MPV
1242 Make MPV play a little bit smoother.
1243 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1244   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1245   hwdec=auto-copy
1246 #+end_src
1247 ** Inputrc
1248 For any GNU Readline programs
1249 #+begin_src conf :tangle ~/.inputrc
1250   set editing-mode vi
1251 #+end_src
1252 ** Git
1253 *** User
1254 #+begin_src conf :tangle ~/.gitconfig
1255 [user]
1256   name = Armaan Bhojwani
1257   email = me@armaanb.net
1258   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1259 #+end_src
1260 *** Init
1261 #+begin_src conf :tangle ~/.gitconfig
1262 [init]
1263   defaultBranch = main
1264 #+end_src
1265 *** GPG
1266 #+begin_src conf :tangle ~/.gitconfig
1267 [gpg]
1268   program = gpg
1269 #+end_src
1270 *** Sendemail
1271 #+begin_src conf :tangle ~/.gitconfig
1272 [sendemail]
1273   smtpserver = smtp.mailbox.org
1274   smtpuser = me@armaanb.net
1275   smtpencryption = ssl
1276   smtpserverport = 465
1277   confirm = auto
1278 #+end_src
1279 *** Submodules
1280 #+begin_src conf :tangle ~/.gitconfig
1281 [submodule]
1282   recurse = true
1283 #+end_src
1284 *** Aliases
1285 #+begin_src conf :tangle ~/.gitconfig
1286 [alias]
1287   stat = diff --stat
1288   sclone = clone --depth 1
1289   sclean = clean -dfX
1290   a = add
1291   aa = add .
1292   c = commit
1293   p = push
1294   subup = submodule update --remote
1295   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1296   mirror = git config --global alias.mirrormirror
1297 #+end_src
1298 *** Commits
1299 #+begin_src conf :tangle ~/.gitconfig
1300 [commit]
1301   gpgsign = true
1302   verbose = true
1303 #+end_src
1304 ** Dunst
1305 Lightweight notification daemon.
1306 *** General
1307 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1308   [global]
1309   font = "JetBrains Mono Medium Nerd Font 11"
1310   allow_markup = yes
1311   format = "<b>%s</b>\n%b"
1312   sort = no
1313   indicate_hidden = yes
1314   alignment = center
1315   bounce_freq = 0
1316   show_age_threshold = 60
1317   word_wrap = yes
1318   ignore_newline = no
1319   geometry = "400x5-10+10"
1320   transparency = 0
1321   idle_threshold = 120
1322   monitor = 0
1323   sticky_history = yes
1324   line_height = 0
1325   separator_height = 1
1326   padding = 8
1327   horizontal_padding = 8
1328   max_icon_size = 32
1329   separator_color = "#ffffff"
1330   startup_notification = false
1331 #+end_src
1332 *** Modes
1333 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1334   [frame]
1335   width = 1
1336   color = "#ffffff"
1337
1338   [shortcuts]
1339   close = mod4+c
1340   close_all = mod4+shift+c
1341   history = mod4+ctrl+c
1342
1343   [urgency_low]
1344   background = "#222222"
1345   foreground = "#ffffff"
1346   highlight = "#ffffff"
1347   timeout = 5
1348
1349   [urgency_normal]
1350   background = "#222222"
1351   foreground = "#ffffff"
1352   highlight = "#ffffff"
1353   timeout = 15
1354
1355   [urgency_critical]
1356   background = "#222222"
1357   foreground = "#a60000"
1358   highlight = "#ffffff"
1359   timeout = 0
1360 #+end_src
1361 ** Zathura
1362 *** Options
1363 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1364   map <C-i> recolor
1365   map <A-b> toggle_statusbar
1366   set selection-clipboard clipboard
1367   set scroll-step 200
1368
1369   set window-title-basename "true"
1370   set selection-clipboard "clipboard"
1371 #+end_src
1372 *** Colors
1373 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1374   set default-bg         "#000000"
1375   set default-fg         "#ffffff"
1376   set render-loading     true
1377   set render-loading-bg  "#000000"
1378   set render-loading-fg  "#ffffff"
1379
1380   set recolor-lightcolor "#000000" # bg
1381   set recolor-darkcolor  "#ffffff" # fg
1382   set recolor            "true"
1383 #+end_src
1384 ** Firefox
1385 *** Swap tab and URL bars
1386 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1387   #nav-bar {
1388       -moz-box-ordinal-group: 1 !important;
1389   }
1390
1391   #PersonalToolbar {
1392       -moz-box-ordinal-group: 2 !important;
1393   }
1394
1395   #titlebar {
1396       -moz-box-ordinal-group: 3 !important;
1397   }
1398 #+end_src
1399 *** Hide URL bar when not focused.
1400 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1401   #navigator-toolbox:not(:focus-within):not(:hover) {
1402       margin-top: -30px;
1403   }
1404
1405   #navigator-toolbox {
1406       transition: 0.1s margin-top ease-out;
1407   }
1408 #+end_src
1409 ** Black screen by default
1410 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1411   #main-window,
1412   #browser,
1413   #browser vbox#appcontent tabbrowser,
1414   #content,
1415   #tabbrowser-tabpanels,
1416   #tabbrowser-tabbox,
1417   browser[type="content-primary"],
1418   browser[type="content"] > html,
1419   .browserContainer {
1420       background: black !important;
1421       color: #fff !important;
1422   }
1423 #+end_src
1424 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1425   @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1426       body {
1427           background: black !important;
1428       }
1429   }
1430 #+end_src
1431 ** Xresources
1432 *** Font
1433 #+begin_src conf :tangle ~/.Xresources
1434   XTerm.vt100.translations: #override \n\
1435     Ctrl <Key> minus: smaller-vt-font() \n\
1436     Ctrl <Key> plus: larger-vt-font()
1437 #+end_src
1438 *** Color scheme
1439 Modus operandi.
1440 #+begin_src conf :tangle ~/.Xresources
1441   ! special
1442   ,*.foreground:   #ffffff
1443   ,*.background:   #000000
1444   ,*.cursorColor:  #ffffff
1445
1446   ! black
1447   ,*.color0:       #000000
1448   ,*.color8:       #555555
1449
1450   ! red
1451   ,*.color1:       #ff8059
1452   ,*.color9:       #ffa0a0
1453
1454   ! green
1455   ,*.color2:       #00fc50
1456   ,*.color10:      #88cf88
1457
1458   ! yellow
1459   ,*.color3:       #eecc00
1460   ,*.color11:      #d2b580
1461
1462   ! blue
1463   ,*.color4:       #29aeff
1464   ,*.color12:      #92baff
1465
1466   ! magenta
1467   ,*.color5:       #feacd0
1468   ,*.color13:      #e0b2d6
1469
1470   ! cyan
1471   ,*.color6:       #00d3d0
1472   ,*.color14:      #a0bfdf
1473
1474   ! white
1475   ,*.color7:       #eeeeee
1476   ,*.color15:      #dddddd
1477 #+end_src
1478 *** Copy paste
1479 #+begin_src conf :tangle ~/.Xresources
1480   xterm*VT100.Translations: #override \
1481     Shift <KeyPress> Insert: insert-selection(CLIPBOARD) \n\
1482     Ctrl Shift <Key>V:    insert-selection(CLIPBOARD) \n\
1483     Ctrl Shift <Key>C:    copy-selection(CLIPBOARD) \n\
1484     Ctrl <Btn1Up>: exec-formatted("xdg-open '%t'", PRIMARY)
1485 #+end_src
1486 *** Blink cursor
1487 #+begin_src conf :tangle ~/.Xresources
1488   xterm*cursorBlink: true
1489 #+end_src
1490 *** Alt keys
1491 #+begin_src conf :tangle ~/.Xresources
1492   XTerm*eightBitInput:   false
1493   XTerm*eightBitOutput:  true
1494 #+end_src