]> git.armaanb.net Git - config.org.git/blob - config.org
Set default TRAMP method
[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     :hook (magit-mode-hook. pinentry-start))
620 #+end_src
621 *** Colored diff in line number area
622 #+begin_src emacs-lisp
623   (use-package diff-hl
624     :straight (diff-hl :type git :host github :repo "dgutov/diff-hl")
625     :hook ((magit-pre-refresh-hook . diff-hl-magit-pre-refresh)
626            (magit-post-refresh-hook . diff-hl-magit-post-refresh))
627     :config (global-diff-hl-mode))
628 #+end_src
629 * General text editing
630 ** Indentation
631 Indent after every change.
632 #+begin_src emacs-lisp
633   (use-package aggressive-indent
634     :config (global-aggressive-indent-mode))
635 #+end_src
636 ** Spell checking
637 Spell check in text mode, and in prog-mode comments.
638 #+begin_src emacs-lisp
639   (dolist (hook '(text-mode-hook))
640     (add-hook hook (lambda () (flyspell-mode))))
641   (dolist (hook '(change-log-mode-hook log-edit-mode-hook))
642     (add-hook hook (lambda () (flyspell-mode -1))))
643   (add-hook 'prog-mode (lambda () (flyspell-prog mode)))
644 #+end_src
645 ** Expand tabs to spaces
646 #+begin_src emacs-lisp
647   (setq-default tab-width 2)
648 #+end_src
649 ** Copy kill ring to clipboard
650 #+begin_src emacs-lisp
651   (setq x-select-enable-clipboard t)
652   (defun copy-kill-ring-to-xorg ()
653     "Copy the current kill ring to the xorg clipboard."
654     (interactive)
655     (x-select-text (current-kill 0)))
656 #+end_src
657 ** Browse kill ring
658 #+begin_src emacs-lisp
659   (use-package browse-kill-ring)
660 #+end_src
661 ** Save place
662 Opens file where you left it.
663 #+begin_src emacs-lisp
664   (save-place-mode)
665 #+end_src
666 ** Writing mode
667 Distraction free writing a la junegunn/goyo.
668 #+begin_src emacs-lisp
669   (use-package olivetti
670     :config
671     (evil-leader/set-key "o" 'olivetti-mode))
672 #+end_src
673 ** Abbreviations
674 Abbreviate things!
675 #+begin_src emacs-lisp
676   (setq abbrev-file-name "~/.emacs.d/abbrevs")
677   (setq save-abbrevs 'silent)
678   (setq-default abbrev-mode t)
679 #+end_src
680 ** TRAMP
681 #+begin_src emacs-lisp
682   (setq tramp-default-method "ssh")
683 #+end_src
684 * Functions
685 ** Easily convert splits
686 Converts splits from horizontal to vertical and vice versa. Lifted from EmacsWiki.
687 #+begin_src emacs-lisp
688   (defun toggle-window-split ()
689     (interactive)
690     (if (= (count-windows) 2)
691         (let* ((this-win-buffer (window-buffer))
692                (next-win-buffer (window-buffer (next-window)))
693                (this-win-edges (window-edges (selected-window)))
694                (next-win-edges (window-edges (next-window)))
695                (this-win-2nd (not (and (<= (car this-win-edges)
696                                            (car next-win-edges))
697                                        (<= (cadr this-win-edges)
698                                            (cadr next-win-edges)))))
699                (splitter
700                 (if (= (car this-win-edges)
701                        (car (window-edges (next-window))))
702                     'split-window-horizontally
703                   'split-window-vertically)))
704           (delete-other-windows)
705           (let ((first-win (selected-window)))
706             (funcall splitter)
707             (if this-win-2nd (other-window 1))
708             (set-window-buffer (selected-window) this-win-buffer)
709             (set-window-buffer (next-window) next-win-buffer)
710             (select-window first-win)
711             (if this-win-2nd (other-window 1))))))
712
713   (define-key ctl-x-4-map "t" 'toggle-window-split)
714 #+end_src
715 ** Insert date
716 #+begin_src emacs-lisp
717   (defun insert-date ()
718     (interactive)
719     (insert (format-time-string "%Y-%m-%d")))
720 #+end_src
721 * Keybindings
722 ** Switch windows
723 #+begin_src emacs-lisp
724   (use-package ace-window
725     :bind ("M-o" . ace-window))
726 #+end_src
727 ** Kill current buffer
728 Makes "C-x k" binding faster.
729 #+begin_src emacs-lisp
730   (substitute-key-definition 'kill-buffer 'kill-buffer-and-window global-map)
731 #+end_src
732 * Other settings
733 ** OpenSCAD
734 Render OpenSCAD files, and add a preview window.
735
736 Personal fork just merges a PR.
737 #+begin_src emacs-lisp
738   (use-package scad-mode)
739   (use-package scad-preview
740     :straight (scad-preview :type git :host github :repo "Armaanb/scad-preview"))
741 #+end_src
742 ** Control backup files
743 Stop backup files from spewing everywhere.
744 #+begin_src emacs-lisp
745   (setq backup-directory-alist `(("." . "~/.emacs.d/backups")))
746 #+end_src
747 ** Make yes/no easier
748 #+begin_src emacs-lisp
749   (defalias 'yes-or-no-p 'y-or-n-p)
750 #+end_src
751 ** Move customize file
752 No more clogging up init.el.
753 #+begin_src emacs-lisp
754   (setq custom-file "~/.emacs.d/custom.el")
755   (load custom-file)
756 #+end_src
757 ** Better help
758 #+begin_src emacs-lisp
759   (use-package helpful
760     :commands (helpful-callable helpful-variable helpful-command helpful-key)
761     :custom
762     (counsel-describe-function-function #'helpful-callable)
763     (counsel-describe-variable-function #'helpful-variable)
764     :bind
765     ([remap describe-function] . counsel-describe-function)
766     ([remap describe-command] . helpful-command)
767     ([remap describe-variable] . counsel-describe-variable)
768     ([remap describe-key] . helpful-key))
769 #+end_src
770 ** GPG
771 #+begin_src emacs-lisp
772   (use-package epa-file
773     :straight (:type built-in))
774   (setq 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 #+end_src
780 ** Pastebin
781 #+begin_src emacs-lisp
782   (use-package 0x0
783     :straight (0x0 :type git :repo "https://git.sr.ht/~zge/nullpointer-emacs")
784     :custom (0x0-default-service 'envs)
785     :config (evil-leader/set-key
786               "00" '0x0-upload
787               "0f" '0x0-upload-file
788               "0s" '0x0-upload-string
789               "0c" '0x0-upload-kill-ring
790               "0p" '0x0-upload-popup))
791 #+end_src
792 * Tangles
793 ** Spectrwm
794 *** General settings
795 #+begin_src conf :tangle ~/.spectrwm.conf
796   workspace_limit = 5
797   warp_pointer = 1
798   modkey = Mod4
799   border_width = 4
800   tile_gap = 10
801   autorun = ws[1]:/home/armaa/Code/scripts/autostart
802 #+end_src
803 *** Apprearance
804 Gruvbox colors
805 #+begin_src conf :tangle ~/.spectrwm.conf
806   color_focus = rgb:83/a5/98
807   color_focus_maximized = rgb:d6/5d/0e
808   color_unfocus = rgb:58/58/58
809 #+end_src
810 *** Bar
811 #+begin_src conf :tangle ~/.spectrwm.conf
812   bar_enabled = 0
813   bar_font = xos4 Fira Code:pixelsize=14:antialias=true # any installed font
814 #+end_src
815 *** Keybindings
816 **** WM actions
817 #+begin_src conf :tangle ~/.spectrwm.conf
818   program[lock] = i3lock -c 000000 -ef
819   program[term] = alacritty
820   program[screenshot_all] = flameshot gui
821   program[menu] = rofi -show run # `rofi-dmenu` handles the rest
822   program[switcher] = rofi -show window
823   program[notif] = /home/armaa/Code/scripts/setter status
824
825   bind[notif] = MOD+n
826   bind[switcher] = MOD+Tab
827 #+end_src
828 **** Media keys
829 #+begin_src conf :tangle ~/.spectrwm.conf
830   program[paup] = /home/armaa/Code/scripts/setter audio +5
831   program[padown] = /home/armaa/Code/scripts/setter audio -5
832   program[pamute] = /home/armaa/Code/scripts/setter audio
833   program[brigup] = /home/armaa/Code/scripts/setter brightness +10%
834   program[brigdown] = /home/armaa/Code/scripts/setter brightness 10%-
835   program[next] = playerctl next
836   program[prev] = playerctl previous
837   program[pause] = playerctl play-pause
838
839   bind[padown] = XF86AudioLowerVolume
840   bind[paup] = XF86AudioRaiseVolume
841   bind[pamute] = XF86AudioMute
842   bind[brigdown] = XF86MonBrightnessDown
843   bind[brigup] = XF86MonBrightnessUp
844   bind[pause] = XF86AudioPlay
845   bind[next] = XF86AudioNext
846   bind[prev] = XF86AudioPrev
847 #+end_src
848 **** HJKL
849 #+begin_src conf :tangle ~/.spectrwm.conf
850   program[h] = xdotool keyup h key --clearmodifiers Left
851   program[j] = xdotool keyup j key --clearmodifiers Down
852   program[k] = xdotool keyup k key --clearmodifiers Up
853   program[l] = xdotool keyup l key --clearmodifiers Right
854
855   bind[h] = MOD + Control + h
856   bind[j] = MOD + Control + j
857   bind[k] = MOD + Control + k
858   bind[l] = MOD + Control + l
859 #+end_src
860 **** Programs
861 #+begin_src conf :tangle ~/.spectrwm.conf
862   program[aerc] = alacritty -e aerc
863   program[weechat] = alacritty --hold -e sh -c "while : ; do ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat; sleep 2; done"
864   program[emacs] = emacsclient -c
865   program[emacs-anywhere] = emacsclient --eval "(emacs-everywhere)"
866   program[firefox] = firefox
867   program[thunderbird] = thunderbird
868   program[slack] = slack
869
870   bind[aerc] = MOD+Control+s
871   bind[weechat] = MOD+Control+d
872   bind[emacs] = MOD+Control+f
873   bind[emacs-anywhere] = MOD+f
874   bind[firefox] = MOD+Control+u
875   bind[thunderbird] = MOD+Control+i
876   bind[slack] = MOD+Control+o
877 #+end_src
878 ** Zsh
879 *** Settings
880 **** Completions
881 #+begin_src shell :tangle ~/.config/zsh/zshrc
882   autoload -Uz compinit
883   compinit
884
885   setopt no_case_glob
886   unsetopt glob_complete
887 #+end_src
888 **** Vim bindings
889 #+begin_src shell :tangle ~/.config/zsh/zshrc
890   bindkey -v
891   KEYTIMEOUT=1
892
893   bindkey -M vicmd "^[[3~" delete-char
894   bindkey "^[[3~" delete-char
895
896   autoload edit-command-line
897   zle -N edit-command-line
898   bindkey -M vicmd ^e edit-command-line
899   bindkey ^e edit-command-line
900 #+end_src
901 **** History
902 #+begin_src shell :tangle ~/.config/zsh/zshrc
903   setopt extended_history
904   setopt share_history
905   setopt inc_append_history
906   setopt hist_ignore_dups
907   setopt hist_reduce_blanks
908
909   HISTSIZE=10000
910   SAVEHIST=10000
911   HISTFILE=~/.local/share/zsh/history
912 #+end_src
913 *** Plugins
914 I manage plugins using my own plugin manager, ZPE. https://git.sr.ht/~armaan/zpe
915 **** ZPE
916 #+begin_src plain :tangle ~/.config/zpe/repositories
917     https://github.com/Aloxaf/fzf-tab
918     https://github.com/zdharma/fast-syntax-highlighting
919     https://github.com/rupa/z
920 #+end_src
921 **** Zshrc
922 #+begin_src shell :tangle ~/.config/zsh/zshrc
923   source ~/Code/zpe/zpe.sh
924   source ~/Code/admone/admone.zsh
925   source ~/.config/zsh/fzf-bindings.zsh
926
927   zpe-source fzf-tab/fzf-tab.zsh
928   zstyle ':completion:*:descriptions' format '[%d]'
929   zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1 --color=always $realpath'
930   zstyle ':completion:*' completer _complete
931   zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' \
932          'm:{a-zA-Z}={A-Za-z} l:|=* r:|=*'
933   enable-fzf-tab
934   zpe-source fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh
935   export _Z_DATA="/home/armaa/.local/share/z"
936   zpe-source z/z.sh
937 #+end_src
938 *** Functions
939 **** Alert after long command
940 #+begin_src shell :tangle ~/.config/zsh/zshrc
941   alert() {
942       notify-send --urgency=low -i ${(%):-%(?.terminal.error)} \
943                   ${history[$HISTCMD]%[;&|][[:space:]]##alert}
944   }
945 #+end_src
946 **** Time Zsh startup
947 #+begin_src shell :tangle ~/.config/zsh/zshrc
948   timezsh() {
949       for i in $(seq 1 10); do
950           time "zsh" -i -c exit;
951       done
952   }
953 #+end_src
954 **** Update all packages
955 #+begin_src shell :tangle ~/.config/zsh/zshrc
956   color=$(tput setaf 5)
957   reset=$(tput sgr0)
958
959   apu() {
960       sudo echo "${color}== upgrading with yay ==${reset}"
961       yay
962       echo ""
963       echo "${color}== checking for pacnew files ==${reset}"
964       sudo pacdiff
965       echo
966       echo "${color}== upgrading flatpaks ==${reset}"
967       flatpak update
968       echo ""
969       echo "${color}== upgrading zsh plugins ==${reset}"
970       zpe-pull
971       echo ""
972       echo "${color}== updating nvim plugins ==${reset}"
973       nvim +PlugUpdate +PlugUpgrade +qall
974       echo "Updated nvim plugins"
975       echo ""
976       echo "${color}You are entirely up to date!${reset}"
977   }
978 #+end_src
979 **** Clean all packages
980 #+begin_src shell :tangle ~/.config/zsh/zshrc
981   apap() {
982       sudo echo "${color}== cleaning pacman orphans ==${reset}"
983       (pacman -Qtdq | sudo pacman -Rns - 2> /dev/null) || echo "No orphans"
984       echo ""
985       echo "${color}== cleaning flatpaks ==${reset}"
986       flatpak remove --unused
987       echo ""
988       echo "${color}== cleaning zsh plugins ==${reset}"
989       zpe-clean
990       echo ""
991       echo "${color}== cleaning nvim plugins ==${reset}"
992       nvim +PlugClean +qall
993       echo "Cleaned nvim plugins"
994       echo ""
995       echo "${color}All orphans cleaned!${reset}"
996   }
997 #+end_src
998 **** ls every cd
999 #+begin_src shell :tangle ~/.config/zsh/zshrc
1000   chpwd() {
1001       emulate -L zsh
1002       exa -lh --icons --git --group-directories-first
1003   }
1004 #+end_src
1005 **** Setup anaconda
1006 #+begin_src shell :tangle ~/.config/zsh/zshrc
1007   zconda() {
1008       __conda_setup="$('/opt/anaconda/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
1009       if [ $? -eq 0 ]; then
1010           eval "$__conda_setup"
1011       else
1012           if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
1013               . "/opt/anaconda/etc/profile.d/conda.sh"
1014           else
1015               export PATH="/opt/anaconda/bin:$PATH"
1016           fi
1017       fi
1018       unset __conda_setup
1019   }
1020 #+end_src
1021 **** Interact with 0x0
1022 #+begin_src shell :tangle ~/.config/zsh/zshrc
1023   zxz="https://envs.sh"
1024   0file() { curl -F"file=@$1" "$zxz" ; }
1025   0pb() { curl -F"file=@-;" "$zxz" ; }
1026   0url() { curl -F"url=$1" "$zxz" ; }
1027   0short() { curl -F"shorten=$1" "$zxz" ; }
1028   0clip() { xclip -out | curl -F"file=@-;" "$zxz" ; }
1029 #+end_src
1030 **** Swap two files
1031 #+begin_src shell :tangle ~/.config/zsh/zshrc
1032   sw() {
1033       mv $1 $1.tmp
1034       mv $2 $1
1035       mv $1.tmp $2
1036   }
1037 #+end_src
1038 *** Aliases
1039 **** SSH
1040 #+begin_src shell :tangle ~/.config/zsh/zshrc
1041   alias bhoji-drop='ssh -p 23 root@armaanb.net'
1042   alias weechat='ssh -p 23 -t root@armaanb.net tmux attach-session -t weechat'
1043   alias tcf='ssh root@204.48.23.68'
1044   alias ngmun='ssh root@157.245.89.25'
1045   alias prox='ssh root@192.168.1.224'
1046   alias dock='ssh root@192.168.1.225'
1047   alias jenkins='ssh root@192.168.1.226'
1048   alias envs='ssh acheam@envs.net'
1049 #+end_src
1050 **** File management
1051 #+begin_src shell :tangle ~/.config/zsh/zshrc
1052   alias ls='exa -lh --icons --git --group-directories-first'
1053   alias la='exa -lha --icons --git --group-directories-first'
1054   alias df='df -h / /boot'
1055   alias du='du -h'
1056   alias free='free -h'
1057   alias cp='cp -riv'
1058   alias rm='rm -Iv'
1059   alias mv='mv -iv'
1060   alias ln='ln -iv'
1061   alias grep='grep -in --exclude-dir=.git --color=auto'
1062   alias mkdir='mkdir -pv'
1063   alias unar='atool -x'
1064   alias wget='wget -e robots=off'
1065   alias lanex='~/.local/share/lxc/lxc'
1066 #+end_src
1067 **** Dotfiles
1068 #+begin_src shell :tangle ~/.config/zsh/zshrc
1069   alias padm='yadm --yadm-repo ~/Code/dotfiles/repo.git'
1070   alias yadu='yadm add -u && yadm commit -m "Updated `date -Iseconds`" && \
1071     yadm push'
1072   alias padu='padm add -u && padm commit && padm push && yadu'
1073 #+end_src
1074 **** Editing
1075 #+begin_src shell :tangle ~/.config/zsh/zshrc
1076   alias v='nvim'
1077   alias vim='nvim'
1078   alias vw="nvim ~/Documents/vimwiki/index.md"
1079 #+end_src
1080 **** System management
1081 #+begin_src shell :tangle ~/.config/zsh/zshrc
1082   alias jctl='journalctl -p 3 -xb'
1083   alias pkill='pkill -i'
1084   alias cx='chmod +x'
1085   alias please='sudo $(fc -ln -1)'
1086   alias sudo='sudo ' # allows aliases to be run with sudo
1087 #+end_src
1088 **** Networking
1089 #+begin_src shell :tangle ~/.config/zsh/zshrc
1090   alias ping='ping -c 10'
1091   alias speed='speedtest-cli'
1092   alias ip='ip --color=auto'
1093   alias cip='curl https://armaanb.net/ip'
1094   alias gps='gpg --keyserver keyserver.ubuntu.com --search-keys'
1095   alias gpp='gpg --keyserver keyserver.ubuntu.com --recv-key'
1096 #+end_src
1097 **** Docker
1098 #+begin_src shell :tangle ~/.config/zsh/zshrc
1099   alias dc='docker-compose'
1100   alias dcdu='docker-compose down && docker-compose up -d'
1101 #+end_src
1102 **** Other
1103 #+begin_src shell :tangle ~/.config/zsh/zshrc
1104   alias bigrandomfile='dd if=/dev/urandom of=1GB-urandom bs=1M count=1024 \
1105     iflag=fullblock status=progress'
1106   alias bigboringfile='dd if=/dev/zero of=1GB-zero bs=1M count=1024 \
1107     iflag=fullblock status=progress'
1108   alias ts='gen-shell -c task'
1109   alias ts='gen-shell -c task'
1110   alias tetris='autoload -Uz tetriscurses && tetriscurses'
1111   alias news='newsboat'
1112   alias tilderadio="\mpv https://radio.tildeverse.org/radio/8000/radio.ogg"
1113   alias ytmusic="youtube-dl -x --add-metadata  --audio-format aac \
1114     --restrict-filenames -o '%(title)s.%(ext)s'"
1115   alias cal="cal -3 --color=auto"
1116 #+end_src
1117 **** Virtual machines, chroots
1118 #+begin_src shell :tangle ~/.config/zsh/zshrc
1119   alias ckiss="sudo chrooter ~/Virtual/kiss"
1120   alias cdebian="sudo chrooter ~/Virtual/debian bash"
1121   alias cwindows='devour qemu-system-x86_64 \
1122     -smp 3 \
1123     -cpu host \
1124     -enable-kvm \
1125     -m 3G \
1126     -device VGA,vgamem_mb=64 \
1127     -device intel-hda \
1128     -device hda-duplex \
1129     -net nic \
1130     -net user,smb=/home/armaa/Public \
1131     -drive format=qcow2,file=/home/armaa/Virtual/windows.qcow2'
1132 #+end_src
1133 **** Python
1134 #+begin_src shell :tangle ~/.config/zsh/zshrc
1135   alias ipy="ipython"
1136   alias zpy="zconda && ipython"
1137   alias math="ipython --profile=math"
1138   alias pypi="python setup.py sdist && twine upload dist/*"
1139   alias pip="python -m pip"
1140   alias black="black -l 79"
1141 #+end_src
1142 **** Latin
1143 #+begin_src shell :tangle ~/.config/zsh/zshrc
1144   alias words='gen-shell -c "words"'
1145   alias words-e='gen-shell -c "words ~E"'
1146 #+end_src
1147 **** Devour
1148 #+begin_src shell :tangle ~/.config/zsh/zshrc
1149   alias zathura='devour zathura'
1150   alias mpv='devour mpv'
1151   alias sql='devour sqlitebrowser'
1152   alias cad='devour openscad'
1153   alias feh='devour feh'
1154 #+end_src
1155 **** Package management (Pacman)
1156 #+begin_src shell :tangle ~/.config/zsh/zshrc
1157   alias aps='yay -Ss'
1158   alias api='yay -Syu'
1159   alias app='yay -Rns'
1160   alias apc='yay -Sc'
1161   alias apo='yay -Qttd'
1162   alias azf='pacman -Q | fzf'
1163   alias favorites='pacman -Qe | cut -d " " -f 1 > ~/Documents/favorites'
1164   alias ufetch='ufetch-arch'
1165   alias reflect='reflector --verbose --sort rate --save \
1166     ~/.local/etc/pacman.d/mirrorlist --download-timeout 60' # Takes ~45m to run
1167 #+end_src
1168 *** Exports
1169 #+begin_src shell :tangle ~/.config/zsh/zshrc
1170   export EDITOR="emacsclient -c"                  # $EDITOR opens in terminal
1171   export VISUAL="emacsclient -c -a emacs"         # $VISUAL opens in GUI mode
1172   export TERM=xterm-256color # for compatability
1173
1174   export GPG_TTY="$(tty)"
1175   export MANPAGER='nvim +Man!'
1176   export PAGER='less'
1177
1178   # generated with "vivid generate gruvbox"
1179   export LS_COLORS="$(cat ~/.local/share/zsh/gruvbox)"
1180
1181   export GTK_USE_PORTAL=1
1182
1183   export PATH="/home/armaa/.local/bin:$PATH" # prioritize .local/bin
1184   export PATH="$PATH:/home/armaa/Code/scripts"
1185   export PATH="$PATH:/home/armaa/.cargo/bin"
1186   export PATH="$PATH:/home/armaa/.local/share/gem/ruby/2.7.0/bin"
1187   export PATH="$PATH:/usr/sbin"
1188   export PATH="$PATH:/opt/FreeTube/freetube"
1189
1190   export LC_ALL="en_US.UTF-8"
1191   export LC_CTYPE="en_US.UTF-8"
1192   export LANGUAGE="en_US.UTF-8"
1193
1194   export KISS_PATH="/home/armaa/kiss/home/armaa/kiss-repo"
1195   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/core"
1196   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/extra"
1197   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/xorg"
1198   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-main/testing"
1199   export KISS_PATH="$KISS_PATH:/home/armaa/Clone/repo-community/community"
1200 #+end_src
1201 ** Alacritty
1202 *** Appearance
1203 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1204 font:
1205   normal:
1206     family: JetBrains Mono Nerd Font
1207     style: Medium
1208   italic:
1209     style: Italic
1210   Bold:
1211     style: Bold
1212   size: 7
1213   ligatures: true # Requires ligature patch
1214
1215 window:
1216   padding:
1217     x: 5
1218     y: 5
1219
1220 background_opacity: 0.6
1221 #+end_src
1222 *** Keybindings
1223 Send <RET> + modifier through
1224 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1225 key_bindings:
1226   - {
1227     key: Return,
1228     mods: Shift,
1229     chars: "\x1b[13;2u"
1230   }
1231   - {
1232     key: Return,
1233     mods: Control,
1234     chars: "\x1b[13;5u"
1235   }
1236 #+end_src
1237 *** Color scheme
1238 Gruvbox
1239 #+begin_src yml :tangle ~/.config/alacritty/alacritty.yml
1240 colors:
1241   # Default colors
1242   primary:
1243     background: '#000000'
1244     foreground: '#ebdbb2'
1245
1246   # Normal colors
1247   normal:
1248     black:   '#282828'
1249     red:     '#cc241d'
1250     green:   '#98971a'
1251     yellow:  '#d79921'
1252     blue:    '#458588'
1253     magenta: '#b16286'
1254     cyan:    '#689d6a'
1255     white:   '#a89984'
1256
1257   # Bright colors
1258   bright:
1259     black:   '#928374'
1260     red:     '#fb4934'
1261     green:   '#b8bb26'
1262     yellow:  '#fabd2f'
1263     blue:    '#83a598'
1264     magenta: '#d3869b'
1265     cyan:    '#8ec07c'
1266     white:   '#ebdbb2'
1267 #+end_src
1268 ** IPython
1269 *** General
1270 Symlink profile_default/ipython_config.py to profile_math/ipython_config.py
1271 #+begin_src python :tangle ~/.ipython/profile_default/ipython_config.py
1272   c.TerminalInteractiveShell.editing_mode = 'vi'
1273   c.InteractiveShell.colors = 'linux'
1274   c.TerminalInteractiveShell.confirm_exit = False
1275 #+end_src
1276 *** Math
1277 #+begin_src python :tangle ~/.ipython/profile_math/startup.py
1278   from math import *
1279
1280   def deg(x):
1281       return x * (180 /  pi)
1282
1283   def rad(x):
1284       return x * (pi / 180)
1285
1286   def rad(x, unit):
1287       return (x * (pi / 180)) / unit
1288
1289   def csc(x):
1290       return 1 / sin(x)
1291
1292   def sec(x):
1293       return 1 / cos(x)
1294
1295   def cot(x):
1296       return 1 / tan(x)
1297 #+end_src
1298 ** MPV
1299 Make MPV play a little bit smoother.
1300 #+begin_src conf :tangle ~/.config/mpv/mpv.conf
1301   ytdl-format="bestvideo[height<=?1080]+bestaudio/best"
1302   hwdec=auto-copy
1303 #+end_src
1304 ** Picom
1305 *** Shadows
1306 #+begin_src conf :tangle ~/.config/picom/picom.conf
1307   shadow = true;
1308   shadow-radius = 10;
1309   shadow-offset-x = -5;
1310   shadow-offset-y = -5;
1311 #+end_src
1312 *** Fading
1313 #+begin_src conf :tangle ~/.config/picom/picom.conf
1314   fading = true
1315   fade-delta = 5
1316 #+end_src
1317 *** Blur
1318 #+begin_src conf :tangle ~/.config/picom/picom.conf
1319   blur:
1320   {
1321   method = "gaussian";
1322   size = 5;
1323   deviation = 5;
1324   };
1325 #+end_src
1326 *** Backend
1327 Needs picom to be run with "--experimental-backends"
1328 #+begin_src conf :tangle ~/.config/picom/picom.conf
1329   backend = "glx";
1330 #+end_src
1331 ** Inputrc
1332 For any GNU Readline programs
1333 #+begin_src plain :tangle ~/.inputrc
1334   set editing-mode vi
1335 #+end_src
1336 ** Vivid
1337 https://github.com/sharkdp/vivid
1338 *** Colors
1339 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1340   colors:
1341     background_color: '282A36'
1342     black: '21222C'
1343     orange: 'd65d0e'
1344     purple: 'b16286'
1345     red: 'cc241d'
1346     blue: '458588'
1347     pink: 'd3869b'
1348     lime: '689d6a'
1349
1350     gray: '928374'
1351 #+end_src
1352 *** Core
1353 #+begin_src yml :tangle ~/.config/vivid/gruvbox.yml
1354   core:
1355     regular_file: {}
1356
1357     directory:
1358       foreground: blue
1359
1360     executable_file:
1361       foreground: red
1362       font-style: bold
1363
1364     symlink:
1365       foreground: pink
1366
1367     broken_symlink:
1368       foreground: black
1369       background: red
1370     missing_symlink_target:
1371       foreground: black
1372       background: red
1373
1374     fifo:
1375       foreground: black
1376       background: blue
1377
1378     socket:
1379       foreground: black
1380       background: pink
1381
1382     character_device:
1383       foreground: black
1384       background: lime
1385
1386     block_device:
1387       foreground: black
1388       background: red
1389
1390     normal_text:
1391       {}
1392
1393     sticky:
1394       {}
1395
1396     sticky_other_writable:
1397       {}
1398
1399     other_writable:
1400       {}
1401
1402   text:
1403     special:
1404       foreground: black
1405       background: orange
1406
1407     todo:
1408       font-style: bold
1409
1410     licenses:
1411       foreground: gray
1412
1413     configuration:
1414       foreground: orange
1415
1416     other:
1417       foreground: orange
1418
1419   markup:
1420     foreground: orange
1421
1422   programming:
1423     source:
1424       foreground: purple
1425
1426     tooling:
1427       foreground: purple
1428
1429       continuous-integration:
1430         foreground: purple
1431
1432   media:
1433     foreground: pink
1434
1435   office:
1436     foreground: red
1437
1438   archives:
1439     foreground: lime
1440     font-style: underline
1441
1442   executable:
1443     foreground: red
1444     font-style: bold
1445
1446   unimportant:
1447     foreground: gray
1448 #+end_src
1449 ** Git
1450 *** User
1451 #+begin_src plain :tangle ~/.gitconfig
1452 [user]
1453   name = Armaan Bhojwani
1454   email = me@armaanb.net
1455   signingkey = 0FEB9471E19C49C60CFBEB133C9ED82FFE788E4A
1456 #+end_src
1457 *** Init
1458 #+begin_src plain :tangle ~/.gitconfig
1459 [init]
1460   defaultBranch = main
1461 #+end_src
1462 *** GPG
1463 #+begin_src plain :tangle ~/.gitconfig
1464 [gpg]
1465   program = gpg
1466 #+end_src
1467 *** Sendemail
1468 #+begin_src plain :tangle ~/.gitconfig
1469 [sendemail]
1470   smtpserver = smtp.mailbox.org
1471   smtpuser = me@armaanb.net
1472   smtpencryption = ssl
1473   smtpserverport = 465
1474   confirm = auto
1475 #+end_src
1476 *** Submodules
1477 #+begin_src plain :tangle ~/.gitconfig
1478 [submodule]
1479   recurse = true
1480 #+end_src
1481 *** Aliases
1482 #+begin_src plain :tangle ~/.gitconfig
1483 [alias]
1484   stat = diff --stat
1485   sclone = clone --depth 1
1486   sclean = clean -dfX
1487   a = add
1488   aa = add .
1489   c = commit
1490   p = push
1491   subup = submodule update --remote
1492   loc = diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Empty hash
1493   mirror = git config --global alias.mirrormirror
1494 #+end_src
1495 *** Commits
1496 #+begin_src plain :tangle ~/.gitconfig
1497 [commit]
1498   gpgsign = true
1499 #+end_src
1500 ** Dunst
1501 Lightweight notification daemon. Gruvbox colors, based on https://github.com/a-schaefers/i3-wm-gruvbox-theme/
1502 *** General
1503 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1504   [global]
1505   font = "JetBrains Mono Medium Nerd Font 11"
1506   allow_markup = yes
1507   format = "<b>%s</b>\n%b"
1508   sort = no
1509   indicate_hidden = yes
1510   alignment = center
1511   bounce_freq = 0
1512   show_age_threshold = 60
1513   word_wrap = yes
1514   ignore_newline = no
1515   geometry = "400x5-20+20"
1516   transparency = 0
1517   idle_threshold = 120
1518   monitor = 0
1519   sticky_history = yes
1520   line_height = 0
1521   separator_height = 4
1522   padding = 8
1523   horizontal_padding = 8
1524   max_icon_size = 32
1525   separator_color = "#585858"
1526   startup_notification = false
1527 #+end_src
1528 *** Modes
1529 #+begin_src conf :tangle ~/.config/dunst/dunstrc
1530   [frame]
1531   width = 4
1532   color = "#585858"
1533
1534   [shortcuts]
1535   close = mod4+c
1536   close_all = mod4+shift+c
1537   history = mod4+ctrl+c
1538
1539   [urgency_low]
1540   background = "#282828"
1541   foreground = "#ebdbb2"
1542   highlight = "#ebdbb2"
1543   timeout = 5
1544
1545   [urgency_normal]
1546   background = "#282828"
1547   foreground = "#ebdbb2"
1548   highlight = "#ebdbb2"
1549   timeout = 15
1550
1551   [urgency_critical]
1552   background = "#282828"
1553   foreground = "#cc241d"
1554   highlight = "#ebdbb2"
1555   timeout = 0
1556 #+end_src