diff options
-rw-r--r-- | .emacs.d/insert/python.template | 2 | ||||
-rw-r--r-- | .emacs.d/modules/thanos-commands.el | 295 | ||||
-rw-r--r-- | .emacs.d/modules/thanos-mu4e.el | 132 | ||||
-rw-r--r-- | .emacs.d/modules/thanos-pass.el | 91 | ||||
-rw-r--r-- | emacs.el (renamed from .emacs.d/init.el) | 663 |
5 files changed, 530 insertions, 653 deletions
diff --git a/.emacs.d/insert/python.template b/.emacs.d/insert/python.template deleted file mode 100644 index 63f77b6..0000000 --- a/.emacs.d/insert/python.template +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env python3 - diff --git a/.emacs.d/modules/thanos-commands.el b/.emacs.d/modules/thanos-commands.el deleted file mode 100644 index af9603f..0000000 --- a/.emacs.d/modules/thanos-commands.el +++ /dev/null @@ -1,295 +0,0 @@ -;;; 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: - -;; VM -(defvar vm-directory "~/Virtual/") - -(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))) - (async-shell-command - (format "qemu-system-x86_64 -enable-kvm -m %s -smp %s -hda %s -vga virtio -device virtio-serial-pci -netdev user,id=vmnic,hostfwd=tcp::2222-:22 -device e1000,netdev=vmnic %s" - memory cores image (if iso (concat "-cdrom " iso) ""))))) - -;; MISC - -(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 thanos/center-buffer () - (interactive) - (set-fringe-mode - (/ (- (frame-pixel-width) - (* 150 (frame-char-width))) - 2))) - -(defun thanos/git-clone (repository) - "Clone git REPOSITORY." - (interactive (list (read-string "repo: "))) - (call-process-shell-command - (concat "git clone " (shell-quote-argument repository)) nil 0)) - -;; CREATE - -(defun create-text-scratch () - "Create a scratch buffer." - (interactive) - (switch-to-buffer (get-buffer-create "*Text Scratch*")) - (org-mode)) - -(defun create-scratch () - "Create scratch buffer." - (interactive) - (switch-to-buffer (get-buffer-create "*scratch*")) - (emacs-lisp-mode)) - -(defvar-keymap thanos/create-map - :doc "Create custom buffers" - "t" #'create-text-scratch - "e" #'create-scratch) - -;; THEMING -(defvar wallpapers-dir "~/wallpapers/") - -(defun thanos/load-theme (&optional theme) - "Disable current theme and load a new THEME." - (interactive) - (let ((theme (or theme (intern (completing-read "Theme: " (custom-available-themes)))))) - (disable-theme (car custom-enabled-themes)) - (load-theme theme t))) - -(defun thanos/wallpaper-set (image) - "Set IMAGE as wallpaper, using feh." - (let ((command (if is-zeus "xwallpaper --output DisplayPort-1 --stretch" "feh --bg-scale"))) - (call-process-shell-command (concat command " " wallpapers-dir image) nil 0))) - -(defun thanos/wallpaper-random () - "Set random wallpaper." - (interactive) - (let ((wallpapers (directory-files "~/wallpapers" nil "^[^.].*"))) - (thanos/wallpaper-set (nth (random (length wallpapers)) wallpapers)))) - -(defun thanos/wallpaper-select () - "Set wallpaper." - (interactive) - (let ((wallpaper (completing-read "Choose wallpaper: " (directory-files wallpapers-dir nil "^[^.].*")))) - (thanos/wallpaper-set wallpaper))) - -(defvar-keymap thanos/applications-map - :doc "Thanos commonly used programs" - "t" #'thanos/load-theme - "w" #'thanos/wallpaper-select - "C-c" thanos/create-map) - -(define-key global-map (kbd "C-c a") thanos/applications-map) - - -(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) - (let ((command (if is-zeus "xwallpaper --output DisplayPort-1 --stretch" "feh --bg-scale"))) - (call-process-shell-command - (format "%s %s" command (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))))) - -(defun thanos/0x0-upload-file () - "Update file to 0x0.st" - (interactive) - (async-shell-command (format "curl -F'file=@%s' https://0x0.st" (dired-get-filename)))) - -;; yeetube -(defun yeetube-download-videos-ffmpeg () - "Download videos using ffmpeg." - (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)))))) - -(defun yeetube-download-vimeo-videos () - "Download videos from vimeo services." - (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))))) - -;; Input methods -(defvar thanos/input-methods - '("greek" "bulgarian-phonetic" "nil") - "List of input methods to toggle.") - -(defvar thanos/input-methods-index 0 - "Index of the next input method in `thanos/input-methods' to use.") - -(defun thanos/toggle-input-method () - "Switch to the next input method in `thanos/input-methods'." - (interactive) - (setf thanos/input-methods-index - (mod (1+ thanos/input-methods-index) (length thanos/input-methods))) - (let ((input-method (nth thanos/input-methods-index thanos/input-methods))) - (set-input-method (if (string= "nil" input-method) nil input-method)))) - -(defun thanos/toggle-input-method () - "Switch to the next input method in `thanos/input-methods'." - (interactive) - (setf thanos/input-methods-index - (mod (1+ thanos/input-methods-index) (length thanos/input-methods))) - (let ((input-method (nth thanos/input-methods-index thanos/input-methods))) - (set-input-method (if (string= "nil" input-method) nil input-method)))) - -(defun erc-libera () - "Login to liberachat with erc." - (interactive) - (erc :server (password-store-get-field "znc/admin" "server") - :port (password-store-get-field "znc/admin" "port") - :user (password-store-get-field "znc/admin" "user") - :password (password-store-get "znc/admin"))) - - -(defun thanos/iimage-mode-buffer (arg) - "Display images if ARG is non-nil, undisplay them otherwise." - (let ((image-path (cons default-directory iimage-mode-image-search-path)) - (edges (window-inside-pixel-edges (get-buffer-window))) - file) - (with-silent-modifications - (save-excursion - (dolist (pair iimage-mode-image-regex-alist) - (goto-char (point-min)) - (while (re-search-forward (car pair) nil t) - (when (and (setq file (match-string (cdr pair))) - (setq file (locate-file file image-path))) - (if arg - (add-text-properties - (match-beginning 0) (match-end 0) - `(display - ,(create-image file nil nil - :max-width 120 - :max-height 120) - keymap ,image-map - modification-hooks - (iimage-modification-hook))) - (remove-list-of-text-properties - (match-beginning 0) (match-end 0) - '(display modification-hooks)))))))))) - -(define-minor-mode thanos/iimage-mode nil - :group 'iimage :lighter " iImg" - (thanos/iimage-mode-buffer thanos/iimage-mode)) - -(provide 'thanos-commands) -;;; thanos-commands.el ends here diff --git a/.emacs.d/modules/thanos-mu4e.el b/.emacs.d/modules/thanos-mu4e.el deleted file mode 100644 index 77b2856..0000000 --- a/.emacs.d/modules/thanos-mu4e.el +++ /dev/null @@ -1,132 +0,0 @@ -;;; 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 'server) - -(add-to-list 'load-path "/usr/share/emacs/site-lisp/mu4e/") -(require 'mu4e) - -(setf mu4e-get-mail-command "mbsync -a") - -(when (and is-zeus (server-running-p)) - (setf mu4e-update-interval (* 10 60))) - -(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 - '(("/Fastmail/Inbox" . ?i) - ("/Drafts" . ?d) - ("/Sent" . ?s) - ("/Fastmail/Emacs/dev" . ?e) - ("/MUSofia/[Gmail]/All Mail" . ?u) - ("/Fastmail/Gentoo" . ?g))) - -(setf mu4e-contexts - (list - (make-mu4e-context - :name "Public" - :match-func - (lambda (msg) - (when msg - (string-prefix-p "/Fastmail" (mu4e-message-field msg :maildir)))) - :vars '((user-mail-address . "[email protected]") - (user-full-name . "Thanos Apollo") - (smtpmail-smtp-server . "smtp.fastmail.com") - (smtpmail-smtp-service . 465) - (smtpmail-stream-type . ssl) - (mu4e-drafts-folder . "/Drafts") - (mu4e-sent-folder . "/Sent") - (mu4e-refile-folder . "/Archive") - (mu4e-trash-folder . "/Trash"))) - (make-mu4e-context - :name "MUSofia" - :match-func - (lambda (msg) - (when msg - (string-prefix-p "/MUSofia" (mu4e-message-field msg :maildir)))) - :vars '((user-mail-address . "[email protected]") - (user-full-name . "Thanos Apollo") - (smtpmail-smtp-server . "smtp.gmail.com") - (smtpmail-smtp-service . 465) - (smtpmail-stream-type . ssl))))) - -(setf message-send-mail-function 'smtpmail-send-it - mu4e-compose-signature "\nThanos Apollo\n \nhttps://thanosapollo.org\n -62B7 58D0 F671 9938 BC09 CECA 339F 736C 3A72 0928\n" - mu4e-compose-context-policy 'ask) - -(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))))) - -(add-hook 'mu4e-main-mode-hook #'(lambda () - (display-line-numbers-mode -1) - (auto-save-mode -1))) -;; Sign messages -(add-hook 'message-send-hook 'mml-secure-message-sign-pgpmime) - -(define-key global-map (kbd "C-x m") 'mu4e) - -(provide 'thanos-mu4e) -;;; thanos-mu4e.el ends here diff --git a/.emacs.d/modules/thanos-pass.el b/.emacs.d/modules/thanos-pass.el deleted file mode 100644 index 0e996f6..0000000 --- a/.emacs.d/modules/thanos-pass.el +++ /dev/null @@ -1,91 +0,0 @@ -;;; thanos-pass.el --- Pass configuration -*- lexical-binding: t; -*- - -;; Copyright (C) 2023 Thanos Apollo - -;; Author: Thanos Apollo <[email protected]> - -;; 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) - (unwind-protect - (with-selected-frame - (make-frame '((name . "thanos/pass-launcher") - (fullscreen . 0) - (undecorated . t) - (minibuffer . only) - (width . 70) - (height . 15))) - (let* ((choice (completing-read "Choose an action: " - '("AUTO" "COPY PASS" "COPY USERNAME" "EDIT" "GENERATE"))) - (action (pcase choice - ("AUTO" #'(lambda (entry) (let ((user (password-store-get-field entry "user")) (pass (password-store-get entry))) - (start-process-shell-command - "xdotool" nil - (format "sleep 0.3 && xdotool getactivewindow type '%s' && xdotool getactivewindow key Tab && xdotool getactivewindow type '%s'" - (if user user 'thanosapollo) pass))))) - ("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 "c") 'password-store-copy) -(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/init.el b/emacs.el index 392a5ec..f9df16d 100644 --- a/.emacs.d/init.el +++ b/emacs.el @@ -1,9 +1,8 @@ -;;; init.el --- Welcome to my Emacs configuration! -*- lexical-binding: t; -*- +;;; emacs.el --- Welcome to my Emacs configuration! -*- lexical-binding: t; -*- ;; Copyright (C) 2023 Thanos Apollo -;; Author: Thanos Apollo <[email protected]> -;; Keywords: extensions +;; Author: Thanos Apollo <[email protected]> ;; 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 @@ -36,50 +35,6 @@ (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" - backup-directory-alist '((".*" . "~/.Trash")) - sentence-end-double-space t - default-input-method "bulgarian-phonetic" - ;; fix emacs hangs - gc-cons-threshold 5000000 - ispell-program-name (executable-find "hunspell")) - -(define-key global-map (kbd "M-<backspace>") 'backward-kill-sexp) -(define-key global-map (kbd "C-c L") 'display-line-numbers-mode) -(define-key global-map (kbd "C-z") 'nil) -(define-key global-map (kbd "C-c r") 'rename-visited-file) - -(add-to-list 'load-path "~/.emacs.d/modules") - -(setf disabled-command-function nil ;; Enable all commands - url-privacy-level 'high) ;; Privacy level - -;; Calendar dates -(setf calendar-date-style 'european) - -(require 'dired) -(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 dired-mode-map (kbd "C-c d") 'dired-delete-files-except) -(define-key dired-mode-map (kbd "C-c r") 'dired-do-query-replace-regexp) - -;; font -(custom-set-faces - (if is-hermes '(default ((t (:inherit nil :height 120 :family "Jetbrains Mono")))) - '(default ((t (:inherit nil :height 130 :family "Jetbrains Mono")))))) - -(if is-zeus - (display-battery-mode 0) - (display-battery-mode 1)) - -(savehist-mode) -(save-place-mode 1) -(recentf-mode 1) -(electric-pair-mode 1) - ;; Autoinsert (auto-insert-mode 1) @@ -90,16 +45,10 @@ (setf tab-always-indent 'complete) -;; tramp -(setf tramp-default-method "ssh") - ;; xref (setf xref-show-xrefs-function #'consult-xref xref-show-definitions-function #'consult-xref) -(add-hook 'emacs-lisp-mode-hook #'prettify-symbols-mode) -(add-hook 'lisp-mode-hook #'prettify-symbols-mode) - ;; Set and load custom.el (setf custom-file (locate-user-emacs-file "custom.el")) (load custom-file 'noerror) @@ -133,11 +82,102 @@ (setf straight-recipe-overrides '((transmission :type git :host nil :repo "[email protected]:/var/git/transmission.git") - (yeetube :type git :host nil :repo "[email protected]:/var/git/yeetube.git") + ;; (yeetube :type git :host nil :repo "[email protected]:/var/git/yeetube.git") (gnosis :type git :host nil :repo "[email protected]:/var/git/gnosis.git") (pcmpl-emerge :type git :host nil :repo "[email protected]:/var/git/pcmpl-emerge.git") (pcmpl-rc :type git :host nil :repo "[email protected]:/var/git/pcmpl-rc.git"))) +(use-package emacs + :straight nil + :ensure t + :config + + (setf browse-url-browser-function 'browse-url-generic + browse-url-generic-program "icecat" + backup-directory-alist '((".*" . "~/.Trash")) + sentence-end-double-space t + default-input-method "bulgarian-phonetic" + gc-cons-threshold 5000000 + disabled-command-function nil ;; Enable all commands + url-privacy-level 'high + calendar-date-style 'european) + (if is-zeus + (display-battery-mode 0) + (display-battery-mode 1)) + + ;; use ssh for tramp, faster for small files + (setf tramp-default-method "ssh") + + (savehist-mode) + (save-place-mode 1) + (recentf-mode 1) + (electric-pair-mode 1) + :bind (("M-<backspace>" . 'backward-kill-sexp) + ("C-c L" . 'display-line-numbers-mode) + ("C-z" . nil) + ("C-c r" . 'rename-visited-file)) + :hook ((emacs-lisp-mode . prettify-symbols-mode) + (lisp-mode . prettify-symbols-mode))) + +(use-package dired + :straight nil + :ensure nil + :config + (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) + (let ((command (if is-zeus "swaybg -o DP-2 -i" "feh --bg-scale"))) + (call-process-shell-command + (format "%s %s" command (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))))) + :bind ((:map + dired-mode-map + ("b" . 'dired-up-directory) + ("v" . 'dired-watch-video) + ("z" . 'wdired-change-to-wdired-mode) + ("C-c w" . 'dired-set-wallpaper) + ("C-c d" . 'dired-delete-files-except) + ("C-c r" . 'dired-do-query-replace-regexp)))) + (defun theme-invisible-dividers (_theme) "Make window dividers for THEME invisible." (let ((bg (face-background 'default))) @@ -166,7 +206,8 @@ (add-to-list 'default-frame-alist '(alpha-background . 85)) ;; theming -(global-hl-line-mode) +;; (global-hl-line-mode) +(global-visual-line-mode) (defun thanos/terminal-theming () "Customize theming when laucning Emacs as TUI." @@ -184,6 +225,8 @@ (tooltip-mode -1) (menu-bar-mode -1) +;; (when is-zeus +;; (guix-emacs-autoload-packages)) (use-package org :ensure t @@ -204,6 +247,7 @@ ("l" . "src lisp") ("b" . "src bash") ("q" . "QUOTE"))) + :hook ((org-mode . org-auto-tangle-mode) (org-mode . (lambda () (display-line-numbers-mode -1) (flyspell-mode)))) :bind (:map org-mode-map @@ -219,16 +263,17 @@ (use-package org-modern :ensure t :config - (global-org-modern-mode) (setf org-modern-table nil org-modern-todo nil - org-modern-tag nil)) + org-modern-tag nil) + :hook ((org-mode . org-modern-mode))) ;; Create notes directory for org-roam (unless (file-exists-p "~/Notes") (make-directory "~/Notes")) (use-package org-roam + :straight nil :defer t :init (define-prefix-command 'thanos/notes-map) @@ -263,6 +308,7 @@ "\n* Daily Notes\n\n* Goals\n+ []\n\n* Extras %?" :target (file+head "%<%Y-%m-%d>.org" "#+title: %<%Y-%m-%d>\n#+filetags: :journal:\n")))) + (defun org-roam-ref-add-book () "Insert org-link from Library." (interactive) @@ -285,6 +331,7 @@ (shell-command (format "%s %s %s" git "commit -m" (shell-quote-argument "Update org-roam notes"))) (vc-git-push nil)) (funcall 'org-roam-db-sync)) + :bind (("C-c n" . thanos/notes-map) :map thanos/notes-map ("t" . org-roam-buffer-toggle) @@ -299,6 +346,9 @@ (use-package org-roam-ui :defer t) +;; (use-package jabber +;; :defer t) + (use-package modus-themes :straight t :config @@ -319,8 +369,8 @@ ;; (bg-main "#1d2021") ;;grubox-hard ;; (bg-main "#191919") ;; 1337 ;; (bg-main "#1d1f21") ;; tomorrow night - (bg-main "#151515") ;; jazz - ;; (bg-main "#0C0C0C") ;; random black + ;; (bg-main "#151515") ;; jazz + (bg-main "#0C0C0C") ;; random black ;; (bg-main "#171717") ;; badger ;; (overline-heading-1 gold) (fg-heading-1 red-warmer) @@ -366,6 +416,7 @@ (marginalia-mode)) (use-package consult + :straight nil :ensure t :init (define-prefix-command 'thanos/search) :bind (("C-x r d" . 'bookmark-delete) @@ -414,7 +465,7 @@ (setf elfeed-feeds '(("https://hackaday.com/blog/feed/" hackaday linux) - ("https://thanosapollo.com/posts/index.xml" + ("https://thanosapollo.org/index.xml" thanos) ("http://wikileaks.org/feed" wikileaks) @@ -436,7 +487,8 @@ ("https://devonzuegel.com/feed" devon) ("https://www.addtoany.com/add_to/feed?linkurl=http%3A%2F%2Fwww.thelancet.com%2Frssfeed%2Flancet_online.xml&type=feed&linkname=The%20Lancet%20Online%20First&linknote=" lancet med) ("http://tools.cdc.gov/podcasts/feed.asp?feedid=183" cdc med) - ("http://planet.lisp.org/rss20.xml" lisp planetlisp))) + ("http://planet.lisp.org/rss20.xml" lisp planetlisp) + ("https://guix.gnu.org/feeds/blog.atom" guix))) :bind (("C-x f" . elfeed) :map elfeed-search-mode-map ("v" . 'elfeed-mpv) @@ -453,7 +505,8 @@ :defer t) (use-package elpy - :ensure t + :straight nil + :ensure nil :init (elpy-enable)) @@ -494,9 +547,6 @@ ("C-h a" . 'apropos) ("C-h C-m" . 'info-apropos))) -(use-package password-store - :defer t) - (use-package ox-hugo :ensure t :config @@ -552,12 +602,16 @@ completion-cycle-threshold 2)) (use-package pdf-tools - :ensure t + :straight nil + :ensure nil :config - (pdf-tools-install) - (add-to-list 'auto-mode-alist '("\\.pdf\\'" . 'pdf-view-mode)) + (add-to-list 'auto-mode-alist '("\\.pdf\\'" . pdf-view-mode)) :hook - ((pdf-view-mode . (lambda () (display-line-numbers-mode 0))))) + ((pdf-view-mode . (lambda () + (display-line-numbers-mode 0) + ;; Guix package emacs-pdf-tools does not enable + ;; minor modes automatically + (pdf-tools-enable-minor-modes))))) (use-package markdown-mode :defer t @@ -581,6 +635,7 @@ :bind ((:map thanos/search ("i" . 'change-inner)))) (use-package nov + :straight nil :defer t :config (add-to-list 'auto-mode-alist '("\\.epub\\'" . nov-mode))) @@ -605,17 +660,21 @@ :hook ((emacs-lisp-mode . (lambda () (flycheck-mode) (flycheck-package-setup))))) ;; Shells -;; (use-package vterm -;; :defer t -;; :bind (("C-c v" . vterm) -;; :map vterm-mode-map -;; ("M-&" . 'async-shell-command) -;; ("C-c C-y" . 'vterm-copy-mode)) -;; :hook ((vterm-mode . (lambda () (display-line-numbers-mode -1))))) +(use-package vterm + :straight nil + :ensure nil + :bind (("C-c v" . vterm) + :map vterm-mode-map + ("M-&" . 'async-shell-command) + ("C-c C-y" . 'vterm-copy-mode)) + :hook + ((vterm-mode . (lambda () (display-line-numbers-mode -1))))) (use-package shell :defer t - :bind (("C-c v" . shell)) + :bind (("C-c V" . shell) + :map shell-mode-map + ("C-l" . 'comint-clear-buffer)) :hook ((shell-mode . (lambda () (display-line-numbers-mode -1))))) (defvar thanos/aliases @@ -638,7 +697,9 @@ :config (setf eshell-highlight-prompt t) (eshell-syntax-highlighting-global-mode 1) - :bind (("C-c e" . eshell)) + :bind (("C-c e" . eshell) + :map eshell-mode-map + ("C-l" . eshell/clear-scrollback)) :hook ((eshell-mode . (lambda () (thanos/set-eshell-aliases thanos/aliases) (display-line-numbers-mode -1))))) @@ -650,24 +711,74 @@ (setf eat-term-name "xterm-256color")) (use-package eshell-git-prompt - :straight '(eshell-git-prompt :type git - :host nil - :repo "https://git.thanosapollo.org/eshell-git-prompt") :config + (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 + (with-face "" 'eshell-git-prompt-directory-face) + (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)) + + ;; Build prompt + (eshell-git-prompt---str-read-only + (concat hr dir separator git git-dirty separator time sign command)))) + (eshell-git-prompt-use-theme 'multiline)) ;; Chat -(use-package telega +(use-package jabber :defer t - :hook ((telega-root-mode . (lambda () - (emojify-mode) - (display-line-numbers-mode -1))) - (telega-chat-mode . (lambda () - (emojify-mode) - (display-line-numbers-mode -1)))) :config - (setf telega-completing-read-function #'completing-read) - :bind (("C-x T" . 'telega))) + (defun jabber-buffers-formats (&optional buffer-formats) + "Return jabber BUFFER-FORMATS without the format specifiers. + +By default, returns all jabber related buffers format." + (let ((buffer-formats (or buffer-formats '(jabber-chat-buffer-format + jabber-browse-buffer-format + jabber-roster-buffer + jabber-groupchat-buffer-format + jabber-muc-private-buffer-format)))) + (cl-loop for var in buffer-formats + for str = (symbol-value var) + for formatted-str = (when (stringp str) + ;; Remove format specifier and + ;; the following 2 char, or 1 if + ;; there is not second. + (replace-regexp-in-string "%.?" "" str)) + collect formatted-str))) + + (defun jabber-switch-to-buffer () + "Prompt the user to select a buffer whose name matches a list of strings." + (interactive) + (let* ((string-list (jabber-buffers-formats)) + (buffers-matching-strings + (cl-loop for buf in (buffer-list) + when (cl-loop for str in string-list + thereis (string-match-p str (buffer-name buf))) + collect (buffer-name buf)))) + (if buffers-matching-strings + (switch-to-buffer + (completing-read "Select jabber buffer: " buffers-matching-strings))) + (error "No jabber buffer found"))) + :bind (:map jabber-global-keymap + ("C-b" . 'jabber-switch-to-buffer))) (use-package erc :defer t @@ -683,12 +794,12 @@ :map erc-mode-map ("C-c RET" . 'erc-cmd-QUERY))) -(use-package erc-image - :ensure t - :after erc - :config - (setq erc-image-inline-rescale 300) - (add-to-list 'erc-modules 'image)) +;; (use-package erc-image +;; :ensure t +;; :after erc +;; :config +;; (setq erc-image-inline-rescale 300) +;; (add-to-list 'erc-modules 'image)) (use-package transmission :defer t) @@ -696,7 +807,7 @@ (use-package sudo-edit :defer t :config - (setf sudo-edit-local-method "doas")) + (setf sudo-edit-local-method "sudo")) (use-package dabbrev :defer t @@ -723,13 +834,54 @@ (when (or is-zeus is-hermes) (use-package yeetube :init (define-prefix-command 'thanos/yeetube-map) - :straight (yeetube :local-repo "~/Dev/emacs-lisp/yeetube") + :straight nil :ensure t :config (setf yeetube-results-limit 20 yeetube-mpv-disable-video t - yeetube-display-thumbnails t + yeetube-display-thumbnails nil yeetube-play-function #'yeetube-mpv-play) + + (defun yeetube-download-videos-ffmpeg () + "Download videos using ffmpeg." + (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)))))) + + (defun yeetube-download-vimeo-videos () + "Download videos from vimeo services." + (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))))) + :bind (("C-c y" . 'thanos/yeetube-map) :map thanos/yeetube-map ("s" . 'yeetube-search) @@ -747,12 +899,10 @@ :ensure t :init (define-prefix-command 'thanos/gnosis-map) :config - (setf gnosis-vc-auto-push (when (or is-hermes - is-zeus) - t) + (setf gnosis-vc-auto-push t gnosis-mcq-display-choices nil - gnosis-image-width (if is-zeus 300 150) - gnosis-image-height (if is-zeus 300 150)) + gnosis-image-width nil + gnosis-image-height nil) (gnosis-modeline-mode) :bind (("C-r" . thanos/gnosis-map) :map thanos/gnosis-map @@ -805,17 +955,29 @@ :map gptel-mode-map ("C-c h" . 'gptel-menu))) -(use-package copilot - :straight (copilot :host github :repo "zerolfx/copilot.el" :files ("dist" "*.el")) - :bind (:map copilot-mode-map - ("M-TAB" . 'copilot-accept-completion-by-line) - ("C-M-<tab>" . 'copilot-accept-completion-by-word) - ("C-M-n" . 'copilot-next-completion) - ("C-M-p" . 'copilot-previous-completion))) +;; (use-package copilot +;; :straight (copilot :host github :repo "zerolfx/copilot.el" :files ("dist" "*.el")) +;; :bind (:map copilot-mode-map +;; ("M-TAB" . 'copilot-accept-completion-by-line) +;; ("C-M-<tab>" . 'copilot-accept-completion-by-word) +;; ("C-M-n" . 'copilot-next-completion) +;; ("C-M-p" . 'copilot-previous-completion))) ;; Password-store -(require 'password-store) +(use-package password-store + :init (define-prefix-command 'thanos/pass) + :defer t + :config + (setf password-store-password-length (+ 20 (random 20))) + :bind (("C-c p" . 'thanos/pass) + :map thanos/pass + ("i" . 'password-store-insert) + ("e" . 'password-store-edit) + ("g" . 'password-store-generate) + ("c" . 'password-store-copy) + ("s" . 'smtp-get-pass))) + (defun thanos/pass-launcher () "Launch Emacs as a front-end for pass." (interactive) @@ -833,10 +995,10 @@ ("AUTO" #'(lambda (entry) (let ((user (password-store-get-field entry "user")) (pass (password-store-get entry))) (start-process-shell-command - "xdotool" nil - (format "sleep 0.3 && xdotool getactivewindow type %s && xdotool key Tab && xdotool getactivewindow type %s" - (shell-quote-argument (if user user "thanosapollo")) - (shell-quote-argument pass)))))) + "wtype" nil + (format "sleep 0.3 && wtype %s -P tab %s" + (shell-quote-argument (if user user "thanosapollo")) + (shell-quote-argument pass)))))) ("COPY PASS" #'password-store-copy) ("COPY USERNAME" #'(lambda (entry) (password-store-copy-field entry "user"))) ("EDIT" #'password-store-edit) @@ -849,20 +1011,6 @@ (interactive) (password-store-copy-field "fastmail.com/[email protected]" "smtp")) - -(use-package password-store - :init (define-prefix-command 'thanos/pass) - :defer t - :config - (setf password-store-password-length (+ 20 (random 20))) - :bind (("C-c p" . 'thanos/pass) - :map thanos/pass - ("i" . 'password-store-insert) - ("e" . 'password-store-edit) - ("g" . 'password-store-generate) - ("c" . 'password-store-copy) - ("s" . 'smtp-get-pass))) - (use-package package-lint :defer t) @@ -876,8 +1024,257 @@ :map mu4e-headers-mode-map ("M-s" . 'consult-mu))) -(require 'thanos-commands) ;; Misc commands +;; Guix Setup +;; Yasnippet configuration +(with-eval-after-load 'yasnippet + (add-to-list 'yas-snippet-dirs "~/Dev/guile/guix/etc/snippets/yas")) +;; ;; Tempel configuration +;; (with-eval-after-load 'tempel +;; ;; Ensure tempel-path is a list -- it may also be a string. +;; (unless (listp 'tempel-path) +;; (setq tempel-path (list tempel-path))) +;; (add-to-list 'tempel-path "~/Dev/guile/guix/etc/snippets/tempel/*")) + +(use-package yaml-mode + :defer t) + +;(load-file "~/Dev/guile/guix/etc/copyright.el") + +(setq copyright-names-regexp + (format "%s <%s>" user-full-name user-mail-address)) + (when (or is-zeus is-hermes) - (require 'thanos-mu4e)) + (use-package mu4e + :straight nil + :ensure nil + :init + + :config + (require 'server) + (require 'mu4e) + + (setf mu4e-get-mail-command "mbsync -a") + + (when (and is-zeus (server-running-p)) + (setf mu4e-update-interval (* 10 60))) + + (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 + mu4e-maildir-shortcuts + '(("/Fastmail/Inbox" . ?i) + ("/Drafts" . ?d) + ("/Sent" . ?s) + ("/Fastmail/Emacs/dev" . ?e) + ("/MUSofia/[Gmail]/All Mail" . ?u) + ("/Fastmail/Gentoo" . ?g))) + + (setf mu4e-contexts + (list + (make-mu4e-context + :name "Public" + :match-func + (lambda (msg) + (when msg + (string-prefix-p "/Fastmail" (mu4e-message-field msg :maildir)))) + :vars '((user-mail-address . "[email protected]") + (user-full-name . "Thanos Apollo") + (smtpmail-smtp-server . "smtp.fastmail.com") + (smtpmail-smtp-service . 465) + (smtpmail-stream-type . ssl) + (mu4e-drafts-folder . "/Drafts") + (mu4e-sent-folder . "/Sent") + (mu4e-refile-folder . "/Archive") + (mu4e-trash-folder . "/Trash"))) + (make-mu4e-context + :name "MUSofia" + :match-func + (lambda (msg) + (when msg + (string-prefix-p "/MUSofia" (mu4e-message-field msg :maildir)))) + :vars '((user-mail-address . "[email protected]") + (user-full-name . "Thanos Apollo") + (smtpmail-smtp-server . "smtp.gmail.com") + (smtpmail-smtp-service . 465) + (smtpmail-stream-type . ssl))))) + + (setf message-send-mail-function 'smtpmail-send-it + mu4e-compose-signature "\nThanos Apollo\n \nhttps://thanosapollo.org\n +62B7 58D0 F671 9938 BC09 CECA 339F 736C 3A72 0928\n" + mu4e-compose-context-policy 'ask) + + (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))))) + + :bind (("C-x m" . 'mu4e)) + :hook + ;; Sign messages + ((message-send . 'mml-secure-message-sign-pgpmime) + ;; Disable line numbers & autosave + (mu4e-main-mode . (lambda () (display-line-numbers-mode -1) (auto-save-mode -1)))))) + +;;; Random commands ;;;; +;;;;;;;;;;;;;;;;;;;;;;;; + +;; Virtual machines +(defvar vm-directory "~/Virtual/") + +(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))) + (async-shell-command + (format "qemu-system-x86_64 -enable-kvm -m %s -smp %s -hda %s -vga virtio -device virtio-serial-pci -netdev user,id=vmnic,hostfwd=tcp::2222-:22 -device e1000,netdev=vmnic %s" + memory cores image (if iso (concat "-cdrom " iso) ""))))) + +;; misc +(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 create-text-scratch () + "Create a scratch buffer." + (interactive) + (switch-to-buffer (get-buffer-create "*Text Scratch*")) + (org-mode)) + +(defun create-scratch () + "Create scratch buffer." + (interactive) + (switch-to-buffer (get-buffer-create "*scratch*")) + (emacs-lisp-mode)) + +(defvar-keymap thanos/create-map + :doc "Create custom buffers" + "t" #'create-text-scratch + "e" #'create-scratch) + +;; Theming + +(defvar wallpapers-dir "~/wallpapers/") + +(defun thanos/load-theme (&optional theme) + "Disable current theme and load a new THEME." + (interactive) + (let ((theme (or theme (intern (completing-read "Theme: " (custom-available-themes)))))) + (disable-theme (car custom-enabled-themes)) + (load-theme theme t))) + +(defun thanos/wallpaper-set (image) + "Set IMAGE as wallpaper, using feh." + (let ((command (if is-zeus "swaybg -o '*' -i" "feh --bg-scale"))) + ;; Kill previous swaybg + (call-process-shell-command "kill -15 $(pgrep swaybg | tail -n 1)") + ;; Set wallpaper + (call-process-shell-command + (format "%s %s%s -m stretch" command wallpapers-dir image) + nil 0))) + +(defun thanos/wallpaper-random () + "Set random wallpaper." + (interactive) + (let ((wallpapers (directory-files "~/wallpapers" nil "^[^.].*"))) + (thanos/wallpaper-set (nth (random (length wallpapers)) wallpapers)))) + +(defun thanos/wallpaper-select () + "Set wallpaper." + (interactive) + (let ((wallpaper (completing-read "Choose wallpaper: " (directory-files wallpapers-dir nil "^[^.].*")))) + (thanos/wallpaper-set wallpaper))) + +(defvar-keymap thanos/applications-map + :doc "Thanos commonly used programs" + "t" #'thanos/load-theme + "w" #'thanos/wallpaper-select + "C-c" thanos/create-map) + +(define-key global-map (kbd "C-c a") thanos/applications-map) + +(defun thanos/iimage-mode-buffer (arg) + "Display images if ARG is non-nil, undisplay them otherwise." + (let ((image-path (cons default-directory iimage-mode-image-search-path)) + (edges (window-inside-pixel-edges (get-buffer-window))) + file) + (with-silent-modifications + (save-excursion + (dolist (pair iimage-mode-image-regex-alist) + (goto-char (point-min)) + (while (re-search-forward (car pair) nil t) + (when (and (setq file (match-string (cdr pair))) + (setq file (locate-file file image-path))) + (if arg + (add-text-properties + (match-beginning 0) (match-end 0) + `(display + ,(create-image file nil nil + :max-width 120 + :max-height 120) + keymap ,image-map + modification-hooks + (iimage-modification-hook))) + (remove-list-of-text-properties + (match-beginning 0) (match-end 0) + '(display modification-hooks)))))))))) + +(define-minor-mode thanos/iimage-mode nil + :group 'iimage :lighter " iImg" + (thanos/iimage-mode-buffer thanos/iimage-mode)) + +;; Font +(custom-set-faces + (if is-hermes '(default ((t (:inherit nil :height 120 :family "Jetbrains Mono")))) + '(default ((t (:inherit nil :height 130 :family "Jetbrains Mono"))))) + '(variable-pitch ((t (:inherit t :family "Iosevka Aile")))) + '(org-modern-symbol ((t (:inherit t :family "Iosevka Aile"))))) + +;; (set-face-attribute 'org-ellipsis nil :inherit 'default :box nil) + -;;; init.el ends here +;;; emacs.el ends here |