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. The region to work on is by this order: 1. if there is a selection, use that. 2. If cursor is in a string quote or any type of bracket, and is within current line, work on that region. 3. else, work on current line. After this command is called, press `xah-repeat-key' to repeat it. URL `http://xahlee.info/emacs/emacs/elisp_change_space-hyphen_underscore.html' Version: 2019-02-12 2023-07-16 2024-01-04" (interactive) ;; this function sets a property 'state. Possible values are 0 to length of xcharArray. (let (xp1 xp2 xlen (xcharArray ["-" "_" " "]) (xregionWasActive-p (region-active-p)) (xnowState (if (eq last-command this-command) (get 'xah-cycle-hyphen-lowline-space 'state) 0)) xchangeTo) (setq xlen (length xcharArray) 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) xlen)) (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) xlen))) (set-transient-map (let ((xkmap (make-sparse-keymap))) (define-key xkmap (or xah-repeat-key (kbd "DEL")) this-command) xkmap)))