diff options
author | Thanos Apollo <[email protected]> | 2023-09-03 17:05:49 +0300 |
---|---|---|
committer | Thanos Apollo <[email protected]> | 2023-09-03 17:06:54 +0300 |
commit | 8efa6f3f1db166d30a4eb38780f6c47855c51439 (patch) | |
tree | 873e0c0aeb443c10153a44e14a3d89c938e68e4d /.emacs.d | |
parent | f7c3db0c688b9b98762464cc9e4cc7c87a9dbe96 (diff) |
emacs: Modularize
Diffstat (limited to '.emacs.d')
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 |