2012-05-17 10 views
7

In Verilog racchiudi blocchi di codice tra le parole 'Begin' e 'fine' come questo:Definire parentesi multi-caratteri in Emacs

if(foo) begin 
    x <= 1'b0; 
    y <= 1'b0; 
end else begin 
    x <= x_d; 
    y <= y_d; 
end 

C'è un modo per impostare iniziare e terminare come parentesi a Emacs, in modo da poter utilizzare check-parens o simili per trovare quelli che non corrispondono?

Ho provato ad aggiungere questo (e le variazioni di) al mio file ~/.emacs, ma non piace ...

(modify-syntax-entry ?begin "(end") 
(modify-syntax-entry ?end ")begin") 

Grazie.

+0

In genere, le cose vengono gestite dal motore di indentazione. Potresti usarlo per controllare la sintassi, ad esempio contrassegnando l'intero buffer ed eseguendo 'indent-region'. Se la fine del file è rientrata in modo errato, si verifica una mancata corrispondenza iniziale/finale. – Lindydancer

+0

@Lindydancer ringrazia, ma sto lavorando su un codice che viene modificato da più persone contemporaneamente, il tutto utilizzando editor diversi, e così spesso diverse sezioni del codice sono rientrate in modi diversi. Anche alcuni file tendono ad essere molto lunghi, e la selezione di tutti i 'indent-region' può impiegare molto tempo ... – kiteflyingmonkey

+0

In tal caso, scriverei semplicemente un pacchetto personalizzato trovando coppie iniziali/finali corrispondenti. Non è banale, ma penso che sarebbe un buon esercizio di elisp, se sei nuovo ad esso. – Lindydancer

risposta

2

Purtroppo, l'infrastruttura di corrispondenza tra parentesi di Emacs non comprende gran parte dei token multi-carattere. La nuova libreria SMIE aggiunta in Emacs-23.4 è destinata in parte a risolvere questo problema. Permette alle modalità principali di descrivere la sintassi della lingua (in un tipo molto limitato di grammatica) dopo di che cose come C-M-f e C-M-b sapranno come saltare sopra elementi logici, ad es. saltare da un begin al corrispondente end. Come nota LindyDancer, tali elementi sono solitamente necessari per l'indentazione, e infatti la principale motivazione dietro SMIE era quella di fornire un motore di indentazione generico.

Ora Verilog non utilizza SMIE ma implementa comandi di navigazione simili. Così si potrebbe forse provare qualcosa di simile

(defun sm-verilog-check-parens() 
    (save-excursion 
    (goto-char (point-min)) 
    (while (not (eobp)) 
     (verilog-forward-sexp)))) 

Tho Non so se verilog-forward-sexp vi darà avvertenze appropriate/errori se urta la fine di tampone in un momento inaspettato.

Problemi correlati