# HG changeset patch # User Zachary Kanfer # Date 1693509750 14400 # Thu Aug 31 15:22:30 2023 -0400 # Node ID 00167e37e5bacc06afdf35d246fe6d87829e8c4c # Parent 3d55de4dd2e4be5f2641a4c2388e8ea84c9d5b14 add *-from-space-dwim diff --git a/caser.el b/caser.el --- a/caser.el +++ b/caser.el @@ -250,6 +250,85 @@ (defvar caser-dashcase-repeat-map (define-keymap "d" #'caser-dashcase-dwim)) (put #'caser-dashcase-dwim 'repeat-map 'caser-dashcase-repeat-map) +(defun caser--convert-whitespace (beginning-point end-point string-to-convert-to) + "Convert every space to STRING-TO-CONVERT-TO. + +This only converts between BEGINNING-POINT and END-POINT." + (save-excursion + (goto-char beginning-point) + (let ((end-marker (make-marker))) + (move-marker end-marker end-point) + (while (re-search-forward (rx (one-or-more ?\s)) (marker-position end-marker) t) + (replace-match string-to-convert-to))))) + +(defun caser--from-space-dwim-helper (words region-function) + "Helper function for *-from-space-dwim functions. + +This cases WORDS words, unless the region is active. + +It uses REGION-FUNCTION to case the region." + (if (use-region-p) + (let ((beginning (region-beginning)) + (end (region-end)) + (starting-point-marker (point-marker)) + (end-marker (make-marker))) + (move-marker end-marker end) + + (set-marker-insertion-type starting-point-marker nil) + (caser--convert-whitespace beginning + end + "-") + (funcall region-function beginning (marker-position end-marker)) + (goto-char starting-point-marker)) + (let* ((starting-end (point)) + (other-end (progn (caser--forward-word words) + (point))) + (beginning (min starting-end other-end)) + (end (max starting-end other-end)) + (end-marker (make-marker)) + (point-at-end-marker (make-marker))) + (set-marker end-marker end) + (set-marker point-at-end-marker other-end) + (set-marker-insertion-type point-at-end-marker (equal starting-end beginning)) + + (caser--convert-whitespace beginning end "-") + (funcall region-function beginning (marker-position end-marker)) + + (goto-char point-at-end-marker)))) + +(defun caser-dashcase-from-space-dwim (&optional words) + "Dashcase what you mean, including converting spaces to dashes. + +If the region is active, dashcase it; otherwise dashcase the word at point. + +This converts it from camelCase or snake_case to dash-case. + +If the region is active, this function calls `caser-dashcase-region'. +Otherwise, it calls `caser-dashcase-word', with prefix argument passed to it +to dashcase WORDS words." + (interactive "*p") + (caser--from-space-dwim-helper words #'caser-dashcase-region)) + +(defun caser-snakecase-from-space-dwim (&optional words) + "Snakecase what you mean, including converting spaces to underscores. + +If the region is active, snakecase it; otherwise snakecase WORDS +words at point, defaulting to 1. + +This converts it from camelCase or dash-case to snake_case." + (interactive "*p") + (caser--from-space-dwim-helper words #'caser-snakecase-region)) + +(defun caser-camelcase-from-space-dwim (&optional words) + "Camelcase what you mean, including converting spaces to underscores. + +If the region is active, camelcase it; otherwise camelcase WORDS +words at point, defaulting to 1. + +This converts it from snake_case or dash-case to camelCase." + (interactive "*p") + (caser--from-space-dwim-helper words #'caser-camelcase-region)) + ;;suggested. ;; (bind-key "M-C" #'caser-camelcase-dwim) ;; (bind-key "M-S" #'caser-snakecase-dwim) diff --git a/tests.el b/tests.el --- a/tests.el +++ b/tests.el @@ -862,3 +862,155 @@ (caser//on-temp-buffer-point "|hi +-_=there friends" (caser--forward-word 2))))) + +;; convert-from-whitespace +(ert-deftest convert-whitespace/no-whitespace () + (should (equal "hi-there" + (caser//on-temp-buffer + "hi-there" + (caser--convert-whitespace (point-min) + (point-max) + "-"))))) + +(ert-deftest convert-whitespace/single-whitespace () + (should (equal "hi-there" + (caser//on-temp-buffer + "hi there" + (caser--convert-whitespace (point-min) + (point-max) + "-"))))) + +(ert-deftest convert-whitespace/duplicate-whitespace () + (should (equal "hi-there" + (caser//on-temp-buffer + "hi there" + (caser--convert-whitespace (point-min) + (point-max) + "-"))))) + +(ert-deftest convert-whitespace/more-than-one-whitespace () + (should (equal "hi-there-to-you" + (caser//on-temp-buffer + "hi there to you" + (caser--convert-whitespace (point-min) + (point-max) + "-"))))) + +(ert-deftest convert-whitespace/obeys-points () + (should (equal "hi _there_to you" + (caser//on-temp-buffer + "hi there to you" + (caser--convert-whitespace 5 + 13 + "_"))))) + +(ert-deftest convert-whitespace/multiple-whitespace-doesnt-overlap-other-words () + (should (equal "a_b c d e" + (caser//on-temp-buffer + "a b c d e" + (caser--convert-whitespace 1 + 13 + "_"))))) + +;;dashcase-from-space-dwim tests + +(ert-deftest dashcase-from-space-dwim/single-whitespace () + (should (equal "|hi-there" + (caser//on-temp-buffer-point + "|hi there" + (set-mark (point-max)) + (activate-mark) + (caser-dashcase-from-space-dwim))))) + +(ert-deftest dashcase-from-space-dwim/region-forward/single-whitespace () + (should (equal "|hi-there" + (caser//on-temp-buffer-point + "|hi there" + (set-mark (point-max)) + (activate-mark) + (caser-dashcase-from-space-dwim))))) + +(ert-deftest dashcase-from-space-dwim/region-backward/lots-of-whitespace () + (should (equal "hi-there|" + (caser//on-temp-buffer-point + "hi there|" + (set-mark (point-min)) + (activate-mark) + (caser-dashcase-from-space-dwim))))) + +(ert-deftest dashcase-from-space-dwim/region-backward/middle-of-string () + (should (equal "a |b-c-d e" + (caser//on-temp-buffer-point + "a |b c d e" + (set-mark 23) + (activate-mark) + (caser-dashcase-from-space-dwim))))) + +(ert-deftest dashcase-from-space-dwim/positive-argument/1 () + (should (equal "hi| there" + (caser//on-temp-buffer-point + "|hi there" + (caser-dashcase-from-space-dwim 1))))) + +(ert-deftest dashcase-from-space-dwim/positive-argument/2 () + (should (equal "hi-there|" + (caser//on-temp-buffer-point + "|hi there" + (caser-dashcase-from-space-dwim 2))))) + + +(ert-deftest dashcase-from-space-dwim/positive-argument/3 () + (should (equal "hi there-to-everybody| around" + (caser//on-temp-buffer-point + "hi |there to everybody around" + (caser-dashcase-from-space-dwim 3))))) + +(ert-deftest dashcase-from-space-dwim/negative-argument/-3 () + (should (equal "hi |there-to-everybody around" + (caser//on-temp-buffer-point + "hi there to everybody| around" + (caser-dashcase-from-space-dwim -3))))) + +(ert-deftest dashcase-from-space-dwim/region-forward/space-and-camelcase () + (should (equal "hi there-to-everybody| around" + (caser//on-temp-buffer-point + "hi there toEverybody| around" + (set-mark 5) + (activate-mark) + (caser-dashcase-from-space-dwim))))) + +;;snakecase-from-space-dwim tests + +(ert-deftest snakecase-from-space-dwim/region-backward/space-and-dashcase () + (should (equal "hi there_to_everybody| around" + (caser//on-temp-buffer-point + "hi there to-everybody| around" + (set-mark 5) + (activate-mark) + (caser-snakecase-from-space-dwim))))) + +(ert-deftest snakecase-from-space-dwim/positive-argument () + (should (equal "ok this is_a_new_thing_that| goes on" + (caser//on-temp-buffer-point + "ok this |is a-newThing that goes on" + (caser-snakecase-from-space-dwim 3))))) + +(ert-deftest snakecase-from-space-dwim/region-forward/lots-of-things () + (should (equal "hi |there_to_everybody_i_know_around here" + (caser//on-temp-buffer-point + "hi |there to-everybodyIKnow around here" + (set-mark 35) + (activate-mark) + (caser-snakecase-from-space-dwim))))) + +;;camelcase-from-space-dwim + +(ert-deftest camelcase-from-space-dwim/region-forward/lots-of-things () + (should (equal "this |isALotOfWordsThat matter" + (caser//on-temp-buffer-point + "this |is a-lot_of words that matter" + (set-mark 34) + (activate-mark) + (caser-camelcase-from-space-dwim))))) + +;;; tests.el ends here