summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.emacs.d/insert/python.template2
-rw-r--r--.emacs.d/modules/thanos-commands.el295
-rw-r--r--.emacs.d/modules/thanos-mu4e.el132
-rw-r--r--.emacs.d/modules/thanos-pass.el91
-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