X-Git-Url: https://git.shemshak.org/~bandali/configs/blobdiff_plain/cce35acae705899028777fe3e3e0cafe89c13451..d141ce1178b5a4728e31ca382e4323552d650df7:/.emacs.d/init.el diff --git a/.emacs.d/init.el b/.emacs.d/init.el index deb88ba..e499e4b 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -181,8 +181,6 @@ (setq use-package-always-defer t) (require 'bind-key) -(use-package delight) - ;;; Initial setup @@ -395,16 +393,20 @@ For disabling the behaviour for certain buffers and/or modes." (global-auto-revert-non-file-buffers nil)) ;; time and battery in mode-line -(comment - (use-feature time - :init - (setq display-time-default-load-average nil) - :config - (display-time-mode)) +(use-feature time + :demand + :config + (display-time-mode) + :custom + (display-time-default-load-average nil) + (display-time-format "%a %b %-e, %-l:%M%P")) - (use-feature battery - :config - (display-battery-mode))) +(use-feature battery + :demand + :config + (display-battery-mode) + :custom + (battery-mode-line-format " %p%% %t")) (use-feature fringe :demand @@ -559,35 +561,76 @@ For disabling the behaviour for certain buffers and/or modes." ;;; Essential packages (use-package exwm - :disabled :demand :config (require 'exwm-config) - ;; Set the initial workspace number. - (setq exwm-workspace-number 4) + (setq + exwm-workspace-number 4 + exwm-workspace-index-map (lambda (i) (number-to-string (1+ i)))) - ;; Make class name the buffer name, truncating beyond 50 characters + ;; Make class name the buffer name, truncating beyond 60 characters (defun exwm-rename-buffer () (interactive) (exwm-workspace-rename-buffer (concat exwm-class-name ":" - (if (<= (length exwm-title) 50) exwm-title - (concat (substring exwm-title 0 49) "..."))))) + (if (<= (length exwm-title) 60) exwm-title + (concat (substring exwm-title 0 59) "..."))))) (add-hook 'exwm-update-class-hook 'exwm-rename-buffer) (add-hook 'exwm-update-title-hook 'exwm-rename-buffer) + (defun b/exwm-ws-prev-index () + "Return the index for the previous EXWM workspace, wrapping +around if needed." + (if (= exwm-workspace-current-index 0) + (1- exwm-workspace-number) + (1- exwm-workspace-current-index))) + + (defun b/exwm-ws-next-index () + "Return the index for the next EXWM workspace, wrapping +around if needed." + (if (= exwm-workspace-current-index + (1- exwm-workspace-number)) + 0 + (1+ exwm-workspace-current-index))) + ;; 's-R': Reset (exwm-input-set-key (kbd "s-R") #'exwm-reset) ;; 's-\': Switch workspace (exwm-input-set-key (kbd "s-\\") #'exwm-workspace-switch) ;; 's-N': Switch to certain workspace - (dotimes (i 10) + (dotimes (i exwm-workspace-number) (exwm-input-set-key (kbd (format "s-%d" i)) (lambda () (interactive) - (exwm-workspace-switch-create i)))) + (exwm-workspace-switch-create (1- i))))) + ;; 's-[': Switch to previous workspace + (defun b/exwm-ws-prev () + "Switch to previous EXWM workspace, wrapping around if needed." + (interactive) + (exwm-workspace-switch-create (b/exwm-ws-prev-index))) + (exwm-input-set-key (kbd "s-[") #'b/exwm-ws-prev) + ;; 's-]': Switch to next workspace + (defun b/exwm-ws-next () + "Switch to next EXWM workspace, wrapping around if needed." + (interactive) + (exwm-workspace-switch-create (b/exwm-ws-next-index))) + (exwm-input-set-key (kbd "s-]") #'b/exwm-ws-next) + ;; 's-{': Move window to previous workspace + (defun b/exwm-move-window-to-prev-ws () + "Move window to previous EXWM workspace, wrapping around if +needed." + (interactive) + (exwm-workspace-move-window (b/exwm-ws-prev-index))) + (exwm-input-set-key (kbd "s-{") #'b/exwm-move-window-to-prev-ws) + ;; 's-}': Move window to next workspace + (defun b/exwm-move-window-to-next-ws () + "Move window to next EXWM workspace, wrapping around if +needed." + (interactive) + (exwm-workspace-move-window (b/exwm-ws-next-index))) + (exwm-input-set-key (kbd "s-}") #'b/exwm-move-window-to-next-ws) ;; 's-SPC': Launch application ;; (exwm-input-set-key ;; (kbd "s-SPC") @@ -597,47 +640,34 @@ For disabling the behaviour for certain buffers and/or modes." (exwm-input-set-key (kbd "M-s-SPC") #'counsel-linux-app) - ;; Shorten 'C-c C-q' to 'C-q' - (define-key exwm-mode-map [?\C-q] #'exwm-input-send-next-key) - - ;; Line-editing shortcuts - (setq exwm-input-simulation-keys - '(;; movement - ([?\C-b] . [left]) - ([?\M-b] . [C-left]) - ([?\C-f] . [right]) - ([?\M-f] . [C-right]) - ([?\C-p] . [up]) - ([?\C-n] . [down]) - ([?\C-a] . [home]) - ([?\C-e] . [end]) - ([?\M-v] . [prior]) - ([?\C-v] . [next]) - ([?\C-d] . [delete]) - ([?\C-k] . [S-end delete]) - ;; cut/copy/paste - ;; ([?\C-w] . [?\C-x]) - ([?\M-w] . [?\C-c]) - ([?\C-y] . [?\C-v]) - ;; search - ([?\C-s] . [?\C-f]))) - - ;; Enable EXWM - (exwm-enable) + (exwm-input-set-key + (kbd "s-") (lambda () + (interactive) + (b/start-process "urxvt"))) - (add-hook 'exwm-init-hook #'exwm-config--fix/ido-buffer-window-other-frame) + (exwm-input-set-key + (kbd "s-t") + (lambda () + (interactive) + (exwm-floating-toggle-floating))) - (require 'exwm-systemtray) - (exwm-systemtray-enable) + (exwm-input-set-key + (kbd "s-f") + (lambda () + (interactive) + (exwm-layout-toggle-fullscreen))) - (require 'exwm-randr) - (exwm-randr-enable) + (exwm-input-set-key + (kbd "s-w") + (lambda () + (interactive) + (kill-buffer (current-buffer)))) - ;; (exwm-input-set-key - ;; (kbd "s-") - ;; (lambda () - ;; (interactive) - ;; (start-process "urxvt" nil "urxvt"))) + (exwm-input-set-key + (kbd "s-q") + (lambda () + (interactive) + (exwm-manage--kill-client))) ;; (exwm-input-set-key ;; (kbd "s-SPC") ;; rofi doesn't properly launch programs when started from emacs @@ -657,76 +687,81 @@ For disabling the behaviour for certain buffers and/or modes." ;; (interactive) ;; (start-process "rofi-pass" nil "rofi-pass"))) - ;; (exwm-input-set-key - ;; (kbd "") - ;; (lambda () - ;; (interactive) - ;; (start-process-shell-command "pamixer" nil "pamixer --toggle-mute"))) - - ;; (exwm-input-set-key - ;; (kbd "") - ;; (lambda () - ;; (interactive) - ;; (start-process-shell-command "pamixer" nil "pamixer --allow-boost --decrease 5"))) - - ;; (exwm-input-set-key - ;; (kbd "") - ;; (lambda () - ;; (interactive) - ;; (start-process-shell-command "pamixer" nil "pamixer --allow-boost --increase 5"))) - - ;; (exwm-input-set-key - ;; (kbd "") - ;; (lambda () - ;; (interactive) - ;; (start-process-shell-command "mpc" nil "mpc toggle"))) - - ;; (exwm-input-set-key - ;; (kbd "") - ;; (lambda () - ;; (interactive) - ;; (start-process-shell-command "mpc" nil "mpc prev"))) - - ;; (exwm-input-set-key - ;; (kbd "") - ;; (lambda () - ;; (interactive) - ;; (start-process-shell-command "mpc" nil "mpv next"))) - - (defun b/exwm-pasystray () - "A command used to start pasystray." - (interactive) - (if (executable-find "pasystray") - (progn - (message "EXWM: starting pasystray ...") - (start-process-shell-command "pasystray" nil "pasystray --notify=all")) - (message "EXWM: pasystray is not installed, abort!"))) + (exwm-input-set-key + (kbd "") + (lambda () + (interactive) + (start-process-shell-command "pamixer" nil "pamixer --toggle-mute"))) - (add-hook 'exwm-init-hook #'b/exwm-pasystray) + (exwm-input-set-key + (kbd "") + (lambda () + (interactive) + (start-process-shell-command "pamixer" nil "pamixer --allow-boost --decrease 5"))) (exwm-input-set-key - (kbd "s-t") + (kbd "") (lambda () (interactive) - (exwm-floating-toggle-floating))) + (start-process-shell-command "pamixer" nil "pamixer --allow-boost --increase 5"))) (exwm-input-set-key - (kbd "s-f") + (kbd "") (lambda () (interactive) - (exwm-layout-toggle-fullscreen))) + (start-process-shell-command "mpc" nil "mpc toggle"))) (exwm-input-set-key - (kbd "s-w") + (kbd "") (lambda () (interactive) - (kill-buffer (current-buffer)))) + (start-process-shell-command "mpc" nil "mpc prev"))) (exwm-input-set-key - (kbd "s-q") + (kbd "") (lambda () (interactive) - (exwm-manage--kill-client)))) + (start-process-shell-command "mpc" nil "mpc next"))) + + ;; Shorten 'C-c C-q' to 'C-q' + (define-key exwm-mode-map [?\C-q] #'exwm-input-send-next-key) + + ;; Line-editing shortcuts + (setq exwm-input-simulation-keys + '(;; movement + ([?\C-b] . [left]) + ([?\M-b] . [C-left]) + ([?\C-f] . [right]) + ([?\M-f] . [C-right]) + ([?\C-p] . [up]) + ([?\C-n] . [down]) + ([?\C-a] . [home]) + ([?\C-e] . [end]) + ([?\M-v] . [prior]) + ([?\C-v] . [next]) + ([?\C-d] . [delete]) + ([?\C-k] . [S-end ?\C-x]) + ;; cut/copy/paste + ([?\C-w] . [?\C-x]) + ([?\M-w] . [?\C-c]) + ([?\C-y] . [?\C-v]) + ([?\M-d] . [C-S-right ?\C-x]) + ([?\M-\d] . [C-S-left ?\C-x]) + ;; search + ([?\C-s] . [?\C-f]) + ;; escape + ([?\C-g] . [escape]))) + + ;; Enable EXWM + (exwm-enable) + + (add-hook 'exwm-init-hook #'exwm-config--fix/ido-buffer-window-other-frame) + + (require 'exwm-systemtray) + (exwm-systemtray-enable) + + (require 'exwm-randr) + (exwm-randr-enable)) ;; use the org-plus-contrib package to get the whole deal (use-package org-plus-contrib) @@ -849,7 +884,9 @@ For disabling the behaviour for certain buffers and/or modes." (nconc magit-section-initial-visibility-alist '(([unpulled status] . show) ([unpushed status] . show))) - :custom (magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1) + :custom + (magit-diff-refine-hunk t) + (magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1) :custom-face (magit-diff-file-heading ((t (:weight normal))))) ;; recently opened files @@ -865,7 +902,6 @@ For disabling the behaviour for certain buffers and/or modes." (use-package ivy :defer 0.3 - :delight ;; " 🙒" :bind (:map ivy-minibuffer-map ([escape] . keyboard-escape-quit) @@ -906,7 +942,6 @@ This function is intended for use with `ivy-ignore-buffers'." (use-package counsel :after ivy - :delight :bind (([remap execute-extended-command] . counsel-M-x) ([remap find-file] . counsel-find-file) ("C-c b b" . ivy-switch-buffer) @@ -1029,10 +1064,11 @@ This function is intended for use with `ivy-ignore-buffers'." (or (name . "^\\*scratch\\*$") (name . "^\\*Messages\\*$"))) + ("exwm" (mode . exwm-mode)) ("erc" (mode . erc-mode))))) (ibuffer-formats '((mark modified read-only locked " " - (name 18 18 :left :elide) + (name 72 72 :left :elide) " " (size-h 9 -1 :right) " " @@ -1046,7 +1082,6 @@ This function is intended for use with `ivy-ignore-buffers'." (use-feature outline :disabled :hook (prog-mode . outline-minor-mode) - :delight (outline-minor-mode " outl") :bind (:map outline-minor-mode-map @@ -1147,7 +1182,6 @@ This function is intended for use with `ivy-ignore-buffers'." ;; display Lisp objects at point in the echo area (use-feature eldoc :when (version< "25" emacs-version) - :delight " eldoc" :config (global-eldoc-mode)) ;; highlight matching parens @@ -1160,7 +1194,6 @@ This function is intended for use with `ivy-ignore-buffers'." :config (electric-pair-mode)) (use-feature simple - :delight (auto-fill-function " fill") :config (column-number-mode) :custom ;; Save what I copy into clipboard from other applications into Emacs' @@ -1198,7 +1231,6 @@ This function is intended for use with `ivy-ignore-buffers'." (use-package company :defer 0.6 - :delight " comp" :bind (:map company-active-map ([tab] . company-complete-common-or-cycle) @@ -1227,8 +1259,7 @@ This function is intended for use with `ivy-ignore-buffers'." (setq flycheck-check-syntax-automatically '(mode-enabled save)) :custom (flycheck-mode-line-prefix "flyc")) -(use-feature flyspell - :delight " flysp") +(use-feature flyspell) ;; http://endlessparentheses.com/ispell-and-apostrophes.html (use-feature ispell @@ -1258,7 +1289,6 @@ This function is intended for use with `ivy-ignore-buffers'." #'endless/replace-quote)) (use-feature abbrev - :delight " abbr" :hook (text-mode . abbrev-mode)) @@ -1271,12 +1301,9 @@ This function is intended for use with `ivy-ignore-buffers'." (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode)) (use-feature reveal - :delight (reveal-mode " reveal") :hook (emacs-lisp-mode . reveal-mode)) -(use-feature elisp-mode - :delight (emacs-lisp-mode "Elisp" :major)) - +(use-feature elisp-mode) (use-package alloy-mode :straight (:host github :repo "dwwmmn/alloy-mode") @@ -1389,8 +1416,8 @@ This function is intended for use with `ivy-ignore-buffers'." (use-package lsp-java :config (add-hook 'java-mode-hook - (lambda () - (setq-local company-backends (list 'company-lsp)))) + (lambda () + (setq-local company-backends (list 'company-lsp)))) (add-hook 'java-mode-hook 'lsp-java-enable) (add-hook 'java-mode-hook 'flycheck-mode) @@ -1511,7 +1538,6 @@ This function is intended for use with `ivy-ignore-buffers'." (use-package which-key :defer 0.4 - :delight :config (which-key-add-key-based-replacements ;; prefixes for global prefixes and minor modes @@ -1665,7 +1691,6 @@ This function is intended for use with `ivy-ignore-buffers'." ;; easily type pretty quotes & other typography, like ‘’“”-–—«»‹› (use-package typo :defer 0.5 - :delight " typo" :config (typo-global-mode 1) :hook (((text-mode erc-mode) . typo-mode) @@ -1752,7 +1777,6 @@ This function is intended for use with `ivy-ignore-buffers'." (use-package page-break-lines :defer 0.5 - :delight " pgln" :custom (page-break-lines-max-width fill-column) :config @@ -1880,6 +1904,10 @@ This function is intended for use with `ivy-ignore-buffers'." (goto-char (cdr macro))) (reftex-this-word))))) +(use-package minions + :demand + :config (minions-mode)) + ;;; Email (with Gnus) @@ -2255,7 +2283,7 @@ https://csclub.uwaterloo.ca/~abandali") "Return the In-Reply-To header for this message." (when message-reply-headers (let ((from (mail-header-from message-reply-headers)) - (msg-id (mail-header-id message-reply-headers))) + (msg-id (mail-header-id message-reply-headers))) (when from msg-id)))) @@ -2295,8 +2323,7 @@ https://csclub.uwaterloo.ca/~abandali") :custom (message-elide-ellipsis "[...]\n")) -(use-feature mml - :delight " mml") +(use-feature mml) (use-feature mml-sec :custom