Org modunda kaynak blokları hızla yerleştirin


61

org-mode Aşağıdaki sözdiziminin blokları ile kaynak kodu oluşturma yeteneğine sahiptir:

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

Bu blokları hızlıca eklemek için mevcut bir komut var mı org-mode, yoksa harici bir araç kullanmam gerekiyor yasnippetmu?


7
Birkaç yol var: (1) Dahili Kolay Şablonlar (2) hydraPaketi kullanma : blogpost (3) Kolay kuruluş kaynağı bloğu yerleştirme için başka bir pasaj .
Kaushal Modi

Yanıtlar:


89

@Kaushalmodi'nin dediği gibi (org) Easy Templates, farklı tipte blokların yerleştirilmesini hızlandırmak için kullanabileceğiniz yorumlar .

Genel prosedür, <ardından boş bir satıra bir şablon seçiciyi (genellikle tek bir harf) ekleyip basmaktır TAB.

Genel bir kaynak bloğu şablonu için şablon seçicisidir s; bu nedenle yazarak <sbunu TABsize verir:

#+BEGIN_SRC 

#+END_SRC

Nokta ilk satırın sonuna yerleştirilecektir.

Bu, ulaşmak istediklerinize iyi bir ilk yaklaşımdır, ancak bu Emacs, öyleyse daha iyi hale getirelim!

Özel şablonları, adı verilen bir değişkene bir veya daha fazla giriş ekleyerek tanımlayabilirsiniz org-structure-template-alist. Örneğin:

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

Bu kod , şablon seçicisi olarak kullanarak bir #+NAME:şablon ekler . Genişlettikten sonra bu şablon noktası konumunda konumlanacaktır .org-structure-template-alistn?

Kod bloklarınızı her zaman adlandırırsanız, kaynak blok şablonunun orijinal versiyonunun #+NAME:satırını içeren genişletilmiş bir versiyonun üzerine yazabilirsiniz :

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

Yazmayı <stakiben TABsize:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

Bu buzdağının sadece görünen kısmı; Dile özgü kod blokları, belirli başlık argümanlarına sahip kod blokları, vb. için ek şablon tanımlamak için benzer bir yaklaşım kullanabilirsiniz.


2
Not: Kolay Şablon, org modunda HEAD'de uyumsuz bir yolla değiştirilir. Yasnippet kullanmanızı tavsiye ederim.
lurdan

@lurdan bu hala böyle mi? <s TABMac OS X'te Emacs 25'i denedim ve işe yarayacak gibiydi.
Rudolf Olah

1
@ RudolfOlah Evet, en azından org modu (git) HEAD için. Emacs26 ile bile, birlikte verilen org-mode hala org-try-structure-completionçalışmaktadır (Easy-templates için). Ancak yine de, gelecekte Yapı-şablonlar ile yer değiştirilecektir. bakınız code.orgmode.org/bzg/org-mode/commit/…
lurdan

14

Neden kendin yazmıyorsun?

(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

Kutumda zamanın% 99'unu kaynak bloklar oluşturuyorum ve zamanın% 1'ini her şeyi yapıyorum. % 1 Kolay Şablonlar mükemmel ve% 99 için bir YaSnippet'im var.

  • Bu benzersiz yaratır NAMEkullanarak org-id) ama bu sadece bize bir şey fark etmez) ve daha sonra ana baba günü (ı Org Modlu Okur Programlama anlattı bu olanları sınırlamadan kullanmak istediğiniz dili soruyor
  • Her türü yazmak yerine, kullanmak istediğiniz Org-Mode'a söylediğiniz dil türlerinin bir listesini sunar (her birini kullanmasam da)
  • Dil bir dosya oluşturmak zorundaysa, çıktı dosyasının adını sorar

İşte sonunda destek kodumla birlikte 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

Yüklü çizgi ve org modu gerektirir.

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

İşte bu id işlevi olabilir bir örnek:

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

Sonuçları

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.