]> git.armaanb.net Git - config.org.git/blob - config.org
Add calfw keybinding
[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 Include offlineimap config
19 ** License
20 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.
21 * Package management
22 ** Bootstrap straight.el
23 straight.el is really nice for managing package, and it integrates nicely with use-package. It uses the bootstrapping system defined here for installation.
24 #+begin_src emacs-lisp
25   (defvar bootstrap-version)
26   (let ((bootstrap-file
27          (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
28         (bootstrap-version 5))
29     (unless (file-exists-p bootstrap-file)
30       (with-current-buffer
31           (url-retrieve-synchronously
32            "https://raw.githubusercontent.com/raxod502/straight.el/develop/install.el"
33            'silent 'inhibit-cookies)
34         (goto-char (point-max))
35         (eval-print-last-sexp)))
36     (load bootstrap-file nil 'nomessage))
37 #+end_src
38 ** Replace use-package with straight
39 #+begin_src emacs-lisp
40   (straight-use-package 'use-package)
41   (setq straight-use-package-by-default t)
42 #+end_src
43 * Visual options
44 ** Theme
45 Very nice high contrast theme.
46
47 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.
48 #+begin_src emacs-lisp
49   (setq modus-themes-slanted-constructs t
50         modus-themes-bold-constructs t
51         modus-themes-mode-line '3d
52         modus-themes-scale-headings t
53         modus-themes-diffs 'desaturated)
54   (load-theme 'modus-vivendi t)
55 #+end_src
56 ** Typography
57 *** Font
58 Great programming font with ligatures.
59 #+begin_src emacs-lisp
60   (add-to-list 'default-frame-alist '(font . "JetBrainsMonoNF-12"))
61 #+end_src
62 *** Ligatures
63 #+begin_src emacs-lisp
64   (use-package ligature
65     :straight (ligature :type git :host github :repo "mickeynp/ligature.el")
66     :config
67     (ligature-set-ligatures
68      '(prog-mode text-mode)
69      '("-|" "-~" "---" "-<<" "-<" "--" "->" "->>" "-->" "/=" "/=="
70        "/>" "//" "/*" "*>" "*/" "<-" "<<-" "<=>" "<=" "<|" "<||"
71        "<|||" "<|>" "<:" "<>" "<-<" "<<<" "<==" "<<=" "<=<" "<==>"
72        "<-|" "<<" "<~>" "<=|" "<~~" "<~" "<$>" "<$" "<+>" "<+" "</>"
73        "</" "<*" "<*>" "<->" "<!--" ":>" ":<" ":::" "::" ":?" ":?>"
74        ":=" "::=" "=>>" "==>" "=/=" "=!=" "=>" "===" "=:=" "==" "!=="
75        "!!" "!=" ">]" ">:" ">>-" ">>=" ">=>" ">>>" ">-" ">=" "&&&"
76        "&&" "|||>" "||>" "|>" "|]" "|}" "|=>" "|->" "|=" "||-" "|-"
77        "||=" "||" ".." ".?" ".=" ".-" "..<" "..." "+++" "+>" "++"
78        "[||]" "[<" "[|" "{|" "?." "?=" "?:" "##" "###" "####" "#["
79        "#{" "#=" "#!" "#:" "#_(" "#_" "#?" "#(" ";;" "_|_" "__" "~~"
80        "~~>" "~>" "~-" "~@" "$>" "^=" "]#"))
81     (global-ligature-mode t))
82 #+end_src
83 ** Line numbers
84 Display relative line numbers except in some modes
85 #+begin_src emacs-lisp
86   (global-display-line-numbers-mode)
87   (setq display-line-numbers-type 'relative)
88   (dolist (no-line-num '(term-mode-hook
89                          pdf-view-mode-hook
90                          shell-mode-hook
91                          org-mode-hook
92                          eshell-mode-hook))
93     (add-hook no-line-num (lambda () (display-line-numbers-mode 0))))
94 #+end_src
95 ** Highlight matching parenthesis
96 #+begin_src emacs-lisp
97   (use-package paren
98     :config (show-paren-mode)
99     :custom (show-paren-style 'parenthesis))
100 #+end_src
101 ** Modeline
102 *** Show current function
103 #+begin_src emacs-lisp
104   (which-function-mode)
105 #+end_src
106 *** Make position in file more descriptive
107 Show current column and file size.
108 #+begin_src emacs-lisp
109   (column-number-mode)
110   (size-indication-mode)
111 #+end_src
112 *** Hide minor modes
113 #+begin_src emacs-lisp
114   (use-package minions
115     :config (minions-mode))
116 #+end_src
117 ** Ruler
118 Show a ruler at a certain number of chars depending on mode.
119 #+begin_src emacs-lisp
120   (setq display-fill-column-indicator-column 80)
121   (global-display-fill-column-indicator-mode)
122 #+end_src
123 ** Keybinding hints
124 Whenever starting a key chord, show possible future steps.
125 #+begin_src emacs-lisp
126   (use-package which-key
127     :config (which-key-mode)
128     :custom (which-key-idle-delay 0.3))
129 #+end_src
130 ** Highlight TODOs in comments
131 #+begin_src emacs-lisp
132   (use-package hl-todo
133     :straight (hl-todo :type git :host github :repo "tarsius/hl-todo")
134     :config (global-hl-todo-mode 1))
135 #+end_src
136 ** Don't lose cursor
137 #+begin_src emacs-lisp
138   (blink-cursor-mode)
139 #+end_src
140 ** Visual line mode
141 Soft wrap words and do operations by visual lines.
142 #+begin_src emacs-lisp
143   (add-hook 'text-mode-hook 'visual-line-mode 1)
144 #+end_src
145 ** Display number of matches in search
146 #+begin_src emacs-lisp
147   (use-package anzu
148     :config (global-anzu-mode))
149 #+end_src
150 ** Visual bell
151 Inverts modeline instead of audible bell or the standard visual bell.
152 #+begin_src emacs-lisp
153   (setq visible-bell nil
154         ring-bell-function
155         (lambda () (invert-face 'mode-line)
156           (run-with-timer 0.1 nil #'invert-face 'mode-line)))
157 #+end_src
158 * Evil mode
159 ** General
160 #+begin_src emacs-lisp
161   (use-package evil
162     :custom (select-enable-clipboard nil)
163     :config
164     (evil-mode)
165     (fset 'evil-visual-update-x-selection 'ignore) ;; Keep clipboard and register seperate
166     ;; Use visual line motions even outside of visual-line-mode buffers
167     (evil-global-set-key 'motion "j" 'evil-next-visual-line)
168     (evil-global-set-key 'motion "k" 'evil-previous-visual-line)
169     (global-set-key (kbd "<escape>") 'keyboard-escape-quit))
170 #+end_src
171 ** Evil collection
172 #+begin_src emacs-lisp
173   (use-package evil-collection
174     :after evil
175     :init (evil-collection-init)
176     :custom (evil-collection-setup-minibuffer t))
177 #+end_src
178 ** Surround
179 tpope prevails!
180 #+begin_src emacs-lisp
181   (use-package evil-surround
182     :config (global-evil-surround-mode))
183 #+end_src
184 ** Leader key
185 #+begin_src emacs-lisp
186   (use-package evil-leader
187     :straight (evil-leader :type git :host github :repo "cofi/evil-leader")
188     :config
189     (evil-leader/set-leader "<SPC>")
190     (global-evil-leader-mode))
191 #+end_src
192 ** Nerd commenter
193 #+begin_src emacs-lisp
194   ;; Nerd commenter
195   (use-package evil-nerd-commenter
196     :bind (:map evil-normal-state-map
197                 ("gc" . evilnc-comment-or-uncomment-lines))
198     :custom (evilnc-invert-comment-line-by-line nil))
199 #+end_src
200 ** Undo redo
201 Fix the oopsies!
202 #+begin_src emacs-lisp
203   (evil-set-undo-system 'undo-redo)
204 #+end_src
205 ** Number incrementing
206 Add back C-a/C-x
207 #+begin_src emacs-lisp
208   (use-package evil-numbers
209     :straight (evil-numbers :type git :host github :repo "juliapath/evil-numbers")
210     :bind (:map evil-normal-state-map
211                 ("C-M-a" . evil-numbers/inc-at-pt)
212                 ("C-M-x" . evil-numbers/dec-at-pt)))
213 #+end_src
214 ** Evil org
215 *** Init
216 #+begin_src emacs-lisp
217   (use-package evil-org
218     :after org
219     :hook (org-mode . evil-org-mode)
220     :config
221     (evil-org-set-key-theme '(textobjects insert navigation shift todo)))
222   (use-package evil-org-agenda
223     :straight (:type built-in)
224     :after evil-org
225     :config (evil-org-agenda-set-keys))
226 #+end_src
227 *** Leader maps
228 #+begin_src emacs-lisp
229   (evil-leader/set-key-for-mode 'org-mode
230     "T" 'org-show-todo-tree
231     "a" 'org-agenda
232     "c" 'org-archive-subtree)
233 #+end_src
234 * Org mode
235 ** General
236 #+begin_src emacs-lisp
237   (use-package org
238     :straight (:type built-in)
239     :commands (org-capture org-agenda)
240     :custom
241     (org-ellipsis " ▾")
242     (org-agenda-start-with-log-mode t)
243     (org-agenda-files (quote ("~/Org/tasks.org" "~/Org/break.org")))
244     (org-log-done 'time)
245     (org-log-into-drawer t)
246     (org-src-tab-acts-natively t)
247     (org-src-fontify-natively t)
248     (org-startup-indented t)
249     (org-hide-emphasis-markers t)
250     (org-fontify-whole-block-delimiter-line nil)
251     :bind ("C-c a" . org-agenda))
252 #+end_src
253 ** Tempo
254 #+begin_src emacs-lisp
255   (use-package org-tempo
256     :after org
257     :straight (:type built-in)
258     :config
259     ;; TODO: There's gotta be a more efficient way to write this
260     (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
261     (add-to-list 'org-structure-template-alist '("sp" . "src conf :tangle ~/.spectrwm.conf"))
262     (add-to-list 'org-structure-template-alist '("ash" . "src shell :tangle ~/.config/ash/ashrc"))
263     (add-to-list 'org-structure-template-alist '("ipy" . "src python :tangle ~/.ipython/"))
264     (add-to-list 'org-structure-template-alist '("pi" . "src conf :tangle ~/.config/picom/picom.conf"))
265     (add-to-list 'org-structure-template-alist '("git" . "src conf :tangle ~/.gitconfig"))
266     (add-to-list 'org-structure-template-alist '("du" . "src conf :tangle ~/.config/dunst/dunstrc"))
267     (add-to-list 'org-structure-template-alist '("za" . "src conf :tangle ~/.config/zathura/zathurarc"))
268     (add-to-list 'org-structure-template-alist '("ff1" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css"))
269     (add-to-list 'org-structure-template-alist '("ff2" . "src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css"))
270     (add-to-list 'org-structure-template-alist '("xr" . "src conf :tangle ~/.Xresources"))
271     (add-to-list 'org-structure-template-alist '("tm" . "src conf :tangle ~/.tmux.conf"))
272     (add-to-list 'org-structure-template-alist '("gp" . "src conf :tangle ~/.gnupg/gpg.conf"))
273     (add-to-list 'org-structure-template-alist '("ag" . "src conf :tangle ~/.gnupg/gpg-agent.conf")))
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 (ivy-prescient-enable-filtering nil)
308     :config
309     (prescient-persist-mode)
310     (ivy-prescient-mode))
311 #+end_src
312 ** Swiper
313 Better search utility.
314 #+begin_src emacs-lisp
315   (use-package swiper)
316 #+end_src
317 * Emacs OS
318 ** RSS
319 Use elfeed for RSS. I have another file with all the feeds in it.
320 #+begin_src emacs-lisp
321   (use-package elfeed
322     :bind (("C-c e" . elfeed))
323     :config
324     (load "~/.emacs.d/feeds.el")
325     (add-hook 'elfeed-new-entry-hook
326               (elfeed-make-tagger :feed-url "youtube\\.com"
327                                   :add '(youtube)))
328     :bind (:map elfeed-search-mode-map ("C-c C-o" . 'elfeed-show-visit)))
329
330   (use-package elfeed-goodies
331     :after elfeed
332     :config (elfeed-goodies/setup))
333 #+end_src
334 ** Email
335 Use mu4e for reading emails.
336
337 I use `offlineimap` to sync my maildirs. It is slower than mbsync, but is fast enough for me, especially when ran with the =-q= option.
338
339 Contexts are a not very well known feature of mu4e that makes it super easy to manage multiple accounts. Much better than some of the hacky methods and external packages that I've seen.
340 #+begin_src emacs-lisp
341   (use-package smtpmail
342     :straight (:type built-in))
343   (use-package mu4e
344     :load-path "/usr/share/emacs/site-lisp/mu4e"
345     :straight (:build nil)
346     :bind (("C-c m" . mu4e))
347     :config
348     (setq user-full-name "Armaan Bhojwani"
349           smtpmail-local-domain "armaanb.net"
350           smtpmail-stream-type 'ssl
351           smtpmail-smtp-service '465
352           mu4e-change-filenames-when-moving t
353           mu4e-get-mail-command "offlineimap -q"
354           message-citation-line-format "On %a %d %b %Y at %R, %f wrote:\n"
355           message-citation-line-function 'message-insert-formatted-citation-line
356           mu4e-completing-read-function 'ivy-completing-read
357           mu4e-confirm-quit nil
358           mu4e-view-use-gnus t
359           mail-user-agent 'mu4e-user-agent
360           mail-context-policy 'pick-first
361           mu4e-contexts
362           `( ,(make-mu4e-context
363                :name "school"
364                :enter-func (lambda () (mu4e-message "Entering school context"))
365                :leave-func (lambda () (mu4e-message "Leaving school context"))
366                :match-func (lambda (msg)
367                              (when msg
368                                (string-match-p "^/school" (mu4e-message-field msg :maildir))))
369                :vars '((user-mail-address . "abhojwani22@nobles.edu")
370                        (mu4e-sent-folder . "/school/Sent")
371                        (mu4e-drafts-folder . "/school/Drafts")
372                        (mu4e-trash-folder . "/school/Trash")
373                        (mu4e-refile-folder . "/school/Archive")
374                        (message-cite-reply-position . above)
375                        (user-mail-address . "abhojwani22@nobles.edu")
376                        (smtpmail-smtp-user . "abhojwani22@nobles.edu")
377                        (smtpmail-smtp-server . "smtp.gmail.com")))
378              ,(make-mu4e-context
379                :name "personal"
380                :enter-func (lambda () (mu4e-message "Entering personal context"))
381                :leave-func (lambda () (mu4e-message "Leaving personal context"))
382                :match-func (lambda (msg)
383                              (when msg
384                                (string-match-p "^/personal" (mu4e-message-field msg :maildir))))
385                :vars '((mu4e-sent-folder . "/personal/Sent")
386                        (mu4e-drafts-folder . "/personal/Drafts")
387                        (mu4e-trash-folder . "/personal/Trash")
388                        (mu4e-refile-folder . "/personal/Archive")
389                        (user-mail-address . "me@armaanb.net")
390                        (message-cite-reply-position . below)
391                        (smtpmail-smtp-user . "me@armaanb.net")
392                        (smtpmail-smtp-server . "smtp.mailbox.org")))))
393     (add-to-list 'mu4e-bookmarks
394                  '(:name "Unified inbox"
395                          :query "maildir:\"/personal/INBOX\" or maildir:\"/school/INBOX\""
396                          :key ?b))
397     :hook ((mu4e-compose-mode . flyspell-mode)
398            (mu4e-compose-mode . auto-fill-mode)
399            (mu4e-view-mode-hook . turn-on-visual-line-mode)
400            (message-send-hook . (lambda () (unless (yes-or-no-p "Ya sure 'bout that?")
401                                              (signal 'quit nil))))))
402 #+end_src
403 Discourage Gnus from displaying HTML emails
404 #+begin_src emacs-lisp
405   (with-eval-after-load "mm-decode"
406     (add-to-list 'mm-discouraged-alternatives "text/html")
407     (add-to-list 'mm-discouraged-alternatives "text/richtext"))
408 #+end_src
409 ** Default browser
410 Set EWW as default browser except for videos.
411 #+begin_src emacs-lisp
412   (defun browse-url-mpv (url &optional new-window)
413     "Open URL in MPV."
414     (start-process "mpv" "*mpv*" "mpv" url))
415
416   (setq browse-url-handlers
417         (quote
418          (("youtu\\.?be" . browse-url-mpv)
419           ("peertube.*" . browse-url-mpv)
420           ("vid.*" . browse-url-mpv)
421           ("vid.*" . browse-url-mpv)
422           ("." . eww-browse-url)
423           )))
424 #+end_src
425 ** EWW
426 Some EWW enhancements.
427 *** Give buffer a useful name
428 #+begin_src emacs-lisp
429   ;; From https://protesilaos.com/dotemacs/
430   (defun prot-eww--rename-buffer ()
431     "Rename EWW buffer using page title or URL.
432         To be used by `eww-after-render-hook'."
433     (let ((name (if (eq "" (plist-get eww-data :title))
434                     (plist-get eww-data :url)
435                   (plist-get eww-data :title))))
436       (rename-buffer (format "*%s # eww*" name) t)))
437
438   (use-package eww
439     :straight (:type built-in)
440     :bind (("C-c w" . eww))
441     :hook (eww-after-render-hook prot-eww--rename-buffer))
442 #+end_src
443 *** Keybinding
444 #+begin_src emacs-lisp
445   (global-set-key (kbd "C-c w") 'eww)
446 #+end_src
447 ** IRC
448 Circe is a really nice IRC client, that claims to be above RCIRC and below ERC in terms of features. ERC felt a bit messy and finicky to me, and Circe has all the features that I need. This setup gets the password for my bouncer (Pounce) instances via my =~/.authinfo.gpg= file.
449 #+begin_src emacs-lisp
450   (defun fetch-password (&rest params)
451     (require 'auth-source)
452     (let ((match (car (apply 'auth-source-search params))))
453       (if match
454           (let ((secret (plist-get match :secret)))
455             (if (functionp secret)
456                 (funcall secret)
457               secret))
458         (error "Password not found for %S" params))))
459
460   (use-package circe
461     :config
462     (enable-lui-track)
463     (enable-circe-color-nicks)
464     (circe "libera")
465     (circe "oftc")
466     (circe "tilde")
467     (setq circe-networks '(("libera"
468                             :host "irc.armaanb.net"
469                             :nick "emacs"
470                             :user "emacs"
471                             :use-tls t
472                             :port "6698"
473                             :pass (lambda (null) (fetch-password
474                                                   :login "emacs"
475                                                   :machine "irc.armaanb.net"
476                                                   :port 6698)))
477                            ("oftc"
478                             :host "irc.armaanb.net"
479                             :nick "emacs"
480                             :user "emacs"
481                             :use-tls t
482                             :port "6699"
483                             :pass (lambda (null) (fetch-password
484                                                   :login "emacs"
485                                                   :machine "irc.armaanb.net"
486                                                   :port 6699)))
487                            ("tilde"
488                             :host "irc.armaanb.net"
489                             :nick "emacs"
490                             :user "emacs"
491                             :use-tls t
492                             :port "6696"
493                             :pass (lambda (null) (fetch-password
494                                                   :login "emacs"
495                                                   :machine "irc.armaanb.net"
496                                                   :port 6696)))
497                            ))
498     :custom (circe-default-part-message "goodbye!")
499     :bind (:map circe-mode-map ("C-c C-r" . circe-reconnect-all)))
500 #+end_src
501 ** Calendar
502 #+begin_src emacs-lisp
503   (defun sync-calendar ()
504     "Sync calendars with vdirsyncer"
505     (interactive)
506     (shell-command "vdirsyncer -vcritical sync"))
507
508   (use-package calfw
509     :bind (:map cfw:calendar-mode-map ("C-S-u" . sync-calendar)))
510   (use-package calfw-ical)
511   (use-package calfw-org)
512
513   (defun acheam-calendar ()
514     "Open calendars"
515     (interactive)
516     (cfw:open-calendar-buffer
517      :contents-sources (list
518                         (cfw:org-create-source "Green")
519                         (cfw:ical-create-source
520                          "Personal"
521                          "~/.local/share/vdirsyncer/mailbox/Y2FsOi8vMC8zMQ.ics"
522                          "Gray")
523                         (cfw:ical-create-source
524                          "Personal"
525                          "~/.local/share/vdirsyncer/mailbox/Y2FsOi8vMC8zMQ.ics"
526                          "Red")
527                         (cfw:ical-create-source
528                          "School"
529                          "~/.local/share/vdirsyncer/school/abhojwani22@nobles.edu.ics"
530                          "Cyan"))
531      :view 'week))
532
533   (global-set-key (kbd "C-c c") 'acheam-calendar)
534 #+end_src
535 * Emacs IDE
536 ** Code cleanup
537 #+begin_src emacs-lisp
538   (use-package blacken
539     :hook (python-mode . blacken-mode)
540     :config (setq blacken-line-length 79))
541
542   ;; Purge whitespace
543   (use-package ws-butler
544     :config (ws-butler-global-mode))
545 #+end_src
546 ** Flycheck
547 #+begin_src emacs-lisp
548   (use-package flycheck
549     :config (global-flycheck-mode))
550 #+end_src
551 ** Project management
552 #+begin_src emacs-lisp
553   (use-package projectile
554     :config (projectile-mode)
555     :custom ((projectile-completion-system 'ivy))
556     :bind-keymap
557     ("C-c p" . projectile-command-map)
558     :init
559     (when (file-directory-p "~/Code")
560       (setq projectile-project-search-path '("~/Code")))
561     (setq projectile-switch-project-action #'projectile-dired))
562
563   (use-package counsel-projectile
564     :after projectile
565     :config (counsel-projectile-mode))
566 #+end_src
567 ** Dired
568 #+begin_src emacs-lisp
569   (use-package dired
570     :straight (:type built-in)
571     :commands (dired dired-jump)
572     :custom ((dired-listing-switches "-agho --group-directories-first"))
573     :config (evil-collection-define-key 'normal 'dired-mode-map
574               "h" 'dired-single-up-directory
575               "l" 'dired-single-buffer))
576
577   (use-package dired-single
578     :commands (dired dired-jump))
579
580   (use-package dired-open
581     :commands (dired dired-jump)
582     :custom (dired-open-extensions '(("png" . "feh")
583                                      ("mkv" . "mpv"))))
584
585   (use-package dired-hide-dotfiles
586     :hook (dired-mode . dired-hide-dotfiles-mode)
587     :config
588     (evil-collection-define-key 'normal 'dired-mode-map
589       "H" 'dired-hide-dotfiles-mode))
590 #+end_src
591 ** Git
592 *** Magit
593 # TODO: Write a command that commits hunk, skipping staging step.
594 #+begin_src emacs-lisp
595   (use-package magit)
596 #+end_src
597 *** Colored diff in line number area
598 #+begin_src emacs-lisp
599   (use-package diff-hl
600     :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
601     :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
602            (magit-post-refresh-hook . diff-hl-magit-post-refresh))
603     :config (global-diff-hl-mode))
604 #+end_src
605 *** Email
606 #+begin_src emacs-lisp
607   (use-package piem)
608   (use-package git-email
609     :straight (git-email :repo "https://git.sr.ht/~yoctocell/git-email")
610     :config (git-email-piem-mode))
611 #+end_src
612 ** Java
613 *** Evaluate current buffer
614 Stolen from https://stackoverflow.com/questions/19953924/how-do-you-run-java-codes-in-emacs
615 #+begin_src emacs-lisp
616   (defun java-eval-buffer ()
617     "run current program (that requires no input)"
618     (interactive)
619     (let* ((source (file-name-nondirectory buffer-file-name))
620            (out    (file-name-sans-extension source))
621            (class  (concat out ".class")))
622       (save-buffer)
623       (shell-command (format "rm -f %s && javac %s" class source))
624       (if (file-exists-p class)
625           (shell-command (format "java %s" out) "*scratch*")
626         (progn
627           (set (make-local-variable 'compile-command)
628                (format "javac %s" source))
629           (command-execute 'compile)))))
630 #+end_src
631 * General text editing
632 ** Indentation
633 Indent after every change.
634 #+begin_src emacs-lisp
635   (use-package aggressive-indent
636     :config (global-aggressive-indent-mode))
637 #+end_src
638 ** Spell checking
639 Spell check in text mode, and in prog-mode comments.
640 #+begin_src emacs-lisp
641   (dolist (hook '(text-mode-hook))
642     (add-hook hook (lambda () (flyspell-mode))))
643   (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
644     (add-hook hook (lambda () (flyspell-mode -1))))
645   (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
646 #+end_src
647 ** Expand tabs to spaces
648 #+begin_src emacs-lisp
649   (setq-default tab-width 2)
650 #+end_src
651 ** Copy kill ring to clipboard
652 #+begin_src emacs-lisp
653   (setq x-select-enable-clipboard t)
654   (defun copy-kill-ring-to-xorg ()
655     "Copy the current kill ring to the xorg clipboard."
656     (interactive)
657     (x-select-text (current-kill 0)))
658 #+end_src
659 ** Save place
660 Opens file where you left it.
661 #+begin_src emacs-lisp
662   (save-place-mode)
663 #+end_src
664 ** Writing mode
665 Distraction free writing a la junegunn/goyo.
666 #+begin_src emacs-lisp
667   (use-package olivetti
668     :config
669     (evil-leader/set-key "o" 'olivetti-mode))
670 #+end_src
671 ** Abbreviations
672 Abbreviate things!
673 #+begin_src emacs-lisp
674   (setq abbrev-file-name "~/.emacs.d/abbrevs.el")
675   (setq save-abbrevs 'silent)
676   (setq-default abbrev-mode t)
677 #+end_src
678 ** TRAMP
679 #+begin_src emacs-lisp
680   (setq tramp-default-method "ssh")
681 #+end_src
682 ** Don't ask about following symlinks in vc
683 #+begin_src emacs-lisp
684   (setq vc-follow-symlinks t)
685 #+end_src
686 ** Don't ask to save custom dictionary
687 #+begin_src emacs-lisp
688   (setq ispell-silently-savep t)
689 #+end_src
690 ** Open file as root
691 #+begin_src emacs-lisp
692   (defun doas-edit (&optional arg)
693     "Edit currently visited file as root.
694
695     With a prefix ARG prompt for a file to visit.
696     Will also prompt for a file to visit if current
697     buffer is not visiting a file.
698
699     Modified from Emacs Redux."
700     (interactive "P")
701     (if (or arg (not buffer-file-name))
702         (find-file (concat "/doas:root@localhost:"
703                            (ido-read-file-name "Find file(as root): ")))
704       (find-alternate-file (concat "/doas:root@localhost:" buffer-file-name))))
705
706     (global-set-key (kbd "C-x C-r") #'doas-edit)
707 #+end_src
708 * Keybindings
709 ** Switch windows
710 #+begin_src emacs-lisp
711   (use-package ace-window
712     :bind ("M-o" . ace-window))
713 #+end_src
714 ** Kill current buffer
715 Makes "C-x k" binding faster.
716 #+begin_src emacs-lisp
717   (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
718 #+end_src
719 * Other settings
720 ** OpenSCAD
721 #+begin_src emacs-lisp
722   (use-package scad-mode)
723 #+end_src
724 ** Control backup files
725 Stop backup files from spewing everywhere.
726 #+begin_src emacs-lisp
727   (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
728 #+end_src
729 ** Make yes/no easier
730 #+begin_src emacs-lisp
731   (defalias 'yes-or-no-p 'y-or-n-p)
732 #+end_src
733 ** Move customize file
734 No more clogging up init.el.
735 #+begin_src emacs-lisp
736   (setq custom-file "~/.emacs.d/custom.el")
737   (load custom-file)
738 #+end_src
739 ** Better help
740 #+begin_src emacs-lisp
741   (use-package helpful
742     :commands (helpful-callable helpful-variable helpful-command helpful-key)
743     :custom
744     (counsel-describe-function-function #'helpful-callable)
745     (counsel-describe-variable-function #'helpful-variable)
746     :bind
747     ([remap describe-function] . counsel-describe-function)
748     ([remap describe-command] . helpful-command)
749     ([remap describe-variable] . counsel-describe-variable)
750     ([remap describe-key] . helpful-key))
751 #+end_src
752 ** GPG
753 #+begin_src emacs-lisp
754   (use-package epa-file
755     :straight (:type built-in)
756     :custom
757     (epa-file-select-keys nil)
758     (epa-file-encrypt-to '("me@armaanb.net"))
759     (password-cache-expiry (* 60 15)))
760
761   (use-package pinentry
762     :config (pinentry-start))
763 #+end_src
764 ** Pastebin
765 #+begin_src emacs-lisp
766   (use-package 0x0
767     :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
768     :custom (0x0-default-service 'envs)
769     :config (evil-leader/set-key
770               "00" '0x0-upload
771               "0f" '0x0-upload-file
772               "0s" '0x0-upload-string
773               "0c" '0x0-upload-kill-ring
774               "0p" '0x0-upload-popup))
775 #+end_src
776 ** Automatically clean buffers
777 #+begin_src emacs-lisp
778   ;; Don't kill Circe buffers
779   (add-to-list 'clean-buffer-list-kill-never-regexps (lambda (buffer-name)
780                                                        (with-current-buffer buffer-name
781                                                          (derived-mode-p 'lui-mode))))
782   (midnight-mode)
783 #+end_src
784 * Tangles
785 ** Spectrwm
786 *** General settings
787 #+begin_src conf :tangle ~/.spectrwm.conf
788   workspace_limit = 5
789   warp_pointer = 1
790   modkey = Mod4
791   autorun = ws[1]:/home/armaa/Code/scripts/autostart
792 #+end_src
793 *** Bar
794 #+begin_src conf :tangle ~/.spectrwm.conf
795   bar_enabled = 0
796   bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
797 #+end_src
798 *** Keybindings
799 **** WM actions
800 #+begin_src conf :tangle ~/.spectrwm.conf
801   program[term] = st -e tmux
802   program[screenshot_all] = flameshot gui
803   program[notif] = /home/armaa/Code/scripts/setter status
804   program[pass] = /home/armaa/Code/scripts/passmenu
805
806   bind[notif] = MOD+n
807   bind[pass] = MOD+Shift+p
808 #+end_src
809 **** Media keys
810 #+begin_src conf :tangle ~/.spectrwm.conf
811   program[paup] = /home/armaa/Code/scripts/setter audio +5
812   program[padown] = /home/armaa/Code/scripts/setter audio -5
813   program[pamute] = /home/armaa/Code/scripts/setter audio
814   program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
815   program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
816   program[next] = playerctl next
817   program[prev] = playerctl previous
818   program[pause] = playerctl play-pause
819
820   bind[padown] = XF86AudioLowerVolume
821   bind[paup] = XF86AudioRaiseVolume
822   bind[pamute] = XF86AudioMute
823   bind[brigdown] = XF86MonBrightnessDown
824   bind[brigup] = XF86MonBrightnessUp
825   bind[pause] = XF86AudioPlay
826   bind[next] = XF86AudioNext
827   bind[prev] = XF86AudioPrev
828 #+end_src
829 **** HJKL
830 #+begin_src conf :tangle ~/.spectrwm.conf
831   program[h] = xdotool keyup h key --clearmodifiers Left
832   program[j] = xdotool keyup j key --clearmodifiers Down
833   program[k] = xdotool keyup k key --clearmodifiers Up
834   program[l] = xdotool keyup l key --clearmodifiers Right
835
836   bind[h] = MOD + Control + h
837   bind[j] = MOD + Control + j
838   bind[k] = MOD + Control + k
839   bind[l] = MOD + Control + l
840 #+end_src
841 **** Programs
842 #+begin_src conf :tangle ~/.spectrwm.conf
843   program[email] = emacsclient -c --eval "(mu4e)"
844   program[irc] = emacsclient -c --eval '(switch-to-buffer "irc.armaanb.net:6698")'
845   program[rss] = emacsclient -c --eval '(elfeed)'
846   program[calendar] = emacsclient -c --eval '(acheam-calendar)'
847   program[emacs] = emacsclient -c
848   program[firefox] = firefox
849   program[calc] = st -e because -l
850
851   bind[email] = MOD+Control+1
852   bind[irc] = MOD+Control+2
853   bind[rss] = MOD+Control+3
854   bind[calendar] = MOD+Control+4
855   bind[calc] = MOD+Control+5
856   bind[firefox] = MOD+Control+0
857   bind[emacs] = MOD+Control+Return
858 #+end_src
859 **** Quirks
860 #+begin_src conf :tangle ~/.spectrwm.conf
861   quirk[Castle Menu] = FLOAT
862   quirk[momen] = FLOAT
863 #+end_src
864 ** Ash
865 *** Options
866 #+begin_src conf :tangle ~/.config/ash/ashrc
867   set -o vi
868 #+end_src
869 *** Functions
870 **** Update all packages
871 #+begin_src shell :tangle ~/.config/ash/ashrc
872   color=$(tput setaf 5)
873   reset=$(tput sgr0)
874
875   apu() {
876       doas echo "${color}== upgrading with yay ==${reset}"
877       yay
878       echo ""
879       echo "${color}== checking for pacnew files ==${reset}"
880       doas pacdiff
881       echo
882       echo "${color}== upgrading flatpaks ==${reset}"
883       flatpak update
884       echo ""
885       echo "${color}== updating nvim plugins ==${reset}"
886       nvim +PlugUpdate +PlugUpgrade +qall
887       echo "Updated nvim plugins"
888       echo ""
889       echo "${color}You are entirely up to date!${reset}"
890   }
891 #+end_src
892 **** Clean all packages
893 #+begin_src shell :tangle ~/.config/ash/ashrc
894   apap() {
895       doas echo "${color}== cleaning pacman orphans ==${reset}"
896       (pacman -Qtdq | doas pacman -Rns - 2> /dev/null) || echo "No orphans"
897       echo ""
898       echo "${color}== cleaning flatpaks ==${reset}"
899       flatpak remove --unused
900       echo ""
901       echo "${color}== cleaning nvim plugins ==${reset}"
902       nvim +PlugClean +qall
903       echo "Cleaned nvim plugins"
904       echo ""
905       echo "${color}All orphans cleaned!${reset}"
906   }
907 #+end_src
908 **** Interact with 0x0
909 #+begin_src shell :tangle ~/.config/ash/ashrc
910   zxz="https://envs.sh"
911   ufile() { curl -F"file=@$1" "$zxz" ; }
912   upb() { curl -F"file=@-;" "$zxz" ; }
913   uurl() { curl -F"url=$1" "$zxz" ; }
914   ushort() { curl -F"shorten=$1" "$zxz" ; }
915   uclip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
916 #+end_src
917 **** Finger
918 #+begin_src shell :tangle ~/.config/ash/ashrc
919   finger() {
920       user=$(echo "$1" | cut -f 1 -d '@')
921       host=$(echo "$1" | cut -f 2 -d '@')
922       echo $user | nc "$host" 79
923   }
924 #+end_src
925 **** Upload to ftp.armaanb.net
926 #+begin_src shell :tangle ~/.config/ash/ashrc
927   pubup() {
928       rsync "$1" "root@armaanb.net:/var/ftp/pub/${2}"
929       echo "https://ftp.armaanb.net/pub/"$(basename "$1") | tee /dev/tty | xclip -sel c
930   }
931 #+end_src
932 *** Exports
933 #+begin_src shell :tangle ~/.config/ash/ashrc
934   export EDITOR="emacsclient -c"
935   export VISUAL="$EDITOR"
936   export TERM=xterm-256color # for compatability
937
938   export GPG_TTY="$(tty)"
939   export MANPAGER='nvim +Man!'
940   export PAGER='less'
941
942   export GTK_USE_PORTAL=1
943
944   export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
945   export PATH="/home/armaa/Code/scripts:$PATH" # prioritize my scripts
946   export PATH="/home/armaa/Code/scripts/bin:$PATH" # prioritize my bins
947   export PATH="$PATH:/home/armaa/.cargo/bin"
948   export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
949   export PATH="$PATH:/usr/sbin"
950   export PATH="$PATH:/opt/FreeTube/freetube"
951
952   export LC_ALL="en_US.UTF-8"
953   export LC_CTYPE="en_US.UTF-8"
954   export LANGUAGE="en_US.UTF-8"
955
956   export KISS_PATH="/home/armaa/Virtual/kiss/home/armaa/kiss-repo"
957   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
958   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
959   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
960   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
961   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
962 #+end_src
963 *** Aliases
964 **** SSH
965 #+begin_src shell :tangle ~/.config/ash/ashrc
966   alias bhoji-drop='ssh -p 23 root@armaanb.net'
967   alias irc='ssh root@armaanb.net -t abduco -A irc catgirl freenode'
968   alias union='ssh 192.168.1.18'
969   alias mine='ssh -p 23 root@pickupserver.cc'
970   alias tcf='ssh root@204.48.23.68'
971   alias ngmun='ssh root@157.245.89.25'
972   alias prox='ssh root@192.168.1.224'
973   alias ncq='ssh root@143.198.123.17'
974   alias envs='ssh acheam@envs.net'
975 #+end_src
976 **** File management
977 #+begin_src shell :tangle ~/.config/ash/ashrc
978   alias ls='ls -lh --group-directories-first'
979   alias la='ls -A'
980   alias df='df -h / /boot'
981   alias du='du -h'
982   alias free='free -h'
983   alias cp='cp -riv'
984   alias rm='rm -iv'
985   alias mv='mv -iv'
986   alias ln='ln -v'
987   alias grep='grep -in --color=auto'
988   alias mkdir='mkdir -pv'
989   alias lanex='java -jar ~/.local/share/lxc/lanxchange.jar'
990   emacs() { $EDITOR "$@" & }
991   alias vim="emacs"
992 #+end_src
993 **** System management
994 #+begin_src shell :tangle ~/.config/ash/ashrc
995   alias crontab='crontab-argh'
996   alias sudo='doas'
997   alias pasu='git -C ~/.password-store push'
998   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
999     yadm push'
1000 #+end_src
1001 **** Networking
1002 #+begin_src shell :tangle ~/.config/ash/ashrc
1003   alias ping='ping -c 10'
1004   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1005   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1006   alias plan='T=$(mktemp) && \
1007         rsync root@armaanb.net:/etc/finger/plan.txt "$T" && \
1008         TT=$(mktemp) && \
1009         head -n -2 $T > $TT && \
1010         vim $TT && \
1011         echo "\nLast updated: $(date -R)" >> "$TT" && \
1012         fold -sw 72 "$TT" > "$T"| \
1013         rsync "$T" root@armaanb.net:/etc/finger/plan.txt'
1014 #+end_src
1015 **** Virtual machines, chroots
1016 #+begin_src shell :tangle ~/.config/ash/ashrc
1017   alias ckiss="doas chrooter ~/Virtual/kiss"
1018   alias cdebian="doas chrooter ~/Virtual/debian bash"
1019   alias cwindows='devour qemu-system-x86_64 \
1020     -smp 3 \
1021     -cpu host \
1022     -enable-kvm \
1023     -m 3G \
1024     -device VGA,vgamem_mb=64 \
1025     -device intel-hda \
1026     -device hda-duplex \
1027     -net nic \
1028     -net user,smb=/home/armaa/Public \
1029     -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1030 #+end_src
1031 **** Python
1032 #+begin_src shell :tangle ~/.config/ash/ashrc
1033   alias pip="python -m pip"
1034   alias black="black -l 79"
1035 #+end_src
1036 **** Latin
1037 #+begin_src shell :tangle ~/.config/ash/ashrc
1038   alias words='gen-shell -c "words"'
1039   alias words-e='gen-shell -c "words ~E"'
1040 #+end_src
1041 **** Devour
1042 #+begin_src shell :tangle ~/.config/ash/ashrc
1043   alias zathura='devour zathura'
1044   alias cad='devour openscad'
1045   alias feh='devour feh'
1046 #+end_src
1047 **** Pacman
1048 #+begin_src shell :tangle ~/.config/ash/ashrc
1049   alias aps='yay -Ss'
1050   alias api='yay -Syu'
1051   alias apii='doas pacman -S'
1052   alias app='yay -Rns'
1053   alias azf='pacman -Q | fzf'
1054   alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1055 #+end_src
1056 **** Other
1057 #+begin_src shell :tangle ~/.config/ash/ashrc
1058   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1059     iflag=fullblock status=progress'
1060   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1061     iflag=fullblock status=progress'
1062   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
1063     --restrict-filenames -o '%(title)s.%(ext)s'"
1064   alias cal="cal -3 --color=auto"
1065   alias bc='bc -l'
1066 #+end_src
1067 ** IPython
1068 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1069   c.TerminalInteractiveShell.editing_mode = 'vi'
1070   c.InteractiveShell.colors = 'linux'
1071   c.TerminalInteractiveShell.confirm_exit = False
1072 #+end_src
1073 ** MPV
1074 Make MPV play a little bit smoother.
1075 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1076   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1077   hwdec=auto-copy
1078 #+end_src
1079 ** Inputrc
1080 For any GNU Readline programs
1081 #+begin_src conf :tangle ~/.inputrc
1082   set editing-mode emacs
1083 #+end_src
1084 ** Git
1085 *** User
1086 #+begin_src conf :tangle ~/.gitconfig
1087   [user]
1088   name = Armaan Bhojwani
1089   email = me@armaanb.net
1090   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1091 #+end_src
1092 *** Init
1093 #+begin_src conf :tangle ~/.gitconfig
1094   [init]
1095   defaultBranch = main
1096 #+end_src
1097 *** GPG
1098 #+begin_src conf :tangle ~/.gitconfig
1099   [gpg]
1100   program = gpg
1101 #+end_src
1102 *** Sendemail
1103 #+begin_src conf :tangle ~/.gitconfig
1104   [sendemail]
1105   smtpserver = smtp.mailbox.org
1106   smtpuser = me@armaanb.net
1107   smtpencryption = ssl
1108   smtpserverport = 465
1109   confirm = auto
1110 #+end_src
1111 *** Submodules
1112 #+begin_src conf :tangle ~/.gitconfig
1113   [submodule]
1114   recurse = true
1115 #+end_src
1116 *** Aliases
1117 #+begin_src conf :tangle ~/.gitconfig
1118   [alias]
1119   stat = diff --stat
1120   sclone = clone --depth 1
1121   sclean = clean -dfX
1122   a = add
1123   aa = add .
1124   c = commit
1125   quickfix = commit . --amend --no-edit
1126   p = push
1127   subup = submodule update --remote
1128   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1129   pushnc = push -o skip-ci
1130 #+end_src
1131 *** Commits
1132 #+begin_src conf :tangle ~/.gitconfig
1133   [commit]
1134   gpgsign = true
1135   verbose = true
1136 #+end_src
1137 ** Dunst
1138 Lightweight notification daemon.
1139 *** General
1140 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1141   [global]
1142   font = "JetBrains Mono Medium Nerd Font 11"
1143   allow_markup = yes
1144   format = "<b>%s</b>\n%b"
1145   sort = no
1146   indicate_hidden = yes
1147   alignment = center
1148   bounce_freq = 0
1149   show_age_threshold = 60
1150   word_wrap = yes
1151   ignore_newline = no
1152   geometry = "400x5-10+10"
1153   transparency = 0
1154   idle_threshold = 120
1155   monitor = 0
1156   sticky_history = yes
1157   line_height = 0
1158   separator_height = 1
1159   padding = 8
1160   horizontal_padding = 8
1161   max_icon_size = 32
1162   separator_color = "#ffffff"
1163   startup_notification = false
1164 #+end_src
1165 *** Modes
1166 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1167   [frame]
1168   width = 1
1169   color = "#ffffff"
1170
1171   [shortcuts]
1172   close = mod4+c
1173   close_all = mod4+shift+c
1174   history = mod4+ctrl+c
1175
1176   [urgency_low]
1177   background = "#222222"
1178   foreground = "#ffffff"
1179   highlight = "#ffffff"
1180   timeout = 5
1181
1182   [urgency_normal]
1183   background = "#222222"
1184   foreground = "#ffffff"
1185   highlight = "#ffffff"
1186   timeout = 15
1187
1188   [urgency_critical]
1189   background = "#222222"
1190   foreground = "#a60000"
1191   highlight = "#ffffff"
1192   timeout = 0
1193 #+end_src
1194 ** Zathura
1195 *** Options
1196 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1197   map <C-i> recolor
1198   map <A-b> toggle_statusbar
1199   set selection-clipboard clipboard
1200   set scroll-step 200
1201
1202   set window-title-basename "true"
1203   set selection-clipboard "clipboard"
1204 #+end_src
1205 *** Colors
1206 #+begin_src conf :tangle ~/.config/zathura/zathurarc
1207   set default-bg         "#000000"
1208   set default-fg         "#ffffff"
1209   set render-loading     true
1210   set render-loading-bg  "#000000"
1211   set render-loading-fg  "#ffffff"
1212
1213   set recolor-lightcolor "#000000" # bg
1214   set recolor-darkcolor  "#ffffff" # fg
1215   set recolor            "true"
1216 #+end_src
1217 ** Firefox
1218 *** Swap tab and URL bars
1219 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1220   #nav-bar {
1221       -moz-box-ordinal-group: 1 !important;
1222   }
1223
1224   #PersonalToolbar {
1225       -moz-box-ordinal-group: 2 !important;
1226   }
1227
1228   #titlebar {
1229       -moz-box-ordinal-group: 3 !important;
1230   }
1231 #+end_src
1232 *** Hide URL bar when not focused.
1233 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1234   #navigator-toolbox:not(:focus-within):not(:hover) {
1235       margin-top: -30px;
1236   }
1237
1238   #navigator-toolbox {
1239       transition: 0.1s margin-top ease-out;
1240   }
1241 #+end_src
1242 *** Black screen by default
1243 userChrome.css:
1244 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userChrome.css
1245   #main-window,
1246   #browser,
1247   #browser vbox#appcontent tabbrowser,
1248   #content,
1249   #tabbrowser-tabpanels,
1250   #tabbrowser-tabbox,
1251   browser[type="content-primary"],
1252   browser[type="content"] > html,
1253   .browserContainer {
1254       background: black !important;
1255       color: #fff !important;
1256   }
1257 #+end_src
1258
1259 userContent.css:
1260 #+begin_src css :tangle ~/.mozilla/firefox/armaan-release/chrome/userContent.css
1261   @-moz-document url("about:home"), url("about:blank"), url("about:newtab") {
1262       body {
1263           background: black !important;
1264       }
1265   }
1266 #+end_src
1267 ** Xresources
1268 Modus operandi theme.
1269 #+begin_src conf :tangle ~/.Xresources
1270   ! special
1271   ,*.foreground:   #ffffff
1272   ,*.background:   #000000
1273   ,*.cursorColor:  #ffffff
1274
1275   ! black
1276   ,*.color0:       #000000
1277   ,*.color8:       #555555
1278
1279   ! red
1280   ,*.color1:       #ff8059
1281   ,*.color9:       #ffa0a0
1282
1283   ! green
1284   ,*.color2:       #00fc50
1285   ,*.color10:      #88cf88
1286
1287   ! yellow
1288   ,*.color3:       #eecc00
1289   ,*.color11:      #d2b580
1290
1291   ! blue
1292   ,*.color4:       #29aeff
1293   ,*.color12:      #92baff
1294
1295   ! magenta
1296   ,*.color5:       #feacd0
1297   ,*.color13:      #e0b2d6
1298
1299   ! cyan
1300   ,*.color6:       #00d3d0
1301   ,*.color14:      #a0bfdf
1302
1303   ! white
1304   ,*.color7:       #eeeeee
1305   ,*.color15:      #dddddd
1306 #+end_src
1307 ** Tmux
1308 #+begin_src conf :tangle ~/.tmux.conf
1309   set -g status off
1310   set -g mouse on
1311   set-window-option -g mode-keys vi
1312   bind-key -T copy-mode-vi 'v' send -X begin-selection
1313   bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel 'xclip -in -selection clipboard'
1314 #+end_src
1315 ** GPG
1316 *** Config
1317 #+begin_src conf :tangle ~/.gnupg/gpg.conf
1318   default-key 3C9ED82FFE788E4A
1319   use-agent
1320 #+end_src
1321 *** Agent
1322 #+begin_src conf :tangle ~/.gnupg/gpg-agent.conf
1323   pinentry-program /sbin/pinentry-gnome3
1324   max-cache-ttl 600
1325   default-cache-ttl 600
1326   allow-emacs-pinentry
1327 #+end_src