Есть ли в org какие-либо операции «обратной путаницы», например, для сотрудничества с не-пользователями org?

10

Я хотел бы написать свои собственные заметки / тесты / код в org, а затем использовать org-bable-tangleдля создания исходных файлов. Тем не менее, все эти файлы подлежат контролю версий и, следовательно, могут быть изменены вне моей среды org.

Я хотел бы иметь возможность иметь несколько srcблоков, а затем связывать их с кучей разных файлов, каждый из которых будет связан с контролем версий. Но в то же время, можно "распутать" каждый из этих файлов обратно в мой файл org после получения любых изменений из контроля версий.

Есть ли прямой способ сделать это? Сейчас я думаю об игре сinsert-file-contents

RJTK
источник
Не могли бы вы привести небольшой пример того, что вы просите сделать? Похоже, у вас есть кодовые блоки в одном или нескольких файлах org, и вы хотите, чтобы файл или файлы, созданные из путаницы этих блоков, были разобраны на исходные блоки с изменениями в файлах org.
Дэвид Д.
По сути, рабочий процесс будет выглядеть следующим образом: (1) написать некоторый грамотный код в org. (2) связать этот код с одним или несколькими файлами. (3) git передают эти файлы. (4) пообедать (5) мерзавец вытащить изменения моего коллеги. (6) «перевернуть» эти изменения обратно в блоки кода в моем файле org. (7) Перейти (1).
RJTK

Ответы:

6

Да, это так org-babel-detangle.

org-babel-detangle - это интерактивная скомпилированная функция Lisp в ob-tangle.el.

(org-babel-detangle &optional SOURCE-CODE-FILE)

Распространить изменения в исходном файле обратно в исходный файл Org. Это требует, чтобы блоки кода были запутаны с комментариями к ссылкам, которые позволяют найти исходные блоки кода.

Вам нужно установить commentsаргумент заголовка, linkчтобы он работал, например,

#+begin_src ruby :tangle hello.rb :comments link
  puts 'hello'
#+end_src

затем используйте M-x org-babel-tangleдля экспорта блока кода, будет создан новый файл с именем hello.rb, он должен иметь аналогичное содержимое, как показано ниже

~ $ cat hello.rb
# [[file:~/foo.org][No heading:1]]
puts 'hello'
# No heading:1 ends here
~ $

И, наконец, открыт hello.rbв Emacs, изменения helloв hello world, и запустить M-x org-babel-detangleв hello.rbбуфере «s. Org файл будет обновлен

#+begin_src ruby :tangle hello.rb :comments link
  puts 'hello world'
#+end_src
xuchunyang
источник
Не могли бы вы более точно (или привести пример), как использовать эту функцию org-babel-detangle. Я попытался с вашим кодом ruby ​​использовать M x org-babel-detangle после того, как запутался в hello.rb и слегка изменил код, но у меня есть ошибка "org-babel-detangle: Неверный аргумент типа: stringp, nil".
Lgen
@Lgen Я обновил свой ответ. И не забудьте прочитать org-babel-detangleдокументацию, чтобы понять цель и использование.
Сюйчунян
Спасибо за это разъяснение. Я не понимал предположение, что исходный код нужно было редактировать в emacs, чтобы разрешить обратное запутывание (я использовал другой текстовый редактор для изменения исходного кода). Это работает как ожидалось сейчас.
Lgen
Это хорошая особенность, но я не совсем то, что я надеялся найти. Я действительно не могу комментировать # [[...]] комментарии, так как они ничего не значат, кроме меня самого. Можно ли аннотировать исходный блок, чтобы распутать весь файл, не требуя комментария ссылки? По сути просто insert-file-contents?
RJTK
2

Существует также org-tanglesync , который имеет гораздо более простой метод синхронизации, чемorg-babel-detangle

По сути, если блок запутан во внешнем файле, то каждый раз, когда этот блок редактируется, также проверяется внешний файл, и, если обнаруживается разница, пользователю предлагается отклонить или передать внешние изменения в блок org src.

Это также имеет функции для автоматической обработки всех запутанных блоков в буфере. Я надеюсь, что это помогает.

Мехмет Текман
источник