From ef565a486511cbbb86e0d1f80264b3b57d2ac88a Mon Sep 17 00:00:00 2001
From: jdlugosz963 <jdlugosz963@gmail.com>
Date: Sat, 10 Jun 2023 09:36:37 +0200
Subject: Migrate from .org to .el Emacs config.

---
 .config/emacs/exwm/desktop.el               | 150 -------
 .config/emacs/exwm/start.sh                 |  12 -
 .config/emacs/init.el                       | 611 +---------------------------
 .config/emacs/jd-emacs/jd-emacs-apps.el     |  88 ++++
 .config/emacs/jd-emacs/jd-emacs-custom.el   |  36 ++
 .config/emacs/jd-emacs/jd-emacs-dev.el      | 175 ++++++++
 .config/emacs/jd-emacs/jd-emacs-init.el     |  81 ++++
 .config/emacs/jd-emacs/jd-emacs-keys.el     |  51 +++
 .config/emacs/jd-emacs/jd-emacs-org-mode.el | 200 +++++++++
 .config/emacs/jd-emacs/jd-emacs-ui.el       | 154 +++++++
 .config/emacs/jd-exwm/init.el               | 149 +++++++
 .config/emacs/jd-exwm/start.sh              |  15 +
 .config/emacs/jd/jd-mu4e.el                 |  17 +-
 13 files changed, 976 insertions(+), 763 deletions(-)
 delete mode 100644 .config/emacs/exwm/desktop.el
 delete mode 100644 .config/emacs/exwm/start.sh
 create mode 100644 .config/emacs/jd-emacs/jd-emacs-apps.el
 create mode 100644 .config/emacs/jd-emacs/jd-emacs-custom.el
 create mode 100644 .config/emacs/jd-emacs/jd-emacs-dev.el
 create mode 100644 .config/emacs/jd-emacs/jd-emacs-init.el
 create mode 100644 .config/emacs/jd-emacs/jd-emacs-keys.el
 create mode 100644 .config/emacs/jd-emacs/jd-emacs-org-mode.el
 create mode 100644 .config/emacs/jd-emacs/jd-emacs-ui.el
 create mode 100644 .config/emacs/jd-exwm/init.el
 create mode 100644 .config/emacs/jd-exwm/start.sh

(limited to '.config/emacs')

diff --git a/.config/emacs/exwm/desktop.el b/.config/emacs/exwm/desktop.el
deleted file mode 100644
index 512dbdc..0000000
--- a/.config/emacs/exwm/desktop.el
+++ /dev/null
@@ -1,150 +0,0 @@
-(defun jd/exwm-update-class ()
-  (exwm-workspace-rename-buffer exwm-class-name))
-
-(defun jd-exwm/run-in-background (command)
-  (let ((command-parts (split-string command "[ ]+")))
-    (apply #'call-process `(,(car command-parts) nil 0 nil ,@(cdr command-parts)))))
-
-(defun jd-exwm/restart-process (program-name)
-  (call-process "killall" nil nil nil program-name)
-  (jd-exwm/run-in-background program-name))
-
-(defun jd-exwm/exwm-init-hook ()
-  (jd-exwm/restart-process "polybar")
-  (jd-exwm/restart-process "nm-applet")
-  (jd-exwm/restart-process "redshift-gtk -l 54.37:18.6")
-  (jd-exwm/restart-process "blueman-applet")
-  (jd-exwm/restart-process "pasystray"))
-
-(defun jd-exwm/exwm-update-title ()
-  (exwm-workspace-rename-buffer exwm-title))
-
-(defun jd-exwm/configure-window-by-class ()
-  (interactive)
-  (pcase exwm-class-name
-    ("firefox" (exwm-workspace-move-window 2))
-    ("Brave" (exwm-workspace-move-window 2))
-    ("qutebrowser" (exwm-workspace-move-window 2))
-    ("discord" (exwm-workspace-move-window 5))
-    ("obs" (exwm-workspace-move-window 5))
-    ("Virt-manager" (exwm-workspace-move-window 4))))
-
-(use-package exwm
-  :config
-  (setq exwm-workspace-number 10)
-
-  (add-hook 'exwm-init-hook #'jd-exwm/exwm-init-hook)
-  (add-hook 'exwm-update-class-hook #'jd/exwm-update-class)
-  (add-hook 'exwm-update-title-hook #'jd-exwm/exwm-update-title)
-  (add-hook 'exwm-manage-finish-hook #'jd-exwm/configure-window-by-class)
-
-  (start-process-shell-command "nitrogen" nil "nitrogen --restore")
-  (start-process-shell-command "xinput" nil "xinput set-prop 'ETPS/2 Elantech Touchpad' 'Synaptics Tap Action' 1 1 1 2 1")
-  (start-process-shell-command "xmodmap" nil "xmodmap ~/dotfiles/.Xmodmap")
-
-  (require 'exwm-randr)
-  (setq exwm-randr-workspace-monitor-plist '(9 "eDP-1" 0 "eDP-1"))
-  (exwm-randr-enable)
-
-  (setq exwm-input-simulation-keys
-        '(([?\C-b] . [left])
-          ([?\C-f] . [right])
-          ([?\C-p] . [up])
-          ([?\C-n] . [down])))
-
-  (setq exwm-input-prefix-keys
-        '(?\C-x
-          ?\C-u
-          ?\C-h
-          ?\M-x
-          ?\M-`
-          ?\M-&
-          ?\M-:
-          ?\C-\M-j 
-          ?\C-\ ))  
-
-  (define-key exwm-mode-map [?\C-q] 'exwm-input-send-next-key)
-  (exwm-input-set-key (kbd "s-p") 'counsel-linux-app)
-
-  (setq exwm-input-global-keys
-        `(([?\s-R] . exwm-reset)
-
-
-          ([?\s-r] . (lambda (command)
-                       (interactive (list (read-shell-command "$ ")))
-                       (start-process-shell-command command nil command)))
-
-          ([?\s-W] . exwm-workspace-move-window)
-          ([?\s-w] . exwm-workspace-switch)
-
-          ,@(mapcar (lambda (i)
-                      `(,(kbd (format "s-%d" i)) .
-                        (lambda ()
-                          (interactive)
-                          (exwm-workspace-switch-create ,i))))
-                    (number-sequence 0 9))))
-
-  (exwm-enable))
-
-(use-package desktop-environment
-  :after exwm
-  :config (desktop-environment-mode)
-  :custom
-  (desktop-environment-brightness-small-increment "2%+")
-  (desktop-environment-brightness-small-decrement "2%-")
-  (desktop-environment-brightness-normal-increment "5%+")
-  (desktop-environment-brightness-normal-decrement "5%-"))
-
-(set-frame-parameter (selected-frame) 'alpha '(90 . 90))
-(add-to-list 'default-frame-alist `(alpha . (90 . 90)))
-(set-frame-parameter (selected-frame) 'fullscreen 'maximized)
-(add-to-list 'default-frame-alist '(fullscreen . maximized))
-
-(defun jd-exwm/get-color (ATTRIBUTE)
-  (face-attribute 'default ATTRIBUTE))
-
-(defun theme-to-xresources ()
-  (interactive)
-  (require 'term)
-  (with-temp-buffer
-    (insert "! Generated by theme-to-xresources\n")
-    (dolist (spec
-             '(("emacs.background" :background "E6")
-               ("emacs.foreground" :foreground "")))
-      (let ((color (jd-exwm/get-color (cadr spec))))
-        (insert (format "%s: #%s%s\n"
-                        (car spec)
-                        (caddr spec)
-                        (string-remove-prefix "#" color))))
-      (write-region (point-min) (point-max) "~/.Xresources")))
-  (call-process "xrdb" nil nil nil "-merge" (expand-file-name "~/.Xresources")))
-
-(defun jd/theme-sync ()
-  (interactive)
-  (theme-to-xresources)
-  (setq org-confirm-babel-evaluate nil)
-  (org-babel-tangle-file "~/dotfiles/Desktop.org")
-  (setq org-confirm-babel-evaluate 't)
-  (call-process "killall" nil nil nil "dunst") ;;  TODO: prevent clear notification history 
-  (jd-exwm/restart-process "polybar"))
-
-(add-hook 'jd/load-theme-hook #'jd/theme-sync)
-(add-hook 'exwm-init-hook #'jd/theme-sync)
-
-(defun jd/dunst-show-history ()
-  (interactive)
-  (start-process-shell-command "dunstctl" nil "dunstctl history-pop"))
-
-(defun jd/dunst-close ()
-  (interactive)
-  (start-process-shell-command "dunstctl" nil "dunstctl close"))
-
-(defun jd/dunst-close-all ()
-  (interactive)
-  (start-process-shell-command "dunstctl" nil "dunstctl close-all"))
-
-(jd/leader-key-def
-  "d" '(nil :which-key "dunst")
-  "dh" '(jd/dunst-show-history :which-key "show history") 
-  "dc" '(jd/dunst-close :which-key "close") 
-  "da" '(jd/dunst-close-all :which-key "close all"))
diff --git a/.config/emacs/exwm/start.sh b/.config/emacs/exwm/start.sh
deleted file mode 100644
index 127e858..0000000
--- a/.config/emacs/exwm/start.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-picom &
-
-xss-lock -- slock &
-
-export VISUAL="emacsclient -a vim"
-export EDITOR="$VISUAL"
-export GTK_THEME="Adwaita:dark"
-export CALIBRE_USE_DARK_PALETTE=1
-
-exec dbus-launch --exit-with-session emacs -mm --debug-init -l ~/.config/emacs/exwm/desktop.el
diff --git a/.config/emacs/init.el b/.config/emacs/init.el
index 780a1c6..65a8683 100644
--- a/.config/emacs/init.el
+++ b/.config/emacs/init.el
@@ -1,602 +1,17 @@
-(setq gc-cons-threshold (* 50 1000 1000))
+;;; Dotfiles --- Jakub Dlugosz emacs config
+;;; Commentary:
 
-(defun jd/display-startup-time ()
-  (message "Emacs loaded in %s with %d garbage collections."
-           (format "%.2f seconds"
-                   (float-time
-                    (time-subtract after-init-time before-init-time)))
-           gcs-done))
+;;; Code:
 
-(defun jd/startup ()
-  (electric-pair-mode 1)
-  (global-company-mode 1)
-  (jd/display-startup-time))
+(defvar jd/exwmp (not (null (getenv "JD_EXWM")))
+  "Return non-nil if Emacs is run as a window manager.")
 
-(add-hook 'emacs-startup-hook #'jd/startup)
+(let ((jd-emacs-init (concat user-emacs-directory
+			     "jd-emacs/jd-emacs-init.el"))
+      (jd-exwm-init (concat user-emacs-directory
+			    "jd-exwm/init.el")))
+  (load jd-emacs-init)
+  (when jd/exwmp
+    (load jd-exwm-init)))
 
-(setq user-full-name "Jakub Dlugosz"
-      user-mail-address "jdlugosz963@gmail.com")
-
-(setq backup-directory-alist '(("." . "~/.cache/emacs/backup"))
-      backup-by-copying t
-      version-control t
-      delete-old-versions t
-      kept-new-versions 20
-      kept-old-versions 5)
-
-(setq user-emacs-directory "~/.cache/emacs")
-
-(require 'package)
-(setq package-archives '(("melpa" . "https://melpa.org/packages/")
-                         ("org" . "https://orgmode.org/elpa/")
-                         ("gnu-devel" . "https://elpa.gnu.org/devel/")
-                         ("elpa" . "https://elpa.gnu.org/packages/")))
-(package-initialize)
-
-(unless package-archive-contents
-  (package-refresh-contents))
-
-(unless (package-installed-p 'use-package)
-  (package-install 'use-package))
-
-(setq use-package-always-ensure t)
-
-(add-to-list 'load-path ".config/emacs/jd/")
-
-(require 'use-package)
-
-(use-package general
-  :config
-  (general-create-definer jd/leader-key-def
-    :keymaps '(normal insert visual emacs)
-    :prefix "SPC"
-    :global-prefix "C-SPC")
-
-  (general-create-definer jd/ctrl-c-keys
-    :prefix "C-c"))
-
-(use-package undo-tree
-  :diminish
-  :config
-  (setq undo-tree-auto-save-history nil)
-  (global-undo-tree-mode 1))
-
-(use-package evil
-  :init
-  (setq evil-want-integration t)
-  (setq evil-want-keybinding nil)
-  (setq evil-want-C-u-scroll t)
-  (setq evil-want-Y-yank-to-eol t) 
-  (setq evil-want-C-i-jump nil) 
-  (setq evil-undo-system 'undo-tree)
-  (setq evil-kill-on-visual-paste nil)
-  :config
-  (evil-set-initial-state 'exwm-mode 'emacs)
-  (evil-mode 1))
-
-(use-package evil-collection
-  :after evil
-  :config
-  (evil-collection-init))
-
-(jd/leader-key-def
-  "w"  'evil-window-map
-  "wr" '(hydra-resize-window/body :which-key "Rezize window")
-  "wd" '(evil-window-delete :which-key "Window delete"))
-
-(jd/leader-key-def
-  "ou" '(undo-tree-visualize :which-key "Open"))
-
-;; remove . key
-(define-key evil-normal-state-map (kbd ".") '())
-
-(setq inhibit-startup-message t)
-(setq visible-bell t)
-(scroll-bar-mode -1)
-(tool-bar-mode -1)
-(tooltip-mode -1)
-(menu-bar-mode -1)
-(set-fringe-mode 10)
-
-(set-face-attribute 'default nil :font "sourcecodepro" :height 100)
-
-(add-hook 'prog-mode-hook 'menu-bar--display-line-numbers-mode-relative)
-
-(global-set-key (kbd "<escape>") 'keyboard-escape-quit)
-
-(defalias 'yes-or-no-p 'y-or-n-p)
-
-(use-package doom-themes
-  :config
-  (load-theme 'doom-ayu-dark t))
-
-(use-package diminish)
-
-(use-package hl-todo
-  :init
-  (setq hl-todo-keyword-faces
-        '(("TODO"   . "#FF0000")
-          ("FIXME"  . "#FF0000")
-          ("DEBUG"  . "#A020F0")))
-  :config
-  (global-hl-todo-mode 1))
-
-(defun jd/switch-buffer ()
-  (interactive)
-  (let ((completion-regexp-list '("\\`[^*]"
-                                  "\\`\\([^T]\\|T\\($\\|[^A]\\|A\\($\\|[^G]\\|G\\($\\|[^S]\\|S.\\)\\)\\)\\).*")))
-    (call-interactively 'counsel-switch-buffer)))
-
-(defvar jd/load-theme-hook nil)
-(defun jd/load-theme ()
-  (interactive)
-  (counsel-load-theme)
-  (run-hooks 'jd/load-theme-hook))
-
-(use-package ivy
-  :diminish
-  :bind
-  (("C-s" . swiper)
-   :map ivy-minibuffer-map
-   ("C-k" . ivy-previous-line)
-   ("C-j" . ivy-next-line)
-   :map ivy-switch-buffer-map
-   ("C-k" . ivy-previous-line))
-  :config
-  (ivy-mode 1))
-
-(use-package counsel
-  :config
-  (counsel-mode 1))
-
-(jd/leader-key-def
-  "t"  '(:ignore t :which-key "Toggle")
-  "tT" '(toggle-truncate-lines :which-key "Toggle truncate lines")
-  "tt" '(jd/load-theme  :which-key "Choose theme"))
-
-(jd/leader-key-def
-  "bb" '(jd/switch-buffer :which-key "Buffer switch")
-  "ba" '(counsel-switch-buffer :which-key "Buffer switch")
-  "b"  '(:ignore t :which-key "Buffer")
-  "," '(counsel-switch-buffer :which-key "Buffer switch"))
-
-(use-package which-key
-  :diminish
-  :config
-  (which-key-mode)
-  (setq which-key-idle-delay 0.3))
-
-(use-package all-the-icons)
-
-(use-package doom-modeline
-  :init (doom-modeline-mode 1)
-  :custom ((doom-modeline-height 15)))
-
-(use-package hydra
-  :defer t)
-
-(defun jd/text-scale-increase ()
-  (interactive)
-  (let ((old-face-attribute (face-attribute 'default :height)))
-    (set-face-attribute 'default nil :height (+ old-face-attribute 10))))
-
-(defun jd/text-scale-decrease ()
-  (interactive)
-  (let ((old-face-attribute (face-attribute 'default :height)))
-    (set-face-attribute 'default nil :height (- old-face-attribute 10))))
-
-(defhydra hydra-resize-window (:timeout 4)
-  ("h" evil-window-decrease-width "<")
-  ("l" evil-window-increase-width ">")
-  ("k" evil-window-decrease-height "^")
-  ("j" evil-window-increase-height "v")
-  ("q" nil "finished" :exit t))
-
-(defhydra hydra-text-scale-global (:timeout 4)
-  "scale text"
-  ("j" jd/text-scale-increase "in")
-  ("k" jd/text-scale-decrease "out")
-  ("q" nil "finished" :exit t))
-
-(defhydra hydra-text-scale (:timeout 4)
-  "scale text"
-  ("j" text-scale-increase "in")
-  ("k" text-scale-decrease "out")
-  ("q" nil "finished" :exit t))
-
-(jd/leader-key-def
-  "tS" '(hydra-text-scale-global/body :which-key "Scale text")
-  "ts" '(hydra-text-scale/body :which-key "Scale text"))
-
-(use-package beacon
-  :config
-  (beacon-mode 1))
-
-(jd/leader-key-def
-  "f"  '(:ignore t :which-key "Files")
-  "fs" '(save-buffer :which-key "File save")
-  "." '(find-file :which-key "Find file")
-  "ff" '(find-file :which-key "Find file"))
-
-(jd/leader-key-def
-  "e"   '(:ignore t :which-key "Eval")
-  "eb"  '(eval-buffer :which-key "Eval buffer"))
-
-(jd/leader-key-def
-  :keymaps '(visual)
-  "er" '(eval-region :which-key "Eval region"))
-
-(defun jd/kill-other-buffers () 
-  (interactive)                                                                   
-  (mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))
-
-(jd/leader-key-def
-  "bK" '(jd/kill-other-buffers :which-key "Kill other buffers")
-  "bk" '(kill-current-buffer :which-key "Kill buffer")
-  "bB" '(ibuffer :which-key "Open ibuffer"))
-
-(setq jd/org-home "~/Documents/Org")
-(setq jd/org-roam-home (concat jd/org-home "/roam"))
-(setq jd/org-roam-daily-home (concat jd/org-home "/roam/daily"))
-
-(defun jd/org-mode-setup ()
-  (org-indent-mode)
-  (variable-pitch-mode 1)
-  (visual-line-mode 1))
-
-(use-package org
-  :pin org
-  :commands (org-capture org-agenda)
-  :hook (org-mode . jd/org-mode-setup)
-  :config
-  (setq org-directory (file-truename "~/Documents/Org/"))
-  (setq org-mobile-inbox-for-pull (concat org-directory "flagged.org"))
-  (setq org-mobile-directory "~/Dropbox/Apps/MobileOrg")
-  (setq org-agenda-files
-        '("Tasks.org"))
-  (setq org-ellipsis " ▾")
-  (setq org-agenda-start-with-log-mode t)
-  (setq org-log-done 'time)
-  (setq org-log-into-drawer t)
-  (setq org-return-follows-link t)
-  (setq org-capture-templates
-        `(("t" "Tasks / Projects")
-          ("tt" "Task" entry (file+olp "Tasks.org" "Inbox")
-           "* TODO %?\n  %t\n  %a\n  %i" :empty-lines 1)
-          ("tT" "Task for tomorow" entry (file+olp "Tasks.org" "Inbox")
-           "* TODO %?\n %t\n  SCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+1d\"))\n %a\n %i" :empty-lines 1)
-
-          ("m" "Metrics Capture")
-          ("mm" "Metrics" table-line (file+headline "Metrics.org" "Metrics")
-           "| %U | %^{Weight} | %^{Waist} | %^{Notes} |" :kill-buffer t)))
-
-  (setq org-latex-listings 'minted
-        org-latex-packages-alist '(("" "minted"))
-        org-latex-pdf-process
-        '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
-          "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
-
-  (require 'org-tempo))
-
-(jd/leader-key-def
-  "o" '(:ignore t :which-key "Open/Org")
-  "oc" '(org-capture :which-key "Open org-capture")
-  "oop" '(org-mobile-pull :which-key "Org mobile pull")
-  "ooP" '(org-mobile-push :which-key "Org mobile push")
-  "oa" '(org-agenda :which-key "Open org-agenda"))
-
-(use-package evil-org
-  :after org
-  :hook (org-mode . (lambda () evil-org-mode))
-  :config
-  (require 'evil-org-agenda)
-  (evil-org-agenda-set-keys))
-
-(use-package toc-org
-  :config
-  (add-hook 'org-mode-hook 'toc-org-mode))
-
-(defun jd/org-font-setup ()
-  ;; Replace list hyphen with dot
-  (font-lock-add-keywords 'org-mode
-                          '(("^ *\\([-]\\) "
-                             (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•-"))))))
-
-  ;; Set faces for heading levels
-  (dolist (face '((org-level-1 . 1.3)
-                  (org-level-2 . 1.2)
-                  (org-level-3 . 1.1)
-                  (org-level-4 . 1.0)
-                  (org-level-5 . 1.1)
-                  (org-level-6 . 1.1)
-                  (org-level-7 . 1.1)
-                  (org-level-8 . 1.1)))
-    (set-face-attribute (car face) nil :font "Monospace" :weight 'Bold :height (cdr face)))
-
-  ;; Ensure that anything that should be fixed-pitch in Org files appears that way
-  (set-face-attribute 'org-block nil    :font "hack" :inherit 'fixed-pitch)
-  (set-face-attribute 'org-table nil    :inherit 'fixed-pitch)
-  (set-face-attribute 'org-formula nil  :inherit 'fixed-pitch)
-  (set-face-attribute 'org-code nil     :inherit '(shadow fixed-pitch))
-  (set-face-attribute 'org-table nil    :inherit '(shadow fixed-pitch))
-  (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
-  (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch))
-  (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch))
-  (set-face-attribute 'org-checkbox nil  :inherit 'fixed-pitch)
-  (set-face-attribute 'line-number nil :inherit 'fixed-pitch)
-  (set-face-attribute 'line-number-current-line nil :inherit 'fixed-pitch))
-
-(with-eval-after-load 'org-faces (jd/org-font-setup))
-
-(defun jd/org-tempo-setup ()
-  (add-to-list 'org-structure-template-alist '("s" . "src"))
-  (add-to-list 'org-structure-template-alist '("sql" . "src sql"))
-  (add-to-list 'org-structure-template-alist '("sh" . "src sh"))
-  (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
-  (add-to-list 'org-structure-template-alist '("li" . "src lisp"))
-  (add-to-list 'org-structure-template-alist '("sc" . "src scheme"))
-  (add-to-list 'org-structure-template-alist '("ts" . "src typescript"))
-  (add-to-list 'org-structure-template-alist '("py" . "src python"))
-  (add-to-list 'org-structure-template-alist '("go" . "src go"))
-  (add-to-list 'org-structure-template-alist '("yaml" . "src yaml")))
-
-(with-eval-after-load 'org-tempo (jd/org-tempo-setup))
-
-(org-babel-do-load-languages
- 'org-babel-load-languages
- '((emacs-lisp . t)
-   (python . t)))
-
-(defun jd/org-babel-tangle-config ()
-  (when (string-equal (file-name-directory (buffer-file-name))
-                      (expand-file-name "~/dotfiles/"))
-    ;; Dynamic scoping to the rescue
-    (let ((org-confirm-babel-evaluate nil))
-      (org-babel-tangle))))
-
-(add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'jd/org-babel-tangle-config)))
-
-(defun jd/org-mode-visual-fill ()
-  (setq visual-fill-column-width 100
-        visual-fill-column-center-text t)
-  (visual-fill-column-mode 1))
-
-(use-package visual-fill-column
-  :hook (org-mode . jd/org-mode-visual-fill))
-
-(use-package org-superstar
-  :hook (org-mode . org-superstar-mode)
-  :init
-  (setq org-superstar-special-todo-items t)
-  (setq org-superstar-remove-leading-stars t)
-  (setq org-superstar-headline-bullets-list '("◉" "○" "●" "○" "●" "○" "●")))
-
-(defun jd/org-roam-filter-by-tag (tag-name)
-  (lambda (node)
-    (member tag-name (org-roam-node-tags node))))
-
-(defun jd/org-roam-list-notes-by-tag (tag-name)
-  (mapcar #'org-roam-node-file
-          (seq-filter
-           (jd/org-roam-filter-by-tag tag-name)
-           (org-roam-node-list))))
-
-(defun jd/org-roam-refreshagenda-list ()
-  (interactive)
-  (setq org-agenda-files (org-roam-list-files)))
-
-(use-package org-roam
-  :custom
-  (org-roam-directory (file-truename jd/org-roam-home))
-  :bind (("C-c n l" . org-roam-buffer-toggle)
-         ("C-c n f" . org-roam-node-find)
-         ("C-c n g" . org-roam-graph)
-         ("C-c n i" . org-roam-node-insert)
-         ("C-c n c" . org-roam-capture)
-         ;; Dailies
-         ("C-c n j" . org-roam-dailies-capture-today))
-  :bind-keymap
-  ("C-c n d" . org-roam-dailies-map)
-  :config
-  ;; If you're using a vertical completion framework, you might want a more informative completion interface
-  (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag)))
-  (org-roam-db-autosync-mode))
-
-(use-package lsp-mode
-  :commands (lsp lsp-deferred)
-  :init
-  (setq lsp-headerline-breadcrumb-enable nil)
-  (setq lsp-diagnostics-provider :none)
-  (setq lsp-modeline-diagnostics-enable nil)
-  (setq lsp-keymap-prefix "C-c l")
-  :config
-  (lsp-enable-which-key-integration t))
-
-(use-package lsp-ivy
-  :after lsp)
-
-(defun jd/python-mode-setup ()
-  (let ((project-venv-path (concat (projectile-project-root) "venv/")))
-    (when (projectile--directory-p project-venv-path)
-      (pyvenv-activate project-venv-path)
-      (pyvenv-mode))))
-
-;;  (use-package python-mode ;;TODO: find alternative
-;;    :hook (python-mode . lsp-deferred)
-;;    :hook (python-mode . jd/python-mode-setup)
-;;    :config
-;;    (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode)))
-
-(use-package pyvenv
-  :after python-mode)
-
-(use-package typescript-mode
-  :mode ("\\.ts\\'")
-  :config
-  (setq typescript-indent-level 2))
-
-(defun jd/activate-tide-mode ()
-  (when (and (stringp buffer-file-name)
-             (string-match "\\.[tj]sx?\\'" buffer-file-name))
-    (tide-setup)
-    (tide-hl-identifier-mode)))
-
-(use-package tide
-  :after (typescript-mode company web-mode))
-
-(use-package flycheck
-  :hook ((after-init . global-flycheck-mode)))
-
-(use-package web-mode
-  :hook ((web-mode . jd/activate-tide-mode))
-  :mode
-  ("\\.ejs\\'" "\\.hbs\\'" "\\.html\\'" "\\.php\\'" "\\.[jt]sx?\\'")
-  :config
-  (setq web-mode-content-types-alist '(("jsx" . "\\.[jt]sx?\\'")))
-  (setq web-mode-markup-indent-offset 2)
-  (setq web-mode-css-indent-offset 2)
-  (setq web-mode-code-indent-offset 2)
-  (setq web-mode-script-padding 2)
-  (setq web-mode-block-padding 2)
-  (setq web-mode-style-padding 2)
-  (setq web-mode-enable-auto-pairing t)
-  (setq web-mode-enable-auto-closing t)
-  (setq web-mode-enable-current-element-highlight t))
-
-(use-package yaml-mode)
-
-(use-package docker)
-
-(jd/leader-key-def
-  "d" '(:ignore t :which-key "Docker")
-  "dc" '(docker-containers :which-key "Docker containers")
-  "dd" '(docker :which-key "Docker"))
-
-(use-package company
-  :after lsp-mode
-  :hook (lsp-mode . company-mode)
-  :bind (:map company-active-map
-              ("<tab>" . company-complete-selection))
-  (:map lsp-mode-map
-        ("<tab>" . company-indent-or-complete-common))
-  :custom
-  (company-minimum-prefix-length 1)
-  (company-idle-delay 0.0)
-  :config
-  (global-company-mode))
-
-(use-package company-box
-  :hook (company-mode . company-box-mode))
-
-(use-package projectile
-  :diminish projectile-mode
-  :init
-  (when (file-directory-p "~/Documents/code")
-    (setq projectile-project-search-path '("~/Documents/code/")))
-  :custom ((projectile-Completion-system 'ivy))
-  :config
-  (setq projectile-switch-project-action #'projectile-dired)
-  (projectile-mode))
-
-(jd/leader-key-def
-  "p" '(projectile-command-map :which-key "Project")
-  "p <ESC>" '()
-  "SPC" '(projectile-find-file :which-key "Find file in project"))
-
-(defun jd/neotree-project-dir ()
-  "Open NeoTree using the git root."
-  (interactive)
-  (let ((project-dir (projectile-project-root))
-        (file-name (buffer-file-name)))
-    (neotree-toggle)
-    (if project-dir
-        (if (neo-global--window-exists-p)
-            (progn
-              (neotree-dir project-dir)
-              (neotree-find file-name)))
-      (message "Could not find git project root."))))
-
-(use-package neotree
-  :init
-  (setq neo-theme 'icons)
-  :config
-
-  (evil-define-key 'normal neotree-mode-map (kbd "TAB") 'neotree-enter)
-  (evil-define-key 'normal neotree-mode-map (kbd "C-RET") 'neotree-quick-look)
-  (evil-define-key 'normal neotree-mode-map (kbd "q") 'neotree-hide)
-  (evil-define-key 'normal neotree-mode-map (kbd "RET") 'neotree-enter)
-  (evil-define-key 'normal neotree-mode-map (kbd "g") 'neotree-refresh)
-  (evil-define-key 'normal neotree-mode-map (kbd "A") 'neotree-stretch-toggle)
-  (evil-define-key 'normal neotree-mode-map (kbd "H") 'neotree-hidden-file-toggle))
-
-(jd/leader-key-def
-  "op" '(jd/neotree-project-dir :which-key "Open neotree"))
-
-(use-package magit
-  :custom
-  (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))
-
-(jd/leader-key-def
-  "g" '(:ignore t :which-key "Git")
-  "gg" '(magit-status-here :which-key "Magit status"))
-
-(defun jd/open-new-vterm (&optional jd/vterm-buffer-name)
-  (interactive)
-  (let ((buffer-name (generate-new-buffer-name vterm-buffer-name)))
-    (when jd/vterm-buffer-name
-      (setq buffer-name jd/vterm-buffer-name))
-    (switch-to-buffer buffer-name)
-    (vterm-mode)))
-
-
-(use-package vterm
-  :config
-  (setq vterm-buffer-name "vterm")
-  (evil-set-initial-state 'vterm-mode 'emacs))
-
-(jd/leader-key-def
-  "ot" '(jd/open-new-vterm :which-key "Open terminal in current window"))
-
-(use-package all-the-icons-dired
-  :hook (dired-mode . all-the-icons-dired-mode))
-
-(use-package dired-ranger)
-
-(use-package dired
-  :ensure nil
-  :commands (dired dired-jump)
-  :custom ((dired-listing-switches "-agho --group-directories-first"))
-  :config
-  (evil-collection-define-key 'normal 'dired-mode-map
-    "y" 'dired-ranger-copy
-    "p" 'dired-ranger-paste
-    "X" 'dired-ranger-move
-    "h" 'dired-up-directory
-    "t" 'dired-create-empty-file
-    "T" 'dired-toggle-marks
-    "l" 'dired-find-file)
-  (setq dired-kill-when-opening-new-dired-buffer t)
-  (evil-define-key 'normal dired-mode-map (kbd "q") 'kill-current-buffer))
-
-(use-package emms
-  :config
-  (require 'emms-setup)
-  (emms-all)
-  (emms-standard)
-  (emms-default-players)
-  (emms-mode-line-disable)
-                                        ; (setq emms-info-functions '(emms-info-tinytag))
-  (setq emms-browser-covers 'emms-browser-cache-thumbnail-async)
-  ;; (setq emms-lyrics-dir "~/Documents/music/lyrics")
-  (emms-add-directory-tree "~/Documents/Music/"))
-
-(use-package pdf-tools)
-
-(require 'jd-mu4e)
-
-(use-package elfeed
-  :config
-  (setq elfeed-feeds
-        '("https://www.reddit.com/r/emacs.rss")))
-
-(setq gc-cons-threshold (* 2 1000 1000))
+;;; init.el ends here
diff --git a/.config/emacs/jd-emacs/jd-emacs-apps.el b/.config/emacs/jd-emacs/jd-emacs-apps.el
new file mode 100644
index 0000000..628039d
--- /dev/null
+++ b/.config/emacs/jd-emacs/jd-emacs-apps.el
@@ -0,0 +1,88 @@
+;;; Dotfiles --- Jakub Dlugosz emacs config
+;;; Commentary:
+
+;;; Code:
+
+(defun jd/open-new-vterm (&optional jd/vterm-buffer-name)
+  (interactive)
+  (let ((buffer-name (generate-new-buffer-name vterm-buffer-name)))
+    (when jd/vterm-buffer-name
+      (setq buffer-name jd/vterm-buffer-name))
+    (switch-to-buffer buffer-name)
+    (vterm-mode)))
+
+
+(use-package vterm
+  :init
+  (add-to-list 'project-switch-commands     '(project-vterm "Vterm") t)
+  (add-to-list 'project-kill-buffer-conditions  '(major-mode . vterm-mode))
+  (setq vterm-copy-exclude-prompt t)
+  :config
+  (setq vterm-buffer-name "vterm")
+  (evil-set-initial-state 'vterm-mode 'emacs)
+  (setq vterm-tramp-shells (append  '(("ssh" "/bin/bash")) vterm-tramp-shells)))
+
+(jd/leader-key-def
+  "ot" '(jd/open-new-vterm :which-key "Open terminal in current window"))
+
+(use-package all-the-icons-dired
+  :hook (dired-mode . all-the-icons-dired-mode))
+
+(use-package dired-ranger)
+
+(use-package dired
+  :ensure nil
+  :commands (dired dired-jump)
+  :custom ((dired-listing-switches "-agho --group-directories-first"))
+  :config
+  (evil-collection-define-key 'normal 'dired-mode-map
+    "y" 'dired-ranger-copy
+    "p" 'dired-ranger-paste
+    "X" 'dired-ranger-move
+    "h" 'dired-up-directory
+    "t" 'dired-create-empty-file
+    "T" 'dired-toggle-marks
+    "l" 'dired-find-file)
+  (setq dired-kill-when-opening-new-dired-buffer t)
+  (evil-define-key 'normal dired-mode-map (kbd "q") 'kill-current-buffer))
+
+(use-package emms
+  :config
+  (require 'emms-setup)
+  (emms-all)
+  (emms-standard)
+  (emms-default-players)
+  (emms-mode-line-disable)
+                                        ; (setq emms-info-functions '(emms-info-tinytag))
+  (setq emms-browser-covers 'emms-browser-cache-thumbnail-async)
+  ;; (setq emms-lyrics-dir "~/Documents/music/lyrics")
+  (emms-add-directory-tree "~/Documents/Music/"))
+
+(use-package pdf-tools)
+
+(require 'jd-mu4e)
+
+(use-package elfeed
+  :config
+  (setq elfeed-feeds
+        '(("https://www.reddit.com/r/emacs.rss" emacs)
+          ("https://www.reddit.com/r/gnu.rss" gnu)
+          ("https://stallman.org/rss/rss.xml" stallman))))
+
+(use-package langtool
+  :config
+  (setq langtool-language-tool-jar "/home/jakub/Documents/LanguageTool-6.0/languagetool-commandline.jar")
+  (setq langtool-default-language "pl-PL"))
+
+(jd/leader-key-def
+  "l"  '(:ignore t :which-key "langtool")
+  "lc" 'langtool-check-buffer
+  "ld" 'langtool-check-done
+  "li" 'langtool-interactive-correction)
+
+(use-package mastodon
+  :config
+  (setq mastodon-active-user "jdlugosz963"
+	mastodon-instance-url "https://fosstodon.org/"))
+
+;;; jd-apps.el ends here
diff --git a/.config/emacs/jd-emacs/jd-emacs-custom.el b/.config/emacs/jd-emacs/jd-emacs-custom.el
new file mode 100644
index 0000000..aef824f
--- /dev/null
+++ b/.config/emacs/jd-emacs/jd-emacs-custom.el
@@ -0,0 +1,36 @@
+;;; Dotfiles --- Jakub Dlugosz emacs config
+;;; Commentary:
+
+;;; Code:
+
+(defun jd/generete-qr-from-clipboard ()
+  (interactive)
+  (let ((clipboard-value (x-get-clipboard))
+	(clipboard-file-path "/tmp/clipboard_value.txt")
+	(clipboard-out-image "/tmp/qr.png"))
+    (with-temp-file clipboard-file-path
+      (insert clipboard-value))
+    (shell-command (concat
+		    "qrencode -o "
+		    clipboard-out-image
+		    " < "
+		    clipboard-file-path))
+    (find-file clipboard-out-image)))
+
+(defun jd-emacs/erc-notify-sound ()
+    (jd-exwm/run-in-background "mpv /home/jakub/.config/emacs/resources/beep.wav"))
+
+;; (add-hook 'erc-notifications-mode-hook #'jd-emacs/erc-notify-sound)
+
+(setq
+ erc-nick "bobbma"
+ erc-user-full-name "Jakub Dlugosz"
+ erc-notify-list '("akuleszaa"))
+
+;; Define a function to connect to a server
+(defun hipis-znc ()
+  (interactive)
+  (erc :server "195.74.91.18"
+       :port   "6697"))
+
+;;; jd-custom.el ends here
diff --git a/.config/emacs/jd-emacs/jd-emacs-dev.el b/.config/emacs/jd-emacs/jd-emacs-dev.el
new file mode 100644
index 0000000..620a7ad
--- /dev/null
+++ b/.config/emacs/jd-emacs/jd-emacs-dev.el
@@ -0,0 +1,175 @@
+;;; Dotfiles --- Jakub Dlugosz emacs config
+;;; Commentary:
+
+;;; Code:
+
+(setq c-default-style "linux"
+      c-basic-offset 8)
+
+(setq gdb-many-windows t)
+
+(use-package lsp-mode
+  :commands (lsp lsp-deferred)
+  :init
+  (setq lsp-headerline-breadcrumb-enable nil)
+  (setq lsp-diagnostics-provider :none)
+  (setq lsp-modeline-diagnostics-enable nil)
+  (setq lsp-keymap-prefix "C-c l")
+  :config
+  (lsp-enable-which-key-integration t))
+
+(use-package lsp-ivy
+  :after lsp)
+
+(use-package paredit)
+(use-package evil-paredit)
+(use-package rainbow-delimiters)
+
+(defun jd/lisp-mode-setup ()
+  (rainbow-delimiters-mode)
+  (evil-paredit-mode)
+  (paredit-mode))
+
+(add-hook 'emacs-startup-hook
+          (lambda ()
+            (add-hook 'scheme-mode-hook 'jd/lisp-mode-setup)
+            (add-hook 'emacs-lisp-mode-hook 'jd/lisp-mode-setup)
+            (add-hook 'clojure-mode-hook 'jd/lisp-mode-setup)
+            (add-hook 'lisp-mode-hook 'jd/lisp-mode-setup)))
+
+
+(evil-define-key 'normal paredit-mode-map (kbd "g h") 'paredit-forward-barf-sexp)
+(evil-define-key 'normal paredit-mode-map (kbd "g l") 'paredit-forward-slurp-sexp)
+
+(evil-define-key 'normal paredit-mode-map (kbd "g H") 'paredit-backward-slurp-sexp)
+(evil-define-key 'normal paredit-mode-map (kbd "g L") 'paredit-backward-barf-sexp)
+
+(use-package geiser)
+(use-package geiser-guile)
+
+(defun jd/python-mode-setup ()
+  (let ((project-venv-path (concat (projectile-project-root) "venv/")))
+    (when (projectile--directory-p project-venv-path)
+      (pyvenv-activate project-venv-path)
+      (pyvenv-mode))))
+
+;;  (use-package python-mode ;;TODO: find alternative
+;;    :hook (python-mode . lsp-deferred)
+;;    :hook (python-mode . jd/python-mode-setup)
+;;    :config
+;;    (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode)))
+
+(use-package pyvenv
+  :after python-mode)
+
+(use-package typescript-mode
+  :mode ("\\.ts\\'")
+  :config
+  (setq typescript-indent-level 2))
+
+(defun jd/activate-tide-mode ()
+  (when (and (stringp buffer-file-name)
+             (string-match "\\.[tj]sx?\\'" buffer-file-name))
+    (tide-setup)
+    (tide-hl-identifier-mode)))
+
+(use-package tide
+  :after (typescript-mode company web-mode))
+
+(use-package flycheck
+  :hook ((after-init . global-flycheck-mode)))
+
+(use-package web-mode
+  :hook ((web-mode . jd/activate-tide-mode))
+  :mode
+  ("\\.ejs\\'" "\\.hbs\\'" "\\.html\\'" "\\.php\\'" "\\.[jt]sx?\\'")
+  :config
+  (setq web-mode-content-types-alist '(("jsx" . "\\.[jt]sx?\\'")))
+  (setq web-mode-markup-indent-offset 2)
+  (setq web-mode-css-indent-offset 2)
+  (setq web-mode-code-indent-offset 2)
+  (setq web-mode-script-padding 2)
+  (setq web-mode-block-padding 2)
+  (setq web-mode-style-padding 2)
+  (setq web-mode-enable-auto-pairing t)
+  (setq web-mode-enable-auto-closing t)
+  (setq web-mode-enable-current-element-highlight t))
+
+(use-package yaml-mode)
+
+(use-package docker)
+
+(jd/leader-key-def
+  "d" '(:ignore t :which-key "Docker")
+  "dc" '(docker-containers :which-key "Docker containers")
+  "dd" '(docker :which-key "Docker"))
+
+(use-package company
+  :after lsp-mode
+  :hook (lsp-mode . company-mode)
+  :bind (:map company-active-map
+              ("<tab>" . company-complete-selection))
+  (:map lsp-mode-map
+        ("<tab>" . company-indent-or-complete-common))
+  :custom
+  (company-minimum-prefix-length 1)
+  (company-idle-delay 0.0)
+  :config
+  (global-company-mode))
+
+(use-package company-box
+  :hook (company-mode . company-box-mode))
+
+(use-package projectile
+  :diminish projectile-mode
+  :init
+  (when (file-directory-p "~/Documents/code")
+    (setq projectile-project-search-path '("~/Documents/code/")))
+  :custom ((projectile-Completion-system 'ivy))
+  :config
+  (setq projectile-switch-project-action #'projectile-dired)
+  (projectile-mode))
+
+(jd/leader-key-def
+  "p" '(projectile-command-map :which-key "Project")
+  "p <ESC>" '()
+  "SPC" '(projectile-find-file :which-key "Find file in project"))
+
+(defun jd/neotree-project-dir ()
+  "Open NeoTree using the git root."
+  (interactive)
+  (let ((project-dir (projectile-project-root))
+        (file-name (buffer-file-name)))
+    (neotree-toggle)
+    (if project-dir
+        (if (neo-global--window-exists-p)
+            (progn
+              (neotree-dir project-dir)
+              (neotree-find file-name)))
+      (message "Could not find git project root."))))
+
+(use-package neotree
+  :init
+  (setq neo-theme 'icons)
+  :config
+
+  (evil-define-key 'normal neotree-mode-map (kbd "TAB") 'neotree-enter)
+  (evil-define-key 'normal neotree-mode-map (kbd "C-RET") 'neotree-quick-look)
+  (evil-define-key 'normal neotree-mode-map (kbd "q") 'neotree-hide)
+  (evil-define-key 'normal neotree-mode-map (kbd "RET") 'neotree-enter)
+  (evil-define-key 'normal neotree-mode-map (kbd "g") 'neotree-refresh)
+  (evil-define-key 'normal neotree-mode-map (kbd "A") 'neotree-stretch-toggle)
+  (evil-define-key 'normal neotree-mode-map (kbd "H") 'neotree-hidden-file-toggle))
+
+(jd/leader-key-def
+  "op" '(jd/neotree-project-dir :which-key "Open neotree"))
+
+(use-package magit
+  :custom
+  (magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1))
+
+(jd/leader-key-def
+  "g" '(:ignore t :which-key "Git")
+  "gg" '(magit-status-here :which-key "Magit status"))
+
+;;; jd-dev.el ends here
diff --git a/.config/emacs/jd-emacs/jd-emacs-init.el b/.config/emacs/jd-emacs/jd-emacs-init.el
new file mode 100644
index 0000000..7f80cac
--- /dev/null
+++ b/.config/emacs/jd-emacs/jd-emacs-init.el
@@ -0,0 +1,81 @@
+;;; Dotfiles --- Jakub Dlugosz emacs config
+;;; Commentary:
+
+;;; Code:
+
+(defvar jd-emacs/directory
+  (concat user-emacs-directory
+	  "/jd-emacs/")
+  "Path to jd-emacs config directory.")
+
+(defun jd-emacs/load (file-name)
+  "Load file from jd-emacs directory.
+FILE-NAME - file name to load."
+  (let ((file (expand-file-name (concat jd-emacs/directory
+		      "jd-emacs-" file-name ".el"))))
+    (load file)))
+
+(setq gc-cons-threshold (* 2 1000 1000))
+
+
+(defun jd/display-startup-time ()
+  (message "Emacs loaded in %s with %d garbage collections."
+           (format "%.2f seconds"
+                   (float-time
+                    (time-subtract after-init-time before-init-time)))
+           gcs-done))
+
+  
+(defun jd-emacs/startup ()
+  "This procedure will run after Emacs startup."
+  (electric-pair-mode 1)
+  (global-company-mode 1)
+  (jd/display-startup-time))
+
+(setq gc-cons-threshold (* 50 1000 1000))
+(add-hook 'emacs-startup-hook #'jd-emacs/startup)
+
+(setq user-full-name "Jakub Dlugosz"
+      user-mail-address "jdlugosz963@gmail.com")
+
+(setq backup-directory-alist '(("." . "~/.cache/emacs/backup"))
+      backup-by-copying t
+      version-control t
+      delete-old-versions t
+      kept-new-versions 20
+      kept-old-versions 5)
+
+(setq user-emacs-directory "~/.cache/emacs")
+
+(require 'package)
+(setq package-archives '(("melpa" . "https://melpa.org/packages/")
+                         ("org" . "https://orgmode.org/elpa/")
+                         ("gnu-devel" . "https://elpa.gnu.org/devel/")
+                         ("elpa" . "https://elpa.gnu.org/packages/")))
+(package-initialize)
+
+(unless package-archive-contents
+  (package-refresh-contents))
+
+(unless (package-installed-p 'use-package)
+  (package-install 'use-package))
+
+(setq use-package-always-ensure t)
+
+(add-to-list 'load-path (expand-file-name "~/.config/emacs/jd/"))
+
+(require 'use-package)
+
+
+(jd-emacs/load "keys")
+(jd-emacs/load "ui")
+(jd-emacs/load "org-mode")
+(jd-emacs/load "dev")
+(jd-emacs/load "apps")
+(jd-emacs/load "custom")
+
+
+(setq gc-cons-threshold (* 2 1000 1000))
+
+
+;; jd-int.el ends here
diff --git a/.config/emacs/jd-emacs/jd-emacs-keys.el b/.config/emacs/jd-emacs/jd-emacs-keys.el
new file mode 100644
index 0000000..cf7f06c
--- /dev/null
+++ b/.config/emacs/jd-emacs/jd-emacs-keys.el
@@ -0,0 +1,51 @@
+;;; Dotfiles --- Jakub Dlugosz emacs config
+;;; Commentary:
+
+;;; Code:
+
+(use-package general
+  :config
+  (general-create-definer jd/leader-key-def
+    :keymaps '(normal insert visual emacs)
+    :prefix "SPC"
+    :global-prefix "C-SPC")
+
+  (general-create-definer jd/ctrl-c-keys
+    :prefix "C-c"))
+
+(use-package undo-tree
+  :diminish
+  :config
+  (setq undo-tree-auto-save-history nil)
+  (global-undo-tree-mode 1))
+
+(use-package evil
+  :init
+  (setq evil-want-integration t)
+  (setq evil-want-keybinding nil)
+  (setq evil-want-C-u-scroll t)
+  (setq evil-want-Y-yank-to-eol t) 
+  (setq evil-want-C-i-jump nil) 
+  (setq evil-undo-system 'undo-tree)
+  (setq evil-kill-on-visual-paste nil)
+  :config
+  (evil-set-initial-state 'exwm-mode 'emacs)
+  (evil-mode 1))
+
+(use-package evil-collection
+  :after evil
+  :config
+  (evil-collection-init))
+
+(jd/leader-key-def
+  "w"  'evil-window-map
+  "wr" '(hydra-resize-window/body :which-key "Rezize window")
+  "wd" '(evil-window-delete :which-key "Window delete"))
+
+(jd/leader-key-def
+  "ou" '(undo-tree-visualize :which-key "Open"))
+
+;; remove . key
+(define-key evil-normal-state-map (kbd ".") '())
+
+;;; jd-keys.el ends here
diff --git a/.config/emacs/jd-emacs/jd-emacs-org-mode.el b/.config/emacs/jd-emacs/jd-emacs-org-mode.el
new file mode 100644
index 0000000..0e5ae42
--- /dev/null
+++ b/.config/emacs/jd-emacs/jd-emacs-org-mode.el
@@ -0,0 +1,200 @@
+;;; Dotfiles --- Jakub Dlugosz emacs config
+;;; Commentary:
+
+;;; Code:
+
+(defvar jd/org-home "~/Documents/Org")
+(defvar jd/org-roam-home (concat jd/org-home "/roam"))
+(defvar jd/org-roam-daily-home (concat jd/org-home "/roam/daily"))
+
+(defun jd/org-mode-init ()
+  (org-indent-mode)
+  (variable-pitch-mode 1)
+  (visual-line-mode 1))
+
+;; (defun jd-emacs/org-insert-date (&optional date)
+;;   (let ((d (or date "+0d")))
+;;     (org-insert-time-stamp (org-read-date nil t d)))) TODO
+
+
+(use-package org
+  :pin org
+  :commands (org-capture org-agenda)
+  :hook (org-mode . jd/org-mode-init)
+  :config
+  (setq org-directory (file-truename "~/Documents/Org/"))
+  (setq org-mobile-inbox-for-pull (concat org-directory "flagged.org"))
+  (setq org-mobile-directory "~/Dropbox/Apps/MobileOrg")
+  (setq org-agenda-files
+        '("Tasks.org"))
+  (setq org-ellipsis " ▾")
+  (setq org-agenda-start-with-log-mode t)
+  (setq org-log-done 'time)
+  (setq org-log-into-drawer t)
+  (setq org-return-follows-link t)
+  (setq org-capture-templates
+        `(("t" "Tasks / Projects")
+          ("tt" "Task" entry (file+olp "Tasks.org" "Inbox")
+           "* TODO %?\n  %t\n  %a\n  %i" :empty-lines 1)
+          ("tT" "Task for tomorow" entry (file+olp "Tasks.org" "Inbox")
+           "* TODO %?\n %t\n  SCHEDULED: %(jd-emacs/org-insert-date \"+1d\")>\n %a\n %i" :empty-lines 1)
+
+          ("m" "Metrics Capture")
+          ("mm" "Metrics" table-line (file+headline "Metrics.org" "Metrics")
+           "| %U | %^{Weight} | %^{Waist} | %^{Notes} |" :kill-buffer t)
+	  ("sh" "School Homework" entry (file+olp "school/todo(jd-emacs/org-insert-date \"1\").org"))))
+
+  (setq org-latex-listings 'minted
+        org-latex-packages-alist '(("" "minted"))
+        org-latex-pdf-process
+        '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
+          "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
+  (require 'org-tempo))
+(jd/leader-key-def
+  "o" '(:ignore t :which-key "Open/Org")
+  "oc" '(org-capture :which-key "Open org-capture")
+  "oop" '(org-mobile-pull :which-key "Org mobile pull")
+  "ooP" '(org-mobile-push :which-key "Org mobile push")
+  "oa" '(org-agenda :which-key "Open org-agenda"))
+
+(use-package evil-org
+  :after org
+  :hook (org-mode . (lambda () evil-org-mode))
+  :config
+  (require 'evil-org-agenda)
+  (evil-org-agenda-set-keys))
+
+(use-package toc-org
+  :config
+  (add-hook 'org-mode-hook 'toc-org-mode))
+
+(defun jd/org-font-setup ()
+  ;; Replace list hyphen with dot
+  (font-lock-add-keywords 'org-mode
+                          '(("^ *\\([-]\\) "
+                             (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•-"))))))
+
+  ;; Set faces for heading levels
+  (dolist (face '((org-level-1 . 1.3)
+                  (org-level-2 . 1.2)
+                  (org-level-3 . 1.1)
+                  (org-level-4 . 1.0)
+                  (org-level-5 . 1.0)
+                  (org-level-6 . 1.0)
+                  (org-level-7 . 1.0)
+                  (org-level-8 . 1.0)))
+    (set-face-attribute (car face) nil :font "Terminus" :weight 'Bold :height (cdr face)))
+
+  ;; Ensure that anything that should be fixed-pitch in Org files appears that way
+  (set-face-attribute 'org-block nil    :font "Terminus" :inherit 'fixed-pitch :height 100)
+  (set-face-attribute 'org-table nil    :inherit 'fixed-pitch)
+  (set-face-attribute 'org-formula nil  :inherit 'fixed-pitch)
+  (set-face-attribute 'org-code nil     :inherit '(shadow fixed-pitch))
+  (set-face-attribute 'org-table nil    :font "Terminus" :inherit '(shadow fixed-pitch))
+  (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
+  (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-comment-face fixed-pitch))
+  (set-face-attribute 'org-meta-line nil :inherit '(font-lock-comment-face fixed-pitch))
+  (set-face-attribute 'org-checkbox nil  :inherit 'fixed-pitch)
+  (set-face-attribute 'line-number nil :inherit 'fixed-pitch)
+  (set-face-attribute 'line-number-current-line nil :inherit 'fixed-pitch))
+
+(with-eval-after-load 'org (jd/org-font-setup))
+
+(defun jd-emacs/org-timer-stop ()
+  (start-process-shell-command "notify-send" nil "notify-send Zakonczono odliczanie"))
+
+
+(add-hook 'org-timer-stop-hook #'jd-emacs/org-timer-stop)
+
+(defun jd/org-tempo-setup ()
+  (add-to-list 'org-structure-template-alist '("s" . "src"))
+  (add-to-list 'org-structure-template-alist '("sql" . "src sql"))
+  (add-to-list 'org-structure-template-alist '("sh" . "src sh"))
+  (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp"))
+  (add-to-list 'org-structure-template-alist '("li" . "src lisp"))
+  (add-to-list 'org-structure-template-alist '("sc" . "src scheme"))
+  (add-to-list 'org-structure-template-alist '("ts" . "src typescript"))
+  (add-to-list 'org-structure-template-alist '("py" . "src python"))
+  (add-to-list 'org-structure-template-alist '("go" . "src go"))
+  (add-to-list 'org-structure-template-alist '("yaml" . "src yaml")))
+
+(with-eval-after-load 'org-tempo (jd/org-tempo-setup))
+
+(org-babel-do-load-languages
+ 'org-babel-load-languages
+ '((emacs-lisp . t)
+   (python . t)))
+
+(defun jd/org-babel-tangle-config ()
+  (when (string-equal (file-name-directory (buffer-file-name))
+                      (expand-file-name "~/dotfiles/"))
+    ;; Dynamic scoping to the rescue
+    (let ((org-confirm-babel-evaluate nil))
+      (org-babel-tangle))))
+
+(add-hook 'org-mode-hook (lambda () (add-hook 'after-save-hook #'jd/org-babel-tangle-config)))
+
+(defun jd/org-mode-visual-fill ()
+  (setq visual-fill-column-width 100
+        visual-fill-column-center-text t)
+  (visual-fill-column-mode 1))
+
+(use-package visual-fill-column
+  :hook (org-mode . jd/org-mode-visual-fill))
+
+(use-package org-superstar
+  :hook (org-mode . org-superstar-mode)
+  :init
+  (setq org-superstar-special-todo-items t)
+  (setq org-superstar-remove-leading-stars t)
+  (setq org-superstar-headline-bullets-list '("◉" "○" "●" "○" "●" "○" "●")))
+
+(defun jd/org-roam-filter-by-tag (tag-name)
+  (lambda (node)
+    (member tag-name (org-roam-node-tags node))))
+
+(defun jd/org-roam-list-notes-by-tag (tag-name)
+  (mapcar #'org-roam-node-file
+          (seq-filter
+           (jd/org-roam-filter-by-tag tag-name)
+           (org-roam-node-list))))
+
+(defun jd/org-roam-refreshagenda-list ()
+  (interactive)
+  (setq org-agenda-files (org-roam-list-files)))
+
+(use-package org-roam
+  :custom
+  (org-roam-directory (file-truename jd/org-roam-home))
+  :bind (("C-c n l" . org-roam-buffer-toggle)
+         ("C-c n f" . org-roam-node-find)
+         ("C-c n g" . org-roam-graph)
+         ("C-c n i" . org-roam-node-insert)
+         ("C-c n c" . org-roam-capture)
+         ;; Dailies
+         ("C-c n j" . org-roam-dailies-capture-today))
+  :bind-keymap
+  ("C-c n d" . org-roam-dailies-map)
+  :config
+  ;; If you're using a vertical completion framework, you might want a more informative completion interface
+  (setq org-roam-node-display-template (concat "${title:*} " (propertize "${tags:10}" 'face 'org-tag)))
+  (setq org-roam-capture-templates
+        '(("a" "workstuff" plain (file (concat org-roam-directory "/work"))
+           :target (file+head "work/%<%Y%m%d%H%M%S>-${slug}.org"
+                              "#+title: ${title}\n") :unnarrowed t)
+          ("b" "research" plain (file "~/Documents/roam/study/templates/research.org")
+           :target (file+head "study/%<%Y%m%d%H%M%S>-${slug}.org"
+			      "#+title: ${title}\n") :unnarrowed t)
+	  ("s" "School" plain nil
+	   :target (file+head
+		    "school/%<%Y%m%d%H%M%S>-${slug}.org"
+		    "#+title: ${title}\n")
+	   :unnarrowed t)
+	  ("d" "default" plain nil
+	   :target (file+head "%<%Y%m%d%H%M%S>-${slug}.org"
+			      "#+title: ${title}\n") :unnarrowed t)
+	  ))
+
+  (org-roam-db-autosync-mode))
+
+;;; jd-emacs-org-mode.el ends here
diff --git a/.config/emacs/jd-emacs/jd-emacs-ui.el b/.config/emacs/jd-emacs/jd-emacs-ui.el
new file mode 100644
index 0000000..c8236af
--- /dev/null
+++ b/.config/emacs/jd-emacs/jd-emacs-ui.el
@@ -0,0 +1,154 @@
+;;; Dotfiles --- Jakub Dlugosz emacs config
+;;; Commentary:
+
+;;; Code:
+
+(setq inhibit-startup-message t)
+(setq visible-bell t)
+(scroll-bar-mode -1)
+(tool-bar-mode -1)
+(tooltip-mode -1)
+(menu-bar-mode -1)
+(set-fringe-mode 10)
+
+(set-face-attribute 'default nil :font "Terminus" :height 100)
+
+(add-hook 'prog-mode-hook 'menu-bar--display-line-numbers-mode-relative)
+
+(global-set-key (kbd "<escape>") 'keyboard-escape-quit)
+
+(global-prettify-symbols-mode 1)
+
+(defalias 'yes-or-no-p 'y-or-n-p)
+
+(use-package doom-themes
+  :config
+  (load-theme 'ujelly t))
+
+(use-package diminish)
+
+(use-package hl-todo
+  :init
+  (setq hl-todo-keyword-faces
+        '(("TODO"   . "#FF0000")
+          ("FIXME"  . "#FF0000")
+          ("DEBUG"  . "#A020F0")))
+  :config
+  (global-hl-todo-mode 1))
+
+(defun jd/switch-buffer ()
+  (interactive)
+  (let ((completion-regexp-list '("\\`[^*]"
+                                  "\\`\\([^T]\\|T\\($\\|[^A]\\|A\\($\\|[^G]\\|G\\($\\|[^S]\\|S.\\)\\)\\)\\).*")))
+    (call-interactively 'counsel-switch-buffer)))
+
+(defvar jd/load-theme-hook nil)
+(defun jd/load-theme ()
+  (interactive)
+  (counsel-load-theme)
+  (run-hooks 'jd/load-theme-hook))
+
+(use-package ivy
+  :diminish
+  :bind
+  (("C-s" . swiper)
+   :map ivy-minibuffer-map
+   ("C-k" . ivy-previous-line)
+   ("C-j" . ivy-next-line)
+   :map ivy-switch-buffer-map
+   ("C-k" . ivy-previous-line))
+  :config
+  (ivy-mode 1))
+
+(use-package counsel
+  :config
+  (counsel-mode 1))
+
+(jd/leader-key-def
+  "t"  '(:ignore t :which-key "Toggle")
+  "tT" '(toggle-truncate-lines :which-key "Toggle truncate lines")
+  "tt" '(jd/load-theme  :which-key "Choose theme"))
+
+(jd/leader-key-def
+  "bb" '(jd/switch-buffer :which-key "Buffer switch")
+  "ba" '(counsel-switch-buffer :which-key "Buffer switch")
+  "b"  '(:ignore t :which-key "Buffer")
+  "," '(counsel-switch-buffer :which-key "Buffer switch"))
+
+(use-package which-key
+  :diminish
+  :config
+  (which-key-mode)
+  (setq which-key-idle-delay 0.3))
+
+(use-package all-the-icons)
+
+(use-package doom-modeline
+  ; :init (doom-modeline-mode 0)
+  :custom ((doom-modeline-height 15)))
+
+(use-package hydra
+  :defer t)
+
+(defun jd/text-scale-increase ()
+  (interactive)
+  (let ((old-face-attribute (face-attribute 'default :height)))
+    (set-face-attribute 'default nil :height (+ old-face-attribute 10))))
+
+(defun jd/text-scale-decrease ()
+  (interactive)
+  (let ((old-face-attribute (face-attribute 'default :height)))
+    (set-face-attribute 'default nil :height (- old-face-attribute 10))))
+
+(defhydra hydra-resize-window (:timeout 4)
+  ("h" evil-window-decrease-width "<")
+  ("l" evil-window-increase-width ">")
+  ("k" evil-window-decrease-height "^")
+  ("j" evil-window-increase-height "v")
+  ("q" nil "finished" :exit t))
+
+(defhydra hydra-text-scale-global (:timeout 4)
+  "scale text"
+  ("j" jd/text-scale-increase "in")
+  ("k" jd/text-scale-decrease "out")
+  ("q" nil "finished" :exit t))
+
+(defhydra hydra-text-scale (:timeout 4)
+  "scale text"
+  ("j" text-scale-increase "in")
+  ("k" text-scale-decrease "out")
+  ("q" nil "finished" :exit t))
+
+(jd/leader-key-def
+  "tS" '(hydra-text-scale-global/body :which-key "Scale text")
+  "ts" '(hydra-text-scale/body :which-key "Scale text"))
+
+(use-package beacon
+  :config
+  (beacon-mode 1))
+
+(jd/leader-key-def
+  "f"  '(:ignore t :which-key "Files")
+  "fs" '(save-buffer :which-key "File save")
+  "." '(find-file :which-key "Find file")
+  "ff" '(find-file :which-key "Find file"))
+
+(jd/leader-key-def
+  "e"   '(:ignore t :which-key "Eval")
+  "eb"  '(eval-buffer :which-key "Eval buffer")
+  "ee" '(eval-defun :which-key "Eval defun"))
+
+(jd/leader-key-def
+  :keymaps '(visual)
+  "er" '(eval-region :which-key "Eval region"))
+
+(defun jd/kill-other-buffers () 
+  (interactive)                                                                   
+  (mapc 'kill-buffer (cdr (buffer-list (current-buffer)))))
+
+(jd/leader-key-def
+  "bK" '(jd/kill-other-buffers :which-key "Kill other buffers")
+  "bk" '(kill-current-buffer :which-key "Kill buffer")
+  "bB" '(ibuffer :which-key "Open ibuffer"))
+
+;;; jd-ui.el ends here
diff --git a/.config/emacs/jd-exwm/init.el b/.config/emacs/jd-exwm/init.el
new file mode 100644
index 0000000..cf043fb
--- /dev/null
+++ b/.config/emacs/jd-exwm/init.el
@@ -0,0 +1,149 @@
+(defun jd/exwm-update-class ()
+    (exwm-workspace-rename-buffer exwm-class-name))
+
+  (defun jd-exwm/run-in-background (command)
+    (let ((command-parts (split-string command "[ ]+")))
+      (apply #'call-process `(,(car command-parts) nil 0 nil ,@(cdr command-parts)))))
+
+  (defun jd-exwm/restart-process (program-name)
+    (call-process "killall" nil nil nil program-name)
+    (jd-exwm/run-in-background program-name))
+
+  (defun jd-exwm/exwm-init-hook ()
+    (jd-exwm/run-in-background "nitrogen --restore")
+    (start-process-shell-command "xinput" nil "xinput set-prop 'ETPS/2 Elantech Touchpad' 'Synaptics Tap Action' 1 1 1 2 1")
+(start-process-shell-command "syndaemon" nil "syndaemon -i 0.8 -K -R -d")
+
+    (jd-exwm/restart-process "polybar")
+    (jd-exwm/restart-process "nm-applet")
+    (jd-exwm/restart-process "redshift-gtk -l 54.37:18.6")
+    (jd-exwm/restart-process "blueman-applet"))
+
+  (defun jd-exwm/exwm-update-title ()
+    (exwm-workspace-rename-buffer exwm-title))
+
+  (defun jd-exwm/configure-window-by-class ()
+    (interactive)
+    (pcase exwm-class-name
+      ("firefox" (exwm-workspace-move-window 2))
+      ("Brave" (exwm-workspace-move-window 2))
+      ("qutebrowser" (exwm-workspace-move-window 2))
+      ("discord" (exwm-workspace-move-window 5))
+      ("obs" (exwm-workspace-move-window 5))
+      ("Virt-manager" (exwm-workspace-move-window 4))))
+
+  (use-package exwm
+    :config
+    (setq exwm-workspace-number 10)
+
+    (add-hook 'exwm-init-hook #'jd-exwm/exwm-init-hook)
+    (add-hook 'exwm-update-class-hook #'jd/exwm-update-class)
+    (add-hook 'exwm-update-title-hook #'jd-exwm/exwm-update-title)
+    (add-hook 'exwm-manage-finish-hook #'jd-exwm/configure-window-by-class)
+
+    (require 'exwm-randr)
+    (setq exwm-randr-workspace-monitor-plist '(9 "eDP-1" 0 "eDP-1"))
+    (exwm-randr-enable)
+
+    (setq exwm-input-simulation-keys
+          '(([?\C-h] . [left])
+            ([?\C-l] . [right])
+            ([?\C-k] . [up])
+            ([?\C-j] . [down])))
+
+    (setq exwm-input-prefix-keys
+          '(?\C-x
+            ?\C-u
+            ?\C-h
+            ?\M-x
+            ?\M-`
+            ?\M-&
+            ?\M-:
+            ?\C-\M-j 
+            ?\C-\ ))  
+
+    (define-key exwm-mode-map [?\C-q] 'exwm-input-send-next-key)
+    (exwm-input-set-key (kbd "s-p") 'counsel-linux-app)
+
+    (setq exwm-input-global-keys
+          `(([?\s-R] . exwm-reset)
+
+
+            ([?\s-r] . (lambda (command)
+                         (interactive (list (read-shell-command "$ ")))
+                         (start-process-shell-command command nil command)))
+
+            ([?\s-W] . exwm-workspace-move-window)
+            ([?\s-w] . exwm-workspace-switch)
+
+            ,@(mapcar (lambda (i)
+                        `(,(kbd (format "s-%d" i)) .
+                          (lambda ()
+                            (interactive)
+                            (exwm-workspace-switch-create ,i))))
+                      (number-sequence 0 9))))
+
+    (exwm-enable))
+
+(use-package desktop-environment
+  :after exwm
+  :config (desktop-environment-mode)
+  :custom
+  (desktop-environment-brightness-small-increment "2%+")
+  (desktop-environment-brightness-small-decrement "2%-")
+  (desktop-environment-brightness-normal-increment "5%+")
+  (desktop-environment-brightness-normal-decrement "5%-"))
+
+(set-frame-parameter (selected-frame) 'alpha '(90 . 90))
+(add-to-list 'default-frame-alist `(alpha . (90 . 90)))
+(set-frame-parameter (selected-frame) 'fullscreen 'maximized)
+(add-to-list 'default-frame-alist '(fullscreen . maximized))
+
+(defun jd-exwm/get-color (ATTRIBUTE)
+  (face-attribute 'default ATTRIBUTE))
+
+(defun theme-to-xresources ()
+  (interactive)
+  (require 'term)
+  (with-temp-buffer
+    (insert "! Generated by theme-to-xresources\n")
+    (dolist (spec
+             '(("emacs.background" :background "E6")
+               ("emacs.foreground" :foreground "")))
+      (let ((color (jd-exwm/get-color (cadr spec))))
+        (insert (format "%s: #%s%s\n"
+                        (car spec)
+                        (caddr spec)
+                        (string-remove-prefix "#" color))))
+      (write-region (point-min) (point-max) "~/.Xresources")))
+  (call-process "xrdb" nil nil nil "-merge" (expand-file-name "~/.Xresources")))
+
+(defun jd/theme-sync ()
+  (interactive)
+  (theme-to-xresources)
+  (setq org-confirm-babel-evaluate nil)
+  (org-babel-tangle-file "~/dotfiles/Desktop.org")
+  (setq org-confirm-babel-evaluate 't)
+  (call-process "killall" nil nil nil "dunst") ;;  TODO: prevent clear notification history 
+  (jd-exwm/restart-process "polybar"))
+
+(add-hook 'jd/load-theme-hook #'jd/theme-sync)
+(add-hook 'exwm-init-hook #'jd/theme-sync)
+
+(defun jd/dunst-show-history ()
+  (interactive)
+  (start-process-shell-command "dunstctl" nil "dunstctl history-pop"))
+
+(defun jd/dunst-close ()
+  (interactive)
+  (start-process-shell-command "dunstctl" nil "dunstctl close"))
+
+(defun jd/dunst-close-all ()
+  (interactive)
+  (start-process-shell-command "dunstctl" nil "dunstctl close-all"))
+
+(jd/leader-key-def
+  "d" '(nil :which-key "dunst")
+  "dh" '(jd/dunst-show-history :which-key "show history") 
+  "dc" '(jd/dunst-close :which-key "close") 
+  "da" '(jd/dunst-close-all :which-key "close all"))
diff --git a/.config/emacs/jd-exwm/start.sh b/.config/emacs/jd-exwm/start.sh
new file mode 100644
index 0000000..98149b6
--- /dev/null
+++ b/.config/emacs/jd-exwm/start.sh
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+# picom &
+
+xss-lock -- slock &
+
+export VISUAL="emacsclient -a vim"
+export EDITOR="$VISUAL"
+export GTK_THEME="Adwaita:dark"
+export CALIBRE_USE_DARK_PALETTE=1
+export JD_EXWM=1
+
+gentoo-pipewire-launcher &
+
+exec dbus-launch --exit-with-session emacs -mm --debug-init -l ~/.config/emacs/exwm/desktop.el
diff --git a/.config/emacs/jd/jd-mu4e.el b/.config/emacs/jd/jd-mu4e.el
index cc0eb24..0f45f15 100644
--- a/.config/emacs/jd/jd-mu4e.el
+++ b/.config/emacs/jd/jd-mu4e.el
@@ -1,13 +1,14 @@
-(add-to-list 'load-path "/usr/share/emacs/site-lisp/mu4e")
+(add-to-list 'load-path "/usr/local/share/emacs/site-lisp/mu4e")
 
 (use-package org-msg)
 
 (use-package mu4e
-  :defer 20
+  :defer 10
   :ensure nil
   :config
   (require 'org-mu4e)
 
+  (setq mu4e-mu-binary "/usr/local/bin/mu")
   (setq mu4e-update-interval (* 10 60))
   (setq mu4e-get-mail-command "mbsync -a")
   (setq mu4e-maildir "~/Mail")
@@ -54,12 +55,22 @@
         smtpmail-smtp-service 465
         smtpmail-stream-type  'ssl)
 
+  (setq mu4e-compose-signature (concat
+                                "Pozdrawiam,\n"
+                                "Jakub Długosz"))
+
   (mu4e t))
 
+(use-package mu4e-alert
+  :defer 20
+  :config
+  (mu4e-alert-set-default-style 'libnotify)
+  (mu4e-alert-enable-mode-line-display)
+  (mu4e-alert-enable-notifications))
+
 (jd/leader-key-def
   "m"  '(:ignore t :which-key "mail")
   "mm" 'mu4e
   "mc" 'mu4e-compose-new)
 
-
 (provide 'jd-mu4e)
-- 
cgit v1.2.3