From 07fa1a67d1988a9a1d9044898216f57153f91668 Mon Sep 17 00:00:00 2001 From: Magdalena Szweda Date: Sun, 4 Oct 2026 17:59:47 +0200 Subject: Emacs, XMonad & EMMS changes. CHANGELOG: * Emacs - Fix various indenting issues in config.org - Make mthml-mode take over all .html files (faster), while keeping web-mode for css, php, etc. ** EMMS - Add a new module that integrates xmms2 into EMMS - Change mappings for EMMS for easier usage with playlist files (.pls, .m3u) - Remove unnecessary MPD functions for EMMS * XMonad - Remove the mpd spawnOnce in favour of xmms2-launcher, xmms2-mpris, & mprisence * fish - Add .cargo/bin/ to $PATH --- doom/.config/doom/config.el | 150 +++--- doom/.config/doom/config.org | 1229 +++++++++++++++++++++++------------------- 2 files changed, 755 insertions(+), 624 deletions(-) (limited to 'doom') diff --git a/doom/.config/doom/config.el b/doom/.config/doom/config.el index 213b60f..2f08da8 100644 --- a/doom/.config/doom/config.el +++ b/doom/.config/doom/config.el @@ -16,7 +16,8 @@ (add-to-list 'custom-theme-load-path "~/.config/doom/extra-themes/") ;; (setq doom-theme 'modus-vivendi) -(setq doom-theme 'doric-oak) +;; (setq doom-theme 'doric-oak) +(setq doom-theme 'doric-obsidian) ;; (setq doom-theme 'tango) (setq custom-safe-themes t) @@ -73,6 +74,20 @@ (lambda () (local-set-key (kbd "") #'my/hs-eval))) +(add-to-list 'major-mode-remap-alist '(html-mode . mhtml-ts-mode)) +(add-to-list 'major-mode-remap-alist '(mhtml-mode . mhtml-ts-mode)) + +(add-to-list 'auto-mode-alist '("\\.html?\\'" . mhtml-ts-mode)) +(add-to-list 'major-mode-remap-alist '(html-mode . mhtml-ts-mode)) +(add-to-list 'major-mode-remap-alist '(mhtml-mode . mhtml-ts-mode)) + +(advice-add 'web-mode :around + (lambda (orig &rest args) + (if (or (null buffer-file-name) + (string-match-p "\\.html?\\'" buffer-file-name)) + (mhtml-ts-mode) + (apply orig args)))) + (use-package! eglot :hook (prog-mode . eglot-ensure)) @@ -82,12 +97,12 @@ :config (eglot-booster-mode)) (after! eglot - (cl-defmethod eglot-register-capability - ((_server eglot-lsp-server) - (method (eql workspace/didChangeWatchedFiles)) - _id - &key _watchers) - nil) + (cl-defmethod eglot-register-capability + ((_server eglot-lsp-server) + (method (eql workspace/didChangeWatchedFiles)) + _id + &key _watchers) + nil) (add-to-list 'eglot-server-programs '((typescript-ts-mode javascript-mode) @@ -105,13 +120,13 @@ line-start (file-name) ":" line ":" column ": " (message) line-end)) - :modes (web-mode)) + :modes (mhtml-ts-mode)) (add-to-list 'flycheck-checkers 'htmlhint) (flycheck-add-next-checker - 'javascript-eslint - 'javascript-oxlint) + 'javascript-eslint + 'javascript-oxlint) (flycheck-add-next-checker 'html-tidy 'htmlhint) @@ -120,14 +135,17 @@ '(save mode-enabled))) (use-package! apheleia - :hook (prog-mode . apheleia-mode) + :hook + (prog-mode . apheleia-mode) :config (setf (alist-get 'oxfmt apheleia-formatters) '("oxfmt" "--config=.oxfmtrc.json" "--stdin-filepath" filepath)) -(dolist (mode '(html-mode mhtml-mode web-mode css-mode)) - (setf (alist-get mode apheleia-mode-alist) 'oxfmt))) +(dolist (mode '(mhtml-ts-mode html-mode mhtml-mode web-mode css-mode)) + (setf (alist-get mode apheleia-mode-alist) 'oxfmt))) + +(add-hook 'mhtml-ts-mode-hook #'apheleia-mode) (use-package! pinentry :config @@ -164,7 +182,7 @@ ) (setq gnus-message-archive-method '(nnimap "migadu") ; use migadu for archiving email - gnus-message-archive-group "Sent") ; where to put sent mail + gnus-message-archive-group "Sent") ; where to put sent mail (setq gnus-large-newsgroup nil gnus-fetch-old-headers t @@ -212,39 +230,16 @@ :desc "New chat" "n" #'jabber-chat-with :desc "Set status" "s" #'jabber-send-presence) -(defun emms--wait-for-mpd-update (callback) - "Poll MPD status until updating_db clears, then call CALLBACK." - (emms-player-mpd-get-status - callback - (lambda (callback info) - (if (assoc "updating_db" info) - (run-with-timer 0.5 nil #'emms--wait-for-mpd-update callback) - (funcall callback))))) - -(defun emms-full-resync () - "Update MPD's db, then pull it into EMMS's cache, then rebuild the browser." - (interactive) - (message "emms: starting mpd db update...") - (emms-player-mpd-update-all) - (emms--wait-for-mpd-update - (lambda () - (emms-cache-set-from-mpd-all) - (dolist (buf (buffer-list)) - (with-current-buffer buf - (when (derived-mode-p 'emms-browser-mode) - (revert-buffer)))) - (emms-browser) - (message "emms: resync done")))) - +(add-to-list 'load-path "/home/hi/.config/doom/") (use-package! emms - :commands (emms emms-browser emms-player-mpd-update-all emms-cache-set-from-mpd-all emms emms-pause emms-next emms-previous emms-stop - emms-random emms-add-directory-tree emms-play-playlist) +:commands (emms emms-browser emms-player-mpd-update-all emms-cache-set-from-mpd-all emms emms-pause emms-next emms-previous emms-stop + emms-random emms-add-directory-tree emms-play-playlist) :init (map! :leader (:prefix ("e" . "emms") - :desc "Browser" "b" #'emms-full-resync - :desc "Playlist" "m" #'emms-playlist-mode-go + :desc "Browser" "b" #'emms-browser + :desc "Emms" "e" #'emms :desc "Play/pause" "SPC" #'emms-pause :desc "Next" "n" #'emms-next :desc "Previous" "p" #'emms-previous @@ -257,12 +252,13 @@ (emms-all) -(require 'emms-player-mpd) -(setq emms-player-list '(emms-player-mpd) - emms-info-functions '(emms-info-mpd) +(require 'emms-player-xmms2) +(setq + emms-player-list '(emms-player-xmms2) -emms-player-mpd-server-name "localhost" -emms-player-mpd-server-port "6600" +emms-lyrics-scroll-p nil +emms-lyrics-display-on-minibuffer t +emms-lyrics-display-on-modeline nil emms-player-mpd-music-directory "~/Music" emms-source-file-default-directory (expand-file-name "~/Music/playlists/") @@ -271,14 +267,8 @@ emms-repeat-playlist t emms-cache-file (concat doom-cache-dir "emms-cache")) -(add-hook 'emms-playlist-cleared-hook #'emms-player-mpd-clear) - -(emms-player-mpd-connect) - (emms-mode-line-mode 1) -(emms-lyrics-toggle-display-on-minibuffer) - (emms-playing-time-mode 1) (map! :map emms-browser-mode-map @@ -346,11 +336,11 @@ emms-cache-file (concat doom-cache-dir "emms-cache")) (advice-add 'vc-jj-push :before #'my/vc-jj--advance-before-push) (setq my/vc-jj-advance-to "@-") -(defun my/vc-jj-checkin (files comment &optional _rev) - "Describe @ and start a fresh change." - (let ((default-directory (vc-jj-root (car files)))) - (vc-jj-modify-change-comment nil "@" comment) - (vc-jj--command-dispatched nil 0 nil "new" "--quiet"))) + (defun my/vc-jj-checkin (files comment &optional _rev) + "Describe @ and start a fresh change." + (let ((default-directory (vc-jj-root (car files)))) + (vc-jj-modify-change-comment nil "@" comment) + (vc-jj--command-dispatched nil 0 nil "new" "--quiet"))) (advice-add 'vc-jj-checkin :override #'my/vc-jj-checkin)) (after! vc-jj @@ -381,7 +371,7 @@ emms-cache-file (concat doom-cache-dir "emms-cache")) (advice-add 'vc-jj-push :around #'my/vc-jj--push-no-window) (advice-add 'vc-jj-push :after #'my/vc-jj--report-push) - (define-advice ansi-color-filter-region (:around (fn &rest args) my/vc-jj-writable) + (define-advice ansi-color-filter-region (:around (fn &rest args) my/vc-jj-writable) (let ((inhibit-read-only (or inhibit-read-only (string-prefix-p "*vc-jj" (buffer-name))))) (apply fn args)))) @@ -405,11 +395,11 @@ emms-cache-file (concat doom-cache-dir "emms-cache")) org-confirm-babel-evaluate nil) (org-babel-do-load-languages -'org-babel-load-languages -'((emacs-lisp . t) - (python . t) - (C . t) - (lisp . t)))) + 'org-babel-load-languages + '((emacs-lisp . t) + (python . t) + (C . t) + (lisp . t)))) (use-package! poly-org :hook (org-mode . poly-org-mode)) @@ -439,9 +429,9 @@ org-confirm-babel-evaluate nil) :if-new (file+head - (lambda () (concat (my/org-roam-short-id) ".org")) - "#+TITLE: %^{title|Untitled}\n#+FILETAGS: :%^{tags}:\n\n") ; title&tags -:unnarrowed t))) + (lambda () (concat (my/org-roam-short-id) ".org")) + "#+TITLE: %^{title|Untitled}\n#+FILETAGS: :%^{tags}:\n\n") ; title&tags + :unnarrowed t))) (cl-defmethod org-roam-node-file-stem ((node org-roam-node)) (file-name-base (org-roam-node-file node))) @@ -520,7 +510,7 @@ org-html-postamble nil)) (use-package! org-modern-indent :defer t -:hook (org-mode . org-modern-indent-mode)) + :hook (org-mode . org-modern-indent-mode)) (setq eww-search-prefix "https://ecosia.org/search?q=") @@ -657,12 +647,12 @@ org-html-postamble nil)) "o" 'evil-forward-char) (evil-define-key '(normal visual operator) 'global - "l" 'evil-backward-word-begin - "L" 'evil-backward-WORD-begin - "u" 'evil-forward-word-end - "U" 'evil-forward-WORD-end - "y" 'evil-forward-word-begin - "Y" 'evil-forward-WORD-begin) + "l" 'evil-backward-word-begin + "L" 'evil-backward-WORD-begin + "u" 'evil-forward-word-end + "U" 'evil-forward-WORD-end + "y" 'evil-forward-word-begin + "Y" 'evil-forward-WORD-begin) (with-eval-after-load 'evil-ex (define-key evil-ex-completion-map (kbd "C-l") 'left-word) @@ -681,12 +671,12 @@ org-html-postamble nil)) "W" 'evil-change-line) (evil-define-key 'normal 'global - "x" 'evil-delete-char - "c" 'evil-yank - "v" 'evil-paste-after - "X" 'evil-delete-line - "C" 'evil-yank-line - "V" 'evil-paste-before) + "x" 'evil-delete-char + "c" 'evil-yank + "v" 'evil-paste-after + "X" 'evil-delete-line + "C" 'evil-yank-line + "V" 'evil-paste-before) (evil-define-key 'visual 'global "x" 'evil-delete diff --git a/doom/.config/doom/config.org b/doom/.config/doom/config.org index 1b98c5d..f633aac 100644 --- a/doom/.config/doom/config.org +++ b/doom/.config/doom/config.org @@ -41,48 +41,49 @@ The reason i use modus-vivendi instead of my evergarden port is because i dont l For this to work, we need modus & ef themes installed. Doric themes are also nice. #+begin_src emacs-lisp :tangle ~/.config/doom/packages.el - (package! modus-themes) - (package! ef-themes) - (package! doric-themes) +(package! modus-themes) +(package! ef-themes) +(package! doric-themes) #+end_src #+begin_src emacs-lisp (add-to-list 'custom-theme-load-path "~/.config/doom/extra-themes/") ;; (setq doom-theme 'modus-vivendi) -(setq doom-theme 'doric-oak) +;; (setq doom-theme 'doric-oak) +(setq doom-theme 'doric-obsidian) ;; (setq doom-theme 'tango) #+end_src By default, Emacs prompts 2 times when loading a theme, this is annoying so im getting rid of it. #+begin_src emacs-lisp - (setq custom-safe-themes t) +(setq custom-safe-themes t) #+end_src ** Font I use the completely not pirated ~Berkeley Mono~ font. I really like it. Sometimes i will use the Commit mono or Cozette! (sometimes!) #+begin_src emacs-lisp - (setq doom-font (font-spec :family "Berkeley Mono" :size 13.0)) +(setq doom-font (font-spec :family "Berkeley Mono" :size 13.0)) #+end_src Line numbers! And not relative! I dont like rln, i just dont #+begin_src emacs-lisp - (setq display-line-numbers-type t) +(setq display-line-numbers-type t) #+end_src ** Modeline mood-line is a nice & simple modeline for emacs! #+begin_src emacs-lisp :tangle ~/.config/doom/packages.el - ;; (package! mood-line) +;; (package! mood-line) #+end_src #+begin_src emacs-lisp - ;; (use-package! mood-line - ;; :config - ;; (mood-line-mode) - ;; :custom - ;; (mood-line-glyph-alist mood-line-glyphs-fira-code)) +;; (use-package! mood-line +;; :config +;; (mood-line-mode) +;; :custom +;; (mood-line-glyph-alist mood-line-glyphs-fira-code)) #+end_src The above is commented if the below is in action. I might try out the default Emacs modeline for a bit sometime, or maybe spacemacs' ~spaceline~ @@ -91,38 +92,38 @@ I might try out the default Emacs modeline for a bit sometime, or maybe spacemac The default Emacs modeline, by default, spills out EVERY minor & major mode into the modeline. That's kind of yucky, so the ~minions~ package fixes it by hiding most of them & having a menu for which to show. #+begin_src emacs-lisp :tangle ~/.config/doom/packages.el - (package! minions) +(package! minions) #+end_src Now, let's configure it! #+begin_src emacs-lisp - (use-package! minions - :config - (minions-mode 1)) +(use-package! minions + :config + (minions-mode 1)) #+end_src ...Yea that's 'bout it. ** Custom window management I didnt like how in emacs, split windows under ~SPC w s~ just stack, so i made this function to make it dynamic in a fibonnaci-like layout. #+begin_src emacs-lisp - (defun my/split-window-dynamically () - "Split the selected window, choosing orientation by its shape." - (interactive) - (select-window - (if (> (window-total-width) (* 2 (window-total-height))) - (split-window-right) - (split-window-below)))) +(defun my/split-window-dynamically () + "Split the selected window, choosing orientation by its shape." + (interactive) + (select-window + (if (> (window-total-width) (* 2 (window-total-height))) + (split-window-right) + (split-window-below)))) #+end_src Map the function to override ~SPC w s~ #+begin_src emacs-lisp - (map! :leader "w s" #'my/split-window-dynamically) +(map! :leader "w s" #'my/split-window-dynamically) #+end_src ** UX ~ UI Scroll margin - when the cursor reaches 3 lines above/below the window bottom/top, the window goes down (this happens in helix automatically, but the margin is 5) #+begin_src emacs-lisp - (setq scroll-margin 3) +(setq scroll-margin 3) #+end_src ** Breadcrumb @@ -131,16 +132,16 @@ Breadcrumb is a package that shows you where you are in a file at the very top o this is because we are in the UI section of the file. #+begin_src emacs-lisp :tangle ~/.config/doom/packages.el - (package! breadcrumb) +(package! breadcrumb) #+end_src #+begin_src emacs-lisp - (use-package! breadcrumb - :defer t - :hook - (prog-mode . breadcrumb-mode) ;; make sure its in programming modes - :config - (breadcrumb-mode 1)) +(use-package! breadcrumb + :defer t + :hook + (prog-mode . breadcrumb-mode) ;; make sure its in programming modes + :config + (breadcrumb-mode 1)) #+end_src ** Zen @@ -149,7 +150,7 @@ the ~zen~ option in Doom Emacs enables ~writeroom~ mode on toggle. By default, entering ~writeroom~ mode changes the typeface in the buffer. I don't like that, especially when im editing source blocks (e.g here). Let's turn it off. #+begin_src emacs-lisp - (setq +zen-mixed-pitch-modes '()) +(setq +zen-mixed-pitch-modes '()) #+end_src ** vertico-carousel ~vertico~ is the equivalent of nvim's ~telescope~ in Emacs. @@ -158,55 +159,85 @@ I don't like that, especially when im editing source blocks (e.g here). Let's tu the currently selected candidate on the first line of the candidate list, then displays the following candidates below it, cycling from the end back to the beginning. - -- vertico-carousel README +-- vertico-carousel README #+end_quote #+begin_src emacs-lisp :tangle ~/.config/doom/packages.el - (package! vertico-carousel - :recipe (:host github :repo "kn66/vertico-carousel")) +(package! vertico-carousel + :recipe (:host github :repo "kn66/vertico-carousel")) #+end_src #+begin_src emacs-lisp - (use-package! vertico-carousel - :config - (vertico-carousel-mode 1)) +(use-package! vertico-carousel + :config + (vertico-carousel-mode 1)) #+end_src -* Languages & LSP +* LSP ~M-x vscode~ ** Haskell A custom function that runs the current Haskell file with runghc (interpreter instead of a compiler). #+begin_src emacs-lisp - (defun my/hs-eval () - (interactive) - (let* ((src (buffer-file-name)) - (out (file-name-sans-extension src))) - (when (zerop (call-process-shell-command - (format "runghc %s" src) nil "*runghc-output*")) - (let ((buf (make-comint "hs-run" out))) - (display-buffer buf))))) +(defun my/hs-eval () + (interactive) + (let* ((src (buffer-file-name)) + (out (file-name-sans-extension src))) + (when (zerop (call-process-shell-command + (format "runghc %s" src) nil "*runghc-output*")) + (let ((buf (make-comint "hs-run" out))) + (display-buffer buf))))) #+end_src Hook the function up up to f5 #+begin_src emacs-lisp - (add-hook 'haskell-mode-hook - (lambda () - (local-set-key (kbd "") #'my/hs-eval))) +(add-hook 'haskell-mode-hook + (lambda () + (local-set-key (kbd "") #'my/hs-eval))) +#+end_src + +** HTML +HTML is a big part of my programming life. +There are, however, alot of modes for HTML (html-mode, web-mode, mhtml-mode). +These are all good, but the BEST one by far is ~mhtml-ts-mode~, it outcompetes almost all of the above. +#+begin_src emacs-lisp + (add-to-list 'major-mode-remap-alist '(html-mode . mhtml-ts-mode)) + (add-to-list 'major-mode-remap-alist '(mhtml-mode . mhtml-ts-mode)) #+end_src +web-mode rescans the whole altered block on every edit, which gets slow on HTML with big inline ~