2012-05-17 3 views
7

В Verilog вы заключаете блоки кода между словами «начать» и «конец», как это:Определение нескольких символов скобки в Emacs

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

Есть ли способ, чтобы установить начало и конец, как скобки в Emacs, так что вы можете использовать check-parens или подобное, чтобы найти какие-либо несоответствующие?

Я пытался добавить это (и вариации) в моем файле ~/.emacs, но это не нравится ...

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

Спасибо.

+0

Такие операции, как правило, обрабатываются двигателем вдавливания. Вы можете использовать его для проверки синтаксиса, например, путем маркировки всего буфера и запуска 'indent-region'. Если конец файла имеет неправильный отступ, у вас есть несоответствие начала и конца. – Lindydancer

+0

@ Lindydancer спасибо, но я работаю над кодом, который редактируется несколькими людьми одновременно, причем все используют разные редакторы, поэтому часто разные разделы кода отступают по-разному. Кроме того, некоторые из файлов имеют тенденцию быть очень длинными, и выбор всей области «indent-region» может занять много времени ... – kiteflyingmonkey

+0

В этом случае я бы просто написал собственный пакет, на котором были найдены совпадающие пары начала и конца. Это не тривиально, но я думаю, что это будет хорошее упражнение в elisp, если вы новичок в этом. – Lindydancer

ответ

2

К сожалению, инфраструктура соответствия скобок Emacs не понимает много многосимвольных токенов. Новая библиотека SMIE, добавленная в Emacs-23.4, частично предназначена для решения этой проблемы. Он позволяет основным режимам описывать синтаксис языка (в очень ограниченном виде грамматики), после которого такие вещи, как C-M-f и C-M-b, будут знать, как перепрыгивать через логические элементы, например. перейдите от begin к соответствующему end. Как отмечает LindyDancer, такие вещи обычно необходимы для отступов, и, по сути, главная мотивация SMIE заключалась в предоставлении универсального механизма отступа.

В настоящее время Verilog не использует SMIE, но выполняет аналогичные навигационные команды. Таким образом, вы могли бы, вероятно, попробовать что-то вроде

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

Тхо Я не знаю, если verilog-forward-sexp даст вам соответствующие предупреждения/ошибки, если она врезается в конце буфера в неожиданный момент.