Domanda

Ho visto un plugin per Vim chiamato AutoClose (scoperto da questo post) che aggiunge automaticamente la parentesi graffa di chiusura quando si digita '(', '{' ecc.

Ad esempio; quando scrivo quanto segue ( | è il cursore):

int main(|

Vorrei che il ) di chiusura venisse inserito automaticamente per me:

int main(|)

Qualcuno sa di una funzione simile per emacs - Google questa volta mi ha deluso!

È stato utile?

Soluzione

C'è anche 'paredit . Il cheat sheet mostra tutti i comandi disponibili. capita di apprezzarlo meglio della modalità elettrica suggerita in un'altra risposta. Anche se paredit si applica solo a (), quindi potrebbe non soddisfare le tue esigenze.

Ma, ad essere onesti, ci sono un sacco di pacchetti attorno alla parentesi. Il wiki li ha tutti elencati qui . Le modalità per rispondere alla tua domanda sono:

Altri suggerimenti

sì, questa modalità è chiamata elettrica . Puoi 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 abilitalo legando i caratteri appropriati ad esso nelle tue modalità di programmazione preferite. 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 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 fornire qualcosa di simile.

cmarcelo ha scritto un post meraviglioso su questo utilizzando la modalità scheletro. Inoltre, mostra come rimuovere la parentesi bilanciata se si elimina la parentesi aperta e come gestire il caso in cui si digita accidentalmente la parentesi quadra di chiusura. (Per inciso entrambi i comportamenti copiano TextMate).

Aggiornamento:

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

Necro questa discussione e fornirò un'altra alternativa. C'è un nuovo progetto avviato di recente che si occupa di autoinserimento di coppie, avvolgimento di regioni, navigazione attorno a espressioni bilanciate e molto altro ancora. L'elenco delle funzioni è troppo lungo da fornire qui, quindi mi limiterò a collegarmi al smartparens github repo dove puoi leggere il readme dettagliato .

È il superset del summenzionato AutoPair e fornisce la maggior parte delle funzionalità principali di paredit (ed esteso a tutti i tipi di coppie diverse, non solo a quelle riconosciute dalle tabelle di sintassi di emacs).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top