Czy org ma jakieś operacje „odwrotnej plątaniny” np. Do współpracy z użytkownikami niebędącymi orgami?

10

Chciałbym pisać własne notatki / testy / kod w org, a następnie używać go org-bable-tangledo tworzenia plików źródłowych. Jednak wszystkie te pliki podlegają kontroli wersji, a zatem mogą ulec zmianie spoza mojego środowiska organizacyjnego.

Chciałbym mieć kilka srcbloków, a następnie splątać kilka różnych plików, z których każdy będzie podlegał kontroli wersji. Ale jednocześnie mogę „rozplątać” każdy z tych plików z powrotem w moim pliku org po usunięciu jakichkolwiek zmian z kontroli wersji.

Czy jest jakiś prosty sposób to zrobić? Zastanawiam się teraz nad grąinsert-file-contents

RJTK
źródło
Czy możesz podać mały przykład tego, o co prosisz? Wygląda na to, że masz bloki kodu w co najmniej jednym pliku org i chcesz, aby plik lub pliki wygenerowane z plątaniny tych bloków rozpadały się na oryginalne bloki ze zmianami w plikach org.
David D.
Zasadniczo przepływ pracy wyglądałby tak: (1) napisz trochę piśmiennego kodu w org. (2) zaplątać ten kod w jeden lub więcej plików. (3) git zatwierdza te pliki. (4) zjedz lunch (5) wyciągnij zmiany mojego kolegi. (6) „inverse-plątanina” te zmiany z powrotem w bloki kodu w moim pliku org. (7) goto (1).
RJTK

Odpowiedzi:

6

Tak to jest org-babel-detangle.

org-babel-detangle to interaktywna skompilowana funkcja Lisp w ob-tangle.el.

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

Propaguj zmiany w oryginalnym pliku źródłowym do pliku Org. Wymaga to splątania bloków kodu z komentarzami linków, które umożliwiają odnalezienie oryginalnych bloków kodu.

Musisz ustawić commentsargument nagłówka, linkaby działał, na przykład

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

następnie użyj M-x org-babel-tangledo wyeksportowania bloku kodu, hello.rbzostanie utworzony nowy plik o nazwie , który powinien mieć podobną zawartość, jak poniżej

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

Wreszcie, otwarty hello.rbw Emacs, zmiany hellodo hello worldi uruchomić M-x org-babel-detanglew hello.rb„s bufora. Plik org zostanie zaktualizowany

#+begin_src ruby :tangle hello.rb :comments link
  puts 'hello world'
#+end_src
Xuchunyang
źródło
Czy możesz być bardziej precyzyjny (lub podać przykład), jak korzystać z tej funkcji org-babel-detangle. Próbowałem z twoim kodem ruby ​​użyć M x org-babel-detangle po splątaniu do hello.rb i lekkiej modyfikacji kodu, ale mam błąd „org-babel-detangle: Nieprawidłowy typ argumentu: stringp, zero”.
Lgen,
@Lgen Zaktualizowałem swoją odpowiedź. I nie zapomnij przeczytać dokumentacji org-babel-detangle, aby zrozumieć cel i sposób użycia.
xuchunyang,
Dziękuję za to wyjaśnienie. Nie zrozumiałem założenia, że ​​kod źródłowy musiał być edytowany w emacsie, aby umożliwić odwrotne splątanie (użyłem innego edytora tekstu do modyfikacji kodu źródłowego). Teraz działa zgodnie z oczekiwaniami.
Lgen,
To fajna funkcja, ale nie do końca to, co chciałem znaleźć. Naprawdę nie mogę dopisać # [[...]] komentarzy, ponieważ nie mają one żadnego znaczenia poza mną. Czy można opatrzyć adnotację blokiem źródłowym w celu rozplątania całego pliku bez konieczności komentarza do linku? Zasadniczo tylko insert-file-contents?
RJTK
2

Istnieje również org-tanglesync , który ma znacznie prostszą metodę synchronizacji niżorg-babel-detangle

Zasadniczo, jeśli blok jest splątany z plikiem zewnętrznym, to za każdym razem, gdy ten blok jest edytowany, sprawdzany jest również plik zewnętrzny, a jeśli wykryto różnicę, użytkownik jest monitowany o odrzucenie lub pobranie zmian zewnętrznych w bloku org src.

Ma również funkcje automatycznego przetwarzania wszystkich splątanych bloków w buforze. Mam nadzieję, że to pomoże.

Mehmet Tekman
źródło