2009-05-11 10 views
7

In Eclipse, modificando il codice Java, se digito un open-paren, ottengo una coppia di parentesi. Se poi "digito" il secondo paren, non inserisce un paren aggiuntivo. Come ottengo quello in emacs?Emacs typeover skeleton-pair-insert-maybe

L'editor di Eclipse è abbastanza intelligente da sapere, quando digito il parison vicino, che sto solo finendo quello che ho iniziato. Il cursore avanza oltre il paren chiuso. Se poi scrivo un punto e virgola, la stessa cosa: sovrascrive appena il punto e virgola, e non ne ottengo due.

In emacs, in java-mode o csharp-mode se collego open-paren a skeleton-pair-insert-maybe, ottengo una coppia paren open-close, che è buona. Ma se poi "digito" il paren vicino, ottengo due parenti ravvicinati.

C'è un modo per insegnare a emacs a non inserire il paren stretto dopo una scheletro-coppia-inserto immediatamente precedente, forse? E se ciò è possibile, che dire di alcune informazioni simili per evitare di raddoppiare il punto e virgola?

Sto chiedendo parents, ma lo stesso vale per virgolette, parentesi graffe, parentesi quadre, ecc. Tutto inserito con scheletro-coppia-insert-forse.

risposta

4

This post mostra come fare ciò che vuoi. Come bonus mostra anche come impostarlo in modo tale che se si esegue immediatamente il backspace dopo il carattere di apertura, verrà eliminato anche il carattere di chiusura dopo il cursore.

Aggiornamento:

da quando ho postato questa risposta, ho scoperto Autopair che è un sistema praticamente perfetto per questo caso d'uso. L'ho usato molto e lo adoro.

+0

semplice, facile . Proprio quello che volevo. – Cheeso

+0

autopair = perfetto. proprio quello che volevo anche io. – yesudeep

1

Io uso la modalità paredit, che fa questo e molto altro.

0

ParEdit suona come se gestisse la parte parentesi del tuo bisogno, con l'avvertenza che è stato progettato per Common Lisp e Scheme. Steve Yegge mentions JDEE for emacs Java development, ma non posso parlare per esperienza personale, e non ho trovato alcuna documentazione su di esso parlando di editing strutturato.

2

Per riassumere quello che ho fatto, ho guardato questo post e preso ciò che volevo. Quello che ho finito è stato più semplice, perché non avevo i requisiti aggiuntivi che aveva.

Ho usato queste due nuove definizioni:

(defvar cheeso-skeleton-pair-alist 
    '((?\) . ?\() 
    (?\] . ?\[) 
    (?" . ?"))) 


(defun cheeso-skeleton-pair-end (arg) 
    "Skip the char if it is an ending, otherwise insert it." 
    (interactive "*p") 
    (let ((char last-command-char)) 
    (if (and (assq char cheeso-skeleton-pair-alist) 
      (eq char (following-char))) 
     (forward-char) 
     (self-insert-command (prefix-numeric-value arg))))) 

E poi nel mio java-mode-hook, ho legato il primo paren e vicino-staffa in questo modo:

(local-set-key (kbd ")") 'cheeso-skeleton-pair-end) 
(local-set-key (kbd "]") 'cheeso-skeleton-pair-end)