Có thể sử dụng tệp cấu hình Org-mode biết chữ với tệp Emacs Lisp sao lưu không?


7

Đó là một thực tế phổ biến để viết các tệp cấu hình Emacs bằng cách sử dụng kiểu lập trình biết chữ trong chế độ Org.

Thật không may, trong khi cải thiện khả năng đọc, điều này đi kèm với những bất lợi đáng kể về lập trình. Đặc biệt, vì không có .eltệp sao lưu , Emacs chỉ biết mã trong khối nguồn hiện tại. Điều này có nghĩa là ngoại trừ khối hiện đang được chỉnh sửa, điều hướng, định nghĩa biểu tượng và flycheck đều không khả dụng.

#+BEGIN_SRC emacs-lisp
  (defun literate-but-invisible ()
    (interactive)
    (message "I close my eyes..."))
#+END_SRC

#+BEGIN_SRC emacs-lisp
  (defun humans-can-read-but-emacs-cannot ()
    (interactive)
    (literate-but-invisible) ; No navigation! Flycheck reports undefined symbol!
    (message "...so that the room will be empty"))
#+END_SRC

Có cách nào để bảo Emacs rối và sử dụng .eltệp được tạo để cung cấp các tính năng này trong chế độ Org không? Một tính năng như vậy sẽ cải thiện khả năng duy trì của mã viết tắt Emacs Lisp.

Lưu ý rằng mặc dù nó sẽ là một tính năng tuyệt vời khi thấy Flycheck hoạt động đồng thời cho Org và Emacs Lisp trong một bộ đệm, tôi chỉ hỏi về cách sử dụng org-editbộ đệm (môi trường bạn nhận được khi bạn gọi org-edit-special(thường C-c ')). Điều này sẽ dễ dàng hơn vì chỉ có một chế độ hoạt động cho bộ đệm.

Tôi đã mở một yêu cầu tính năng trên kho lưu trữ Flycheck ở đây và có một số nghiên cứu có liên quan trong một vấn đề khác ở đây . Tuy nhiên, tôi chưa thể xây dựng một giải pháp.


Bạn có thể đánh giá tất cả các khối src elisp khi mở tệp này. thêm một hook trên find-file-hookvv để phát hiện xem mở tập tin org emacs config.
stardiviner

@stardiviner Bạn có sẵn lòng mở rộng nhận xét của mình thành câu trả lời không? Vì tôi không có đủ ngữ cảnh để hiểu giải pháp đề xuất của bạn.
Matthew Piziak

Câu trả lời:


2

Để biết điều hướng và định nghĩa biểu tượng, hãy xem https://github.com/jkitchin/scimax/blob/master/scimax-literate-programming.el

Bạn có thể tạo tệp TAGS bằng thẻ Mx scimax-lp-created-tags.

Sau này, tôi có thể điều hướng đến các định nghĩa hàm với M-. và M-,. Bạn cần làm mới tệp TAGS với chức năng đó khi mọi thứ di chuyển xung quanh và được thêm vào, nhưng có lẽ điều đó có thể được thực hiện trong một móc đệm lưu hoặc một cái gì đó. Cũng lưu ý rằng điều này cung cấp các thẻ liên quan đến tệp org, chứ không phải nơi định nghĩa trong tệp nguồn.

Mx scimax-lp-chữ ký-doc sẽ nhận được một số thông tin về biểu tượng tại điểm nếu nó được xác định trong tệp org.

Tôi đã tìm ra một cách khái niệm để có được flycheck hoạt động trong các khối src trong các tệp org. Ý tưởng là để có một tệp proxy có mã bị rối trong đó, ở cùng một vị trí ký tự (nghĩa là bạn thay đổi tất cả các ký tự khác thành khoảng trắng). Sau đó, hãy để flycheck hoạt động trên tập tin đó. Sau đó, chuyển lớp phủ flycheck từ tệp proxy sang tệp gốc. Bạn thiết lập chức năng hook để cập nhật tệp proxy khi lưu và sau đó cập nhật lớp phủ. Đáng ngạc nhiên, điều này hoạt động khá tốt.

Bạn có thể xem mã tại https://github.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.org .

Đây là những gì một đoạn mã xấu thường trông giống như Trước scimax-ob-flycheck

Sau khi bật chế độ scimax-ob-flycheck-mode, nó trông giống như:

Sau khi bật chế độ scimax-ob-flycheck-mode


Lưu ý rằng đối với một cái gì đó như Flycheck, tôi nghĩ nó sẽ hoàn toàn chấp nhận được nếu nó chỉ hoạt động khi org-editđược gọi. Trong trường hợp đó, sẽ chỉ có một chế độ hoạt động cho bộ đệm. Tôi đã chỉnh sửa câu hỏi của mình để thêm một số sắc thái ở đó.
Matthew Piziak

Tôi đã tạo ra một giải pháp cho việc này tại github.com/jkitchin/scimax/blob/master/scimax-ob-flycheck.org . Nó thực hiện ít nhiều những gì tôi đã nêu ở trên bằng flycheck trên tệp proxy. Có lẽ vẫn còn một số vấn đề trong đó, nhưng nó vẫn hoạt động với tôi cho đến nay!
John Kitchin

Thật là tuyệt vời! Tuy nhiên, tôi gặp khó khăn khi sao chép nó. Tôi đã đưa ra một emacs -q, phụ thuộc được cài đặt, và sau đó chạy (org-babel-load-file "scimax-ob-flycheck.org")theo (scimax-ob-flycheck-mode +1). Tôi không thấy bất kỳ lỗi Flycheck nào khi tôi tạo mã bị hỏng dưới dạng thử nghiệm.
Matthew Piziak

Bạn phải lưu tệp, tệp này sẽ tạo các tệp proxy và sau đó chạy flycheck trong đó sau khi tệp được kiểm tra xong, các lớp phủ sẽ được chuyển. Trong khi tệp org đang mở, cần có một tệp được tạo trong cùng thư mục có phần mở rộng băm md5 và .el, nếu bạn nhìn vào đó, bạn sẽ thấy lớp phủ flycheck ở đó. Nếu không, một cái gì đó khác đang xảy ra. Tôi đã không thử điều này với một emacs / thiết lập vanilla, có lẽ bạn có thể đăng init của mình cho điều đó và tôi có thể thử nó.
John Kitchin

Được rồi. Tôi có thể thấy flychecklớp phủ trong md5-hash.eltập tin. Tuy nhiên tôi không thể thấy bất kỳ sự trùng lặp nào trong scimax-ob-flycheck.org(với scimax-ob-flycheck-modebật), cũng như khi sử dụng org-edit-special.
Matthew Piziak

-2
 (defun org-literate-programming-eval-src-blocks ()
   "Auto evaluate Org buffer all source blocks to get a complete
 project environment when Literate Programming."
   (if (string= (buffer-name) "init.org")
       (org-babel-execute-buffer)))

 (add-hook 'find-file-hook #'org-literate-programming-eval-src-blocks :before)

Mã trên thêm một hàm để đánh giá tất cả các khối nguồn trong bộ đệm khớp với tệp của bạn "init.org". Tên tệp có thể được sửa đổi khi bạn cần.


Tôi sợ điều này không làm gì cả ngoài việc đánh giá các khối và thêm RESULTScác khối. Flycheck vẫn không sử dụng được.
Matthew Piziak

flycheck dường như hoạt động tốt với tôi trong chế độ chỉnh sửa org cho emacs-lisp. Nó không làm gì cho bạn?
John Kitchin

@MatthewPiziak Nếu tất cả các khối nguồn của bạn là các khối emacs-lisp và được đánh giá, thì tất cả các mã elisp của bạn sẽ có sẵn cho Emacs, flycheck sẽ nhận ra điều đó. Ngoài ra, flycheck cũng hoạt động tốt trên khối org-edit-src của tôi.
stardiviner

@JohnKitchin @stardiviner Tôi nhận được emacs-lisp predicate:nil flycheck-verify-setupdo thực tế buffer-file-nameniltrong Org Srcbộ đệm.
Matthew Piziak

Có thể thiết lập buffer-file-namemột tập tin giả tạm thời. Nhưng nếu muốn vô hiệu hóa flycheck tôi nghĩ rằng vô hiệu hóa đó là một giải pháp tốt.
stardiviner
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.