views:

120

answers:

6

I've used XCode and Netbeans, and I've noticed that they have a feature to automatically complete quotation marks or parentheses (and I assume that other IDEs often do this also). I don't know what the name of this feature is, but is there any way to do this in Emacs?

For example, when I type

printf("

I would like it to automatically input

printf("")

placing the cursor in between the quotation marks.

Thank you.

+5  A: 

The basic variant would be AutoPairs. The same effect but a little more sophisticated can also be achieved with YASnippet.

Jacob Oscarson
It seemed like AutoPairs and Paredit are the two popular suggestions, but it looks like AutoPairs is made to integrate well with YASnippet, which is nice for further code-completion.
Bird Jaguar IV
+2  A: 

I'm using code from http://cmarcelo.wordpress.com/2008/04/26/a-little-emacs-experiment/ to do "electric pairs". As I descibe in my blog other modes have problems with Python's triple quoted strings. (A Python peculiarity)

matt harrison
+3  A: 

If you type M-(, that will insert both a ( and a ), and leave point in between; if you then type M-), that will move point across the closing ). I use this all the time.

There is also a mode called "paredit" (available from http://mumble.net/~campbell/emacs/paredit.el) which does this sort of thing for quotes as well, and probably other stuff.

offby1
In my configuraton, `M-)` is bound to `move-past-close-and-reindent`, i.e. it opens up a new line. Is there a possibility to just move past the enclosing parenthese without reindenting?
phimuemue
`M-- C-M-u` might do what you want.
offby1
+2  A: 

Paredit-mode inserts matching closing elements by default, so the while typing you'll see something like printf() then printf("") and the cursor would be positioned inside quotes.

eGlyph
A: 

The autopair minor mode does exactly what you ask for.

Bozhidar Batsov
+2  A: 

My 5 cents here as well.

(setq skeleton-pair t)
(defvar skeletons-alist
  '((?\( . ?\))
    (?\" . ?\")
    (?[  . ?])
    (?{  . ?})
    (?$  . ?$)))

(global-set-key (kbd "(") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "[") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "\"") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "\'") 'skeleton-pair-insert-maybe)

Next advice will enable the backspace to deletes the pairs: a(|)b -> ab

(defadvice delete-backward-char (before delete-empty-pair activate)
  (if (eq (cdr (assq (char-before) skeletons-alist)) (char-after))
      (and (char-after) (delete-char 1))))

Next advice will make backward-kill-word (for me is M-backspace) to delete matching par even if it separated by other text; very handy.

(defadvice backward-kill-word (around delete-pair activate)
  (if (eq (char-syntax (char-before)) ?\()
      (progn
 (backward-char 1)
 (save-excursion
   (forward-sexp 1)
   (delete-char -1))
 (forward-char 1)
 (append-next-kill)
 (kill-backward-chars 1))
    ad-do-it))

I am trying to move now to paredit, though.

VitoshKa
Since Autopairs doesn't seem to automatically delete pairs, this backwards delete pairs advice looks like a great supplement.
Bird Jaguar IV