diff --git a/init.example.el b/init.example.el index aadb388dd..2fbab8d84 100644 --- a/init.example.el +++ b/init.example.el @@ -46,6 +46,7 @@ :editor (evil +everywhere); come to the dark side, we have cookies file-templates ; auto-snippets for empty files + ;;god ; run Emacs commands without modifier keys fold ; (nigh) universal code folding ;;(format +onsave) ; automated prettiness ;;lispy ; vim for lisp, for people who dont like vim diff --git a/modules/README.org b/modules/README.org index 2b329620a..bf953cd21 100644 --- a/modules/README.org +++ b/modules/README.org @@ -52,6 +52,7 @@ Modules that affect and augment your ability to manipulate or insert text. + [[file:editor/file-templates/README.org][file-templates]]: Auto-inserted templates in blank new files + [[file:editor/fold/README.org][fold]]: universal code folding + [[file:editor/format/README.org][format]] =+onsave=: ++ god: run Emacs commands without modifier keys + [[file:editor/lispy/README.org][lispy]]: + multiple-cursors: + [[file:editor/parinfer/README.org][parinfer]]: diff --git a/modules/editor/god/autoload/god.el b/modules/editor/god/autoload/god.el new file mode 100644 index 000000000..3245eb1a1 --- /dev/null +++ b/modules/editor/god/autoload/god.el @@ -0,0 +1,76 @@ +;; editor/god/autoload/god.el -*- lexical-binding: t; -*- + +(defvar god-default-color (face-background 'cursor) + "Default cursor and bar color.") + +(defvar god-read-only-mode-color "Gray" + "Cursor and bar color when `read-only-mode' is enabled.") + +(defvar god-overwrite-mode-color "Yellow" + "Cursor and bar color when `overwrite-mode' is enabled.") + +(defvar god-fill-overflow-color "IndianRed" + "Cursor and bar color when fill column width has been exceeded.") + +;;;###autoload +(defvar god-default-exempt-major-modes + '(Custom-mode + Info-mode + ag-mode + calculator-mode + calendar-mode + cider-test-report-mode + compilation-mode + debugger-mode + dired-mode + edebug-mode + ediff-mode + eww-mode + geben-breakpoint-list-mode + git-commit-mode + grep-mode + ibuffer-mode + magit-popup-mode + org-agenda-mode + pdf-outline-buffer-mode + recentf-dialog-mode + sldb-mode + sly-db-mode + vc-annotate-mode + wdired-mode) + "Major modes in which `god-local-mode' will not be enabled on +initialization.") + +;;;###autoload +(defun god--configure-cursor-and-modeline () + "Configure cursor type, cursor color and doom-modeline bar color depending on mode." + (let* ((is-fill-overflow (> (current-column) fill-column)) + (previous-cursor-color (face-background 'cursor)) + (previous-modeline-color (and (facep 'doom-modeline-bar) + (face-background 'doom-modeline-bar))) + (is-god-mode (and (boundp 'god-local-mode) + god-local-mode)) + (next-cursor-type + (cond (buffer-read-only 'box) + ((and overwrite-mode is-god-mode) 'hollow) + ((or is-god-mode overwrite-mode) 'box) + (t 'bar))) + (next-cursor-and-modeline-color + (cond (buffer-read-only god-read-only-mode-color) + (is-fill-overflow god-fill-overflow-color) + (overwrite-mode god-overwrite-mode-color) + (t god-default-color)))) + (setq cursor-type next-cursor-type) + (unless (eq previous-cursor-color next-cursor-and-modeline-color) + (set-cursor-color next-cursor-and-modeline-color)) + (when (and (facep 'doom-modeline-bar) + (fboundp 'doom-modeline-refresh-bars) + (not (eq previous-modeline-color next-cursor-and-modeline-color))) + (set-face-attribute 'doom-modeline-bar nil :background next-cursor-and-modeline-color) + (doom-modeline-refresh-bars)))) + +;;;###autoload +(defun god--toggle-on-overwrite () + (if (bound-and-true-p overwrite-mode) + (god-local-mode-pause) + (god-local-mode-resume))) diff --git a/modules/editor/god/config.el b/modules/editor/god/config.el new file mode 100644 index 000000000..998d83f91 --- /dev/null +++ b/modules/editor/god/config.el @@ -0,0 +1,9 @@ +;;; editor/god/config.el -*- lexical-binding: t; -*- + +(use-package! god-mode + :commands (god-local-mode god-mode-all) + :hook ((after-init . god-mode-all) + (post-command . god--configure-cursor-and-modeline) + (overwrite-mode . god--toggle-on-overwrite)) + :config + (setq god-exempt-major-modes god-default-exempt-major-modes)) diff --git a/modules/editor/god/doctor.el b/modules/editor/god/doctor.el new file mode 100644 index 000000000..66b0b1e84 --- /dev/null +++ b/modules/editor/god/doctor.el @@ -0,0 +1,8 @@ +;; -*- lexical-binding: t; no-byte-compile: t; -*- +;;; editor/god/doctor.el + +(when (featurep! :editor evil) + (warn! "god-mode is not really compatible with evil")) + +(when (featurep! :editor objed) + (warn! "god-mode is not really compatible with objed")) diff --git a/modules/editor/god/packages.el b/modules/editor/god/packages.el new file mode 100644 index 000000000..a62830687 --- /dev/null +++ b/modules/editor/god/packages.el @@ -0,0 +1,4 @@ +;; -*- no-byte-compile: t; -*- +;;; editor/god/packages.el + +(package! god-mode)