summaryrefslogtreecommitdiff
path: root/.emacs.d
diff options
context:
space:
mode:
Diffstat (limited to '.emacs.d')
-rw-r--r--.emacs.d/init.el43
-rw-r--r--.emacs.d/modules/multi-eshell.el150
-rw-r--r--.emacs.d/modules/thanos-aesthetics.el145
-rw-r--r--.emacs.d/modules/thanos-ai.el36
-rw-r--r--.emacs.d/modules/thanos-books.el48
-rw-r--r--.emacs.d/modules/thanos-chat.el69
-rw-r--r--.emacs.d/modules/thanos-commands.el88
-rw-r--r--.emacs.d/modules/thanos-dev.el103
-rw-r--r--.emacs.d/modules/thanos-dired.el87
-rw-r--r--.emacs.d/modules/thanos-elfeed.el126
-rw-r--r--.emacs.d/modules/thanos-eshell.el158
-rw-r--r--.emacs.d/modules/thanos-markdown.el49
-rw-r--r--.emacs.d/modules/thanos-mu4e.el130
-rw-r--r--.emacs.d/modules/thanos-multimedia.el107
-rw-r--r--.emacs.d/modules/thanos-org-config.el79
-rw-r--r--.emacs.d/modules/thanos-org-roam.el105
-rw-r--r--.emacs.d/modules/thanos-org-themes.el142
-rw-r--r--.emacs.d/modules/thanos-packages.el64
-rw-r--r--.emacs.d/modules/thanos-pass.el91
-rw-r--r--.emacs.d/modules/thanos-random.el32
-rw-r--r--.emacs.d/modules/thanos-vm.el54
-rw-r--r--.emacs.d/modules/thanos-yeetube.el95
22 files changed, 2001 insertions, 0 deletions
diff --git a/.emacs.d/init.el b/.emacs.d/init.el
new file mode 100644
index 0000000..f6e6032
--- /dev/null
+++ b/.emacs.d/init.el
@@ -0,0 +1,43 @@
+;;
+
+(setf user-full-name "Thanos Apollo"
+ user-mail-address "[email protected]")
+
+(defvar is-zeus (equal (system-name) "zeus"))
+(defvar is-hermes (equal (system-name) "hermes"))
+(defvar is-phone (equal (system-name) "localhost"))
+
+(setf browse-url-browser-function 'browse-url-generic
+ browse-url-generic-program "firefox")
+
+(setf backup-directory-alist '((".*" . "~/.Trash")))
+
+(define-prefix-command 'thanos/applications-map)
+(global-set-key (kbd "C-c a") 'thanos/applications-map)
+
+(define-prefix-command 'Create)
+(define-key thanos/applications-map (kbd "C-c") 'Create)
+
+;;(global-set-key (kbd "<escape>") 'keyboard-escape-quit) ;
+
+;; custom themes
+(add-to-list 'custom-theme-load-path (expand-file-name "~/.emacs.d/themes/"))
+
+(require 'cl-lib)
+
+(defun thanos/load-modules ()
+ "."
+ (let* ((modules-dir (concat user-emacs-directory "modules"))
+ (modules (cl-remove-if-not
+ (lambda (file) (string-suffix-p ".el" file))
+ (directory-files modules-dir t))))
+ (dolist (module modules)
+ (when (not (string-match-p "#" module))
+ (load module)))))
+
+
+(thanos/load-modules)
+
+
+
+;;; init.el ends here
diff --git a/.emacs.d/modules/multi-eshell.el b/.emacs.d/modules/multi-eshell.el
new file mode 100644
index 0000000..4e6cc6b
--- /dev/null
+++ b/.emacs.d/modules/multi-eshell.el
@@ -0,0 +1,150 @@
+;;; multi-eshell.el --- multi-eshell -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(defgroup multi-eshell nil
+ "Simple support for having multiple shells open."
+ :group 'languages)
+
+(defcustom multi-eshell-shell-function '(eshell)
+ "Command called to create shell"
+ :group 'multi-eshell)
+
+(defcustom multi-eshell-name "*eshell*" "The name of the buffer opened by the shell command."
+ :type 'string
+ :group 'multi-eshell)
+
+(defun multi-eshell-function ()
+ "This function opens the appropriate shell."
+ (eval multi-eshell-shell-function))
+
+(defvar multi-eshell-ring (make-ring 100)
+ "This stores a bunch of buffers, which are shells created by multi-eshell." )
+(setq multi-eshell-index 0 )
+(defvar multi-eshell-last-buffer nil)
+
+(defun multi-eshell-is-current-buffer-current-multi-eshell (&optional ignored)
+ "Checks if current buffer is the current multi-eshell."
+ (eq (current-buffer) (ring-ref multi-eshell-ring multi-eshell-index)))
+
+(defun multi-eshell-switch-to-current-shell (&optional ignored)
+ "Switch to shell buffer."
+ (if (buffer-live-p (ring-ref multi-eshell-ring multi-eshell-index))
+ (switch-to-buffer (ring-ref multi-eshell-ring multi-eshell-index))))
+
+(defun multi-eshell-current-shell (&optional ignored)
+ "Returns the current multi-eshell."
+ (ring-ref multi-eshell-ring multi-eshell-index))
+
+(defun multi-eshell-switch-to-next-live-shell (&optional ignored)
+ "Switches to the next live shell. Creates one if none exists."
+ (interactive "p")
+ (let ((still-looking t)
+ (empty nil))
+ (while (and still-looking (not empty))
+ (if (ring-empty-p multi-eshell-ring)
+ (progn
+ (setq empty t)
+ (multi-eshell 1))
+ (progn
+ (if (buffer-live-p (ring-ref multi-eshell-ring multi-eshell-index))
+ (progn
+ (setq multi-eshell-index (+ multi-eshell-index 1))
+ (switch-to-buffer (ring-ref multi-eshell-ring multi-eshell-index))
+ (setq still-looking nil))
+ (ring-remove multi-eshell-ring multi-eshell-index)))))))
+
+;;;###autoload
+(defun multi-eshell-go-back (&optional ignored)
+ "Switch to buffer multi-eshell-last-buffer."
+ (interactive "p")
+ (if (buffer-live-p multi-eshell-last-buffer)
+ (switch-to-buffer multi-eshell-last-buffer)
+ (message "Last buffer visited before multi-eshell is gone. Nothing to go back to..")))
+
+
+;;;###autoload
+(defun multi-eshell-switch (&optional ignored)
+ "If current buffer is not an multi-eshell, switch to current multi-eshell buffer. Otherwise, switch to next multi-eshell buffer."
+ (interactive "p")
+ (progn
+ (setq multi-eshell-last-buffer (current-buffer))
+ (let ((still-looking t)
+ (empty nil))
+ (if (ring-empty-p multi-eshell-ring)
+ (multi-eshell 1)
+ (if (and (buffer-live-p (multi-eshell-current-shell) )
+ (not (eq (multi-eshell-current-shell) (current-buffer))))
+ (switch-to-buffer (multi-eshell-current-shell))
+ (multi-eshell-switch-to-next-live-shell))))))
+
+;;;###autoload
+(defun multi-eshell (&optional numshells)
+ "Creates a shell buffer. If one already exists, this creates a new buffer, with the name '*shell*<n>', where n is chosen by the function generate-new-buffer-name."
+ (interactive "p")
+ (progn
+ (setq multi-eshell-last-buffer (current-buffer))
+ (dotimes (i (if-void 'numshells 1) nil)
+ (let ( (tempname (generate-new-buffer-name "*tempshell*"))
+ (new-buff-name (generate-new-buffer-name multi-eshell-name))
+ (localdir default-directory))
+ (if (eq (get-buffer multi-eshell-name) nil)
+ (progn
+ (multi-eshell-function)
+ (ring-insert multi-eshell-ring (current-buffer))
+ (setq multi-eshell-index (+ multi-eshell-index 1)))
+ (progn
+ (interactive)
+ (multi-eshell-function)
+ (rename-buffer tempname)
+ (multi-eshell-function)
+ (rename-buffer new-buff-name )
+ (switch-to-buffer tempname)
+ (rename-buffer multi-eshell-name)
+ (switch-to-buffer new-buff-name)
+ (ring-insert multi-eshell-ring (current-buffer) )
+ (setq multi-eshell-index (+ multi-eshell-index 1))))))))
+
+(defun shell-with-name (name)
+ "Creates a shell with name given by the first argument, and switches to it. If a buffer with name already exists, we simply switch to it."
+ (let ((buffer-of-name (get-buffer name))
+ (tempname (generate-new-buffer-name "*tempshell*") ) )
+ (cond ((bufferp buffer-of-name) ;If the buffer exists, switch to it (assume it is a shell)
+ (switch-to-buffer name))
+ ((bufferp (get-buffer multi-eshell-name))
+ (progn
+ (multi-eshell-function)
+ (rename-buffer tempname)
+ (multi-eshell-function)
+ (rename-buffer name)
+ (switch-to-buffer tempname)
+ (rename-buffer multi-eshell-name)
+ (switch-to-buffer name)))
+ (t
+ (progn
+ (multi-eshell-function)
+ (rename-buffer name))))))
+
+(provide 'multi-eshell)
+;;; multi-eshell.el ends here
diff --git a/.emacs.d/modules/thanos-aesthetics.el b/.emacs.d/modules/thanos-aesthetics.el
new file mode 100644
index 0000000..c3c31f4
--- /dev/null
+++ b/.emacs.d/modules/thanos-aesthetics.el
@@ -0,0 +1,145 @@
+;;; thanos-aesthetics.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(setf inhibit-startup-message t)
+(setf initial-scratch-message nil)
+
+;; Transparency
+(add-to-list 'default-frame-alist '(alpha-background . 90))
+(add-to-list 'default-frame-alist '(alpha 90 90))
+
+
+(add-hook 'dired-mode-hook 'all-the-icons-dired-mode)
+
+(when (equal is-phone nil)
+ (scroll-bar-mode -1)
+ (set-fringe-mode 10))
+
+(beacon-mode 1)
+(tool-bar-mode -1)
+(tooltip-mode -1)
+(menu-bar-mode -1)
+(which-key-mode 1)
+(blink-cursor-mode -1)
+(menu-bar--visual-line-mode-enable)
+(global-visual-line-mode 1)
+
+;; Set emojis for emacs 29
+(require 'emojify)
+(setf global-emojify-mode 1)
+
+(setf visible-bell t)
+
+(column-number-mode)
+(global-display-line-numbers-mode 1)
+(menu-bar--display-line-numbers-mode-relative)
+;;Disable line numbers for some modes
+(dolist (mode '(pdf-view-mode-hook
+ org-mode-hook
+ term-mode-hook
+ shell-mode-hook
+ eshell-mode-hook
+ vterm-mode-hook
+ elfeed
+ vterm-mode
+ telega-chat-mode-hook
+ telega-root-mode-hook
+ nov-mode-hook
+ transmission-mode-hook))
+ (add-hook mode (lambda ()
+ (display-line-numbers-mode 0))))
+
+;; Set font-size for each device
+(custom-set-faces
+ (if is-hermes '(default ((t (:inherit nil :height 120 :family "Jetbrains Mono"))))
+ '(default ((t (:inherit nil :height 135 :family "Jetbrains Mono"))))))
+
+(load-theme 'doom-monokai-classic)
+
+(doom-modeline-mode 1)
+
+(setf doom-modeline-height 35)
+
+;; Don't display battery-mode on desktop
+(if is-zeus
+ (display-battery-mode 0)
+ (display-battery-mode 1))
+
+(require 'ivy)
+
+(ivy-mode 1)
+(setf ivy-use-virtual-buffers t)
+(setf enable-recursive-minibuffers t)
+(global-set-key (kbd "C-s") 'swiper)
+(define-key ivy-minibuffer-map (kbd "TAB") 'ivy-alt-done)
+(global-set-key "\C-s" 'swiper)
+(global-set-key (kbd "C-c C-r") 'ivy-resume)
+(global-set-key (kbd "<f6>") 'ivy-resume)
+(global-set-key (kbd "M-x") 'counsel-M-x)
+(global-set-key (kbd "C-x C-f") 'counsel-find-file)
+(global-set-key (kbd "<f1> f") 'counsel-describe-function)
+(global-set-key (kbd "<f1> v") 'counsel-describe-variable)
+(global-set-key (kbd "<f1> o") 'counsel-describe-symbol)
+(global-set-key (kbd "<f1> l") 'counsel-find-library)
+(global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
+(global-set-key (kbd "<f2> u") 'counsel-unicode-char)
+(global-set-key (kbd "C-c g") 'counsel-git)
+(global-set-key (kbd "C-c j") 'counsel-git-grep)
+(global-set-key (kbd "C-c k") 'counsel-ag)
+(global-set-key (kbd "C-x l") 'counsel-locate)
+(global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
+(define-key minibuffer-local-map (kbd "C-r") 'counsel-minibuffer-history)
+
+(ivy-rich-mode 1)
+(all-the-icons-ivy-rich-mode 1)
+
+(setf ivy-use-selectable-prompt t)
+
+(global-set-key (kbd "C-c m") 'consult-imenu)
+(define-key thanos/applications-map (kbd "t") 'counsel-load-theme)
+
+(require 'helpful)
+(global-set-key (kbd "C-h f") #'helpful-callable)
+(global-set-key (kbd "C-h v") #'helpful-variable)
+(global-set-key (kbd "C-h k") #'helpful-key)
+(global-set-key (kbd "C-h x") #'helpful-command)
+
+(global-set-key (kbd "C-c C-d") #'helpful-at-point)
+(global-set-key (kbd "C-h F") #'helpful-function)
+
+(setf counsel-describe-function-function #'helpful-callable)
+(setf counsel-describe-variable-function #'helpful-variable)
+
+(global-set-key (kbd "C-x r d") 'bookmark-delete)
+(global-set-key (kbd "C-x r C-r") 'bookmark-rename)
+
+;; ibuffer
+(global-set-key (kbd "C-x C-b") 'ibuffer)
+
+
+
+(provide 'thanos-aesthetics)
+;;; thanos-aesthetics.el ends here
diff --git a/.emacs.d/modules/thanos-ai.el b/.emacs.d/modules/thanos-ai.el
new file mode 100644
index 0000000..387e71d
--- /dev/null
+++ b/.emacs.d/modules/thanos-ai.el
@@ -0,0 +1,36 @@
+;;; thanos-ai.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'gptel)
+
+(define-key 'thanos/applications-map (kbd "c") 'gptel-send)
+
+(setf gptel-api-key (password-store-get "chatgpt/api")
+ gptel-model 'gpt-4-32k)
+
+
+(provide 'thanos-ai)
+;;; thanos-ai.el ends here
diff --git a/.emacs.d/modules/thanos-books.el b/.emacs.d/modules/thanos-books.el
new file mode 100644
index 0000000..b34992e
--- /dev/null
+++ b/.emacs.d/modules/thanos-books.el
@@ -0,0 +1,48 @@
+;;; thanos-books.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+
+(require 'pdf-tools)
+(require 'nov)
+
+(pdf-tools-install)
+;;Add pdf-isearch-minor-mode hook, otherwise isearch will be buggy
+;;Darkmode hook, cause I don't want color or light in my life, I'm a vampire.
+(add-hook 'pdf-view-mode-hook 'pdf-isearch-minor-mode)
+(add-hook 'pdf-view-mode-hook 'pdf-view-midnight-minor-mode)
+(add-to-list 'auto-mode-alist '("\\.pdf\\'" . 'pdf-view-mode))
+
+(add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))
+
+(defun my-nov-font-setup ()
+ (face-remap-add-relative 'variable-pitch
+ :family "Jetbrains Mono"
+ :height 100))
+(add-hook 'nov-mode-hook 'my-nov-font-setup)
+
+
+(provide 'thanos-books)
+;;; thanos-books.el ends here
diff --git a/.emacs.d/modules/thanos-chat.el b/.emacs.d/modules/thanos-chat.el
new file mode 100644
index 0000000..e4e6445
--- /dev/null
+++ b/.emacs.d/modules/thanos-chat.el
@@ -0,0 +1,69 @@
+;;; thanos-chat.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+
+(defun ement-login ()
+ (interactive)
+ (ement-connect
+ :user-id "@thanos_apollon:matrix.org"
+ :password (password-store-get "matrix/thanos_apollon")
+ :uri-prefix "https://matrix-client.matrix.org"))
+
+(define-key thanos/applications-map (kbd "M-e") 'ement-login)
+
+;;; Code:
+(require 'erc)
+
+(setf erc-modules
+ '(sasl netsplit fill button match track completion readonly
+networks ring autojoin noncommands irccontrols move-to-prompt stamp
+menu list))
+
+(defun erc-libera ()
+ "Login to liberachat with erc."
+ (interactive)
+ (erc-tls :server "irc.libera.chat" :port 6697
+ :nick "thanosapollo"
+ :user "thanosapollo"
+ :password (password-store-get "liberachat/thanos_apollo")))
+
+(defun erc-mouse ()
+ "Login to liberachat with erc."
+ (interactive)
+ (erc-tls :server "irc.myanonamouse.net" :port 6697
+ :nick "Skylosophos"
+ :user "Skylosophos"
+ :password (password-store-get "myanonamouse.net/irc")))
+
+(define-key thanos/applications-map (kbd "i") 'erc-libera)
+
+(require 'telega)
+(add-hook 'telega-root-mode-hook 'emojify-mode)
+(add-hook 'telega-chat-mode-hook 'emojify-mode)
+
+
+(provide 'thanos-chat)
+;;; thanos-chat.el ends here
diff --git a/.emacs.d/modules/thanos-commands.el b/.emacs.d/modules/thanos-commands.el
new file mode 100644
index 0000000..827bd49
--- /dev/null
+++ b/.emacs.d/modules/thanos-commands.el
@@ -0,0 +1,88 @@
+;;; thanos-commands.el --- custom commands/functions -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'gptel)
+
+(defvar vm-directory "~/virtual-machines/")
+
+
+(defun thanos/run-in-background (command)
+ "Run COMMAND in the background."
+ (let ((command-parts (split-string command "[ ]+")))
+ (apply #'call-process `(,(car command-parts) nil 0 nil ,@(cdr command-parts)))))
+
+
+(defun thanos/emacs-keys ()
+ "Swap caps with ctrl."
+ (interactive)
+ (start-process-shell-command
+ "setxkbmap" nil "setxkbmap us -option ctrl:swapcaps"))
+
+(defun create-text-scratch ()
+ "Create a scratch buffer."
+ (interactive)
+ (switch-to-buffer (get-buffer-create "*Text Scratch*"))
+ (markdown-mode)
+ (gptel-mode))
+
+(define-key Create (kbd "t") 'create-text-scratch)
+
+(defun create-scratch ()
+ "Create scratch buffer."
+ (interactive)
+ (switch-to-buffer (get-buffer-create "*scratch*"))
+ (emacs-lisp-mode))
+
+(define-key Create (kbd "e") 'create-scratch)
+
+(defun vm-create-image ()
+ "Create qcow2 image."
+ (interactive)
+ (let ((name (format "%s%s.qcow2" vm-directory (read-string "Name: ")))
+ (size (format "%s" (read-string "Size(G): "))))
+ (shell-command
+ (format "qemu-img create -f qcow2 %s %sG" name size))))
+
+
+(defun vm-run ()
+ "Spawn Virtual Machine."
+ (interactive)
+ (let ((memory (format "%sG" (read-string "Memory(G): ")))
+ (cores (read-string "Cores: "))
+ (image (read-file-name "Image: " vm-directory))
+ (iso (if (y-or-n-p "Load iso?? ")
+ (read-file-name "ISO: ")
+ nil)))
+ (start-process-shell-command
+ "virtual-machine" nil
+ (format "qemu-system-x86_64 -enable-kvm -m %s -smp %s -hda %s -vga qxl -device virtio-serial-pci -spice port=5784,disable-ticketing -display spice-app %s "
+ memory cores image (when iso (concat "-cdrom " iso))))))
+
+
+
+
+(provide 'thanos-commands)
+;;; thanos-commands.el ends here
diff --git a/.emacs.d/modules/thanos-dev.el b/.emacs.d/modules/thanos-dev.el
new file mode 100644
index 0000000..f80b64b
--- /dev/null
+++ b/.emacs.d/modules/thanos-dev.el
@@ -0,0 +1,103 @@
+;;; thanos-dev.el --- Developer Tools Configuration -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords: extensions
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'company)
+
+(add-hook 'after-init-hook 'global-company-mode)
+(define-key company-active-map (kbd "TAB") 'company-indent-or-complete-common)
+(setq company-idle-delay
+ (lambda () (if (company-in-string-or-comment) nil 0.0)))
+
+(require 'company-box)
+(add-hook 'company-mode-hook 'company-box-mode)
+(setf company-box-icons-alist 'company-box-icons-images)
+
+(setq indent-tabs-mode nil)
+
+(defun insert-brackets (&optional arg)
+ "Insert brackets."
+ (interactive "P")
+ (insert-pair arg ?\[ ?\]))
+
+(global-set-key (kbd "C-x M-[") 'insert-brackets)
+
+(require 'magit)
+
+(setf magit-display-buffer-function #'magit-display-buffer-same-window-except-diff-v1)
+(define-prefix-command 'thanos/magit)
+(global-set-key (kbd "C-c g") 'thanos/magit)
+(define-key thanos/magit (kbd "c") 'magit-clone)
+
+(define-auto-insert '("\\.sh\\'" . "Bash skeleton")
+ '("Description:" \n
+ "#!/bin/bash"))
+
+(add-hook 'shell-script-mode #'auto-insert)
+
+(setf tab-always-indent 'complete)
+(add-to-list 'completion-styles 'initials t)
+
+(add-hook 'emacs-lisp-mode-hook #'rainbow-delimiters-mode)
+(add-hook 'emacs-lisp-mode-hook #'company-mode)
+(add-hook 'emacs-lisp-mode-hook #'display-line-numbers-mode)
+
+;; Disable checkdoc flycheck for org-src buffers
+(add-hook 'org-src-mode-hook #'(lambda ()
+ (flycheck-disable-checker 'emacs-lisp-checkdoc)))
+
+(setf inferior-lisp-program "sbcl")
+(add-hook 'lisp-mode-hook #'rainbow-delimiters-mode)
+(add-hook 'lisp-mode-hook #'company-mode)
+(add-hook 'lisp-mode-hook #'display-line-numbers-mode)
+
+(add-hook 'scheme-mode-hook #'rainbow-delimiters-mode)
+(add-hook 'scheme-mode-hook #'company-mode)
+
+(defun thanos/lsp-mode-setup ()
+ (setf lsp-headerline-breadcrumb-segments '(path-up-to-project file symbols))
+ (lsp-headerline-breadcrumb-mode))
+
+(require 'lsp-mode)
+(add-hook 'lsp-mode #'thanos/lsp-mode-setup)
+(setf lsp-keymap-prefix "C-c l")
+(lsp-enable-which-key-integration t)
+
+(require 'lsp-ui)
+(add-hook 'lsp-mode 'lsp-ui-mode)
+(setf lsp-ui-doc-position 'bottom)
+
+;; set pylsp with lsp-mode
+(setf lsp-pyls-server-command "~/usr/bin/pylsp")
+
+(require 'python-mode)
+(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
+(add-hook 'python-mode 'lsp-deferred)
+
+(require 'json-mode)
+(add-to-list 'auto-mode-alist '("\\.json'" . json-mode))
+
+
+(provide 'thanos-dev)
+;;; thanos-dev.el ends here
diff --git a/.emacs.d/modules/thanos-dired.el b/.emacs.d/modules/thanos-dired.el
new file mode 100644
index 0000000..3a61378
--- /dev/null
+++ b/.emacs.d/modules/thanos-dired.el
@@ -0,0 +1,87 @@
+;;; thanos-dired.el --- Dired configuration -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'dired)
+(require 'all-the-icons-dired)
+
+(defun dired-watch-video ()
+ "Watch play file with mpv."
+ (interactive)
+ (call-process-shell-command
+ (format "mpv \"%s\"" (dired-get-filename)) nil 0))
+
+(defun dired-set-wallpaper ()
+ "Set NAME as wallpaper using feh."
+ (interactive)
+ (call-process-shell-command
+ (format "feh --bg-scale %s" (dired-get-filename)) nil 0))
+
+(defun dired-delete-files-except ()
+ "Delete all files inside directory except match."
+ (interactive)
+ (let* ((directory (read-directory-name "Select directory: "))
+ (files (directory-files directory t))
+ (except-match (read-string "Except the ones that have: ")))
+ (dolist (file files)
+ (unless (or (string= "." (substring file -1))
+ (string= ".." (substring file -2))
+ (string-match except-match file))
+ (dired-delete-file file t)))))
+
+(defun dired-delete-file-match ()
+ "Delete all files inside directory except match."
+ (interactive)
+ (let* ((directory (read-directory-name "Select directory: "))
+ (files (directory-files directory t))
+ (match (read-string "Delete files that match: ")))
+ (dolist (file files)
+ (when (string-match-p match file)
+ (dired-delete-file file t)))))
+
+(defun dired-rename-capitalize-file ()
+ "Capitalize the base name of the file at point in a dired buffer."
+ (interactive)
+ (let* ((file (dired-get-file-for-visit))
+ (new-file (capitalize (file-name-nondirectory file))))
+ (if (string-prefix-p "." file)
+ (message "Skipping file starting with '.'")
+ (progn
+ (rename-file file (concat (file-name-directory file) new-file))
+ (revert-buffer)
+ (message "Renamed %s to %s" file new-file)))))
+
+(define-key dired-mode-map (kbd "b") 'dired-up-directory)
+(define-key dired-mode-map (kbd "v") 'dired-watch-video)
+(define-key dired-mode-map (kbd "z") 'wdired-change-to-wdired-mode)
+(define-key dired-mode-map (kbd "C-c w") 'dired-set-wallpaper)
+(define-key global-map (kbd "C-c d") 'dired-delete-files-except)
+
+(add-hook 'dired-mode-hook 'all-the-icons-dired-mode)
+(setf all-the-icons-dired-monochrome 'nil
+ all-the-icons-dired-v-adjust 0.10)
+
+(provide 'thanos-dired)
+;;; thanos-dired.el ends here
diff --git a/.emacs.d/modules/thanos-elfeed.el b/.emacs.d/modules/thanos-elfeed.el
new file mode 100644
index 0000000..181e8f4
--- /dev/null
+++ b/.emacs.d/modules/thanos-elfeed.el
@@ -0,0 +1,126 @@
+;;; thanos-elfeed.el --- elfeed configuration -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords: extensions
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'elfeed)
+(require 'elfeed-goodies)
+(setf elfeed-feeds
+ '(("https://hackaday.com/blog/feed/"
+ hackaday linux)
+ ("https://protesilaos.com/news.xml"
+ protesilaos)
+ ("https://protesilaos.com/codelog.xml"
+ proetesilaos)
+ ("https://guix.gnu.org/feeds/blog.atom"
+ gnu guix)
+ ("https://thanosapollo.com/posts/index.xml"
+ thanos)
+ ("http://nullprogram.com/feed/"
+ emacs linux)
+ ("https://drewdevault.com/blog/index.xml"
+ sourcehut drewdevault)
+ ("https://spacepub.space/feeds/videos.xml?videoChannelId=2"
+ drewdevault video)
+ ("https://odysee.com/$/rss/@DistroTube:2"
+ video dt)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UC7YOGHUfC1Tb6E4pudI9STA"
+ video mental)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCAiiOTio8Yu69c3XnR7nQBQ"
+ video daviwil)
+ ("https://videos.lukesmith.xyz/feeds/videos.atom?sort=-publishedAt&isLocal=true"
+ video luke)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCrc2iv2-G1FZ3VscM3zu2jg"
+ video zoogirl)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UC0uTPqBCFIpZxlz_Lv1tk_g"
+ video prot)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCq6VFHwMzcMXbuKyG7SQYIg"
+ video moist)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UC05XpvbHZUQOfA6xk4dlmcw"
+ video djware)
+ ("https://archlinux.org/feeds/news/"
+ ArchLinux Latest)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCsBjURrPoezykLs9EqgamOA"
+ fireship video)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCl-J-ovSJhA3or73Q2uVpow"
+ medicosperf video)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCSuHzQ3GrHSzoBbwrIq3LLA"
+ naomi video)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCqYPhGiB9tkShZorfgcL2lA"
+ WhatIveLearned video)
+ ("http://wikileaks.org/feed"
+ wikileaks)
+ ("https://hackernoon.com/feed"
+ hackernoon)
+ ("https://sachachua.com/blog/feed/"
+ sacha emacs)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCtMVHI3AJD4Qk4hcbZnI9ZQ"
+ video OrdinaeryGamers)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCl2mFZoRqjw_ELax4Yisf6w"
+ video Louis)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UC1yNl2E66ZzKApQdRuTQ4tw "
+ video sabine)
+ ("https://bits.debian.org/feeds/feed.rss"
+ debian linux)
+ ("https://torrentfreak.com/feed"
+ torrentfreak)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UCM6SlP9fiwPIjhkWmbg8Ojg"
+ video liberated-programmer)
+ ("https://odysee.com/$/rss/@seytonic:c"
+ video seytonic)
+ ("https://www.youtube.com/feeds/videos.xml?channel_id=UC1yNl2E66ZzKApQdRuTQ4tw"
+ video sabine)
+ ("https://wp.medscape.com/cx/rssfeeds/2700.xml"
+ med medscape)
+ ("https://nyxt.atlas.engineer/feed"
+ nyxt)))
+
+(defun elfeed-v-mpv (url)
+ "Watch a video from URL in MPV"
+ (start-process-shell-command "elfeed-video" nil (format "mpv \"%s\"" url)))
+
+(defun elfeed-view-mpv (&optional use-generic-p)
+ "Youtube-feed link"
+ (interactive "P")
+ (let ((entries (elfeed-search-selected)))
+ (cl-loop for entry in entries
+ do (elfeed-untag entry 'unread)
+ when (elfeed-entry-link entry)
+ do (elfeed-v-mpv it))
+ (mapc #'elfeed-search-update-entry entries)
+ (unless (use-region-p) (forward-line))))
+
+(define-key elfeed-search-mode-map (kbd "v") 'elfeed-view-mpv)
+(define-key elfeed-search-mode-map (kbd "U") 'elfeed-update)
+(define-key thanos/applications-map (kbd "f") 'elfeed)
+
+(setf elfeed-goodies/entry-pane-size 0.55)
+(elfeed-goodies/setup)
+
+(setf eshell-visual-commands '())
+(eat-eshell-mode 1)
+
+
+(provide 'thanos-elfeed)
+;;; thanos-elfeed.el ends here
diff --git a/.emacs.d/modules/thanos-eshell.el b/.emacs.d/modules/thanos-eshell.el
new file mode 100644
index 0000000..484bad8
--- /dev/null
+++ b/.emacs.d/modules/thanos-eshell.el
@@ -0,0 +1,158 @@
+;;; thanos-eshell.el --- eshell configuration -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(setenv "EDITOR" "emacsclient -n")
+(setenv "DEBEMAIL" "[email protected]")
+(setenv "DEBNAME" "Thanos Apollo")
+
+;;;; sudo completion
+(defun pcomplete/sudo ()
+ "Completion rules for the `sudo' command."
+ (let ((pcomplete-ignore-case t))
+ (pcomplete-here (funcall pcomplete-command-completion-function))
+ (while (pcomplete-here (pcomplete-entries)))))
+
+;;;; systemctl completion
+(defcustom pcomplete-systemctl-commands
+ '("disable" "enable" "status" "start" "restart" "stop" "reenable"
+ "list-units" "list-unit-files")
+ "p-completion candidates for `systemctl' main commands"
+ :type '(repeat (string :tag "systemctl command"))
+ :group 'pcomplete)
+
+(defvar pcomplete-systemd-units
+ (split-string
+ (shell-command-to-string
+ "(systemctl list-units --all --full --no-legend;systemctl list-unit-files --full --no-legend)|while read -r a b; do echo \" $a\";done;"))
+ "p-completion candidates for all `systemd' units")
+
+(defvar pcomplete-systemd-user-units
+ (split-string
+ (shell-command-to-string
+ "(systemctl list-units --user --all --full --no-legend;systemctl list-unit-files --user --full --no-legend)|while read -r a b;do echo \" $a\";done;"))
+ "p-completion candidates for all `systemd' user units")
+
+(defun pcomplete/systemctl ()
+ "Completion rules for the `systemctl' command."
+ (pcomplete-here (append pcomplete-systemctl-commands '("--user")))
+ (cond ((pcomplete-test "--user")
+ (pcomplete-here pcomplete-systemctl-commands)
+ (pcomplete-here pcomplete-systemd-user-units))
+ (t (pcomplete-here pcomplete-systemd-units))))
+
+;;;; man completion
+(defvar pcomplete-man-user-commands
+ (split-string
+ (shell-command-to-string
+ "apropos -s 1 .|while read -r a b; do echo \" $a\";done;"))
+ "p-completion candidates for `man' command")
+
+(defun pcomplete/man ()
+ "Completion rules for the `man' command."
+ (pcomplete-here pcomplete-man-user-commands))
+
+;; hut completion
+(defcustom pcomplete-hut-commands
+ '("builds" "export" "git" "graphql" "lists" "help" "hg"
+ "init" "meta" "pages" "paste" "todo")
+ "p-completion candidates for `hut' main commands"
+ :type '(repeat (string :tag "hut command"))
+ :group 'pcomplete)
+
+(defun pcomplete/hut ()
+ "Completion rules for `hut' command"
+ (pcomplete-here (append pcomplete-hut-commands)))
+
+(setq thanos/eshell-aliases
+ '((g . magit)
+ (gl . magit-log)
+ (d . dired)
+ (o . find-file)
+ (oo . find-file-other-window)
+ (ll . (lambda () (eshell/ls '-la)))
+ (eshell/clear . eshell/clear-scrollback)))
+
+;; Define aliases using `mapc`
+(mapc (lambda (alias)
+ (defalias (car alias) (cdr alias)))
+ thanos/eshell-aliases)
+
+;; PATH
+(defvar eshell-path-env (getenv "~/.local/bin"))
+
+(require 'eshell-git-prompt)
+;; customize multiline theme
+(defun eshell-git-prompt-multiline ()
+ "Eshell Git prompt inspired by spaceship-prompt."
+ (let (separator hr dir git git-dirty time sign command)
+ (setq separator (with-face " | " 'eshell-git-prompt-multiline-secondary-face))
+ (setq hr (with-face (concat "\n" (make-string (/ (window-total-width) 2) ?─) "\n") 'eshell-git-prompt-multiline-secondary-face))
+ (setq dir
+ (concat
+ (concat (abbreviate-file-name (eshell/pwd)))))
+ (setq git
+ (concat (with-face "⎇" 'eshell-git-prompt-exit-success-face)
+ (concat (eshell-git-prompt--branch-name))))
+ (setq git-dirty
+ (when (eshell-git-prompt--branch-name)
+ (if (eshell-git-prompt--collect-status)
+ (with-face " ✎" 'eshell-git-prompt-modified-face)
+ (with-face " ✔" 'eshell-git-prompt-exit-success-face))))
+ (setq time (with-face (format-time-string "%I:%M:%S %p") 'eshell-git-prompt-multiline-secondary-face))
+ (setq sign
+ (if (= (user-uid) 0)
+ (with-face "\n#" 'eshell-git-prompt-multiline-sign-face)
+ (with-face "\nλ" 'eshell-git-prompt-multiline-sign-face)))
+ (setq command (with-face " " 'eshell-git-prompt-multiline-command-face))
+
+
+ (eshell-git-prompt---str-read-only
+ (concat hr dir separator git git-dirty separator time sign command))))
+
+(eshell-git-prompt-use-theme 'multiline)
+
+(eshell-syntax-highlighting-global-mode 1)
+
+(setq eshell-highlight-prompt t)
+
+
+(define-prefix-command 'thanos/eshell-map)
+(global-set-key (kbd "C-c e") 'thanos/eshell-map)
+
+(define-key thanos/eshell-map (kbd "o") 'multi-eshell)
+(define-key thanos/eshell-map (kbd "n") 'multi-eshell-switch)
+
+(defvar thanos/vterm-map (make-sparse-keymap))
+(define-prefix-command 'thanos/vterm-map)
+(define-key global-map (kbd "C-c v") 'thanos/vterm-map)
+(define-key thanos/vterm-map (kbd "n") 'multi-vterm-next)
+(define-key thanos/vterm-map (kbd "p") 'multi-vterm-prev)
+(define-key thanos/vterm-map (kbd "d") 'multi-vterm-dedicated-open)
+(define-key thanos/vterm-map (kbd "o") 'multi-vterm)
+
+
+(provide 'thanos-eshell)
+;;; thanos-eshell.el ends here
diff --git a/.emacs.d/modules/thanos-markdown.el b/.emacs.d/modules/thanos-markdown.el
new file mode 100644
index 0000000..72e0327
--- /dev/null
+++ b/.emacs.d/modules/thanos-markdown.el
@@ -0,0 +1,49 @@
+;;; thanos-markdown.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(defun thanos/markdown-theme ()
+ "."
+ (interactive)
+ (dolist
+ (face
+ '(markdown-header-face-1 :height 2.0))))
+
+(require 'markdown-mode)
+(setq markdown-header-scaling t)
+(add-to-list 'auto-mode-alist '("\\.md\\'" . gfm-mode))
+(setq markdown-command "multimarkdown")
+
+(electric-pair-mode 1)
+(auto-insert-mode 1)
+(global-flycheck-mode)
+(global-set-key (kbd "M-.") 'xref-find-definitions)
+(global-set-key (kbd "C-c l") 'display-line-numbers-mode)
+
+
+
+
+(provide 'thanos-markdown)
+;;; thanos-markdown.el ends here
diff --git a/.emacs.d/modules/thanos-mu4e.el b/.emacs.d/modules/thanos-mu4e.el
new file mode 100644
index 0000000..10e0045
--- /dev/null
+++ b/.emacs.d/modules/thanos-mu4e.el
@@ -0,0 +1,130 @@
+;;; thanos-mu4e.el --- mu4e configuration -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords: extensions
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'smtpmail)
+(require 'mu4e)
+
+(when is-zeus (setf mu4e-update-interval (* 10 60)))
+
+(setf mu4e-get-mail-command "mbsync -a")
+
+(defun set-mu4e-context (context-name full-name mail-address signature)
+ "Return a mu4e context named CONTEXT-NAME with :match-func matching
+ folder name CONTEXT-NAME in Maildir. The context's `user-mail-address',
+ `user-full-name' and `mu4e-compose-signature'`smtpmail-smpt-server' is set to MAIL-ADDRESS
+ FULL-NAME SIGNATURE and SERVER respectively.
+ Special folders are set to context specific folders."
+ (let ((dir-name (concat "/" context-name)))
+ (make-mu4e-context
+ :name context-name
+ ;; we match based on the maildir of the message
+ :match-func
+ `(lambda (msg)
+ (when msg
+ (string-match-p
+ ,(concat "^" dir-name)
+ (mu4e-message-field msg :maildir))))
+ :vars
+ `((user-mail-address . ,mail-address)
+ (user-full-name . ,full-name)
+ (mu4e-sent-folder . ,(concat dir-name "/Sent"))
+ (mu4e-drafts-folder . ,(concat dir-name "/Drafts"))
+ (mu4e-trash-folder . ,(concat dir-name "/Trash"))
+ (mu4e-trash-folder . ,(concat dir-name "/Starred"))
+ (mu4e-refile-folder . ,(concat dir-name "/Archive"))
+ (mu4e-compose-signature . ,signature)))))
+;;Fixing duplicate UID errors when using mbsync and mu4e
+(setf mu4e-change-filenames-when-moving t)
+
+(setf mu4e-maildir-shortcuts
+ '(("/Public/Inbox" . ?I)
+ ("/Inbox" . ?i)
+ ("/Sent" . ?s)
+ ("/Emacs/dev" . ?e)
+ ("/Guix/dev" . ?g)))
+
+(setf mu4e-contexts
+ (list
+ (make-mu4e-context
+ :name "Fastmail"
+ :match-func
+ (lambda (msg)
+ (when msg
+ (string-prefix-p "/" (mu4e-message-field msg :maildir))))
+ :vars '((user-mail-address . "[email protected]")
+ (user-full-name . "Thanos Apollo")
+ (mu4e-drafts-folder . "/Drafts")
+ (mu4e-sent-folder . "/Sent")
+ (mu4e-refile-folder . "/Archive")
+ (mu4e-trash-folder . "/Trash")))
+ (make-mu4e-context
+ :name "Public"
+ :match-func
+ (lambda (msg)
+ (when msg
+ (string-prefix-p "/" (mu4e-message-field msg :maildir))))
+ :vars '((user-mail-address . "[email protected]")
+ (user-full-name . "Thanos Apollo")
+ (mu4e-drafts-folder . "/Drafts")
+ (mu4e-sent-folder . "/Sent")
+ (mu4e-refile-folder . "/Archive")
+ (mu4e-trash-folder . "/Trash")))))
+
+(setf message-send-mail-function 'smtpmail-send-it
+ smtpmail-smtp-server "smtp.fastmail.com"
+ smtpmail-smtp-service 465
+ smtpmail-stream-type 'ssl
+ mu4e-compose-signature "Thanos Apollo\nhttps://thanosapollo.com"
+ mu4e-compose-context-policy 'ask
+ mu4e-compose-format-flowed t)
+
+(setf mu4e-view-actions
+ (delete-dups
+ (append
+ '(("gapply git patches" . mu4e-action-git-apply-patch)
+ ("mgit am patch" . mu4e-action-git-apply-mbox)
+ ("bb4 am patch" . mu4e-action-git-apply-b4)
+ ("ssetup reword list with b4" . mu4e-action-setup-reword-b4)
+ ("crun checkpatch script" . my-mu4e-action-run-check-patch)
+ ("MCheck if merged" . my-mu4e-action-check-if-merged)))))
+
+(setf mu4e-view-actions
+ (delete-dups
+ (append
+ '(("gapply git patches" . mu4e-action-git-apply-patch)
+ ("mgit am patch" . mu4e-action-git-apply-mbox)
+ ("bb4 am patch" . mu4e-action-git-apply-b4)
+ ("ssetup reword list with b4" . mu4e-action-setup-reword-b4)
+ ("crun checkpatch script" . my-mu4e-action-run-check-patch)
+ ("MCheck if merged" . my-mu4e-action-check-if-merged)))))
+
+(require 'mu4e-alert)
+(mu4e-alert-enable-mode-line-display)
+
+(define-key thanos/applications-map (kbd "m") 'mu4e)
+
+(provide 'thanos-mu4e)
+;;; thanos-mu4e.el ends here
diff --git a/.emacs.d/modules/thanos-multimedia.el b/.emacs.d/modules/thanos-multimedia.el
new file mode 100644
index 0000000..aed0982
--- /dev/null
+++ b/.emacs.d/modules/thanos-multimedia.el
@@ -0,0 +1,107 @@
+;;; thanos-multimedia.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+;; EMMS
+(require 'emms)
+(emms-all)
+(setf emms-player-list '(emms-player-mpv)
+ emms-player-mpv-parameters '("--no-video")
+ emms-info-functions '(emms-info-native)
+ emms-playlist-buffer-name "*Music*"
+ emms-source-file-default-directory "~/Music/jazz")
+(define-key 'thanos/applications-map (kbd "e") 'emms)
+(define-key emms-playlist-mode-map (kbd "A") 'emms-add-directory-tree)
+
+;; yeetube
+(defun yeetube-download-vimeo-videos ()
+ (interactive)
+ (let ((url "")
+ (name "")
+ (download-counter 1))
+ (while (not (string= url "q"))
+ (setf url (read-string "Enter URL (q to quit): "))
+ (unless (string= url "q")
+ (setf name (read-string (format "Custom name (download counter: %d) " download-counter)))
+ (setf download-counter (1+ download-counter))
+ (call-process-shell-command
+ (format
+ "yt-dlp '%s' -o '%s'"
+ (replace-regexp-in-string "\\.json" ".m3u8" url) name)
+ nil 0)))))
+
+(defun yeetube-download-videos-ffmpeg ()
+ "Download one or multiple videos using yt-dlp.
+This command is not meant to be used in the *Yeetube Search* buffer.
+
+Usage Example:
+Open a Dired buffer and navigate where you want to download your videos,
+then run this command interactively. You can leave the 'Custom name:'
+prompt blank to keep the default name."
+ (interactive)
+ (let ((url "")
+ (name "")
+ (download-counter 1)
+ (stored-contents nil))
+ ;; Read links and names until "q" is entered
+ (while (not (string= url "q"))
+ (setf url (read-string "Enter URL (q to quit): "))
+ (unless (string= url "q")
+ (setf name (read-string (format "Custom name (download counter: %d) " download-counter)))
+ (push (cons url name) stored-contents)
+ (setf download-counter (1+ download-counter))))
+ ;; Process the collected links and names
+ (dolist (pair stored-contents)
+ (let ((url (car pair))
+ (name (cdr pair)))
+ (async-shell-command
+ (format
+ "ffmpeg -protocol_whitelist file,crypto,data,https,tls,tcp -stats -i '%s' -codec copy '%s.mp4'"
+ url name))))))
+
+(when is-zeus
+ (load-file "~/Developer/yeetube.el/yeetube.el"))
+(require 'yeetube)
+
+(setf yeetube-results-limit 30
+ yeetube-mpv-disable-video t)
+
+(define-prefix-command 'thanos/yeetube)
+(global-set-key (kbd "C-c y") 'thanos/yeetube)
+(define-key thanos/yeetube (kbd "s") 'yeetube-search)
+(define-key thanos/yeetube (kbd "b") 'yeetube-play-saved-video)
+(define-key thanos/yeetube (kbd "d") 'yeetube-download-videos)
+(define-key thanos/yeetube (kbd "p") 'yeetube-mpv-toggle-pause)
+(define-key thanos/yeetube (kbd "C-p") 'yeetube-mpv-toggle-video)
+(define-key thanos/yeetube (kbd "k") 'yeetube-remove-saved-video)
+(define-key thanos/yeetube (kbd "u") 'yeetube-change-platform)
+(define-key thanos/yeetube (kbd "C-d") 'yeetube-download-vimeo-videos)
+
+(define-key yeetube-mode-map (kbd "c") 'yeetube-switch-mpv)
+
+
+
+(provide 'thanos-multimedia)
+;;; thanos-multimedia.el ends here
diff --git a/.emacs.d/modules/thanos-org-config.el b/.emacs.d/modules/thanos-org-config.el
new file mode 100644
index 0000000..845dea5
--- /dev/null
+++ b/.emacs.d/modules/thanos-org-config.el
@@ -0,0 +1,79 @@
+;;; thanos-org-config.el --- org config -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'org)
+(require 'org-agenda)
+
+(setf org-directory "~/org/"
+ org-agenda-files '("~/org/agenda.org")
+ org-default-notes-file (expand-file-name "notes.org" org-directory)
+ org-ellipsis " ▼ "
+ org-log-done 'time
+ org-hide-emphasis-markers nil ;;change to t to hide emphasis markers
+ org-table-convert-region-max-lines 20000
+ org-log-done 'time
+ org-log-into-drawer t
+ org-todo-keywords ;; This overwrites the default Doom org-todo-keywords
+ '((sequence
+ "TODO(t)" ;; A task that is ready to be tackled
+ "BLOG(b)" ;; Blog writing assignments
+ "GYM(g)" ;; Things to accomplish at the gym
+ "WAIT(w)" ;; Something is holding up this task
+ "|" ;; The pipe necessary to separate "active" states and "inactive" states
+ "DONE(d)" ;; Task has been completed
+ "CANCELLED(c)" )))
+
+(define-key org-mode-map (kbd "C-c t") 'org-time-stamp-inactive)
+(define-key org-mode-map (kbd "C-c s") 'org-download-screenshot)
+
+(add-hook 'org-mode-hook 'thanos/org-theme-gruvbox)
+(add-hook 'org-mode-hook 'flyspell-mode)
+(add-hook 'org-mode-hook 'toc-org-mode)
+
+(defadvice org-edit-src-code (around set-buffer-file-name activate compile)
+ (let ((file-name (buffer-file-name))) ;; (1)
+ ad-do-it ;; (2)
+ (setf buffer-file-name file-name))) ;; (3)
+
+(org-babel-do-load-languages
+ 'org-babel-load-languages
+ '((emacs-lisp . t)
+ (python . t)))
+
+
+(setf org-structure-template-alist
+ '(("e" . "src emacs-lisp")
+ ("p" . "src python")
+ ("l" . "src lisp")
+ ("b" . "src bash")
+ ("q" . "QUOTE")))
+
+;;Auto tangle
+(add-hook 'org-mode-hook 'org-auto-tangle-mode)
+
+
+(provide 'thanos-org-config)
+;;; thanos-org-config.el ends here
diff --git a/.emacs.d/modules/thanos-org-roam.el b/.emacs.d/modules/thanos-org-roam.el
new file mode 100644
index 0000000..1eeaa4b
--- /dev/null
+++ b/.emacs.d/modules/thanos-org-roam.el
@@ -0,0 +1,105 @@
+;;; org-roam.el --- org roam config -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'org-roam)
+
+;; Create ~/Notes, ignore errors if it's already made
+(ignore-errors
+ (make-directory "~/Notes"))
+
+(setf org-roam-directory "~/Notes"
+ org-roam-dailies-directory "journal/")
+
+(org-roam-db-autosync-enable)
+
+(setf org-roam-node-display-template (concat "${title:50} "(propertize "${tags:30}" 'face 'org-tag)))
+
+(setf org-roam-db-node-include-function
+ (lambda ()
+ (not (or (member "journal" (org-get-tags))
+ (member "memorize" (org-get-tags))))))
+
+;; Functions
+(defun org-insert-book ()
+ "Insert org-link from ~/Library for book"
+ (interactive)
+ (let* ((book-path (read-file-name "Book: " "~/Library/")))
+ (org-insert-link nil book-path (file-name-base book-path))))
+
+;;; Keybindings
+(define-key org-mode-map (kbd "C-c b") 'org-insert-book)
+
+;; Set maps
+(define-prefix-command 'thanos/notes)
+(global-set-key (kbd "C-c n") 'thanos/notes)
+;; org-roam keys
+(define-key thanos/notes (kbd "t") 'org-roam-buffer-toggle)
+(define-key thanos/notes (kbd "f") 'org-roam-node-find)
+(define-key thanos/notes (kbd "i") 'org-roam-node-insert)
+;; Journaling
+(define-prefix-command 'Journal)
+(define-key thanos/notes (kbd "C-j") 'Journal)
+(define-key Journal (kbd "d") 'Journaling/dailies)
+(define-key Journal (kbd "C-c") 'org-roam-dailies-capture-today)
+(define-key Journal (kbd "C-t") 'org-roam-dailies-capture-tomorrow)
+(define-key Journal (kbd "C-y") 'org-roam-dailies-capture-yesterday)
+(define-key Journal (kbd "c") 'org-roam-dailies-goto-today)
+(define-key Journal (kbd "t") 'org-roam-dailies-goto-tomorrow)
+(define-key Journal (kbd "y") 'org-roam-dailies-goto-yesterday)
+
+(define-key org-mode-map (kbd "C-c C-.") 'org-roam-tag-add)
+(define-key org-mode-map (kbd "C-c i") 'org-id-get-create)
+
+;; Templates
+(setf org-roam-capture-templates
+ '(("d" "default" plain
+ "%?"
+ :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
+ :unnarrowed t)
+ ("l" "programming language" plain
+ "* Characteristics\n\n- Family: %?\n- Inspired by: \n\n* Reference:\n\n"
+ :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n")
+ :unnarrowed t)
+ ("p" "MUS" plain "* Goals\n\n%?\n\n* Tasks\n\n** TODO Add initial tasks\n\n* Dates\n\n"
+ :if-new (file+head "%<%Y%m%d%H%M%S>-${slug}.org" "#+title: ${title}\n#+filetags: MUS")
+ :unnarrowed t)))
+;; Dailies
+(setf org-roam-dailies-capture-templates
+ '(("d" "default" entry
+ "* %?"
+ :target (file+head "%<%Y-%m-%d>.org"
+ "#+title: %<%Y-%m-%d>\n"))
+ ("j" "Daily Journaling" entry
+ (file "~/org/Templates/journaling.org")
+ :target (file+head "%<%Y-%m-%d>.org"
+ "#+title: %<%Y-%m-%d>\n"))
+ ("i" "Improve" entry
+ (file "~/org/Templates/improve.org")
+ :target (file+head "%<%Y-%m-%d>.org"
+ "#+title: %<%Y-%m-%d>\n"))))
+
+(provide 'thanos-org-roam)
+;;; org-roam.el ends here
diff --git a/.emacs.d/modules/thanos-org-themes.el b/.emacs.d/modules/thanos-org-themes.el
new file mode 100644
index 0000000..a63459c
--- /dev/null
+++ b/.emacs.d/modules/thanos-org-themes.el
@@ -0,0 +1,142 @@
+;;; thanos-org-themes.el --- org themes -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+(require 'org)
+(require 'org-modern)
+(require 'org-agenda)
+(require 'org)
+
+(defun thanos/org-theme-dracula ()
+ "Enable Dracula theme for Org headers."
+ (interactive)
+ (dolist
+ (face
+ '((org-level-1 1.7 "#8be9fd" extra-bold)
+ (org-level-2 1.6 "#bd93f9" extra-bold)
+ (org-level-3 1.5 "#50fa7b" bold)
+ (org-level-4 1.4 "#ff79c6" semi-bold)
+ (org-level-5 1.3 "#9aedfe" normal)
+ (org-level-6 1.2 "#caa9fa" normal)
+ (org-level-7 1.1 "#5af78e" normal)
+ (org-level-8 1.0 "#ff92d0" normal)))
+ (set-face-attribute (nth 0 face) nil
+ :font "JetBrains Mono"
+ :weight (nth 3 face)
+ :height (nth 1 face)
+ :foreground (nth 2 face)))
+ (set-face-attribute 'org-table nil
+ :font "JetBrains Mono"
+ :weight 'normal
+ :height 1.0
+ :foreground "#bfafdf"))
+
+(defun thanos/org-theme-darkone ()
+ "Enable Darkone theme for Org headers."
+ (interactive)
+ (dolist
+ (face
+ '((org-level-1 1.70 "#51afef" bold)
+ (org-level-2 1.55 "#7FBCD2" bold)
+ (org-level-3 1.40 "#da8548" bold)
+ (org-level-4 1.20 "#da8548" semi-bold)
+ (org-level-5 1.20 "#5699af" normal)
+ (org-level-6 1.20 "#a9a1e1" normal)
+ (org-level-7 1.10 "#46d9ff" normal)
+ (org-level-8 1.00 "#ff6c6b" normal)))
+ (set-face-attribute (nth 0 face) nil
+ :font "Jetbrains Mono"
+ :weight (nth 3 face)
+ :height (nth 1 face)
+ :foreground (nth 2 face)))
+ (set-face-attribute 'org-table nil
+ :font "Jetbrains Mono"
+ :weight 'normal
+ :height 1.0
+ :foreground "#A66CFF"))
+
+(defun thanos/org-theme-gruvbox ()
+ "Enable Darkone theme for Org headers."
+ (interactive)
+ (dolist
+ (face
+ '((org-level-1 1.70 "#fb4934" bold)
+ (org-level-2 1.55 "#98971a" bold)
+ (org-level-3 1.40 "#458588" bold)
+ (org-level-4 1.20 "#b16286" semi-bold)
+ (org-level-5 1.20 "#689d6a" normal)
+ (org-level-6 1.20 "#d3869b" normal)
+ (org-level-7 1.10 "#8ec07c" normal)
+ (org-level-8 1.00 "#ebdbb2" normal)))
+ (set-face-attribute (nth 0 face) nil
+ :font "Jetbrains Mono"
+ :weight (nth 3 face)
+ :height (nth 1 face)
+ :foreground (nth 2 face)))
+ (set-face-attribute 'org-table nil
+ :font "Jetbrains Mono"
+ :weight 'normal
+ :height 1.0
+ :foreground "#A66CFF"))
+
+(modify-all-frames-parameters
+ '((right-divider-width . 5)
+ (internal-border-width . 5)))
+(dolist (face '(window-divider
+ window-divider-first-pixel
+ window-divider-last-pixel))
+ (face-spec-reset-face face)
+ (set-face-foreground face (face-attribute 'default :background)))
+(set-face-background 'fringe (face-attribute 'default :background))
+
+(setf
+ ;; Edit settings
+ org-auto-align-tags nil
+ org-tags-column 0
+ org-fold-catch-invisible-edits 'show-and-error
+ org-special-ctrl-a/e t
+ org-insert-heading-respect-content t
+
+ ;; Org styling, hide markup etc.
+ org-hide-emphasis-markers t
+ org-pretty-entities t
+
+ ;; Agenda styling
+ org-agenda-tags-column 0
+ org-agenda-block-separator ?─
+ org-agenda-time-grid
+ '((daily today require-timed)
+ (800 1000 1200 1400 1600 1800 2000)
+ " ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄")
+ org-agenda-current-time-string
+ "⭠ now ─────────────────────────────────────────────────")
+
+(global-org-modern-mode)
+
+(setf org-modern-todo nil)
+
+
+
+(provide 'thanos-org-themes)
+;;; thanos-org-themes.el ends here
diff --git a/.emacs.d/modules/thanos-packages.el b/.emacs.d/modules/thanos-packages.el
new file mode 100644
index 0000000..9497b77
--- /dev/null
+++ b/.emacs.d/modules/thanos-packages.el
@@ -0,0 +1,64 @@
+;;; thanos-packages.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'package)
+
+(defvar thanos/packages
+ '(emms tree-sitter org-snooze org-drill
+ all-the-icons all-the-icons-dired
+ all-the-icons-ivy-rich toc-org emojify
+ doom-themes doom-modeline gruvbox-theme counsel
+ vterm multi-vterm which-key ivy ivy-rich helpful
+ password-store org org-modern org-roam
+ visual-fill-column rainbow-delimiters flycheck
+ lsp-mode lsp-ui json-mode rjsx-mode
+ typescript-mode python-mode pyvenv company
+ company-box magit elfeed elfeed-goodies paredit
+ corfu monkeytype sudo-edit consult alsamixer
+ simple-httpd eshell-syntax-highlighting
+ org-superstar pdf-tools org-auto-tangle sly
+ org-download eshell-git-prompt eshell-vterm
+ hackernews circe gptel beacon ement mu4e-alert
+ pass eat nov yeetube stumpwm-mode telega
+ transmission monokai-theme))
+
+(setf package-archives '(("melpa" . "https://melpa.org/packages/")
+ ("elpa" . "https://elpa.gnu.org/packages/")
+ ("nongnu" . "https://elpa.nongnu.org/nongnu/")))
+;; Activate all the packages
+(package-initialize)
+;; Install the missing packages
+(dolist (package thanos/packages)
+ (unless (package-installed-p package)
+ (package-install package)))
+
+;; Set and load custom.el
+(setf custom-file (concat user-emacs-directory "custom.el"))
+(load custom-file 'noerror)
+
+
+(provide 'thanos-packages)
+;;; thanos-packages.el ends here
diff --git a/.emacs.d/modules/thanos-pass.el b/.emacs.d/modules/thanos-pass.el
new file mode 100644
index 0000000..edad15e
--- /dev/null
+++ b/.emacs.d/modules/thanos-pass.el
@@ -0,0 +1,91 @@
+;;; thanos-pass.el --- Pass configuration -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'password-store)
+
+(setf password-store-password-length (+ 20 (random 20)))
+
+(defun thanos/pass-launcher ()
+ "Launch Emacs as a front-end for pass."
+ (interactive)
+ (cl-flet ((pass-autotype (entry)
+ (let ((user (password-store-get-field entry "user"))
+ (pass (password-store-get entry)))
+ (start-process-shell-command
+ "xdotool" nil
+ (if user
+ (format "sleep 0.3 && xdotool getactivewindow type '%s' && xdotool getactivewindow key Tab && xdotool getactivewindow type '%s'" user pass)
+ (format "sleep 0.3 && xdotool getactivewindow type 'thanosapollo' && xdotool getactivewindow key Tab && xdotool getactivewindow type '%s'" pass))))))
+ (let ((ivy-height 100))
+ (unwind-protect
+ (with-selected-frame
+ (make-frame '((name . "thanos/pass-launcher")
+ (minibuffer . only)
+ (fullscreen . 0)
+ (undecorated . t)
+ (internal-border-width . 10)
+ (width . 80)
+ (height . 11)))
+ (let* ((choice (completing-read "Choose an action: " '("AUTO" "COPY PASS" "COPY USERNAME" "EDIT" "GENERATE")))
+ (action (pcase choice
+ ("AUTO" #'pass-autotype)
+ ("COPY PASS" #'password-store-copy)
+ ("COPY USERNAME" #'(lambda (entry) (password-store-copy-field entry "user")))
+ ("EDIT" #'password-store-edit)
+ ("GENERATE" #'password-store-generate))))
+ (funcall action (completing-read "Search: " (password-store-list)))
+ (delete-frame)))))))
+
+(defun smtp-get-pass ()
+ "Get password for smtp"
+ (interactive)
+ (password-store-copy-field "fastmail.com/[email protected]" "smtp"))
+
+(define-prefix-command 'thanos/pass)
+(global-set-key (kbd "C-c p") 'thanos/pass)
+(define-key thanos/pass (kbd "i") 'password-store-insert)
+(define-key thanos/pass (kbd "e") 'password-store-edit)
+(define-key thanos/pass (kbd "g") 'password-store-generate)
+(define-key thanos/pass (kbd "s") 'smtp-get-pass)
+
+(defun thanos/app-launcher ()
+ "Launch Emacs as an Application Launcher."
+ (interactive)
+ (let ((ivy-height 100))
+ (unwind-protect
+ (with-selected-frame
+ (make-frame '((name . "thanos/emacs-launcher")
+ (minibuffer . only)
+ (fullscreen . 0)
+ (undecorated . t)
+ (internal-border-width . 10)
+ (width . 80)
+ (height . 11)))
+ (counsel-linux-app)
+ (delete-frame)))))
+
+(provide 'thanos-pass)
+;;; thanos-pass.el ends here
diff --git a/.emacs.d/modules/thanos-random.el b/.emacs.d/modules/thanos-random.el
new file mode 100644
index 0000000..9ea2cea
--- /dev/null
+++ b/.emacs.d/modules/thanos-random.el
@@ -0,0 +1,32 @@
+;;; thanos-random.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Random functions and configurations
+
+;;; Code:
+
+(require 'stumpwm-mode)
+(setf stumpwm-shell-program "~/.stumpwm.d/modules/util/stumpish/stumpish")
+
+
+(provide 'thanos-random)
+;;; thanos-random.el ends here
diff --git a/.emacs.d/modules/thanos-vm.el b/.emacs.d/modules/thanos-vm.el
new file mode 100644
index 0000000..c6d2559
--- /dev/null
+++ b/.emacs.d/modules/thanos-vm.el
@@ -0,0 +1,54 @@
+;;; thanos-vm.el --- Manage your virtual machines with emacs -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(defvar vm-directory "~/virtual-machines/")
+
+(defun vm-create-image ()
+ "Create qcow2 image."
+ (interactive)
+ (let ((name (format "%s%s.qcow2" vm-directory (read-string "Name: ")))
+ (size (format "%s" (read-string "Size(G): "))))
+ (shell-command
+ (format "qemu-img create -f qcow2 %s %sG" name size))))
+
+
+(defun vm-run ()
+ "Spawn Virtual Machine."
+ (interactive)
+ (let ((memory (format "%sG" (read-string "Memory(G): ")))
+ (cores (read-string "Cores: "))
+ (image (read-file-name "Image: " vm-directory))
+ (iso (if (y-or-n-p "Load iso?? ")
+ (read-file-name "ISO: ")
+ nil)))
+ (start-process-shell-command
+ "virtual-machine" nil
+ (format "qemu-system-x86_64 -enable-kvm -m %s -smp %s -hda %s -vga qxl -device virtio-serial-pci -spice port=5784,disable-ticketing -display spice-app %s "
+ memory cores image (when iso (concat "-cdrom " iso))))))
+
+
+(provide 'thanos-vm)
+;;; thanos-vm.el ends here
diff --git a/.emacs.d/modules/thanos-yeetube.el b/.emacs.d/modules/thanos-yeetube.el
new file mode 100644
index 0000000..517d245
--- /dev/null
+++ b/.emacs.d/modules/thanos-yeetube.el
@@ -0,0 +1,95 @@
+;;; thanos-yeetube.el --- -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2023 Thanos Apollo
+
+;; Author: Thanos Apollo <[email protected]>
+;; Keywords:
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;
+
+;;; Code:
+
+(require 'yeetube)
+
+
+(defun yeetube-download-vimeo-videos ()
+ (interactive)
+ (let ((url "")
+ (name "")
+ (download-counter 1))
+ (while (not (string= url "q"))
+ (setf url (read-string "Enter URL (q to quit): "))
+ (unless (string= url "q")
+ (setf name (read-string (format "Custom name (download counter: %d) " download-counter)))
+ (setf download-counter (1+ download-counter))
+ (call-process-shell-command
+ (format
+ "yt-dlp '%s' -o '%s'"
+ (replace-regexp-in-string "\\.json" ".m3u8" url) name)
+ nil 0)))))
+
+(defun yeetube-download-videos-ffmpeg ()
+ "Download one or multiple videos using yt-dlp.
+ This command is not meant to be used in the *Yeetube Search* buffer.
+
+ Usage Example:
+ Open a Dired buffer and navigate where you want to download your videos,
+ then run this command interactively. You can leave the 'Custom name:'
+ prompt blank to keep the default name."
+ (interactive)
+ (let ((url "")
+ (name "")
+ (download-counter 1)
+ (stored-contents nil))
+ ;; Read links and names until "q" is entered
+ (while (not (string= url "q"))
+ (setf url (read-string "Enter URL (q to quit): "))
+ (unless (string= url "q")
+ (setf name (read-string (format "Custom name (download counter: %d) " download-counter)))
+ (push (cons url name) stored-contents)
+ (setf download-counter (1+ download-counter))))
+ ;; Process the collected links and names
+ (dolist (pair stored-contents)
+ (let ((url (car pair))
+ (name (cdr pair)))
+ (async-shell-command
+ (format
+ "ffmpeg -protocol_whitelist file,crypto,data,https,tls,tcp -stats -i '%s' -codec copy '%s.mp4'"
+ url name))))))
+
+(when is-zeus
+ (load-file "~/Developer/yeetube.el/yeetube.el"))
+(require 'yeetube)
+
+(setf yeetube-results-limit 30
+ yeetube-mpv-disable-video t)
+
+(define-prefix-command 'thanos/yeetube)
+(global-set-key (kbd "C-c y") 'thanos/yeetube)
+(define-key thanos/yeetube (kbd "s") 'yeetube-search)
+(define-key thanos/yeetube (kbd "b") 'yeetube-play-saved-video)
+(define-key thanos/yeetube (kbd "d") 'yeetube-download-videos)
+(define-key thanos/yeetube (kbd "p") 'yeetube-mpv-toggle-pause)
+(define-key thanos/yeetube (kbd "C-p") 'yeetube-mpv-toggle-video)
+(define-key thanos/yeetube (kbd "k") 'yeetube-remove-saved-video)
+(define-key thanos/yeetube (kbd "u") 'yeetube-change-platform)
+(define-key thanos/yeetube (kbd "C-d") 'yeetube-download-vimeo-videos)
+(define-key yeetube-mode-map (kbd "c") 'yeetube-switch-mpv)
+
+(provide 'thanos-yeetube)
+;;; thanos-yeetube.el ends here