From 5d265841976d13affc568557d125c65782b3d50f Mon Sep 17 00:00:00 2001 From: Thanos Apollo Date: Fri, 10 Feb 2023 04:57:03 +0200 Subject: emacs: Complete transition to literate config --- .emacs.d/emacs.org | 555 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 469 insertions(+), 86 deletions(-) (limited to '.emacs.d') diff --git a/.emacs.d/emacs.org b/.emacs.d/emacs.org index 74bfe80..dfcbcaa 100644 --- a/.emacs.d/emacs.org +++ b/.emacs.d/emacs.org @@ -1,5 +1,5 @@ #+TITLE: Emacs Configuration -#+PROPERTY: header-args :tangle test.el +#+PROPERTY: header-args :tangle init.el #+auto_tangle: t #+OPTIONS: num:nil toc:nil @@ -29,11 +29,9 @@ - [[#key-bindings][Key-bindings]] - [[#functions][Functions]] - [[#mu4e--email-configuration][mu4e | Email Configuration]] - - [[#macos][MacOS]] - - [[#settings--context-setup][Settings & Context setup]] - - [[#shortcuts][Shortcuts]] - - [[#contexts][Contexts]] - [[#custom-key-bindings][Custom key-bindings]] + - [[#general][General]] + - [[#hydra][Hydra]] - [[#org-mode-configuration][Org-mode Configuration]] - [[#org-make-toc][org-make-toc]] - [[#themes][Themes]] @@ -53,6 +51,8 @@ - [[#json][JSON]] - [[#javascript][Javascript]] - [[#elfeed][Elfeed]] + - [[#feeds][Feeds]] + - [[#settings][Settings]] - [[#pdf][PDF]] - [[#telega][Telega]] - [[#custom][Custom]] @@ -61,7 +61,7 @@ - [[#exwm][EXWM]] :END: -* TODO Setting up Packages +* Setting up Packages ** Setup for GuixSD machines We check the ~$HOSTNAME~, if it's one of my devices running GuixSD. we use ~guix-emacs-autoload-packages~ to load emacs packages installed using guix if ~t~ @@ -154,7 +154,7 @@ Contains the list of packages that need to be installed.") (package-install 'use-package)) #+end_src -* TODO UI Settings +* UI Settings ** Basic UI Fonts and basic appearance settings #+begin_src emacs-lisp @@ -284,7 +284,114 @@ Fonts and basic appearance settings (define-key dired-mode-map "b" 'dired-up-directory) #+end_src ** All-the-icons.el +#+begin_src emacs-lisp +;;; all-the-icons-dired.el --- Shows icons for each file in dired mode -*- lexical-binding: t; -*- + +;;; Code: + +(require 'cl-lib) +(require 'dired) +(require 'all-the-icons) + +(defface all-the-icons-dired-dir-face + '((((background dark)) :foreground "white") + (((background light)) :foreground "black")) + "Face for the directory icon" + :group 'all-the-icons-faces) + +(defcustom all-the-icons-dired-v-adjust 0.01 + "The default vertical adjustment of the icon in the dired buffer." + :group 'all-the-icons + :type 'number) + +(defvar all-the-icons-dired-mode) + +(defun all-the-icons-dired--add-overlay (pos string) + "Add overlay to display STRING at POS." + (let ((ov (make-overlay (1- pos) pos))) + (overlay-put ov 'all-the-icons-dired-overlay t) + (overlay-put ov 'after-string string))) + +(defun all-the-icons-dired--overlays-in (beg end) + "Get all all-the-icons-dired overlays between BEG to END." + (cl-remove-if-not + (lambda (ov) + (overlay-get ov 'all-the-icons-dired-overlay)) + (overlays-in beg end))) + +(defun all-the-icons-dired--overlays-at (pos) + "Get all-the-icons-dired overlays at POS." + (apply #'all-the-icons-dired--overlays-in `(,pos ,pos))) + +(defun all-the-icons-dired--remove-all-overlays () + "Remove all `all-the-icons-dired' overlays." + (save-restriction + (widen) + (mapc #'delete-overlay + (all-the-icons-dired--overlays-in (point-min) (point-max))))) + +(defun all-the-icons-dired--refresh () + "Display the icons of files in a dired buffer." + (all-the-icons-dired--remove-all-overlays) + (save-excursion + (goto-char (point-min)) + (while (not (eobp)) + (when (dired-move-to-filename nil) + (let ((file (dired-get-filename 'relative 'noerror))) + (when file + (let ((icon (if (file-directory-p file) + (all-the-icons-icon-for-dir file + :face 'all-the-icons-dired-dir-face + :v-adjust all-the-icons-dired-v-adjust) + (all-the-icons-icon-for-file file :v-adjust all-the-icons-dired-v-adjust)))) + (if (member file '("." "..")) + (all-the-icons-dired--add-overlay (point) " \t") + (all-the-icons-dired--add-overlay (point) (concat icon "\t"))))))) + (forward-line 1)))) + +(defun all-the-icons-dired--refresh-advice (fn &rest args) + "Advice function for FN with ARGS." + (apply fn args) + (when all-the-icons-dired-mode + (all-the-icons-dired--refresh))) + +(defun all-the-icons-dired--setup () + "Setup `all-the-icons-dired'." + (when (derived-mode-p 'dired-mode) + (setq-local tab-width 1) + (advice-add 'dired-readin :around #'all-the-icons-dired--refresh-advice) + (advice-add 'dired-revert :around #'all-the-icons-dired--refresh-advice) + (advice-add 'dired-internal-do-deletions :around #'all-the-icons-dired--refresh-advice) + (advice-add 'dired-insert-subdir :around #'all-the-icons-dired--refresh-advice) + (advice-add 'dired-do-kill-lines :around #'all-the-icons-dired--refresh-advice) + (with-eval-after-load 'dired-narrow + (advice-add 'dired-narrow--internal :around #'all-the-icons-dired--refresh-advice)) + (all-the-icons-dired--refresh))) + +(defun all-the-icons-dired--teardown () + "Functions used as advice when redisplaying buffer." + (advice-remove 'dired-readin #'all-the-icons-dired--refresh-advice) + (advice-remove 'dired-revert #'all-the-icons-dired--refresh-advice) + (advice-remove 'dired-internal-do-deletions #'all-the-icons-dired--refresh-advice) + (advice-remove 'dired-narrow--internal #'all-the-icons-dired--refresh-advice) + (advice-remove 'dired-insert-subdir #'all-the-icons-dired--refresh-advice) + (advice-remove 'dired-do-kill-lines #'all-the-icons-dired--refresh-advice) + (all-the-icons-dired--remove-all-overlays)) + +;;;###autoload +(define-minor-mode all-the-icons-dired-mode + "Display all-the-icons icon for each files in a dired buffer." + :lighter " all-the-icons-dired-mode" + (when (and (derived-mode-p 'dired-mode) (display-graphic-p)) + (if all-the-icons-dired-mode + (all-the-icons-dired--setup) + (all-the-icons-dired--teardown)))) +#+end_src +Hook with ~dired-mode~ +#+begin_src emacs-lisp +(add-hook 'dired-mode-hook 'all-the-icons-dired-mode) +#+end_src * Terminals ** Vterm #+begin_src emacs-lisp @@ -334,76 +441,332 @@ Fonts and basic appearance settings (global-set-key (kbd "") 'keyboard-escape-quit) #+end_src -* TODO Functions +* Functions +#+begin_src emacs-lisp +(defun apollo/html-boostrap-boilerplate () + "Insert html boilerplate with boostrap link." + (interactive) + (insert +" + + + + + + My Title + + + + +
+

Starting point

+
+ + +" )) + + +(defun apollo/center-buffer () + "Centers/Uncenters selected buffer" + (interactive) + (if visual-fill-column-center-text + (setq visual-fill-column-center-text nil) + (setq visual-fill-column-center-text t)) + (visual-fill-column-mode 1) + (message "General's task completed!")) + + +(defun apollo/rofi-switch-window () + "Navigate X11 buffers using rofi." + (interactive) + (start-process-shell-command + "rofi" nil "rofi -show window")) + +(defun apollo/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 rofi () + "Run Rofi." + (interactive) + (apollo/run-in-background "rofi -show drun")) + +(defun apollo/volume-increase () + "Increase Volume." + (interactive) + (start-process-shell-command + "amixer" nil "amixer sset Master 5%+")) + +(defun apollo/volume-decrease () + "Decrease Volume." + (interactive) + (start-process-shell-command + "amixer" nil "amixer sset Master 5%-")) + +(defun apollo/restore-wallpaper () + "Set NAME as wallpaper." + (interactive) + (start-process-shell-command + "feh" nil "feh --bg-scale ~/dotfiles/wallpaper.png")) + +(defun apollo/emacs-keys () + "Swap caps with ctrl." + (interactive) + (start-process-shell-command + "setxkbmap" nil "setxkbmap us -option ctrl:swapcaps")) + +(defun apollo/greek-keyboard () + "Swap caps with ctrl." + (interactive) + (start-process-shell-command + "setxkbmap" nil "setxkbmap gr")) + +(defun apollo/exwm-init-hook () + "Do this upon start." + (display-battery-mode 0) ;;Change to 1 to display battery + + (setq display-time-day-and-date t) + (display-time-mode 1) + + ;;Launch apps that will run in the background +;; (apollo/run-in-background "blueman-applet") + (apollo/run-in-background "picom") +;; (apollo/run-in-background "nm-applet") + (apollo/emacs-keys) + (apollo/set-wallpaper) + (start-polybar) + ) + +(defun apollo/exwm-update-class () + (exwm-workspace-rename-buffer exwm-class-name)) + +(defun eshell-new() + "Open a new instance of eshell." + (interactive) + (eshell 'N)) + +(defun make-mini-buffer () + (interactive) + (split-window-below 40) + (other-window 1)) + +(defun make-mini-geiser () + (interactive) + (split-window-below 60) + (geiser nil)) + +(defun start-polybar () + "Check which system is running, start polybar accordingly." + (interactive) + (if (string= (system-name) "fsociety") + (start-process-shell-command + "polybar" nil "polybar main & polybar second") + (start-process-shell-command + "polybar" nil "polybar main"))) +#+end_src * mu4e | Email Configuration -** MacOS -If it's a mac, load from homebrew path + +# ** MacOS +# If it's a mac, load from homebrew path + +# #+begin_src emacs-lisp +# (when (equal system-type 'darwin) +# (use-package mu4e +# :load-path "/opt/homebrew/share/emacs/site-lisp/mu/mu4e/")) +# #+end_src + #+begin_src emacs-lisp (when (equal system-type 'darwin) (use-package mu4e :load-path "/opt/homebrew/share/emacs/site-lisp/mu/mu4e/")) -#+end_src -** Settings & Context setup -#+begin_src emacs-lisp - (setq mu4e-update-interval (* 10 60)) - (setq mu4e-get-mail-command "mbsync -a") - (setq mu4e-maildir-list "~/Mail/Inbox") - - (defun set-mu4e-context (context-name full-name mail-address signature server) - "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")) - (smtpmail-smtp-service . ,465) - (smtpmail-smtp-server . ,server) - (mu4e-compose-signature . ,signature))))) - - ;;Fixing duplicate UID errors when using mbsync and mu4e - (setq mu4e-change-filenames-when-moving t) - ;; Messaging - (setq message-send-mail-function 'smtpmail-send-it - smtpmail-stream-type 'ssl) -#+end_src -** Shortcuts -#+begin_src emacs-lisp + +(require 'mu4e) + +(setq mu4e-update-interval (* 10 60)) +(setq mu4e-get-mail-command "mbsync -a") +(setq mu4e-maildir-list "~/Mail/Inbox") + +(defun set-mu4e-context (context-name full-name mail-address signature server) + "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")) + (smtpmail-smtp-service . ,465) + (smtpmail-smtp-server . ,server) + (mu4e-compose-signature . ,signature))))) +;;Fixing duplicate UID errors when using mbsync and mu4e +(setq mu4e-change-filenames-when-moving t) + (setq mu4e-maildir-shortcuts '(("/Fastmail/Inbox" . ?i) ("/Fastmail/Sent" . ?s) + ;; ("/Gmail/Trash" . ?t) + ;; ("/Gmail/Drafts" . ?d) + ;; ("/Gmail/[Gmail]/All Mail" . ?a )) -#+end_src -** Contexts -#+begin_src emacs-lisp + (setq mu4e-contexts `(, (set-mu4e-context "Fastmail" "Thanos Apollo" "thanos@thanosapollo.com" "Thanos\nhttps://thanosapollo.com/public" "smtp.fastmail.com"))) + +;; (setq smtpmail-smtp-service 465 +;; smtpmail-stream-type 'ssl +;; smtpmail-smtp-server "smtp.fastmail.com") + + + +(setq message-send-mail-function 'smtpmail-send-it + smtpmail-stream-type 'ssl) + +#+end_src + +# ** Settings & Context setup +# #+begin_src emacs-lisp +# (require 'mu4e) +# (setq mu4e-update-interval (* 10 60)) +# (setq mu4e-get-mail-command "mbsync -a") +# (setq mu4e-maildir-list "~/Mail/Inbox") + +# (defun set-mu4e-context (context-name full-name mail-address signature server) +# "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")) +# (smtpmail-smtp-service . ,465) +# (smtpmail-smtp-server . ,server) +# (mu4e-compose-signature . ,signature))))) + +# ;;Fixing duplicate UID errors when using mbsync and mu4e +# (setq mu4e-change-filenames-when-moving t) +# ;; Messaging +# (setq message-send-mail-function 'smtpmail-send-it +# smtpmail-stream-type 'ssl) +# #+end_src +# ** Shortcuts +# #+begin_src emacs-lisp +# (setq mu4e-maildir-shortcuts +# '(("/Fastmail/Inbox" . ?i) +# ("/Fastmail/Sent" . ?s) +# )) +# #+end_src +# ** Contexts +# #+begin_src emacs-lisp +# (setq mu4e-contexts +# `(, (set-mu4e-context +# "Fastmail" "Thanos Apollo" +# "thanos@thanosapollo.com" "Thanos\nhttps://thanosapollo.com/public" +# "smtp.fastmail.com"))) +# #+end_src +* Custom key-bindings +** General +#+begin_src emacs-lisp + + ;; my general's leader key! + (defconst general-key "C-c g") + + (general-create-definer general-does + :prefix general-key) + + ;; Basic functions + (general-define-key + "C-d" 'kill-region + "C-k" 'copy-region-as-kill + "C-c v" 'multi-vterm-next + "C-x 9" 'make-mini-buffer + "C-c l e" 'apollo/emacs-keys + ;;Change keyboard layouts/language + "C-c l g" 'apollo/greek-keyboard + "C-κ" 'apollo/emacs-keys + "C-x C-b" 'ibuffer) + + + + ;; My Generals does: + (general-does + "t" 'counsel-load-theme + "l" 'display-line-numbers-mode + "v" 'multi-vterm-next + "e" 'eshell + "i" 'circe + "c" 'apollo/center-buffer + "m" 'mu4e + "f" 'elfeed + "C-t" 'telega) + + ;;pdf-tools + (general-define-key + :keymaps 'pdf-view-mode-map + "C-c d" 'pdf-view-midnight-minor-mode + "C-s" 'isearch-forward + "C-o" 'pdf-isearch-occur) + + ;;vterm + (general-does + :keymaps 'vterm-mode-map + "n" 'multi-vterm-next + "o" 'multi-vterm + "p" 'multi-vterm-prev) + + (general-does + :keymaps 'eshell-mode-map + "n" 'eshell-new) + + (general-does + :keymaps 'org-mode-map + "3" 'org-insert-image-size-300) +#+end_src +** Hydra +#+begin_src emacs-lisp +(defhydra hydra-zoom (global-map "s-z") + "zoom" + ("=" text-scale-increase "in") + ("-" text-scale-decrease "out")) #+end_src -* TODO Custom key-bindings * Org-mode Configuration ** org-make-toc #+begin_src emacs-lisp - (use-package org-make-toc - :ensure t) + (add-hook 'org-mode-hook 'org-make-toc-mode) #+end_src ** Themes *** Dracula @@ -484,25 +847,25 @@ If it's a mac, load from homebrew path org-superstar-headline-bullets-list '("◉" "●" "○" "●" "○" "●" "◆") org-superstar-itembullet-alist '((?+ . ?➤) (?- . ?✦))) ;; changes +/- symbols in item lists) - ;; Startup - (defun apollo/org-mode-setup () - (apollo/org-theme-dracula)) ;; Hooks - (add-hook 'org-mode-hook 'apollo/org-mode-setup) + (add-hook 'org-mode-hook 'apollo/org-theme-dracula) (add-hook 'org-mode-hook 'org-superstar-mode) (add-hook 'org-mode-hook 'flyspell-mode) #+end_src ** Babel #+begin_src emacs-lisp -(org-babel-do-load-languages - 'org-babel-load-languages - '((emacs-lisp . t) - (python . t))) - -(add-to-list 'org-structure-template-alist '("sh" . "src shell")) -(add-to-list 'org-structure-template-alist '("b" . "src shell")) -(add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) -(add-to-list 'org-structure-template-alist '("py" . "src python")) + (org-babel-do-load-languages + 'org-babel-load-languages + '((emacs-lisp . t) + (python . t))) + + (add-to-list 'org-structure-template-alist '("sh" . "src shell")) + (add-to-list 'org-structure-template-alist '("b" . "src shell")) + (add-to-list 'org-structure-template-alist '("el" . "src emacs-lisp")) + (add-to-list 'org-structure-template-alist '("py" . "src python")) + + ;;Auto tangle + (add-hook 'org-mode-hook 'org-auto-tangle-mode) #+end_src * Markdown ** Theme @@ -618,14 +981,38 @@ If it's a mac, load from homebrew path (delete-char sgml-basic-offset))))) #+end_src * Elfeed - +** Feeds +#+begin_src emacs-lisp +(require 'elfeed) +(require 'elfeed-goodies) + +(setq elfeed-feeds (quote + ( + ("https://hackaday.com/blog/feed/" hackaday linux) + ("https://opensource.com/feed" opensource linux) + ("https://linux.softpedia.com/backend.xml" softpedia linux) + ("https://www.thelancet.com/rssfeed/lancet_current.xml" Lancet lancet) + ("https://www.thelancet.com/rssfeed/lancet_online.xml" LancetOnline lancet) + ("https://www.thelancet.com/rssfeed/lanmic_online.xml" LancetOnline Microbiology) + ("https://www.techrepublic.com/rssfeeds/topic/open-source/" techrepublic linux) + ("https://www.thanosapollo.com/public/feed.xml" Thanos) + ("https://protesilaos.com/news.xml" Protesilaos News) + ("https://protesilaos.com/codelog.xml" Proetesilaos Coding) + ("https://stallman.org/rss/rss.xml" Stallman news) + ))) +#+end_src +** Settings +#+begin_src emacs-lisp +(setq elfeed-goodies/entry-pane-size 0.5) +#+end_src * PDF #+begin_src emacs-lisp -(use-package pdf-tools - :ensure t - :mode ".pdf" - :config - (add-hook 'pdf-view-mode #'pdf-isearch-minor-mode)) + +;;Add pdf-isearch-minor-mode hook, otherwise isearch will be buggy +;;Darkmode hook, cause I don't want color or light in my life, I'm a vampire. +(add-hook 'pdf-view-mode-hook 'pdf-isearch-minor-mode) +(add-hook 'pdf-view-mode-hook 'pdf-view-midnight-minor-mode) +(add-to-list 'auto-mode-alist '("\\.pdf\\'" . pdf-view-mode)) #+end_src * Telega In ~GuixSD~ systems I have telegram installed via guix, and it's loaded via ~guix-emacs-autoload-packages~ @@ -911,10 +1298,11 @@ you have the correctly set the OPENAI_API_KEY variable" (start-process-shell-command "polybar" nil "polybar main"))) #+end_src -* TODO EXWM -TODO: tangle with .exwm.el & organize +* EXWM +EXWM configuration is tangled with ~.exwm~ ++ In GuixSD ~emacs-exwm~ package will look for ~~/.exwm~ -#+begin_src emacs-lisp +#+begin_src emacs-lisp :tangle ../.exwm.el (defun apollo/exwm-init-hook () "Do this upon start." (if (string= (system-name) "fsociety") ;; Check if it's my desktop, otherwise display battery @@ -1053,10 +1441,5 @@ TODO: tangle with .exwm.el & organize (exwm-enable) - -;;Transparency -(set-frame-parameter (selected-frame) 'alpha '(90 90)) -(add-to-list 'default-frame-alist '(alpha 90 90)) - #+end_src -- cgit v1.2.3