Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Emacs Lisp: Toggle Between a Clojure String and Keyword

DZone's Guide to

Emacs Lisp: Toggle Between a Clojure String and Keyword

· Java Zone
Free Resource

Learn how to troubleshoot and diagnose some of the most common performance issues in Java today. Brought to you in partnership with AppDynamics.

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:

Understand the needs and benefits around implementing the right monitoring solution for a growing containerized market. Brought to you in partnership with AppDynamics.

Topics:

Published at DZone with permission of Jay Fields, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

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

{{ parent.tldr }}

{{ parent.urlSource.name }}