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