Nhanh chóng chèn các khối nguồn trong chế độ org


61

org-mode có khả năng kết xuất mã nguồn, với các khối cú pháp sau:

#+NAME: <name>
#+BEGIN_SRC <language> <switches> <header arguments>
    <body>
#+END_SRC

Có một lệnh hiện có để nhanh chóng chèn các khối này vào org-modehay tôi cần sử dụng một công cụ bên ngoài như thế yasnippetnào?


7
Có một số cách: (1) Mẫu dễ dàng tích hợp (2) Sử dụng hydragói: blogpost (3) Một đoạn khác để chèn khối nguồn org dễ dàng.
Kaushal Modi

Nếu bạn đang dán từ Emacs, Emacs có thể điền vào chế độ chính và backlink cho bạn: github.com/unhammer/org-rich-yank#org-rich-paste
unhammer 9/2/18

Câu trả lời:


89

Như @kaushalmodi đề cập trong các bình luận bạn có thể sử dụng (org) Easy Templatesđể tăng tốc độ chèn các loại khối khác nhau.

Quy trình chung là chèn <theo sau bởi một bộ chọn mẫu (thường là một chữ cái) trên một dòng trống khác và nhấn TAB.

Bộ chọn mẫu cho mẫu khối nguồn chung là s, do đó, việc nhập <stheo sau TABsẽ cung cấp cho bạn cái này:

#+BEGIN_SRC 

#+END_SRC

Điểm sẽ được định vị ở cuối dòng đầu tiên.

Đây là một xấp xỉ đầu tiên tốt về những gì bạn muốn đạt được, nhưng đây là Emacs, vì vậy hãy làm cho nó tốt hơn!

Bạn có thể xác định các mẫu tùy chỉnh bằng cách thêm một hoặc nhiều mục vào một biến được gọi org-structure-template-alist. Ví dụ:

(add-to-list 'org-structure-template-alist '("n" "#+NAME: ?"))

Mã này thêm một #+NAME:mẫu vào org-structure-template-alist, sử dụng nlàm bộ chọn mẫu. Sau khi mở rộng điểm mẫu này sẽ được định vị tại vị trí của ?.

Nếu bạn luôn đặt tên cho các khối mã của mình, bạn cũng có thể ghi đè lên phiên bản gốc của mẫu khối nguồn với phiên bản mở rộng bao gồm #+NAME:dòng:

(add-to-list 'org-structure-template-alist
             '("s" "#+NAME: ?\n#+BEGIN_SRC \n\n#+END_SRC"))

<stheo sau TABsẽ cung cấp cho bạn:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

Đây chỉ là đỉnh của tảng băng trôi; bạn có thể sử dụng một cách tiếp cận tương tự để xác định các mẫu bổ sung cho các khối mã cụ thể theo ngôn ngữ, các khối mã với các đối số tiêu đề cụ thể, v.v.


2
Lưu ý: Easy Template được thay thế bằng cách không tương thích trong chế độ org. Tôi khuyên bạn nên sử dụng yasnippet.
lurdan

@lurdan đây vẫn là trường hợp? Tôi mới thử <s TABtrên Emacs 25 trên Mac OS X và nó dường như hoạt động.
Rudolf Olah

1
@RudolfOlah Có, ít nhất là cho chế độ org (git) ĐẦU. Ngay cả với emacs26, chế độ org được đóng gói vẫn có org-try-structure-completionchức năng (đối với các mẫu Easy). Nhưng dù sao, nó sẽ được thay thế bởi các mẫu Cấu trúc trong tương lai. xem code.orgmode.org/bzg/org-mode/commit/ từ
lurdan

14

Tại sao không tự viết nó?

(defun org-insert-source-block (name language switches header)
  "Asks name, language, switches, header.
Inserts org-mode source code snippet"
  (interactive "sname? 
slanguage? 
sswitches? 
sheader? ")
  (insert 
   (if (string= name "")
       ""
     (concat "#+NAME: " name) )
   (format "
#+BEGIN_SRC %s %s %s

#+END_SRC" language switches header
)
   )
  (forward-line -1)
  (goto-char (line-end-position))
  )

6

Trên hộp của tôi 99% thời gian tôi đang tạo các khối nguồn và 1% thời gian tôi đang làm mọi thứ khác. Đối với Mẫu dễ dàng 1% là hoàn hảo và 99% tôi đã có YaSnippet.

  • Nó tạo ra một NAMEcách sử dụng duy nhất org-idnhưng điều đó không quan trọng với chúng tôi bất cứ điều gì) và sau đó nó hỏi tôi ngôn ngữ nào tôi muốn sử dụng giới hạn ngôn ngữ mà tôi đã nói với Lập trình văn học Org-Mode (babel)
  • Trình bày danh sách các loại ngôn ngữ mà bạn đã nói với Org-Mode mà bạn muốn sử dụng và chọn, thay vì nhập mọi loại ngôn ngữ (mặc dù tôi không sử dụng tất cả các loại ngôn ngữ đó)
  • Nếu ngôn ngữ phải tạo một tệp, nó sẽ hỏi tên tệp đầu ra

Đây là YaSnippet với mã hỗ trợ của tôi ở cuối.

# -*- mode: snippet -*-
# key: sc
# name: Source Block
# group: HELP
# contributor: gcr@wisdomandwonder.com
# expand-env: ((yas-indent-line 'fixed))
# --
#+NAME: ${1:`(help/org-id-new)`}
#+BEGIN_SRC ${2:$$(let ((langs (sort (-map (lambda (x) (symbol-name (car x))) (if (-contains? org-babel-load-languages '(js . t)) (-snoc org-babel-load-languages '(javascript . t)) org-babel-do-load-languages)) 'string<))) (yas-choose-value (if (-contains? langs "shell") (-snoc langs "sh") langs)))}${2:$(when (-contains? '("ditaa" "dot" "plantuml") yas-text) (concat " :file \\"./image/" (yas-field-value 1) ".png\\""))} $3
$0
#+END_SRC

Nó yêu cầu dash và chế độ org được tải.

(require 'org-id)
(setq org-id-link-to-org-use-id 'nil)
(setq org-id-prefix (concat "org_" (user-real-login-name) "_" (format-time-string "%Y-%m-%d") "_" (system-name)))
(setq org-id-method 'uuid)
(defun help/org-id-new ()
  "Re-purposing `org-id' hit a snag when colons were forbidden in Source-Block
  names. Adding support for a user-defined Org-Id separator would have fixed
  this but with no benefit to Org-Id. So this function removes the colon
  instead.
 "
  (interactive)
  (let* ((gend (org-id-new))
         (newid (replace-regexp-in-string ":" "_" gend)))
    newid))

Dưới đây là một ví dụ về chức năng id của bạn:

C-u M-:
(insert (help/org-id-new))

Kết quả trong

org_gcr_2017-08-06_mara_DD608C9A-33B0-4A8D-9123-298746BE973Anil

2
;;; package --- Summary
;;; Commentary:
;;; Code:
(defvar org-sai-src-default "C++"
 "This is the list used to store the default label for source code section.")

(defun org-insert-src-block ()
  "Insert the source code section in `org-mode'."
  (interactive)
  (let* ((src-code-types
          '("emacs-lisp" "python" "C" "sh" "java" "js" "clojure" "C++" "css"
            "calc" "asymptote" "dot" "gnuplot" "ledger" "lilypond" "mscgen"
            "octave" "oz" "plantuml" "R" "sass" "screen" "sql" "awk" "ditaa"
            "haskell" "latex" "lisp" "matlab" "ocaml" "org" "perl" "ruby"
            "scheme" "sqlite"))
         (src-prompt-str
          (concat "Source code type (default "
                  org-sai-src-default
                  "): "))
         (temp-src-code-types 
          (cons org-sai-src-default src-code-types))
         (src-type-str
          (completing-read src-prompt-str temp-src-code-types
                           nil nil nil nil org-sai-src-default)))
    (setq org-sai-src-default src-type-str))
    (insert (format "#+BEGIN_SRC %s\n" src-type-str))
    (newline)
    (org-indent-line)
    (insert "#+END_SRC\n")
    (forward-line -2))))

(add-hook 'org-mode-hook
          (lambda ()
            ;; keybinding for inserting code blocks
            (local-set-key (kbd "C-c s") 'org-insert-src-block)))

(provide 'orgAuxiliary)
;;; orgAuxiliary.el ends here
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.