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