H: làm cách nào để tôi yasnippet
mở rộng chuỗi văn bản một cách chính xác (nhận ra các trường đoạn mã) từ bên trong mã elisp?
Một đoạn rất đơn giản chỉ là một chuỗi các ký tự với một số ký tự điều khiển xen kẽ. Chúng tôi cũng có thể sử dụng các hình thức elisp để tạo các đoạn mã phong phú hơn, nhưng tôi không rõ làm thế nào để mở rộng chúng một cách thích hợp.
Đây là một ví dụ đơn giản nắm bắt được vấn đề. Tôi đang tạo một org-mode
đoạn mã để chèn một bộ xương liên kết, trông giống như vậy [[source][description]]
. Đoạn mã đơn giản sau đây tạo ra hành vi mong muốn "bắt đầu trong trường nguồn, kết thúc trong trường mô tả":
[[$1][$0]]
Chúng ta có thể xen kẽ mã elisp trong đoạn trích (được gói trong `s). Tôi đã nghĩ rằng những điều sau đây sẽ tạo ra chính xác hành vi tương tự như phiên bản đơn giản hơn, bởi vì ý if
chí đơn giản sẽ đánh giá thành [[$1][$0]]
một chuỗi:
`(if t "[[$1][$0]]")`
Nó không làm như vậy, tuy nhiên. Thay vào đó, nó hoạt động như thể $0
và $1
các trường không phải là các trường, kết thúc đoạn mã và đặt điểm sau trận chung kết ]
. Vậy: làm thế nào để có được hành vi mong muốn khi một hình thức elisp đánh giá một chuỗi văn bản với yasnippet
các trường được nhúng trong chuỗi đó?
EDIT: theo yêu cầu, đây là trường hợp sử dụng cụ thể đã truyền cảm hứng cho câu hỏi. Nếu bảng tạm X chứa liên kết url, tôi muốn nó điền vào trường nguồn trong liên kết org ([[ nguồn ] [mô tả]]) và để tôi trong trường đích. Nó sử dụng hàm trợ giúp ( dan-xclipboard-link-p
) trả về url nếu nó tồn tại hoặc nếu không nil
. Dường như với tôi rằng tôi sẽ có thể làm một cái gì đó như thế này:
`(let ((link (dan-xclipboard-link-p)))
(if link
(concat "[[" link "][$0]]")
"[[$1][$0]]"))`
Trong thực tế, với một phiên bản trước đó của yasnippet, một phiên bản của mã này đã hoạt động như tôi dự định.
EDIT 2: Thật thú vị, đoạn trích này hoạt động khi có một liên kết trên bảng tạm X, nhưng không thành công khi không (nghĩa là nó không nhận ra $1
là một trường:
[[`(or (dan-xclipboard-link-p) "$1")`][$0]]
yas-insert-snippet
áp dụng ở đây. Ở bất kỳ giá nào, một trường hợp sử dụng thực tế (được sử dụng để làm việc) hiện đang được đặt ra.
(if t (yas-insert-snippet))
? Bạn có thể đưa ra một điều kiện thực tế hơn để chúng ta có thể hiểu trường hợp sử dụng thực tế? Đây có thể là một vấn đề XY với các giải pháp thanh lịch hơn.