Heredoc hoặc cú pháp chuỗi đa dòng tương đương trong Elisp?


10

Nói chung, chúng ta có thư viện cl-heredoc , có tương đương trong EmacsLisp không?


Emacs Lisp không có macro người đọc, vì vậy, ngoài đỉnh đầu tôi sẽ nói không, không có. Nhưng có lẽ nếu bạn cũng nói rõ hơn về những gì bạn sẽ làm với những điều này thì có thể có một cách tiếp cận khác.
wvxvw

1
@wvxvw Tôi có thể có thể làm những gì tôi cần với một chuỗi trích dẫn nhiều dòng, chỉ cần thoát khỏi dấu ngoặc kép nội thất là sự khó chịu duy nhất.
ocodo

3
Vâng, chuỗi là multiline trong ELisp. Một cách để xử lý dấu ngoặc kép bên trong dấu ngoặc kép sẽ thông qua một cái gì đó như (format "next word is quoted %S" "word").
wvxvw

@wvxvw Tôi không biết% S đã làm điều đó, tôi sẽ thử. Âm thanh lý tưởng cảm ơn bạn! Làm cho nó một câu trả lời, và tôi sẽ chấp nhận nó.
ocodo

"% S" rất giống với format ~schỉ thị CL (nghĩa là prin1). Vì vậy, nó sẽ in đối số của nó theo cách phù hợp với người đọc, cho các chuỗi sẽ có dấu ngoặc kép.
wvxvw

Câu trả lời:


6

Các chuỗi Lisp thông thường của Emacs có khả năng đa dòng. Bạn chỉ có thể đặt dòng mới trong đó.

Nhìn vào cl-heredoc, có vẻ như những gì bạn đang tìm kiếm là chuỗi "thô". Có một đề xuất để thêm những thứ này vào một lúc trước, nhưng thật không may, nó đã bị từ chối. .


Lần trước, chủ đề về macro người đọc do người dùng định nghĩa xuất hiện, mọi người dường như ủng hộ. Vì vậy, tôi chắc chắn trở ngại duy nhất là nỗ lực của con người.
Malabarba

2

Nếu bạn đang định cấu hình emacs thông qua tệp init.el, bạn có thể muốn xem xét sử dụng init.org thay thế.

Sau đó, bạn có thể sử dụng các cấu trúc như sau:

#+NAME: arbitrary-text
#+begin_src xml
<some>
  <random src="xml">or whatever... includes syntax highlighting!</random>
</some>
#+end_src


#+begin_src emacs-lisp :var arb-text=arbitrary-text
(eval `(defun a-test ()
         (format "whoop there it is: %S" ,arb-text)))
#+end_src

Nếu bạn nhìn vào .eltệp được tạo, bạn sẽ thấy một cái gì đó như:

(let ((arb-text "escaped text here..."))
  (eval `(defun a-test ()
           (format "whoop there it is: %S" ,arb-text))))

Bạn có thể đặt văn bản và mã theo bất kỳ thứ tự nào. Bạn có thể thêm tên vào danh sách Org, bảng, v.v.

Nếu đây là thư viện mà bạn không muốn buộc các cộng tác viên cũng sử dụng 'lập trình biết chữ' thì bạn có thể đặt phần lớn mã vào một .eltệp và tạo .eltệp phụ trợ bằng Org - kiểm tra mã được tạo vào kiểm soát sửa đổi.


3
Có thể tôi đang thiếu một cái gì đó, nhưng tôi không thấy init.org phải làm gì với các chuỗi nhiều dòng.
Malabarba

1
@Malabarba: tl; dr: nếu bạn viết elisp của mình ở chế độ org, bạn có thể làm một cái gì đó gợi nhớ đến heredocs; mặt khác, bạn đã phải thoát một số nội dung bên trong chuỗi ký tự nhiều dòng của mình - chủ yếu là ` and "`, iirc.
SamB

Đây là một cách thú vị xung quanh vấn đề, nhưng hơi quá phức tạp cho các trường hợp của tôi.
ocodo
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.