beardc
beardc

Reputation: 21063

Is it possible to auto-complete parentheses or quotation marks in emacs?

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.

Upvotes: 7

Views: 4022

Answers (6)

VitoshKa
VitoshKa

Reputation: 8523

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.

Upvotes: 2

Bozhidar Batsov
Bozhidar Batsov

Reputation: 56595

The autopair minor mode does exactly what you ask for.

Upvotes: 0

eGlyph
eGlyph

Reputation: 1137

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.

Upvotes: 3

offby1
offby1

Reputation: 6983

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.

Upvotes: 3

Matt Harrison
Matt Harrison

Reputation: 1375

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)

Upvotes: 2

Jacob Oscarson
Jacob Oscarson

Reputation: 6393

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

Upvotes: 8

Related Questions