From b1d307126913cbd4d8af818f7aec7ada6a0ea4ad Mon Sep 17 00:00:00 2001 From: Case Duckworth Date: Sat, 4 Dec 2021 23:09:33 -0600 Subject: uhhhhhhhh --- init.el | 62 ++++++++++++++++++++- lisp/+elisp.el | 18 +++++++ lisp/+modeline.el | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ lisp/+pulse.el | 50 +++++++++++++++++ 4 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 lisp/+elisp.el create mode 100644 lisp/+modeline.el create mode 100644 lisp/+pulse.el diff --git a/init.el b/init.el index 57657fe..631ae3d 100644 --- a/init.el +++ b/init.el @@ -16,10 +16,13 @@ ;;; Code: +;; Delete when no longer ... remacs'd ;; Require early-init.el just in case it hasn't been yet. (require 'early-init (locate-user-emacs-file "early-init.el") :noerror) + ;; Requre my private stuff (require 'private) +(setq debug-on-error t) (setup (:require +defaults)) @@ -72,6 +75,20 @@ (with-eval-after-load 'frowny (add-to-list 'frowny-inhibit-modes 'dired-mode))) +(setup eldoc + (:hook-into elisp-mode + lisp-interaction-mode)) + +(setup elisp-mode + (:also-load +elisp) + (:option eval-expression-print-length nil + eval-expression-print-level nil) + (:with-map (emacs-lisp-mode-map lisp-interaction-mode-map) + (:bind "C-c C-c" 'eval-defun + "C-c C-k" '+elisp-eval-region-or-buffer + "C-c C-z" 'ielm)) + (advice-add 'eval-region :around '+eval-region@pulse)) + (setup eshell (:also-load +eshell em-smart @@ -108,6 +125,22 @@ '("tildegit.org" "tildegit.org/api/v1" "tildegit.org" forge-gitea-repository))))) +(setup prog + (:local-set comment-auto-fill-only-comments t) + (:hook 'prettify-symbols-mode + 'display-fill-column-indicator-mode + 'turn-on-auto-fill)) + +(setup pulse + (:also-load +pulse) + (:option pulse-flag nil + pulse-delay 0.5 + pulse-iterations 1) + (+pulse-location-mode +1)) + +(setup text + (:hook 'turn-on-auto-fill)) + (setup (:straight 0x0) (:option 0x0-default-server 'ttm) (with-eval-after-load 'embark @@ -118,6 +151,7 @@ ) (setup (:straight anzu) + (:option anzu-cons-mode-line-p nil) (:global [remap query-replace] 'anzu-query-replace-regexp [remap query-replace-regexp] 'anzu-query-replace-regexp) (global-anzu-mode +1) @@ -348,7 +382,7 @@ (:option prefix-help-command 'embark-prefix-help-command) (:global "C-." 'embark-act "M-." 'embark-dwim - "C-h B" 'embark-bindings)) + " B" 'embark-bindings)) (setup (:straight embark-consult) (:load-after consult embark) @@ -565,6 +599,25 @@ "M-!" 'shell-command+) (:global "M-!" 'shell-command+)) +(setup (:straight (simple-modeline + :fork (:repo "duckwork/simple-modeline"))) + (:also-load +modeline) + (:option simple-modeline-segments '((;; left + +modeline-modified + +modeline-buffer-name + +modeline-position + +modeline-anzu + ) + (;; right + +modeline-track + +modeline-vc + simple-modeline-segment-misc-info + simple-modeline-segment-process + +modeline-narrowed + +modeline-minions + +modeline-major-mode))) + (simple-modeline-mode +1)) + (setup (:straight (sophomore :host github :repo "duckwork/sophomore.el")) @@ -637,3 +690,10 @@ (:option whitespace-cleanup-mode-preserve-point t) (remove-hook 'before-save-hook 'whitespace-cleanup) (global-whitespace-cleanup-mode +1)) + +(setup (:straight zzz-to-char) + (:global "M-z" (lambda (prefix) + "Call `zzz-to-char' or `zzz-up-to-char' with PREFIX arg." + (interactive "P") + (call-interactively + (if prefix #'zzz-up-to-char #'zzz-to-char))))) diff --git a/lisp/+elisp.el b/lisp/+elisp.el new file mode 100644 index 0000000..d2f018a --- /dev/null +++ b/lisp/+elisp.el @@ -0,0 +1,18 @@ +;;; +elisp.el -*- lexical-binding: t; -*- + +;;; Code: + +(defun +elisp-eval-region-or-buffer () + (interactive) + (if (region-active-p) + (eval-region (region-beginning) (region-end)) + (eval-buffer))) + +;; Should I move this to `+pulse' ? +(defun +eval-region@pulse (advised beg end &rest args) + "ADVICE to pulse an eval'd region." + (apply advised beg end args) + (pulse-momentary-highlight-region beg end)) + +(provide '+elisp) +;;; +elisp.el ends here diff --git a/lisp/+modeline.el b/lisp/+modeline.el new file mode 100644 index 0000000..b417e50 --- /dev/null +++ b/lisp/+modeline.el @@ -0,0 +1,157 @@ +;;; +modeline.el --- my modeline customizations -*- lexical-binding: t; -*- + +;;; Commentary: + +;; `+modeline.el' is kind of a dumping ground for various +;; modeline-related functions. I probably don't use everything in +;; here. Credit given where possible. + +;;; Code: + +(require '+util) +(require 'simple-modeline) +(require 'minions) + +(defgroup +modeline nil + "Various customization options for my modeline things." + :prefix "+modeline-" + :group 'simple-modeline) + +(defun +modeline-buffer-name () ; gonsie + "Display the buffer name." + (propertize + (+string-align (buffer-name) 20 :before " " :ellipsis "… ") + 'face 'bold + 'help-echo (or (buffer-file-name) + (buffer-name)) + 'mouse-face 'mode-line-highlight)) + +(defcustom +modeline-minions-icon "&" + "The \"icon\" for `+modeline-minions' button." + :type 'string) + +(defun +modeline-minions () + "Display a button for `minions-minor-modes-menu'." + (concat " " + (propertize + +modeline-minions-icon + 'help-echo "Minor modes menu\nmouse-1: show menu." + 'local-map (purecopy (simple-modeline-make-mouse-map + 'mouse-1 + (lambda (event) + (interactive "e") + (with-selected-window + (posn-window (event-start event)) + (minions-minor-modes-menu))))) + 'mouse-face 'mode-line-highlight))) + +(defun +modeline-major-mode () + "Display the current `major-mode'." + (concat " " + (propertize (+string-truncate (format-mode-line mode-name) + 12 "…") + 'face 'bold + 'keymap mode-line-major-mode-keymap + 'mouse-face 'mode-line-highlight))) + +(defcustom +modeline-modified-icon-alist '((ephemeral . "*") + (readonly . "=") + (modified . "+") + (special . "~") + (t . "-")) + "\"Icons\" to display depending on buffer status in modeline. +The CAR of each field is one of `readonly', `modified', +`special', `ephemeral', or t, and the CDR is a string to display +in that mode. + +`readonly' is true if the buffer is read-only and visiting a file. +`modified' is true if the buffer is modified. +`special' is true if the buffer is a special-mode or derived buffer. +`ephemeral' is true if the buffer is not visiting a file. +t is the fall-back, shown when nothing else in the alist applies. + +The order of elements matters: whichever one matches first is applied." + :type '(alist :key-type symbol + :value-type string) + :options '("readonly" "modified" "special" "t")) + +(defcustom +modeline-modified-icon-special-modes '(special-mode) + "Modes to apply the `special-mode' icon to in the +`+modeline-modified'." + :type '(repeat function)) + +(defun +modeline-modified () ; modified from `simple-modeline-status-modified' + "Display a color-coded \"icon\" indicator for the buffer's status." + (let* ((icon (catch :icon + (dolist (cell +modeline-modified-icon-alist) + (when (pcase (car cell) + ('ephemeral (not (buffer-file-name))) + ('readonly buffer-read-only) + ('modified (buffer-modified-p)) + ('special + (apply 'derived-mode-p + +modeline-modified-icon-special-modes)) + ('t t) + (_ nil)) + (throw :icon (cdr cell))))))) + (concat " " + (propertize (or icon "") + 'mouse-face 'mode-line-highlight)))) + +(defun +modeline-narrowed () + "Display an indication that the buffer is narrowed." + (when (buffer-narrowed-p) + (concat " " + (propertize "N" + 'help-echo (format "%s\n%s" + "Buffer is narrowed." + "mouse-2: widen buffer.") + 'local-map (purecopy (simple-modeline-make-mouse-map + 'mouse-2 'mode-line-widen)) + 'mouse-face 'mode-line-highlight)))) + +(define-minor-mode file-percentage-mode + "Toggle the percentage display in the mode line (File Percentage Mode)." + :init-value t :global t :group 'mode-line) + +(defun +modeline-position () ; adapted from `simple-modeline' + "Display the current cursor position." + (list '((line-number-mode + ((column-number-mode + (column-number-indicator-zero-based + (9 " %l:%c") + (9 " %l:%C")) + (6 " %l:"))) + ((column-number-mode + (column-number-indicator-zero-based + (5 " :%c") + (5 " :%C")))))) + '(file-percentage-mode + ((-3 "%p") "%% ")) + (if (region-active-p) + (propertize (format "%s%-5d" + (if (and (mark) (< (point) (mark))) "-" "+") + (apply '+ (mapcar + (lambda (pos) + (- (cdr pos) + (car pos))) + (region-bounds)))) + 'font-lock-face 'font-lock-variable-name-face)))) + +(defun +modeline-vc () + "Display the version control branch of the current buffer in the modeline." + ;; from https://www.gonsie.com/blorg/modeline.html, from Doom + (if-let ((backend (vc-backend buffer-file-name))) + (concat " " (substring vc-mode (+ (if (eq backend 'Hg) 2 3) 2))))) + +(defun +modeline-track () + "Display `tracking-mode' information." + '(tracking-mode + tracking-mode-line-buffers)) + +(defun +modeline-anzu () + "Display `anzu--update-mode-line'." + (anzu--update-mode-line)) + +(provide '+modeline) +;;; +modeline.el ends here diff --git a/lisp/+pulse.el b/lisp/+pulse.el new file mode 100644 index 0000000..6ba7ded --- /dev/null +++ b/lisp/+pulse.el @@ -0,0 +1,50 @@ +;;; +pulse.el -*- lexical-binding: t; -*- + +;;; Code: + +(defgroup +pulse nil + "Extra customizations for `pulse'." + :group 'pulse + :prefix "+pulse-") + +(defcustom +pulse-location-commands '(scroll-up-command + scroll-down-command + recenter-top-bottom + other-window + switch-to-buffer + redraw-frame) + "Commands to pulse the current line after. +Good for finding location." + :type '(repeat function)) + +(defcustom +pulse-location-function '+pulse-line-current-window + "What function to call after `+pulse-location-commands'." + :type 'function) + +;; XXX: this doesn't work yet. I only want to pulse the line in the +;; active window, so when I have the same buffer viewed in multiple +;; windows I can still see where my cursor is. To see the issue, C-x +;; 2 then C-x o a few times. +(defun +pulse-line-current-window (&rest _) + "Pulse the current line, but only if this window is active." + (pulse-momentary-highlight-one-line + (window-point (selected-window)))) + +(defun +pulse--advice-remove (symbol where function &optional props) + "Remove advice SYMBOL from FUNCTION. +This uses the same args as `advice-add' for easy toggling. +WHERE and PROPS are discarded." + (ignore where props) + (advice-remove symbol function)) + +(define-minor-mode +pulse-location-mode + "After moving locations, pulse where we are." + :global t + :keymap nil + (dolist (command +pulse-location-commands) + (funcall + (if +pulse-location-mode 'advice-add '+pulse--advice-remove) + command :after +pulse-location-function))) + +(provide '+pulse) +;;; +pulse.el ends here -- cgit 1.4.1-21-gabe81