Platinum Partner
java,languages,tips and tricks,clojure,emacs

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:

Published at DZone with permission of {{ articles[0].authors[0].realName }}, DZone MVB. (source)

Opinions expressed by DZone contributors are their own.

{{ tag }}, {{tag}},

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}
{{ parent.authors[0].realName || parent.author}}

{{ parent.authors[0].tagline || parent.tagline }}

{{ parent.views }} ViewsClicks
Tweet

{{parent.nComments}}