Apakah org memiliki operasi “kusut terbalik” misalnya untuk berkolaborasi dengan pengguna non-org?

10

Saya ingin menulis catatan / tes / kode saya sendiri dalam org dan kemudian gunakan org-bable-tangleuntuk menghasilkan file sumber. Namun, semua file ini tunduk pada kontrol versi dan karenanya dapat berubah dari luar lingkungan org saya.

Saya ingin dapat memiliki sejumlah srcblok dan kemudian kusut ke banyak file yang berbeda, yang masing-masing akan berkomitmen untuk kontrol versi. Tetapi pada saat yang sama, dapat "melepaskan" masing-masing file ini kembali ke file org saya setelah menarik perubahan dari kontrol versi.

Apakah ada cara langsung untuk melakukan ini? Saya sekarang mempertimbangkan untuk bermain dengannyainsert-file-contents

RJTK
sumber
Bisakah Anda memberikan sedikit contoh tentang apa yang Anda minta lakukan? Sepertinya Anda memiliki blok kode dalam satu atau lebih file org dan Anda ingin file atau file yang dihasilkan dari jalinan blok ini untuk dibongkar menjadi blok asli dengan perubahan pada file org.
David D.
Intinya alur kerjanya akan seperti ini: (1) tulis beberapa kode melek dalam org. (2) kusut kode itu ke satu atau lebih file. (3) git melakukan file-file itu. (4) makan siang (5) git pull perubahan kolega saya. (6) "inverse-kusut" perubahan itu kembali menjadi blok kode dalam file org saya. (7) goto (1).
RJTK

Jawaban:

6

Ya itu org-babel-detangle.

org-babel-detangle adalah fungsi Lisp interaktif yang dikompilasi di ob-tangle.el.

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

Menyebarkan perubahan dalam file sumber kembali asli ke file Org. Ini mensyaratkan bahwa blok kode dibelit dengan komentar tautan yang memungkinkan ditemukannya blok kode asli.

Anda perlu mengatur commentsargumen tajuk linkagar berfungsi, misalnya,

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

kemudian gunakan M-x org-babel-tangleuntuk mengekspor blok kode, file baru bernama hello.rbakan dibuat, itu harus memiliki konten yang sama seperti berikut ini

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

Terakhir, buka hello.rbdi Emacs, ubah helloke hello world, dan jalankan M-x org-babel-detangledi hello.rbbuffer. File org akan diperbarui

#+begin_src ruby :tangle hello.rb :comments link
  puts 'hello world'
#+end_src
xuchunyang
sumber
Bisakah Anda lebih tepat (atau memberi contoh) tentang cara menggunakan fungsi org-babel-detangle ini. Saya mencoba dengan kode ruby ​​Anda untuk menggunakan M x org-babel-detangle setelah kusut ke hello.rb dan memodifikasi ringan kode tetapi saya memiliki kesalahan "org-babel-detangle: Argumen tipe yang salah: stringp, nil".
Lgen
@Lgen, saya sudah memperbarui jawaban saya. Dan jangan lupa membaca org-babel-detangledokumen untuk memahami tujuan dan penggunaannya.
xuchunyang
Terima kasih atas klarifikasi ini. Saya tidak mengerti asumsi bahwa kode sumber harus diedit dalam emacs untuk memungkinkan kekusutan terbalik (saya menggunakan editor teks lain untuk memodifikasi kode sumber). Ini berfungsi seperti yang diharapkan sekarang.
Lgen
Ini adalah fitur yang bagus, tetapi tidak seperti yang saya harapkan. Saya tidak dapat benar-benar melakukan komentar # [[...]] karena tidak berarti apa-apa selain saya sendiri. Apakah mungkin untuk membubuhi keterangan blok sumber untuk memisahkan dari seluruh file tanpa memerlukan komentar tautan? Pada dasarnya adil insert-file-contents?
RJTK
2

Ada juga org-tanglesync , yang memiliki metode sinkronisasi yang lebih sederhana daripadaorg-babel-detangle

Pada dasarnya jika suatu blok dirangkai ke file eksternal, maka setiap kali blok itu diedit, file eksternal diperiksa juga, dan jika sebuah diff terdeteksi, pengguna diminta untuk menolak atau menarik perubahan eksternal ke dalam blok org src.

Ini juga memiliki fungsi untuk secara otomatis memproses semua blok kusut dalam buffer. Saya harap ini membantu.

Mehmet Tekman
sumber