Vim’s ~ in Emacs

2022/11/28

Categories: Emacs Emacs Lisp Tags: Emacs Emacs Lisp

For a bunch of reasons, I recently decided to stop using Vim emulation in Emacs, and switch to a different modal keybinding system. But that’s a topic for another post.

One of the things that Vim does pretty well is bind case change to the tilde key (“~”). Briefly, if the point is on an upper-case character, tilde will make it lower case. If the point is on a lower-case character, tilde will make it upper-case. After a case change, the point advances one character.

I got used to this behavior, and wanted something similar in base Emacs. It’s easy enough to code it up in Emacs lisp, and bind the resulting defun to a key. Here is the elisp to emulate Vim’s ~ in Emacs.:

(defun jth-change-case ()
  "Function to emulate Vim's ~ key in Emacs."
  (interactive)
  (let ((char-at-point (char-after)))
    (delete-char 1)
    (cond
     ((equal (upcase char-at-point) char-at-point)
      (insert (downcase char-at-point)))

     ((equal (downcase char-at-point) char-at-point)
      (insert (upcase char-at-point)))

     (t nil))))

If the point is not on an upper or lower-case character, nothing happens other than the point moving forward by one char.