Làm thế nào để phát hiện nếu bên trong một cặp phù hợp?


16

Q: có cách nào chung để phát hiện điểm có trong một cặp ký tự trùng khớp hay không?

Đó là: có một hàm vị ngữ chung (hoặc một cái gì đó) có thể xác định xem điểm nằm giữa một cặp khớp hay một số ký tự được chọn tùy ý không? Tôi đang suy nghĩ về một ttình huống sẽ đánh giá trong các tình huống sau đây, với việc !đề cập đến điểm:

"!"   (quotes in general)
``!'' (LaTeX quotes)
$!$   (LaTeX math)
(!)   (lisp parens)
*!*   (org emphasis)

Chỉnh sửa : syntax-ppsscó vẻ là một điểm khởi đầu tốt, nhưng đối với tôi không rõ người ta sẽ điều chỉnh nó như thế nào với các cặp khớp nhiều ký tự (ví dụ: `` LaTeX trích dẫn '', hoặc thậm chí khớp <b>html tags</b>). Tôi tự hỏi nếu có một giải pháp chung, hoặc nếu nó sẽ yêu cầu một trình phân tích cú pháp được xây dựng có mục đích.

Câu trả lời:


16

syntax-ppsscó thể giúp đỡ ở đây Nó trả về một danh sách cũng có các yếu tố này:

  • phần tử 0: độ sâu trong parens
  • phần tử 3: non-nil nếu bên trong một chuỗi

Bạn có thể sử dụng nó như thế này:

(or (> (nth 0 (syntax-ppss)) 0)
    (nth 3 (syntax-ppss)))

Với một bảng cú pháp được thiết lập đúng trong bộ đệm (đối với các chuỗi và parens phù hợp), hàm sẽ làm những gì bạn mong đợi. Nếu việc sử dụng bảng cú pháp của chế độ là không thể, bạn có thể sử dụng with-syntax-table.


Tôi nên chỉ ra rằng chuỗi doc parse-partial-sexpgiải thích cấu trúc dữ liệu được trả về syntax-ppsschi tiết hơn phần thủ công Elisp mà tôi liên kết đến.
paprika

2

Nếu bạn muốn lấy ví dụ để kiểm tra xem giữa các dấu ngoặc nhọn, hãy sử dụng:

(and (looking-back "{") (looking-at "}"))

Chắc chắn, bạn có thể thay thế các dấu ngoặc nhọn bằng bất cứ điều gì bạn muốn.

BIÊN TẬP:

Một chức năng hữu ích hơn sẽ là một cái gì đó gần với điều này:

(defun test-inside-curly-braces ()
 (interactive)
 (when (and (looking-back "{\\(.*?\\)") (looking-at "\\(.*?\\)}"))
  (message "inside curly braces")))

2
Điều đó chỉ hoạt động nếu điểm đang kết thúc }, và không có gì giữa {}. Bắt các dấu phân cách được ghép đúng với biểu thức chính quy có thể khó khăn. Tốt hơn để sử dụng syntax-ppsnhư @paprika đề xuất.
Tyler

@Tyler chỉ hoạt động nếu đóng điểm }không phải là hành vi tôi đã thấy: \ nhưng vâng, lấy các cặp sử dụng biểu thức chính là khó khăn, thực sự
Nsukami _

looking-atkiểm tra văn bản bắt đầu từ điểm trừ khi điểm trên }tuyên bố đầu tiên của bạn ở trên không nên hoạt động? Có lẽ một sự khác biệt giữa các phiên bản Emacs. : /
Tyler
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.