Как установить ярлык для # + BEGIN_SRC # + END_SRC?

14

Я прочитал руководство по режиму org, но не нашел ярлыка для вставки:

#+BEGIN_SRC 
#+END_SRC

Я думаю, мне нужно создать конфигурацию в ~ / .emacs, чтобы установить ярлык? Или есть ярлык но я не знал?

Я много использую R в Emacs. Есть ли способ создать отдельный ярлык для создания этого?

#+BEGIN_SRC R
#+END_SRC
Сяньвэнь Чен
источник

Ответы:

21

Org-mode имеет встроенный механизм вставки исходных блоков. См. Простые шаблоны в руководстве Org. Конфигурация по умолчанию предоставляет шаблоны для ряда # + БЛОКОВ, и вы можете добавить свои собственные, настроив ‘org-structure-template-alist’.

Например, откройте буфер org и введите <sTABтекст, чтобы вставить блок BEGIN / END_SRC.

glucas
источник
13
Для org версии 9.2 это не работает для меня из коробки. Вы должны (require 'org-tempo)добавить в свой .emacs. Кроме того, вот обновленная ссылка на Простые шаблоны -> orgmode.org/manual/Easy-templates.html
JMT2080AD
@ JMT2080AD Org 9.2 представил новую функциональность, которая решает эту проблему. Смотрите мой ответ ниже: emacs.stackexchange.com/a/47370/15177
Lorem Ipsum
Это , i bв spacemacs?
Джейсон Гол
15

[Это дополнение / пояснение к ответам @glucas и @manandearth - оно не само по себе.]

Обратите внимание, что в последних версиях разработки (> = 9.2) режима org (и, следовательно, в будущих стабильных версиях, если что-то не изменится), org-structure-template-alistизменился его тип. Встроенный механизм easy-templates был заброшен в пользу более общего механизма, основанного на tempoпакете. К сожалению, новый механизм допускает только односимвольные сокращения после <, поэтому <sбудет расширен до #+BEGIN_SRC...#+END_SRCстроки, которую запрашивает OP, но такие вещи, как <elв ответе @ manandearth, НЕ будут работать. Это все еще в стадии разработки, поэтому все может измениться, но если вы используете многобуквенные <XXXсокращения, будьте готовы к их поломке при обновлении org-mode до такой версии.

Существует также другой механизм: C-c C-,привязан к тому, org-insert-structure-templateкоторый запрашивает у вас тип блока, который вы хотите вставить (с меню, которое перечисляет все доступные блоки и позволяет выбирать одним нажатием клавиши). Его преимущество заключается в том, что он будет обтекать begin/endобласть, поэтому, если вы уже набрали кучу материала и хотите обернуть его в блок, все, что вам нужно сделать, это выбрать его как область и тип, C-c C-.за которым следует один символ выбрать тип блока.

См. Эту заметку [fn: 1], строку документа (новой) функции org-insert-structure-templateи файл org-tempo.el .

[fn: 1] Ссылка может быть неточной, поскольку она указывает на фиксированный номер строки в файле, который может (нет!) изменится. Если ссылка не приведет вас в нужное место, найдите строку «расширение шаблона структуры» - и не стесняйтесь редактировать этот ответ и исправить номер строки - спасибо!

NickD
источник
12

Поведение исходного блока изменяется в Org 9.2 . Аббревиатура <sбольше не работает по умолчанию. Вместо этого вы используете C-c C-,какие звонки org-insert-structure-template.

Добавление исходного блока

Нажатие C-c C-,вызывает диалог. Нажмите TABи затем введите src R. Это вставит исходный блок и поместит ваш курсор в начало второй строки (пусть |будет точкой ):

#+begin_src R
|#+end_src

Чтобы затем отредактировать внутри блока, нажмите, C-oчтобы открыть новую строку.

Вы можете сохранить шаблон, добавив запись в org-structure-template-alist. Поместите следующее где-нибудь в свой init.elили запустите его используя C-x C-e:

(add-to-list 'org-structure-template-alist '("r" . "src R"))

Теперь, когда вы это сделаете, C-c C-,вы увидите запись для rв списке. Вы можете использовать тот же подход для других языков, таких как Python, Ruby и т. Д. Просто замените cdr в пунктирной паре выше (часть «src R»).

Кроме того, чтобы вставить строку между разделителями исходного блока, вы можете вставить символ новой строки, используя C-q C-j. То есть, типа src R C-q C-jв корд из пунктирной пары выше. Результат будет выглядеть так:

(add-to-list 'org-structure-template-alist '("R" . "src R
"))

Теперь, когда вы нажмете R, Emacs вставит исходный блок и поместит курсор между ними на новой строке (пусть |будет точкой ):

#+begin_src R
|
#+end_src
Лорем Ипсум
источник
4
<sСвязывание все еще существует, нужно просто включить (require org-temp)в вашей инициализации , чтобы включить его.
Тайлер
Исправление (require 'org-tempo)
опечатки
8

для связывания клавиш для блоков кода babel-orgпопробуйте выполнить следующее связывание, <rа затем <tab>:

;; add <r for R expansion
(add-to-list 'org-structure-template-alist
         '("p" "#+BEGIN_SRC r :results output org drawer\n?\n#+END_SRC"
           "<src lang=\"r\">\n?\n</src>"))

Вы также можете изменить источник в ESS.

Чтобы связать, <pа затем с <tab>кодом блока Python, например:

;; add <p for python expansion
(add-to-list 'org-structure-template-alist
         '("p" "#+BEGIN_SRC python :results output org drawer\n?\n#+END_SRC"
           "<src lang=\"python\">\n?\n</src>"))

emacs-lisp, за <elкоторым следует a, <tab>будет:

;; add <el for emacs-lisp expansion
(add-to-list 'org-structure-template-alist
         '("el" "#+BEGIN_SRC emacs-lisp\n?\n#+END_SRC"
           "<src lang=\"emacs-lisp\">\n?\n</src>"))

Другие полезные привязки в org-mode:

(add-to-list 'org-structure-template-alist
         '("ao" "#+attr_org: " ""))

(add-to-list 'org-structure-template-alist
         '("al" "#+attr_latex: " ""))

(add-to-list 'org-structure-template-alist
         '("ca" "#+caption: " ""))

(add-to-list 'org-structure-template-alist
         '("tn" "#+tblname: " ""))

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

(add-to-list 'org-structure-template-alist
         '("o" "#+options: " ""))

(add-to-list 'org-structure-template-alist
         '("ti" "#+title: " ""))
manandearth
источник
Не могли бы вы объяснить немного больше о том, что я мог бы также изменить исходный код для ESS? Спасибо!
Сяньвэнь Чен
Посмотрите на эту ссылку на страницу babel R Я использую ноутбук Python и Jupyter, через einкоторый также должна поддерживать R.
Manandearth
Для org-version> 9.2 синтаксис будет следующим:(add-to-list 'org-structure-template-alist '("p" . "src python"))
ギ ョ ー ム
2

Посмотрите на пакет YASnippet Emacs. Позволяет добавлять фрагменты кода с некоторыми ключевыми словами и вкладку после. Это гораздо проще и полезнее как для режима org, так и для сценариев R. У вас должна быть папка в .emacs.d / snippets / ess-mode (и одна для org-mode), в которой вы сохраняете такие файлы:

    # -*- mode: snippet -*-
    # name: in
    # key: in
    # -- 
    %in% 

Когда вы вводите TAB, он вставляется в% в%, аналогично:

# -*- mode: snippet -*-
# name: source_r
# key: srcr_
# --
#+BEGIN_SRC R 
$0
#+END_SRC

https://www.emacswiki.org/emacs/Yasnippet

https://joaotavora.github.io/yasnippet/snippet-development.html

А. Метель
источник
1

Чтобы добавить новую комбинацию клавиш в режим org, вы можете использовать

(define-key org-mode-map "\C-cs" 
    (lambda()(interactive)(insert "#+BEGIN_SRC R\n#+END_SRC")))

Это вставит строку, если вы нажмете C-cs.

choroba
источник