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