Emacs Lisp: Toggle Between a Clojure String and Keyword
When I was doing a fair bit of Ruby I often used the TextMate's shortcut (Ctrl+:) to convert a Ruby String to a Symbol or a Ruby Symbol to a String. It's something I've periodically missed while doing Clojure, and yesterday I found myself in the middle of a refactoring that was going to force the conversion of 5+ Clojure Keywords to Strings.
The following emacs lisp is my solution for toggling between Clojure Strings and Keywords. The standard disclaimers apply - it works on my machine, and I've never claimed to know emacs lisp well.
(defun char-at-point () (interactive) (buffer-substring-no-properties (point) (+ 1 (point)))) (defun clj-string-name (s) (substring s 1 -1)) (defun clj-keyword-name (s) (substring s 1)) (defun delete-and-extract-sexp () (let* ((begin (point))) (forward-sexp) (let* ((result (buffer-substring-no-properties begin (point)))) (delete-region begin (point)) result))) (defun toggle-clj-keyword-string () (interactive) (save-excursion (if (equal 1 (point)) (message "beginning of file reached, this was probably a mistake.") (cond ((equal "\"" (char-at-point)) (insert ":" (clj-string-name (delete-and-extract-sexp)))) ((equal ":" (char-at-point)) (insert "\"" (clj-keyword-name (delete-and-extract-sexp)) "\"")) (t (progn (backward-char) (toggle-keyword-string))))))) (global-set-key (kbd "C-:") 'toggle-clj-keyword-string)
A quick video of the behaviour: