From 7fdcfa458ca6cfa8108449d04654fd0390061457 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Mon, 13 Apr 2026 10:31:43 +0800 Subject: [PATCH] emacs: emacs style for remaining SPC keybindings, fix nano-calendar scaling, use emacs for magit --- .config/emacs/init.org | 109 ++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 61 deletions(-) diff --git a/.config/emacs/init.org b/.config/emacs/init.org index e69df66..0797fe2 100644 --- a/.config/emacs/init.org +++ b/.config/emacs/init.org @@ -808,25 +808,6 @@ Fill region is great, except when you don't need it... (evil-get-auxiliary-keymap joe/evil-space-mode-map state t t) state)) - (evil-define-key 'normal joe/evil-space-mode-map - (kbd "SPC fb") 'bookmark-jump - (kbd "SPC fr") 'consult-recent-file - (kbd "SPC ff") 'project-find-file - (kbd "SPC fa") '(lambda () (interactive) (project-find-file t)) - (kbd "SPC fi") 'joe/edit-init - (kbd "SPC bi") 'ibuffer - (kbd "SPC bu") 'recentf-open-most-recent-file - (kbd "SPC bm") 'joe/toggle-buffer-mode - (kbd "SPC br") 'joe/revert-buffer-no-confirm - (kbd "SPC ss") 'joe/vterm-here - (kbd "SPC sv") 'vterm-other-window - (kbd "SPC mm") 'mu4e - (kbd "SPC cl") 'consult-line - (kbd "SPC cy") 'consult-yank-from-kill-ring - (kbd "SPC cg") 'consult-ripgrep - (kbd "SPC cF") 'consult-find - (kbd "SPC co") 'consult-outline) - (define-key evil-window-map "u" #'winner-undo) (define-key evil-window-map "U" #'winner-redo) @@ -1460,11 +1441,12 @@ odd looking ~'(t .t)~ is for specifying a default for all other actions. ;; (require 'consult-lsp) -(global-set-key (kbd "C-. C-l") 'consult-line) -(global-set-key (kbd "C-. C-i") 'consult-imenu) -(global-set-key (kbd "C-. C-t") 'joe/consult-theme) -(global-set-key (kbd "C-. C-r") 'consult-recent-file) -(global-set-key (kbd "C-. C-y") 'consult-yank-from-kill-ring) +(global-set-key (kbd "M-s l") #'consult-line) +(global-set-key (kbd "M-s g") #'consult-ripgrep) +(global-set-key (kbd "M-s f") #'consult-find) +(global-set-key (kbd "M-s y") #'consult-yank-from-kill-ring) +(global-set-key (kbd "M-s r") #'consult-recent-file) +(global-set-key (kbd "M-s i") #'consult-imenu) #+end_src *** Orderless @@ -1580,6 +1562,8 @@ odd looking ~'(t .t)~ is for specifying a default for all other actions. (require 'mu4e) (setq mu4e-use-maildirs-extension nil) + (global-set-key (kbd "C-c m") #'mu4e) + ;; Attach files to a message composition buffer by going into `dired' ;; and doing C-c C-m C-a (M-x `gnus-dired-attach'). (require 'gnus-dired) ; does not require `gnus' @@ -1677,8 +1661,7 @@ odd looking ~'(t .t)~ is for specifying a default for all other actions. (require 'avy) (setq avy-case-fold-search nil) (setq avy-keys '(?a ?s ?d ?f ?g ?h ?j ?k ?l ?q ?w ?e ?r ?u ?i ?o ?p ?z ?x ?c ?v ?n ?m)) -;; (define-key global-map (kbd "C-;") 'avy-goto-char) ;; I use this most frequently -(define-key global-map (kbd "M-s") 'avy-goto-char) ;; I use this most frequently +(global-set-key (kbd "C-;") #'avy-goto-char) ;; I use this most frequently ;; (define-key global-map (kbd "C-'") 'avy-goto-line) ;; Consistent with ivy-avy (define-key global-map (kbd "M-g c") 'avy-goto-char) (define-key global-map (kbd "M-g e") 'avy-goto-word-0) ;; lots of candidates @@ -1721,8 +1704,7 @@ odd looking ~'(t .t)~ is for specifying a default for all other actions. (with-current-buffer vterm-buf (setq popper-popup-status 'raised)))) -;; (global-set-key (kbd "C-c t") #'vterm) -;; (global-set-key (kbd "C-c T") #'joe/vterm-here) +(global-set-key (kbd "C-c t") #'joe/vterm-here) ;; (setq explicit-shell-file-name "~/Development/fell/fell") (add-hook 'shell-mode (lambda () (setq-local global-hl-line-mode nil))) (setq shell-kill-buffer-on-exit t) @@ -1932,14 +1914,7 @@ These help speed eglot up apparently [[https://www.reddit.com/r/emacs/comments/1 (evil-global-set-key 'normal (kbd "M-D") #'lsp-describe-thing-at-point) (evil-global-set-key 'normal (kbd "M-r") #'lsp-rename) (evil-global-set-key 'insert (kbd "M-i") #'lsp-signature-activate) - (evil-global-set-key 'normal (kbd "gD") #'xref-find-definitions-other-window) - (evil-global-set-key 'normal (kbd "SPC la") #'lsp-execute-code-action) - (evil-global-set-key 'normal (kbd "SPC lt") #'lsp-find-type-definition) - (evil-global-set-key 'normal (kbd "SPC lr") #'lsp-find-references) - (evil-global-set-key 'normal (kbd "SPC ld") #'lsp-find-definition) - (evil-global-set-key 'normal (kbd "SPC ls") #'consult-lsp-symbols) - (evil-global-set-key 'normal (kbd "SPC lD") #'consult-lsp-diagnostics) - (evil-global-set-key 'normal (kbd "SPC lf") #'consult-lsp-file-symbols)) + (evil-global-set-key 'normal (kbd "gD") #'xref-find-definitions-other-window)) #+end_src @@ -2075,22 +2050,23 @@ start it, so go through all existing buffers that match the mode and belong to t (insert-file-contents (expand-file-name "gptel-key" user-emacs-directory)) (buffer-string))) +(setq gptel-model 'claude-sonnet-4-6) +(setq gptel-backend (gptel-get-backend "Claude")) + (setq gptel-prompt-prefix-alist '((markdown-mode . "### ") (org-mode . "* ") (text-mode . "### "))) -(evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC a a") #'gptel) -(evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC a RET") #'gptel-ask) -(evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC a M") #'gptel-mode) -(evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC a c") #'gptel-add) ;; Will delete context at point -(evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC a A") #'gptel-abort) -(evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC a ") #'joe/gptel-context-remove-all) +(define-prefix-command 'joe/gptel-map) +(global-set-key (kbd "C-c a") 'joe/gptel-map) -(evil-define-key 'visual joe/evil-space-mode-map (kbd "SPC a r") #'gptel-rewrite) -(evil-define-key 'visual joe/evil-space-mode-map (kbd "SPC a RET") #'gptel-ask) -(evil-define-key 'visual joe/evil-space-mode-map (kbd "SPC a c") #'gptel-add) -(setq gptel-model 'claude-sonnet-4-6) -(setq gptel-backend (gptel-get-backend "Claude")) +(define-key joe/gptel-map (kbd "a") #'gptel) +(define-key joe/gptel-map (kbd "RET") #'gptel-ask) +(define-key joe/gptel-map (kbd "m") #'gptel-mode) +(define-key joe/gptel-map (kbd "c") #'gptel-add) +(define-key joe/gptel-map (kbd "q") #'gptel-abort) +(define-key joe/gptel-map (kbd "") #'joe/gptel-context-remove-all) +(define-key joe/gptel-map (kbd "r") #'gptel-rewrite) #+end_src gptel-context-remove-all without confirmation @@ -2484,7 +2460,6 @@ Org mode buffers have associated files. (700 900 1200 1700 1900 2030 2300) " ═════ " " ════════════════════ ")) -(define-key global-map (kbd "C-c a") #'org-agenda) (setq org-agenda-custom-commands '(("n" "Agenda and all TODOs" @@ -2626,7 +2601,7 @@ with the cursor you hit TAB and you complete the following; (setq org-download-image-dir "./Images/") (setq org-download-heading-lvl nil) #+end_src -*** org-transclusion +*** COMMENT org-transclusion #+begin_src emacs-lisp (define-key global-map (kbd "C-c t t") #'org-transclusion-mode) (define-key global-map (kbd "C-c t a") #'org-transclusion-add) @@ -2649,14 +2624,25 @@ with the cursor you hit TAB and you complete the following; #+end_src ** Calendar #+begin_src emacs-lisp +(defun joe/fit-text-scale-to-window () + "Scale text so buffer content fills the window width." + (let* ((window (get-buffer-window (current-buffer))) + (win-width (window-body-width window t)) ; pixels + (char-width (frame-char-width)) + (buffer-cols 90) ; nano-calendar is 90 chars wide + (desired-scale (log (/ (float win-width) + (* char-width buffer-cols)) + 1.2))) + (text-scale-set (floor desired-scale)))) + (defun joe/nano-calendar () (interactive) (nano-calendar) (with-current-buffer "*nano-calendar*" - (text-scale-set 2) + (joe/fit-text-scale-to-window) (evil-emacs-state))) -(evil-global-set-key 'normal (kbd "SPC cc") #'joe/nano-calendar) +(global-set-key (kbd "C-c M-c") #'joe/nano-calendar) #+end_src ** Magit @@ -2668,11 +2654,11 @@ The best git porcelain/client I've ever used. Also kill stray magit buffers left (defun joe/magit-kill-buffers (param) "Restore window configuration and kill all Magit buffers." (let ((buffers (magit-mode-get-buffers))) - (magit-restore-window-configuration) + ;; (magit-restore-window-configuration) (mapc #'kill-buffer buffers))) (when (boundp 'evil-mode) - (add-hook 'with-editor-mode-hook 'evil-insert-state)) + (add-hook 'with-editor-mode-hook 'evil-emacs-state)) (setq magit-bury-buffer-function #'joe/magit-kill-buffers) (setq magit-clone-set-remote.pushDefault t) @@ -2685,11 +2671,14 @@ The best git porcelain/client I've ever used. Also kill stray magit buffers left (display-buffer buffer '(display-buffer-same-window))))) (magit-status))) -(evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC g h") #'joe/magit-status-here) -(evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC g f") #'magit-find-file) -;; (define-key magit-mode-map "h" 'backward-char) -;; (define-key magit-mode-map "l" 'backward-char) +(define-prefix-command 'joe/magit-map) +(global-set-key (kbd "C-x g") 'joe/magit-map) +(define-key joe/magit-map (kbd "g") #'magit-status) +(define-key joe/magit-map (kbd "h") #'joe/magit-status-here) +(define-key joe/magit-map (kbd "f") #'magit-find-file) + +(evil-set-initial-state 'magit-status-mode 'emacs) #+end_src TODO: We need to create a var for a project based base branch @@ -2711,10 +2700,8 @@ TODO: We need to create a var for a project based base branch nil nil "origin/dev"))) (magit-log-other (list (concat base "..HEAD"))))) -(with-eval-after-load 'magit - (evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC g b") #'joe/magit-diff-branch-changes) - (evil-define-key 'normal joe/evil-space-mode-map (kbd "SPC g l") #'joe/magit-log-branch-commits)) - +(define-key joe/magit-map (kbd "b") #'joe/magit-diff-branch-changes) +(define-key joe/magit-map (kbd "l") #'joe/magit-log-branch-commits) #+end_src ** Restclient