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