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