From 4bd20b7930f7d12ee8e96322bd1d3281baa9936c Mon Sep 17 00:00:00 2001 From: MitchMarq42 Date: Fri, 9 Dec 2022 10:22:50 -0900 Subject: [PATCH] org: add monster `org-dwim-char` function, remove bloat --- lisp/mitch-orgstuff.el | 70 ++++++++++++++++++++++++++++++++++++------ lisp/mitch-packages.el | 31 ++++++++++++------- 2 files changed, 81 insertions(+), 20 deletions(-) diff --git a/lisp/mitch-orgstuff.el b/lisp/mitch-orgstuff.el index 476268b..47e27b2 100644 --- a/lisp/mitch-orgstuff.el +++ b/lisp/mitch-orgstuff.el @@ -64,15 +64,6 @@ ;; (add-to-list 'auto-mode-alist `(,org-wiki-regex . org-vw-mode)) (add-hook 'org-mode-hook #'org-vw-mode) -;; ------------------ ABANDON ALL SANITY, YE WHO ENTER HERE -------------------- - -;; Below, I attempt to generalize tangling a whole directory of org files into -;; whichever export format, and then apply that. - -;; (require 'ox-hugo) - -;; --------- LET THY BRAIN NO LONGER TREMBLE, FOR I AM BECOME COMPLETE --------- - (defun mitch-insert-current-datetime () "Insert the current date and time in my preffered format, with a newline at the end." @@ -91,5 +82,66 @@ Start insert mode." (mitch-insert-current-datetime) (evil-insert 1)) +;; ------------------ ABANDON ALL SANITY, YE WHO ENTER HERE -------------------- + +(defun mitch/org-dwim-char (&optional char) + "If a region is active (visual mode), surround selection with CHAR. + +If in a word, surround it with CHAR (like `evil-surround') or, if word is +already surrounded with CHAR, un-surround it. If on the first character of a +word, run the default function that Evil binds the key CHAR to. + +If the next character is the same as CHAR, move cursor past it \(like +`electric-pair'). + +If the line is a block delimiter or heading, or when in a protected block \(see +variable `org-protecting-blocks') or properties drawer, just insert the +character CHAR. + +Otherwise, insert two of CHAR and put point between them like `electric-pair'." + (interactive) ; TODO: can we make CHAR an arg to `interactive'? + (let ((char (or char (string-to-char (this-command-keys)))) + (word (thing-at-point 'word 'no-properties))) + (cond + ((eq evil-state 'visual) + (let* ((beg (region-beginning)) + (end (region-end))) + (evil-surround-region beg end evil-visual-selection char nil))) + ((eq evil-state 'normal) + (if (or (bolp) (eq (char-before (point)) ?\ )) ; at beginning of word + ;; run original function bound to key + (let ((charstr (make-string 1 char))) + (pcase charstr + ;; TODO: can we not hard-code this? + ("_" (call-interactively 'evil-next-line-1-first-non-blank)) + ("/" (call-interactively 'evil-search-forward)) + ("*" (call-interactively 'evil-search-word-forward)) + ("+" (call-interactively 'evil-next-line-first-non-blank)) + ("~" (call-interactively 'evil-invert-char)) + ("=" (call-interactively 'evil-indent)))) + (save-excursion + (if (and (eq (char-before (beginning-of-thing 'word)) char) + (eq (char-after (end-of-thing 'word)) char)) + (progn + (search-backward (char-to-string char)) (delete-char 1) + (search-forward (char-to-string char)) (delete-char -1)) + (evil-with-single-undo + (beginning-of-thing 'word) + (insert char) + (end-of-thing 'word) + (insert char)))))) + ((eq char (char-after)) + (right-char)) + ((or (string-match-p (rx bol (or "#" "*")) + (thing-at-point 'line 'no-properties)) + (org-in-block-p org-protecting-blocks) + (org-at-property-p)) + (insert char)) + (t (progn + (insert (make-string 2 char)) + (left-char)))))) +;; (setq debug-on-error t) +;; --------- LET THY BRAIN NO LONGER TREMBLE, FOR I AM BECOME COMPLETE --------- + (provide 'mitch-orgstuff) ;;; mitch-orgstuff.el ends here diff --git a/lisp/mitch-packages.el b/lisp/mitch-packages.el index 9e8987f..3ba8842 100644 --- a/lisp/mitch-packages.el +++ b/lisp/mitch-packages.el @@ -470,8 +470,8 @@ targets." :diminish (org-indent-mode org-vw-mode) :custom (org-hide-leading-stars t) - (org-startup-indented t) - (org-hide-emphasis-markers t) + ;; (org-startup-indented t) + ;; (org-hide-emphasis-markers t) :config (add-hook 'after-save-hook #'(lambda () (if (equal major-mode 'org-mode) @@ -485,10 +485,10 @@ targets." "Electric pairs for org-mode. See https://emacs.stackexchange.com/questions/2538/how-to-define-additional-mode-specific-pairs-for-electric-pair-mode") - (defun org-add-electric-pairs () - (setq-local electric-pair-pairs (append electric-pair-pairs org-electric-pairs)) - (setq-local electric-pair-text-pairs electric-pair-pairs)) - (add-hook 'org-mode-hook 'org-add-electric-pairs) + ;; (defun org-add-electric-pairs () + ;; (setq-local electric-pair-pairs (append electric-pair-pairs org-electric-pairs)) + ;; (setq-local electric-pair-text-pairs electric-pair-pairs)) + ;; (add-hook 'org-mode-hook 'org-add-electric-pairs) (require 'mitch-orgstuff) (defun insert-zws () (interactive) @@ -496,16 +496,25 @@ See https://emacs.stackexchange.com/questions/2538/how-to-define-additional-mode :hook (org-mode . turn-off-line-numbers) (org-mode . org-vw-mode) + (org-mode . yas-minor-mode) :general (general-define-key :states 'insert - :maps 'org-mode-map + :keymaps 'org-mode-map "`" (general-key-dispatch 'self-insert-command - :timeout 0.1 - "SPC" 'insert-zws))) -(use-package darkroom - :hook (org-mode . darkroom-tentative-mode)) (use-package org-tempo :straight (:type built-in) + :timeout 0.1 + "SPC" 'insert-zws)) + (general-define-key + :states '(normal visual insert) + :keymaps 'org-mode-map + "_" 'mitch/org-dwim-char + "/" 'mitch/org-dwim-char + "*" 'mitch/org-dwim-char + "+" 'mitch/org-dwim-char + "~" 'mitch/org-dwim-char + "=" 'mitch/org-dwim-char)) + :after org :config (add-to-list 'org-structure-template-alist '("sh" . "src shell"))