2009-05-27 8 views
11

Quando si utilizza paredit nelle modalità di programmazione come C, digitando (inserirà uno spazio prima del paren quando sto provando a chiamare una funzione, lasciandomi con:Modifica Paredit formattazione

foo() 

Esiste un modo per disabilitare l'inserimento dello spazio senza modificare la sorgente di paredit?

risposta

13

Bene, il modo in cui paredit sembra funzionare è che controlla le tabelle di sintassi per vedere se stai inserendo una coppia subito dopo una parola/simbolo/ecc., nel qual caso costringe uno spazio da inserire. Devi sovrascrivere quella funzionalità, che può essere fatta in diversi modi: consigli, ridefinire la funzione determinin spazio g, modificare la tabella della sintassi, ecc

mi piacerebbe provare il dritto in avanti:

(defun paredit-space-for-delimiter-p (endp delimiter) 
    (and (not (if endp (eobp) (bobp))) 
     (memq (char-syntax (if endp (char-after) (char-before))) 
      (list ?\" ;; REMOVED ?w ?_ 
        (let ((matching (matching-paren delimiter))) 
        (and matching (char-syntax matching))))))) 

Ciò, ovviamente, si applicano a tutti i luoghi in cui si utilizza paredit. Se desideri qualcosa di più specifico della modalità, puoi aggiungere alcune condizioni a quella dichiarazione and (ad esempio (and ... (memq major-mode '(c-mode lisp-mode)))).

Quindi ... Credo di aver cambiato la "fonte", ma si può fare la stessa cosa con un pezzo di defadvice ... è tutto chiaro, quindi la differenza è minima. Non sembra essere un'impostazione per controllare questo tipo di comportamento.

+2

ho sempre voluto questo per lungo tempo, dal momento che trovo autopair.el _very_ lento. Paredit ora funziona come un incantesimo in 'c-mode'. Grazie! :) –

+0

Per essere specifici della modalità, si può anche scrivere '(defvar-local my-paredit-no-insert-space nil)' e usare '(e ... my-paredit-no-insert-space)' invece di '(e ... (memq major-mode '(c-mode lisp-mode))))' e quindi imposta 'my-paredit-no-insert-space' su' t' da 'c-mode-common- hook'. In questo modo due persone con le preferenze di differenza possono utilizzare la stessa nuova definizione di 'paredit-space-for-delimiter-p' –

+0

' Se vuoi qualcosa di più specifico della modalità, puoi aggiungere alcune condizioni a questo e l'istruzione' - Voglio non sovrascrive questo per alcune modalità, ma non capisco quale istruzione 'if' posso aggiungere alla condizione. Puoi chiarire per favore? – Max

4

Bene, Paredit è ideale per la modifica di lingue basate su espressioni S. Se ti piace come inserisce automaticamente il paren di chiusura, usa la funzione skeleton-pair.

(setq skeleton-pair t) 
(global-set-key "(" 'skeleton-pair-insert-maybe) 
+0

Buon punto. Ho dimenticato la coppia di scheletri. Sono così abituato a Paredit per fare il giro con emacs lisp. Devo configurarlo per le mie lingue non-libere. –

+3

In realtà, la modalità paredit è estremamente utile anche al di fuori dei linguaggi basati sull'espressione s per applicare la validità dei delimitatori corrispondenti; non si tratta solo di inserimento. – technomancy

5

Vedi paredit-space-for-delimiter-predicates

+0

Questo potrebbe essere di interesse in questo senso (potrebbe essere necessario un aggiustamento ai nomi di modalità, o anche la rimozione di "dolist" e una semplice aggiunta di quella "lambda()" al gancio della tua modalità (se si ha una sola modalità)): https://gist.github.com/remvee/879305 – dimsuz