Cách chuyển đổi khối mã nguồn chế độ Org thành công: eval no trạng thái


9

Tôi thường giới hạn hoặc bỏ qua việc đánh giá các khối mã cụ thể trong babel chế độ org bằng cách sử dụng :evalđối số tiêu đề.

Đây là một ví dụ:

#+BEGIN_SRC emacs-lisp :results value scalar :eval no
(+ 1 1)
#+END_SRC

#+RESULTS:
: 2

Tôi chuyển các khối mã giữa :eval no:eval n(hoặc xóa :eval nohoàn toàn) bằng tay.

#+PROPERTY: eval no là thuận tiện, nhưng không phù hợp với từng khối mã.

Có cách nào tốt hơn để chuyển :evaltrạng thái tiện dụng, như dưới đây không?

C-c C-t     (org-todo)
Rotate the TODO state of the current item among
(unmarked) -> TODO -> DONE

Câu trả lời:


7

Tôi đã đưa ra một giải pháp tương đối tốt, dựa trên org-in-block-pchức năng, mà tôi khuyên bạn nên xem qua. Thêm mã sau vào init.eltệp của bạn :

(defun org-toggle-src-eval-no ()
  "Will toggle ':eval no' on the src block begin line"

  (defun in-src-block-p ()
    "Returns t when the point is inside a source code block"
    (string= "src" (org-in-block-p '("src"))))

  (defun beginning-src ()
    "Find the beginning of the src block"
    (let ((case-fold-search t)) (search-backward "#+BEGIN_SRC")))

  (defun toggle-eval-no ()
    "Handles the toggling of ' :eval no'"
     (save-excursion
      (end-of-line)
      (let ((case-fold-search t)) (search-backward "#+BEGIN_SRC")
       (if (search-forward " :eval no" (line-end-position) "f")
           (replace-match "")
         (insert " :eval no")
         ))))

  (if (in-src-block-p) (toggle-eval-no)))

(defun add-org-toggle-src-key ()
  (local-set-key (kbd "C-c t") (lambda () (interactive) (org-toggle-src-eval-no))))

(add-hook 'org-mode-hook 'add-org-toggle-src-key)

Điều này xác định chức năng org-toggle-src-eval-novà nó sẽ làm chính xác những gì bạn muốn; bất cứ khi nào bạn ở trong một khối mã, nó sẽ chuyển đổi sự hiện diện của :eval no. Tôi đã ràng buộc nó C-c t, nhưng cứ thoải mái ánh xạ nó tới bất cứ thứ gì bạn thích. Chúc mừng cực khoái.


1
Kinh ngạc! Nó thực sự tuyệt vời! Đây chính xác là những gì tôi muốn! Tôi không mong đợi để có được giải pháp nhanh như vậy. Trong khi đó tôi chỉ nhận thấy một điều tầm thường. Khi tôi có 2 khối mã, nếu tôi bắt đầu một dòng của khối thứ hai # + BEGIN_SRC, thì khối mã đầu tiên sẽ được bật. Có lẽ tôi nên thêm (di chuyển cuối dòng nil) trước cả hai (tìm kiếm ngược "# + BEGIN_SRC")?
RUserPassingBy 11/07/2015

1
Điểm tuyệt vời. Tôi đã cập nhật câu trả lời của mình để đưa vào (end-of-line)trước khi tìm kiếm, điều này sẽ chuyển điểm đến cuối của câu #+BEGIN_SRChỏi nếu bạn đứng trước nó (mà không giới hạn bất kỳ chức năng nào khác). Hãy cho tôi biết nếu bạn vẫn gặp vấn đề.
GJStein

Tôi cảm ơn bạn cho mã của bạn! Nó thực sự tuyệt vời!!
RUserPassingBy 11/07/2015

Cảm ơn rất nhiều. Đã tìm kiếm một chức năng như vậy trong một thời gian dài :)
Thomas Dehaeze
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.