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