2012-05-17 6 views
7

In Verilog anbei erhalten Sie Codeblöcke zwischen den Wörtern ‚begin‘ und ‚end‘ wie folgt aus:definieren Mehrzeichen Klammern in Emacs

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

Gibt es eine Möglichkeit, wie Klammern in Emacs beginnen und enden zu setzen, so dass Sie check-parens oder ähnliches verwenden können, um nicht übereinstimmende zu finden?

Ich habe versucht, indem diese (und Variationen) in meiner ~/.emacs-Datei, aber es mag es nicht ...

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

Dank.

+0

Das wird normalerweise von der Einrückungs-Engine gehandhabt. Sie könnten es verwenden, um die Syntax zu überprüfen, indem Sie beispielsweise den gesamten Puffer markieren und eine Einrückungsregion ausführen. Wenn das Ende der Datei falsch eingerückt ist, haben Sie eine Anfangs-/Endübereinstimmung. – Lindydancer

+0

@Lindydancer danke, aber ich arbeite an Code, der von mehreren Personen gleichzeitig bearbeitet wird, alle mit verschiedenen Editoren, und so oft verschiedene Abschnitte des Codes auf verschiedene Arten eingerückt sind. Auch einige der Dateien neigen dazu, sehr lang zu sein, und die Auswahl aller "Einrückung-Region" kann eine lange Zeit dauern ... – kiteflyingmonkey

+0

In diesem Fall würde ich einfach ein benutzerdefiniertes Paket schreiben finden passende Anfangs-/Ende-Paare. Es ist nicht trivial, aber ich denke, es wäre eine gute Übung in elisp, wenn du neu bist. – Lindydancer

Antwort

2

Leider Emacs Klammer Klammerung Infrastruktur nicht viel von Multi-Zeichen-Tokens zu verstehen. Die neue Bibliothek SMIE, die in Emacs-23.4 hinzugefügt wurde, soll dieses Problem teilweise beheben. Es lässt Hauptmodi die Syntax der Sprache (in einer sehr begrenzten Grammatik) beschreiben, nach der Dinge wie C-M-f und C-M-b wissen, wie man über logische Elemente springt, z. Überspringen Sie von einem begin zu seinem passenden end. Wie LindyDancer feststellt, werden solche Dinge normalerweise für die Einrückung benötigt, und die Hauptmotivation hinter SMIE war die Bereitstellung einer generischen Einrückungsmaschine.

Jetzt verwendet Verilog SMIE nicht, aber es implementiert ähnliche Navigationsbefehle. So könnte man wohl so etwas wie

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

Tho Ich weiß nicht, ob verilog-forward-sexp werden Ihnen entsprechende Warnungen geben/Fehler, wenn es in das Ende des Puffers Bumps in einem unerwarteten Moment.

Verwandte Themen