Emacs: Cycle Hyphen/Lowline/Space ๐
Here's a command that cycles hypen/lowline/space for word under cursor. (lowline is also known as underscore)
(the command was known as xah-cycle-hyphen-underscore-space
before 2021-08-09)
put this in your Emacs Init File:
(defun xah-cycle-hyphen-lowline-space (&optional Begin End) "Cycle hyphen/lowline/space chars in selection or inside quote/bracket or line, in that order. After this command is called, press `xah-repeat-key' to repeat it. The region to work on is by this order: 1. if there is a selection, use that. 2. If cursor is string quote or any type of bracket, and is within current line, work on that region. 3. else, work on current line. URL `http://xahlee.info/emacs/emacs/elisp_change_space-hyphen_underscore.html' Version: 2019-02-12 2022-10-20 2023-07-16" (interactive) ;; this function sets a property 'state. Possible values are 0 to length of xcharArray. (let* (xp1 xp2 (xcharArray ["-" "_" " "]) (xn (length xcharArray)) (xregionWasActive-p (region-active-p)) (xnowState (if (eq last-command this-command) (get 'xah-cycle-hyphen-lowline-space 'state) 0)) (xchangeTo (elt xcharArray xnowState))) (if (and Begin End) (setq xp1 Begin xp2 End) (if (region-active-p) (setq xp1 (region-beginning) xp2 (region-end)) (let ((xskipChars "^\"<>(){}[]โโโโโนโบยซยปใใใใใใใใใใใใใใ๏ผ๏ผ")) (skip-chars-backward xskipChars (line-beginning-position)) (setq xp1 (point)) (skip-chars-forward xskipChars (line-end-position)) (setq xp2 (point)) (push-mark xp1)))) (save-excursion (save-restriction (narrow-to-region xp1 xp2) (goto-char (point-min)) (while (re-search-forward (elt xcharArray (% (+ xnowState 2) xn)) (point-max) 1) (replace-match xchangeTo t t)))) (when (or (string-equal xchangeTo " ") xregionWasActive-p) (goto-char xp2) (push-mark xp1) (setq deactivate-mark nil)) (put 'xah-cycle-hyphen-lowline-space 'state (% (+ xnowState 1) xn))) (set-transient-map (let ((xkmap (make-sparse-keymap))) (define-key xkmap (or xah-repeat-key (kbd "DEL")) this-command) xkmap)))