Tạo các khối nhận biết giới tính được xác định bởi các từ khóa, không chỉ là dấu ngoặc đơn


10

Trong một ngôn ngữ (julia) đã ngăn chặn được định nghĩa bởi các từ khóa như for..end, begin..endcũng như dấu ngoặc đơn, một cách tốt để bỏ qua một khối như vậy là gì? Ngoài ra, endkhông chỉ là một từ khóa khối, mà còn là một định danh hợp lệ được sử dụng ở những nơi khác.

Một cách là tìm kiếm regex bắt đầu / đóng khối, và bỏ qua tất cả các chuỗi, nhận xét và ends, v.v., nhưng điều này hơi không hiệu quả và hơi xấu.

Có cách nào để làm cho phân tích cú pháp cú pháp riêng của emacs nhận ra các từ khóa khối như vậy, để nó forward/backward-sexptự động hoạt động và để người ta có thể nhanh chóng cho biết sự bắt đầu của khối hiện tại từ đầu ra của, ví dụ như syntax-ppss?

[Lưu ý: Tôi không ngại tự phân tích tệp, nhưng trong trường hợp đó tôi vẫn muốn biết trình phân tích cú pháp của mình nên được cắm vào phần còn lại của emacs như thế nào.]


1
Bạn có thể xem cái ruby-modenào làm một cái gì đó tương tự cho ruby. Một lựa chọn khác là nối vào smartparens , nó có cấu hình đặc biệt cho chế độ ruby mà bạn có thể sử dụng làm điểm bắt đầu
Iqbal Ansari

Câu trả lời:


9

Bạn có thể xem thư viện SMIE tích hợp (viết tắt của Simple-Minded Indentation Engine). Mặc dù tên, thụt lề chỉ là một trong những tính năng mà nó cung cấp. Đây là phương pháp được sử dụng bởi nhiều chế độ (bao gồm ruby-mode, được đề cập trong một bình luận), để cung cấp chuyển động và thụt giới tính.

Triển khai SMIE cho một ngôn ngữ đại khái là một công việc gồm hai bước:

  • xác định ngữ pháp cho ngôn ngữ của bạn, cùng với mã thông báo xác định từ vựng;
  • xác định quy tắc thụt lề.

Đối với mục đích của bạn, chỉ cần bước đầu tiên!

Nhìn chung, trình phân tích cú pháp xác định cách này cắm độc đáo vào emacs. Ví dụ: show-parenssẽ làm nổi bật các biểu thức giống như paren được xác định trong ngữ pháp SMIE (ít nhất là trong các phiên bản emacs đủ gần đây).

Lưu ý rằng bạn vẫn sẽ không thể sử dụng syntax-ppssđể lấy thông tin về môi trường kèm theo, vì nó sẽ chỉ cung cấp cho bạn kết quả của trình phân tích cú pháp bảng cú pháp. Nhưng các chức năng chuyển động của sexp (ví dụ up-listtheo sau backward-sexp) có thể là một sự thay thế.


2

Tôi đã làm một thư viện cho việc này

Sau khi xác định, một loạt các lệnh có sẵn, di chuyển tiến, lùi, sao chép, v.v.

Xác định - trong mã giả--:

(put 'MY-FORM 'beginning-op-at
           (lambda () MY-FORWARD-MOVE-CODE))

(put 'MY-FORM 'end-op-at
     (lambda () MY-BACKWARD-MOVE-CODE))

Khi hoàn thành, nó sẽ có sẵn, tức là sao chép và trả lại như thế này

(defun MY-FORM-atpt (&optional arg)
  " "
  (interactive "p")
  (ar-th 'MY-FORM arg))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.