2012-05-17 4 views
7

Trong Verilog bạn kèm theo khối mã giữa các từ 'bắt đầu' và 'kết thúc' như thế này:Xác định ngoặc đa nhân vật trong Emacs

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

Có cách nào để thiết lập bắt đầu và kết thúc như dấu ngoặc đơn trong Emacs, để bạn có thể sử dụng kiểm tra-parens hoặc tương tự để tìm thấy bất kỳ mà không phù hợp?

Tôi đã cố gắng thêm này (và các biến thể của) vào tập tin ~/emacs của tôi, nhưng nó không thích nó ...

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

Cảm ơn.

+0

Những thứ như thế này thường được xử lý bởi động cơ thụt lề. Bạn có thể sử dụng nó để kiểm tra cú pháp, ví dụ bằng cách đánh dấu toàn bộ bộ đệm và chạy 'indent-region'. Nếu phần cuối của tệp được thụt lề không chính xác, bạn có sự không khớp bắt đầu/kết thúc. – Lindydancer

+0

@Lindydancer cảm ơn, nhưng tôi đang làm việc trên mã đang được chỉnh sửa bởi nhiều người cùng một lúc, tất cả đều sử dụng các trình chỉnh sửa khác nhau và vì vậy các phần khác nhau của mã được thụt lề theo nhiều cách khác nhau. Ngoài ra một số tệp có xu hướng rất dài và việc chọn tất cả 'thụt lề-khu vực' có thể mất một thời gian dài ... – kiteflyingmonkey

+0

Trong trường hợp đó, tôi sẽ đơn giản viết một gói tìm kiếm phù hợp với cặp bắt đầu/kết thúc. Nó không phải là tầm thường, nhưng tôi nghĩ rằng nó sẽ là một bài tập tốt trong elisp, nếu bạn mới vào nó. – Lindydancer

Trả lời

2

Đáng buồn thay, cơ sở hạ tầng phù hợp với dấu ngoặc đơn của Emacs không hiểu nhiều mã thông báo đa ký tự. Thư viện mới SMIE được thêm vào trong Emacs-23.4 là một phần nhằm giải quyết vấn đề này. Nó cho phép các chế độ chính mô tả cú pháp của ngôn ngữ (trong một loại ngữ pháp rất hạn chế) sau đó những thứ như C-M-f và C-M-b sẽ biết cách nhảy qua các phần tử logic, ví dụ: bỏ qua từ số begin đến số end phù hợp của nó. Như LindyDancer lưu ý, những thứ như vậy thường cần thiết cho thụt đầu dòng, và thực sự động lực chính đằng sau SMIE là cung cấp một động cơ thụt đầu dòng chung.

Hiện tại Verilog không sử dụng SMIE nhưng nó thực hiện các lệnh điều hướng tương tự. Vì vậy, bạn có thể có thể thử một cái gì đó giống như

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

Thọ Tôi không biết nếu verilog-forward-sexp sẽ cung cấp cho bạn những cảnh báo thích hợp/lỗi nếu nó đâm sầm vào cuối đệm tại một khoảnh khắc bất ngờ.