2009-06-21 19 views
23

ho visto un plugin per Vim chiamato AutoClose (scoperto da this post) che aggiunge automaticamente la parentesi di chiusura durante la digitazione '(', '{' eccChiusura automatica delle parentesi graffe in Emacs?

Per esempio, quando si digita il seguente (| è il cursore):

int main(| 

vorrei che la chiusura ) da inserire automaticamente per me:

int main(|) 

qualcuno sa di una sim funzionalità ilar per emacs - Google mi ha fallito questa volta!

risposta

13

C'è anche 'paredit. Lo cheat sheet mostra tutti i comandi disponibili. capita che mi piaccia meglio della modalità elettrica suggerita in un'altra risposta. Sebbene il paredit si applichi solo a(), quindi potrebbe non soddisfare le tue esigenze.

Ma, ad essere onesti, ci sono un sacco di pacchetti che circondano la parentesi. Il wiki li ha tutti listed here. Le modalità di indirizzamento alla tua domanda sono:

+3

Vedi anche http://www.emacswiki.org/emacs/ AutoPairs. –

+0

E se ho bisogno di qualcosa di più ... Molti editor hanno la funzione di chiusura automatica, ad es. tag HTML e inoltre inserire una linea vuota tra loro e fare il rientro corretto. Come posso ottenere questo in emacs? – jesper

+1

@jesper Alcune delle modalità elencate potrebbero già fare ciò che si desidera. Sicuramente la modalità più generale, yasnippet (http://www.emacswiki.org/emacs/Yasnippet) può fare ciò che vuoi. Non è davvero una modalità di bilanciamento tra parentesi, quindi non la aggiungerò alla risposta, ma può fare quello che stai chiedendo. –

15

sì, this mode is called electric. È possibile combinare il comportamento elettrico con questa semplice macro per il massimo confort:

(defun electric-pair() 
    "If at end of line, insert character pair without surrounding spaces. 
    Otherwise, just insert the typed character." 
    (interactive) 
    (if (eolp) (let (parens-require-spaces) (insert-pair)) 
    (self-insert-command 1))) 

quindi attivarlo legando i caratteri appropriate nelle vostre modalità di programmazione preferito. Ad esempio, per PythonMode:

(add-hook 'python-mode-hook 
      (lambda() 
      (define-key python-mode-map "\"" 'electric-pair) 
      (define-key python-mode-map "\'" 'electric-pair) 
      (define-key python-mode-map "(" 'electric-pair) 
      (define-key python-mode-map "[" 'electric-pair) 
      (define-key python-mode-map "{" 'electric-pair))) 

La modalità cperl fornisce questo come un incorporato:

;; from my .emacs 
(add-hook 'cperl-mode-hook 
    (lambda() 
    (setq cperl-hairy nil 
     abbrev-mode t  ;; automatic keyword expansion 
     cperl-highlight-variables-indiscriminately t 
     cperl-auto-newline t 
     cperl-auto-newline-after-colon t 
     cperl-regexp-scan nil 
     cperl-electric-keywords t 
     cperl-electric-linefeed t 
     cperl-electric-parens nil) ;; <------ electric parens! 

Altre modalità potrebbero fornisce qualcosa di simile.

+6

La 'modalità -doppia elettrica' è stata costruita in emacs 24 e può essere usata da' (electric-pair-mode 1) '. [Link] (http://ergoemacs.org/emacs/emacs_insert_brackets_by_pair.html). – liuminzhao

+0

modalità elettrica non chiude virgolette singole e parentesi graffe. Ad ogni modo per abilitarlo? –

+0

Solo M-x personalizza il gruppo 'elettricità' e cerca 'coppie-coppie elettriche'. Ma tieni presente che l'impostazione indipendentemente dalla modalità principale potrebbe essere imprudente, ad esempio in modalità testo, mentre altre modalità principali di solito forniscono la personalizzazione, ad es. La citazione singola di Python funziona come previsto (aggiunge quella finale)). – bubak

5

cmarcelo ha written a wonderful post about this utilizzando la modalità scheletro. Mostra anche come rimuovere la parentesi quadra se si elimina la parentesi di apertura e come gestire il caso in cui si digita accidentalmente la staffa di chiusura. (Per inciso, entrambi i comportamenti copiano TextMate).

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

+1 per l'autopar. –

+0

autopair non chiude virgolette singole e parentesi graffe. Ad ogni modo per abilitarlo? –

+0

@VineetKaushik Dipende dalla modalità in cui si utilizza l'autopar. Funziona bene per me in modalità Python. Forse stai usando una modalità in cui non sono considerate coppie. Puoi dare maggiori dettagli su ciò che stai facendo? – Singletoned

5

Ho intenzione di necro questa discussione e fornire un'altra alternativa. C'è un nuovo progetto avviato di recente che riguarda l'autoinserimento di coppie, l'involucro di regioni, la navigazione attorno a espressioni bilanciate e molto altro ancora.L'elenco delle funzionalità è troppo lungo per essere pubblicato qui, quindi mi limiterò a collegarmi allo smartparens github repo dove puoi leggere readme dettagliato.

È superset della suddetta AutoPair e fornisce la maggior parte delle funzionalità di base di paredit (ed estesa a tutti i tipi di coppie diverse, non solo quelle riconosciute dalle tabelle di sintassi emacs).

Problemi correlati