# 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.