2010-09-27 7 views
6

Ho appena iniziato a utilizzare emacs, e c'è una caratteristica che mi piacerebbe davvero, e la ricerca intorno un po 'è stato inutile. Spero che qualcun altro l'abbia fatto perché non voglio ancora imparare l'elis.Come si posso ottenere emacs per inserire chiusura bretelle automaticamente

void foo()<cursor> 

desidero digitando un "{" per causare questo accada

void foo(){ 
    <cursor> 
} 

desidero ciò avvenga solo in cc-mode, e solo alla fine di una riga quando non viene una stringa/commento/ecc.

La prima cosa che mi è venuta in mente è stata la riconferma "{" per farlo sempre (ho potuto capire come farlo da solo), ma sarebbe difficile farlo accadere solo al momento giusto.

alcun suggerimento sarebbe apprezzato.

+0

credo che questo sia duplicato della http://stackoverflow.com/questions/1023770/automatically-closing-braces-in-emacs –

+0

ho guardato a questa domanda, ma era solo di aggiungere la parentesi di chiusura/brace/etc. Lo voglio newline due volte, rientro e riposiziono il cursore sulla linea vuota pure – Bwmat

risposta

5

Questo lo farà:

(defun my-c-mode-insert-lcurly() 
    (interactive) 
    (insert "{") 
    (let ((pps (syntax-ppss))) 
    (when (and (eolp) (not (or (nth 3 pps) (nth 4 pps)))) ;; EOL and not in string or comment 
     (c-indent-line) 
     (insert "\n\n}") 
     (c-indent-line) 
     (forward-line -1) 
     (c-indent-line)))) 

(define-key c-mode-base-map "{" 'my-c-mode-insert-lcurly) 
+0

grazie, questo ha funzionato alla grande. – Bwmat

2

Provare yasnippet (o nella pagina Wiki Emacs yasnippet). Ci sono molti pacchetti per Emacs che supportano fanno questo genere di cose, ma yasnippet sembra avere lo slancio attualmente ed è molto estensibile. Guarda i video.

+0

Che sembra davvero bello, lo guarderò io – Bwmat

+0

Questo non sembra essere l'ideale, ho bisogno di premere tab per espanderlo e non funziona se non c'è uno spazio tra il "{" e qualsiasi cosa ci sia prima. – Bwmat

+0

Probabilmente potresti modificare il modello per rimuovere lo spazio. La modifica/creazione di modelli è piuttosto semplice. –

1

Dovrai approfondire emacs-lisp per farlo esattamente come desideri, dal momento che YASnippet farà qualcosa di carino per te ma non esattamente quello che stai chiedendo.

Penso che il modo più semplice per farlo sarebbe quello di associare una funzione alla chiave RET, nella mappa chiave cc-mode.

La funzione dovrebbe controllare che il carattere precedente è un { e in tal caso, eseguire la richiesta RET, RET, TAB, }, Up, TAB per ottenere il cursore dove si desidera e la chiusura } inserito.

è possibile rendere la caratteristica più robusto da averlo verificare la presenza di una chiusura equilibrata }, ma questo sarebbe stato più complicato, e mi consiglia di vedere come ci si sente senza questa caratteristica lucidatura aggiuntiva.

Se ti piace, posso scrivere la funzione e la rilegatura della mappa delle chiavi per te, ma dal momento che hai chiesto un'idea di come è fatto, lascerò a te la richiesta di ulteriore assistenza se ne hai bisogno .

In alternativa, trovo che autopair.el fa bene abbastanza per me, e faccio il newlines me;)

+0

è quello che pensavo. c'è un modo semplice per, all'interno della funzione lisp, controllare se sono in un commento/stringa e se sono alla fine della linea? So che cc-mode lo fa internamente e sarebbe davvero facile se potessi usarlo. – Bwmat

+0

Puoi usare thing-at-point per determinare in che contesto ti trovi. – ocodo

3

vivamente consigliamo di provare l'eccellente autopair modo minore - si fa un sacco più che semplicemente inserire parentesi graffe e rende Emacs molto più IDE come in quell'area. Credo che la combinazione con le parentesi graffe elettrici impostazione in cc-mode vi darà più o meno il comportamento che cercate.

8

sulle ultime emacs è possibile utilizzare:

electric-pair-mode is an interactive compiled Lisp function. 

(electric-pair-mode &optional ARG) 

Automatically pair-up parens when inserting an open paren. 

questo è integrato in Emacs 24.1 (in realtà CVS)

1

Si potrebbe voler mantenere il opzione di un corpo di una funzione vuota, nel qual caso vorrai che la parentesi di chiusura rimanga sulla stessa linea. In questo caso, puoi provare questa soluzione alternativa:

  1. Affidati ai pacchetti citati nelle risposte precedenti per aggiungere automaticamente la parentesi di chiusura.
  2. Quando si desidera aggiungere istruzioni al corpo della funzione, si preme la chiave Return (mentre la parentesi di chiusura aggiunta automaticamente è ancora sotto il cursore). Il tasto 'ritorno' è destinato come segue:

    ;; automatic first line in function            
    (defun my-c-mode-insert-funline() 
        (interactive) 
        (newline-and-indent) 
        (when (looking-at "}") 
        (newline-and-indent) 
        (forward-line -1) 
        (c-indent-line))) 
    (global-set-key (kbd "RET") 'my-c-mode-insert-funline) 
    
2

Accendere elettrico-pair-mode in Emacs 24 o versione più recente.

(electric-pair-mode 1) 
Problemi correlati