แทรกบล็อกแหล่งที่มาอย่างรวดเร็วในโหมดองค์กร


61

org-mode มีความสามารถในการเรนเดอร์ซอร์สโค้ดโดยมีบล็อกของไวยากรณ์ต่อไปนี้:

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

มีคำสั่งที่มีอยู่เพื่อแทรกบล็อกเหล่านี้อย่างรวดเร็วorg-modeหรือฉันจำเป็นต้องใช้เครื่องมือภายนอกเช่นyasnippet?


7
มีสองสามวิธี: (1) เทมเพลต Easy ในตัว (2) การใช้hydraแพคเกจ: บล็อกโพสต์ (3) ตัวอย่างอื่นสำหรับการแทรกบล็อกต้นทางที่ง่าย
Kaushal Modi

หากคุณกำลังวางจาก Emacs, Emacs สามารถกรอกข้อมูลในหลักโหมดและลิงก์ย้อนกลับสำหรับคุณ: github.com/unhammer/org-rich-yank#org-rich-paste
unhammer

คำตอบ:


89

@kaushalmodi กล่าวถึงในความคิดเห็นที่คุณสามารถใช้(org) Easy Templatesเพื่อเพิ่มความเร็วในการแทรกบล็อกประเภทต่าง ๆ

ขั้นตอนโดยทั่วไปคือการแทรก<ตามมาด้วยการเลือกแม่แบบ (มักจะเป็นตัวอักษรเดียว) TABบนบรรทัดว่างอย่างอื่นและกด

ตัวเลือกเทมเพลตสำหรับเทมเพลตบล็อกทั่วไปนั้นคือการsพิมพ์<sตามด้วยTABจะให้สิ่งนี้แก่คุณ:

#+BEGIN_SRC 

#+END_SRC

จุดจะถูกวางตำแหน่งที่ส่วนท้ายของบรรทัดแรก

นี่เป็นการประมาณค่าแรกที่ดีของสิ่งที่คุณต้องการบรรลุ แต่นี่คือ Emacs ดังนั้นมาทำให้ดีขึ้น!

org-structure-template-alistคุณสามารถกำหนดแม่แบบกำหนดเองโดยการเพิ่มหนึ่งหรือมากกว่าหนึ่งรายการให้กับตัวแปรที่เรียกว่า ตัวอย่างเช่น:

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

รหัสนี้เพิ่ม#+NAME:เทมเพลตorg-structure-template-alistโดยใช้nเป็นตัวเลือกเทมเพลต ?หลังจากการขยายจุดแม่แบบนี้จะถูกวางตำแหน่งที่สถานที่ตั้งของ

หากคุณตั้งชื่อบล็อครหัสของคุณเสมอคุณยังสามารถเขียนทับแม่แบบบล็อกต้นฉบับต้นฉบับได้ด้วยเวอร์ชันเพิ่มเติมที่รวม#+NAME:บรรทัดไว้ด้วย:

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

การพิมพ์<sตามด้วยTABจะทำให้คุณ:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

นี่เป็นเพียงส่วนยอดของภูเขาน้ำแข็ง คุณสามารถใช้วิธีที่คล้ายกันเพื่อกำหนดเทมเพลตเพิ่มเติมสำหรับบล็อคโค้ดเฉพาะภาษาบล็อกโค้ดที่มีอาร์กิวเมนต์ส่วนหัวเฉพาะเป็นต้น


2
หมายเหตุ: Easy Template ถูกแทนที่ด้วยวิธีที่เข้ากันไม่ได้ใน HEAD โหมดโหมด ฉันแนะนำให้ใช้ yasnippet
lurdan

@lurdan ยังคงเป็นกรณีนี้หรือไม่? ฉันเพิ่งลองใช้<s TABEmacs 25 บน Mac OS X และดูเหมือนว่าจะใช้งานได้
Rudolf Olah

1
@RudolfOlah ใช่อย่างน้อยก็สำหรับ HEAD mode (git) HEAD แม้จะใช้ emacs26 แล้วโหมด org รวมก็ยังมีorg-try-structure-completionฟังก์ชั่น (สำหรับเทมเพลตอย่างง่าย) แต่อย่างไรก็ตามมันจะถูกแทนที่ด้วยแม่แบบโครงสร้างในอนาคต cf เลย code.orgmode.org/bzg/org-mode/commit/…
lurdan

14

ทำไมไม่เขียนมันด้วยตัวเองล่ะ

(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

ในกล่องของฉัน 99% ของเวลาที่ฉันสร้างบล็อกแหล่งที่มาและ 1% ของเวลาที่ฉันทำทุกอย่างอื่น สำหรับเทมเพลต Easy 1% นั้นสมบูรณ์แบบและสำหรับ 99% ฉันได้รับ YaSnippet แล้ว

  • มันสร้างการNAMEใช้ที่ไม่เหมือนใครorg-idแต่ไม่สำคัญว่าเราจะเป็นอะไร) จากนั้นมันจะถามฉันว่าฉันต้องการใช้ภาษาใดในการ จำกัด ให้สิ่งที่ฉันบอกกับ Org-Mode Literate Programming (babel)
  • แสดงรายการประเภทภาษาที่คุณบอกกับ Org-Mode ว่าคุณต้องการใช้และเลือกแทนที่จะพิมพ์ทุกประเภท (แม้ว่าฉันจะไม่ใช้ทั้งหมด)
  • หากภาษานั้นมีการสร้างไฟล์มันจะถามชื่อไฟล์ที่ส่งออก

นี่คือ YaSnippet พร้อมรหัสสนับสนุนของฉันในตอนท้าย

# -*- 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

มันต้องโหลดเส้นประและโหมดองค์กร

(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))

นี่คือตัวอย่างของฟังก์ชั่น id นี้ของคุณ:

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

ผลลัพธ์ใน

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.