From bcd3b394a2f876f4609cfaf5e8def6e224d3fbe1 Mon Sep 17 00:00:00 2001 From: Joseph Ferano Date: Fri, 2 Sep 2022 10:32:13 +0700 Subject: [PATCH] Embark, ace-window, smooth scroll, global magit keybindings --- .emacs.bankruptcy/init.org | 176 ++++++++++++++++++++++++++++--------- 1 file changed, 133 insertions(+), 43 deletions(-) diff --git a/.emacs.bankruptcy/init.org b/.emacs.bankruptcy/init.org index a989ae5..f294fd5 100644 --- a/.emacs.bankruptcy/init.org +++ b/.emacs.bankruptcy/init.org @@ -87,7 +87,6 @@ Prioritize old byte-compiled source files over newer sources. It saves us a litt (prefer-coding-system 'utf-8) ;;; early-init.el ends here #+end_src - ** Straight.el For now, use [[https://github.com/radian-software/straight.el][straight.el]] until [[https://github.com/progfolio/elpaca @@ -109,7 +108,6 @@ Then bootstrap (eval-print-last-sexp))) (load bootstrap-file nil 'nomessage)) #+END_SRC - ** Benchmarking This is commented out since it adds ever so slightly to init time, but keep it around in case we @@ -120,7 +118,6 @@ need to benchmark slow init times later. (require 'benchmark-init) (add-hook 'after-init-hook 'benchmark-init/deactivate) #+end_src - ** Misc Stuff #+begin_SRC emacs-lisp @@ -168,7 +165,6 @@ I don't even know how you resume from GUI mode, we'll find a use for this keybin (when (display-graphic-p) (global-unset-key (kbd "C-z"))) #+end_src - ** Visuals *** Dashboard @@ -189,7 +185,6 @@ Use Dashboard.el. First load `all-the-icons` for nicer rendering (setq dashboard-set-heading-icons t) (add-hook 'dashboard-mode-hook (lambda () (setq-local line-spacing 12))) #+end_src - *** Olivetti #+begin_src emacs-lisp @@ -198,7 +193,6 @@ Use Dashboard.el. First load `all-the-icons` for nicer rendering (setq olivetti-minimum-body-width 100) (global-set-key (kbd "C-x x o") 'olivetti-mode) #+end_src - *** Themes sanityinc-tomorrow-light is really good @@ -219,8 +213,6 @@ Save the last used theme when exiting emacs and then reload it. (customize-save-variable 'custom-enabled-themes custom-enabled-themes)) (add-hook 'kill-emacs-hook #'joe/save-current-theme) #+end_src - - *** Other Setup other stuff @@ -262,10 +254,11 @@ Setup other stuff (straight-use-package 'nano-modeline) (nano-modeline-mode) #+end_src - ** Text + #+begin_src emacs-lisp -(set-face-attribute 'default nil :font "Fira Code Nerd Font" :height 105) +(set-face-attribute 'default nil :family "Fira Code Nerd Font Mono" :height 120) +;; (set-face-attribute 'variable-pitch nil :family "Source Code Pro" :height 120) (setq-default c-basic-offset 4) ;; This is annoying (setq-default indent-tabs-mode nil) @@ -277,7 +270,6 @@ Setup other stuff (add-hook 'before-save-hook 'whitespace-cleanup) #+end_src - ** Buffers #+begin_src emacs-lisp (defun joe/kill-this-buffer-or-popup () @@ -321,10 +313,8 @@ The theme of `C-x 4` bindings is that they operate on other windows, so this fun (global-set-key (kbd "C-x C-0") 'kill-buffer-and-window) #+end_src - ** Windows - -*** Popper +*** Window Management #+begin_src emacs-lisp (add-hook 'after-init-hook (lambda () (winner-mode t))) @@ -338,6 +328,14 @@ The theme of `C-x 4` bindings is that they operate on other windows, so this fun (define-key ctl-x-4-map (kbd "|") #'joe/window-split-vertical) (define-key ctl-x-4-map (kbd "-") #'joe/window-split-horizontal) +(define-key ctl-x-4-map (kbd "t") #'rotate-window) + +(global-set-key (kbd "C-x o") #'ace-window) +(global-set-key (kbd "C-x C-o") #'ace-swap-window) +#+end_src> +*** Popper + +#+begin_src emacs-lisp (straight-use-package 'popper) (require 'popper) (setq popper-reference-buffers @@ -374,45 +372,54 @@ The theme of `C-x 4` bindings is that they operate on other windows, so this fun (popper-mode t) #+end_src - *** Scrolling #+begin_src emacs-lisp (require 'pixel-scroll) (setq pixel-scroll-precision-large-scroll-height 10.0) (setq pixel-scroll-precision-interpolation-factor 30) + +(defun joe/pixel-scroll-lerp (amount direction) + (let ((half-height (* direction (/ (window-height) amount))) + (point-min-or-max (if (> direction 0) (point-min) (point-max)))) + (when (or (and (pos-visible-in-window-p (point-min)) + (< direction 0))) + (pixel-scroll-precision-interpolate (* 5 half-height))) + (pixel-scroll-precision-interpolate (* 5 half-height)))) + (defun joe/smooth-scroll-half-page-down () "Smooth scroll down" (interactive) - (let ((half-height (/ (window-height) 2))) - (pixel-scroll-precision-interpolate (* 5 (- half-height))))) + (joe/pixel-scroll-lerp 2 -1)) + ;; (pixel-scroll-kbd-up)) (defun joe/smooth-scroll-half-page-up () - "Smooth scroll down" + "Smooth scroll up" (interactive) - (let ((half-height (/ (window-height) 2))) - (pixel-scroll-precision-interpolate (* 5 half-height)))) + (joe/pixel-scroll-lerp 2 1)) (defun joe/smooth-scroll-short-down () "Smooth scroll down" (interactive) - (let ((half-height (/ (window-height) 6))) - (pixel-scroll-precision-interpolate (* 5 (- half-height))))) + (joe/pixel-scroll-lerp 6 -1)) (defun joe/smooth-scroll-short-up () "Smooth scroll down" (interactive) - (let ((half-height (/ (window-height) 6))) - (pixel-scroll-precision-interpolate (* 5 half-height)))) + (joe/pixel-scroll-lerp 6 1)) ;; scroll-up-command (global-set-key (kbd "C-v") #'joe/smooth-scroll-half-page-down) (global-set-key (kbd "M-v") #'joe/smooth-scroll-half-page-up) - #+end_src +(global-set-key (kbd "C-S-v") #'joe/smooth-scroll-short-down) +(global-set-key (kbd "M-S-v") #'joe/smooth-scroll-short-up) +#+end_src ** Org Mode + #+begin_src emacs-lisp (straight-use-package 'org-bullets) + (defun joe/org-init () (setq org-todo-keywords '((sequence "TODO" "IN-PROGRESS" "|" "DONE" "BACKLOG"))) (setq org-agenda-files '("~/todo.org")) @@ -422,28 +429,38 @@ The theme of `C-x 4` bindings is that they operate on other windows, so this fun (setq org-edit-src-content-indentation 0)) (with-eval-after-load 'org (joe/org-init)) +(setq org-blank-before-new-entry + '((heading . nil) + (plain-list-item . nil))) +(setq org-cycle-separator-lines 1) +(setq org-hide-emphasis-markers t) +(setq org-src-window-setup 'current-window) + (defun joe/org-hook () (local-set-key (kbd "C-. C-i") 'consult-org-heading) (org-bullets-mode) (org-indent-mode)) (add-hook 'org-mode-hook 'joe/org-hook) #+end_src - ** VEMCO Vertico Embark Marginalia Consult Orderless #+begin_src emacs-lisp (straight-use-package 'all-the-icons-completion) -(straight-use-package '(vertico :files (:defaults "extensions/*") :includes (vertico-directory vertico-reverse))) -;; :bind (:map vertico-map -;; ("\M-G" . vertico-multiform-mode) -;; ("\M-e" . embark-act))) - +(straight-use-package '(vertico :files (:defaults "extensions/*") + :includes (vertico-indexed + vertico-repeat + vertico-directory))) (vertico-mode) (straight-use-package 'vertico-posframe) + +(define-key vertico-map (kbd "C-w") #'vertico-directory-delete-word) +(define-key vertico-map (kbd "C-r") #'vertico-repeat-) + (vertico-posframe-mode t) +(vertico-indexed-mode) (setq vertico-posframe-parameters '((left-fringe . 100) (right-fringe . 100))) @@ -461,8 +478,14 @@ Vertico Embark Marginalia Consult Orderless vertico-resize nil vertico-cycle t) +(define-key vertico-map (kbd "C-M-n") #'vertico-next-group) +;; #' "C-M-p" #'vertico-previous-group) + (require 'savehist) (savehist-mode) +(add-hook 'minibuffer-setup-hook #'vertico-repeat-save) +(add-to-list 'savehist-additional-variables 'vertico-repeat-history) + (straight-use-package 'vertico-directory) ;; :bind (:map vertico-map ;; ("RET" . vertico-directory-enter) @@ -471,11 +494,69 @@ Vertico Embark Marginalia Consult Orderless ;; :hook (rfn-eshadow-update-overlay . vertico-directory-tidy)) (straight-use-package 'embark) + +(defvar joe-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-'") #'embark-act) + (define-key map (kbd "M-'") #'embark-dwim) + map) + "my-keys-minor-mode keymap.") + +(define-minor-mode joe-mode + "A minor mode so that my key settings override annoying major modes." + :init-value t + :lighter " joe-keys") + +(joe-mode t) + +(defun embark-which-key-indicator () + "An embark indicator that displays keymaps using which-key. +The which-key help message will show the type and value of the +current target followed by an ellipsis if there are further +targets." + (lambda (&optional keymap targets prefix) + (if (null keymap) + (which-key--hide-popup-ignore-command) + (which-key--show-keymap + (if (eq (plist-get (car targets) :type) 'embark-become) + "Become" + (format "Act on %s '%s'%s" + (plist-get (car targets) :type) + (embark--truncate-target (plist-get (car targets) :target)) + (if (cdr targets) "…" ""))) + (if prefix + (pcase (lookup-key keymap prefix 'accept-default) + ((and (pred keymapp) km) km) + (_ (key-binding prefix 'accept-default))) + keymap) + nil nil t (lambda (binding) + (not (string-suffix-p "-argument" (cdr binding)))))))) + +(setq embark-indicators + '(embark-which-key-indicator + embark-highlight-indicator + embark-isearch-highlight-indicator)) + +(defun embark-hide-which-key-indicator (fn &rest args) + "Hide the which-key indicator immediately when using the completing-read prompter." + (which-key--hide-popup-ignore-command) + (let ((embark-indicators + (remq #'embark-which-key-indicator embark-indicators))) + (apply fn args))) + +(advice-add #'embark-completing-read-prompter + :around #'embark-hide-which-key-indicator) + +(global-set-key (kbd "C-'") #'embark-act) + (straight-use-package 'embark-consult) (straight-use-package 'marginalia) (setq marginalia-annotators '(marginalia-annotators-heavy marginalia-annotators-light nil)) +(setq marginalia-align 'right) +(setq marginalia-max-relative-age most-positive-fixnum) (marginalia-mode) +(define-key minibuffer-local-map (kbd "M-A") #'marginalia-cycle) (require 'all-the-icons-completion) (all-the-icons-completion-mode) (all-the-icons-completion-marginalia-setup) @@ -496,7 +577,6 @@ Vertico Embark Marginalia Consult Orderless (global-set-key (kbd "C-. C-r") 'consult-recent-file) (global-set-key (kbd "C-. C-y") 'consult-yank-from-kill-ring) #+end_src - ** Avy #+begin_src emacs-lisp @@ -510,7 +590,6 @@ Vertico Embark Marginalia Consult Orderless (define-key global-map (kbd "M-g w") 'avy-goto-word-1) ;; first character of the word (define-key global-map (kbd "M-g P") 'avy-pop-mark) #+end_src - ** Helpful #+begin_src emacs-lisp (straight-use-package 'helpful) @@ -521,7 +600,6 @@ Vertico Embark Marginalia Consult Orderless (global-set-key (kbd "C-h F") #'helpful-function) (global-set-key (kbd "C-h C") #'helpful-command) #+end_src - ** Dirvish/Dired #+begin_src emacs-lisp (straight-use-package 'dirvish) @@ -556,6 +634,7 @@ Vertico Embark Marginalia Consult Orderless (define-key dirvish-mode-map (kbd "C-c f") #'dirvish-fd) (define-key dirvish-mode-map (kbd "a" ) #'dirvish-quick-access) + (define-key dirvish-mode-map (kbd "." ) #'dired-create-empty-file) (define-key dirvish-mode-map (kbd "f" ) #'dirvish-file-info-menu) (define-key dirvish-mode-map (kbd "y" ) #'dirvish-yank-menu) (define-key dirvish-mode-map (kbd "N" ) #'dirvish-narrow) @@ -577,7 +656,6 @@ Vertico Embark Marginalia Consult Orderless (global-set-key (kbd "C-x C-d") #'joe/dirvish-find-directory) #+end_src - ** Terminals/Shells #+begin_src emacs-lisp (straight-use-package 'vterm) @@ -603,6 +681,9 @@ Vertico Embark Marginalia Consult Orderless (global-set-key (kbd "C-c t") #'vterm) (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) (add-hook 'vterm-mode-hook (lambda () (setq-local global-hl-line-mode nil))) #+end_src @@ -613,7 +694,6 @@ down init time because vterm is loading TRAMP which is slow. #+begin_src emacs-lisp (add-hook 'emacs-startup-hook (lambda () (require 'vterm))) #+end_src - ** Undo Tree #+begin_src emacs-lisp (straight-use-package 'undo-tree) @@ -623,7 +703,6 @@ down init time because vterm is loading TRAMP which is slow. (setq undo-tree-visualizer-diff t) (setq undo-tree-history-directory-alist `(("." . ,(expand-file-name "undo" user-emacs-directory)))))) #+end_src - ** Which Key #+begin_src emacs-lisp @@ -631,7 +710,6 @@ down init time because vterm is loading TRAMP which is slow. (setq which-key-idle-delay 0.3) (add-hook 'after-init-hook (lambda () (which-key-mode))) #+end_src - ** Text Editor Emacs is an great operating system, if only it had a good text editor... @@ -640,7 +718,6 @@ Emacs is an great operating system, if only it had a good text editor... #+begin_src emacs-lisp (global-set-key (kbd "M-z") #'zap-up-to-char) (global-set-key (kbd "M-Z") #'zap-to-char) -;; (setq explicit-shell-file-name "~/Development/fell/fell") (defun joe/duplicate-line-comment () (interactive) @@ -660,6 +737,7 @@ Emacs is an great operating system, if only it had a good text editor... (defhydra hydra-navigate (global-map "") "Window Navigation" + ("q" nil "quit") ("d" joe/smooth-scroll-half-page-down "half page down") ("u" joe/smooth-scroll-half-page-up "half page up") ("e" joe/smooth-scroll-short-down "line down") @@ -812,7 +890,6 @@ Emacs is an great operating system, if only it had a good text editor... (add-hook 'after-init-hook 'my/kakoune-setup) #+end_src - ** IDE Features *** LSP/Company @@ -845,6 +922,7 @@ Emacs is an great operating system, if only it had a good text editor... (define-key company-active-map (kbd "C-n") nil) (define-key company-active-map (kbd "C-p") nil) (define-key company-active-map (kbd "") nil) + (define-key company-active-map (kbd "RET") nil) (define-key company-active-map (kbd "C-f") #'company-complete-selection) (define-key company-active-map [tab] #'company-complete-common-or-cycle) (define-key company-active-map (kbd "") (lambda () (interactive) (company-complete-common-or-cycle -1))) @@ -895,7 +973,6 @@ Emacs is an great operating system, if only it had a good text editor... ;; (require 'yasnippet) ;; (yas-global-mode 1) #+end_src - *** C Design some basic functions for compiling. There's also a hook to close the popper window if there @@ -924,7 +1001,6 @@ it doesn't close it. (popper-close-latest)))))) (add-hook 'compilation-finish-functions 'joe/close-compilation-if-no-warn-err) #+end_src - ** Magit The best git porcelain/client I've ever used. Also kill stray magit buffers left over as explained [[https://manueluberti.eu/emacs/2018/02/17/magit-bury-buffer/][here]] @@ -939,9 +1015,23 @@ The best git porcelain/client I've ever used. Also kill stray magit buffers left (mapc #'kill-buffer buffers))) (setq magit-bury-buffer-function #'joe/magit-kill-buffers) +(setq magit-clone-set-remote.pushDefault t) +(setq magit-clone-default-directory "~/Development/") +(defvar joe/magit-keys-mode-map + (let ((map (make-sparse-keymap))) + (define-key map (kbd "C-x g g") #'magit-status) + (define-key map (kbd "C-x g c") #'magit-clone) + (define-key map (kbd "C-x g i") #'magit-init) + map) + "Personal magit map") + +(define-minor-mode joe/magit-keys-mode + "A minor mode to enable some magit keys" + :init-value t) + +(joe/magit-keys t) #+end_src - ** Restclient #+begin_src emacs-lisp