I recently discovered cedit, which provides some structural commands for editing c-like languages. (See this Emacs Rocks! episode if you’re not familiar with the concept: it introduces paredit, a structural editing mode for lisps).

So, it deals with curly braces and semicolons, keeping things balanced and correct as show in its screencast. It mentions that it integrates with paredit rather than duplicating all its functionality. After setting up cedit, I decided to try enabling paredit alongside cedit and disabling autopair. Once I did, however, I noticed an annoying formatting issue: If I were to type foo and then (, paredit would format this as foo (), which makes sense, considering that paredit is written for lisps — s-expressions are usually separated by spaces — but not so much for c-like languages.

I was thinking about disabling paredit and going back to autopair, when I decided to look through the configuration variables for paredit. Turns out it provides paredit-space-for-delimiter-predicates, which is a list of functions that control whether a space should be inserted. So, solving the formatting issue turned out to be pretty simple:

(defun ap/cedit-space-delimiter-p (endp delimiter)
"Don't insert a space before delimiters in c-style modes"
(not cedit-mode))
(add-to-list 'paredit-space-for-delimiter-predicates #'ap/cedit-space-delimiter-p)

Hopefully that saves someone some time if they try to use the two together.