Masukkan blok sumber dengan cepat dalam mode org

61

org-mode memiliki kemampuan untuk merender kode sumber, dengan blok sintaks berikut:

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

Apakah ada perintah yang ada untuk memasukkan blok-blok ini dengan cepat org-mode, atau apakah saya perlu menggunakan alat eksternal seperti yasnippet?

Matthew Piziak
sumber
7
Ada beberapa cara: (1) Template Mudah bawaan (2) Menggunakan hydrapaket: blogpost (3) Cuplikan lain untuk penyisipan blok sumber org mudah.
Kaushal Modi
Jika Anda menempel dari Emacs, Emacs dapat mengisi mode-utama dan tautan balik untuk Anda: github.com/unhammer/org-rich-yank#org-rich-paste
unhammer

Jawaban:

89

Seperti @kaushalmodi menyebutkan dalam komentar yang dapat Anda gunakan (org) Easy Templatesuntuk mempercepat penyisipan berbagai jenis blok.

Prosedur umum adalah memasukkan <diikuti oleh pemilih template (biasanya satu huruf) pada baris kosong dan tekan TAB.

Selektor templat untuk templat blok sumber umum adalah s, jadi mengetikkan <sdiikuti oleh TABakan memberi Anda ini:

#+BEGIN_SRC 

#+END_SRC

Point akan diposisikan di akhir baris pertama.

Ini adalah perkiraan pertama yang baik dari apa yang ingin Anda capai, tetapi ini adalah Emacs, jadi mari kita membuatnya lebih baik!

Anda dapat menentukan template khusus dengan menambahkan satu atau lebih entri ke variabel yang dipanggil org-structure-template-alist. Sebagai contoh:

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

Kode ini menambahkan #+NAME:templat ke org-structure-template-alist, menggunakan nsebagai templat selektor. Setelah memperluas titik templat ini akan diposisikan di lokasi ?.

Jika Anda selalu memberi nama blok kode Anda, Anda juga bisa menimpa versi asli templat blok sumber dengan versi yang diperluas yang menyertakan #+NAME:baris:

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

Mengetik <sdiikuti oleh TABkemudian akan memberi Anda:

#+NAME: 
#+BEGIN_SRC 

#+END_SRC

Ini hanya puncak gunung es; Anda dapat menggunakan pendekatan serupa untuk menetapkan templat tambahan untuk blok kode khusus bahasa, blok kode dengan argumen header spesifik, dll.

itu hanya
sumber
2
Catatan: Template Mudah diganti dengan cara yang tidak kompatibel dalam HEAD mode-org. Saya merekomendasikan untuk menggunakan yasnippet.
lurdan
@ lurdan apakah ini masih terjadi? Saya baru saja mencoba <s TABEmacs 25 di Mac OS X dan sepertinya berhasil.
Rudolf Olah
1
@RudolfOlah Ya, setidaknya untuk org-mode (git) KEPALA. Bahkan dengan emacs26, bundel org-mode masih memiliki org-try-structure-completionfungsi (untuk templat-Mudah). Tapi bagaimanapun, itu akan digantikan oleh Struktur-template di masa depan. lih. code.orgmode.org/bzg/org-mode/commit/…
lurdan
14

Mengapa tidak menulisnya sendiri?

(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))
  )
Adobe
sumber
6

Di kotak saya 99% dari waktu saya membuat blok sumber dan 1% dari waktu saya melakukan yang lain. Untuk Template Mudah 1% yang sempurna dan untuk 99% saya punya YaSnippet.

  • Itu menciptakan NAMEpenggunaan yang unik org-idtetapi itu tidak masalah sama sekali bagi kami apa pun) dan kemudian ia bertanya kepada saya bahasa apa yang ingin saya gunakan membatasi itu yang saya katakan kepada Org-Mode Literate Programming (babel)
  • Menampilkan daftar jenis bahasa yang Anda beri tahu Org-Mode yang ingin Anda gunakan, dan untuk memilih, alih-alih mengetik setiap jenis (meskipun saya tidak menggunakan semuanya)
  • Jika bahasa harus membuat file, ia akan meminta nama file output

Ini YaSnippet dengan kode pendukung saya di bagian akhir.

# -*- mode: snippet -*-
# key: sc
# name: Source Block
# group: HELP
# contributor: [email protected]
# 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

Ini membutuhkan dash dan mode org dimuat.

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

Berikut adalah contoh dari Anda mungkin fungsi id ini:

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

Hasil dalam

org_gcr_2017-08-06_mara_DD608C9A-33B0-4A8D-9123-298746BE973Anil
Grettke
sumber
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
yixun bian
sumber