Mam kod elisp, który chciałbym uruchamiać w plikach orgmode podczas ładowania (różne dla różnych plików i zdefiniowane w samym pliku). Czy jest na to sposób? Nic nie widziałem w http://orgmode.org/manual/In_002dbuffer-settings.html
Jeśli mogę dodać coś do inicjowania emacsa, który uruchamia specjalnie nazwany blok kodu za każdym razem, gdy ładuje się plik orgmode, może to być rozwiązanie, ale nie jestem pewien, jak to zrobić, a idealnie jest coś wbudowanego.
# -*- eval: (lisp code here) -*-
ale musisz także zdawać sobie sprawę z niebezpieczeństw. Nawet jeśli nie udostępnisz tych dokumentów innym osobom, interpretacja Emacs Lisp będzie oznaczać, że zmiana może przypadkowo spowodować utratę danych. Ponadto tryb hook wydaje się lepszą opcją, jeśli chcesz uruchomić ten sam kod dla więcej niż jednego pliku.Odpowiedzi:
To rozwiązanie nie wymaga zmiany
init.el
(z niewielkimi modyfikacjami). Wiąże się to jednak z ocenami lokalnymi dla plików - ale dokładnie o to poprosił PO. Zalety rozwiązania to:init.el
pliku orgmode, mogą być udostępniane (zaufanym) użytkownikomPrzeredagowuję tutaj rozwiązanie.
Dodaj blok src gdzieś w swoim pliku:
Następnie umieść to na końcu pliku orgmode:
Dodałem,
(outline-hide-sublevels 1)
ponieważ lubię ukrywać blok src w nagłówku i chcę, aby podpoziomy były ukryte podczas uruchamiania. Bez tego oświadczenia podpoziomy zostaną rozszerzone o(org-babel-goto-named-src-block "startup")
.Dzięki temu rozwiązaniu emacs poprosi 2 razy o pozwolenie na wykonanie (1: zastosuj zmienne lokalne; 2: uruchom blok „startup” -src-block). Ponieważ w moim pliku jest wiele bloków src, ustawiłem inną zmienną lokalną dla pliku
org-confirm-babel-evaluate
, taką jak ta:Ostrzeżenie: Po dodaniu tego emacs poprosi tylko raz o zgodę na wykonanie - wszystkie bloki src w tym pliku mogą być teraz wykonywane bez dalszego potwierdzenia. Jak zauważyli wcześniej inni, takie zachowanie może być niebezpieczne i powinieneś być bardzo ostrożny z tym ustawieniem.
Jednak twierdzę, że to rozwiązanie (szczególnie pierwsza wersja) jest bezpieczniejsze niż to, które podał Joe Corneli, ponieważ przynajmniej zostaniesz poproszony o potwierdzenie wykonania. Rozwiązanie Joe oceni specjalny blok bez potwierdzenia, jeśli zostanie znaleziony w pliku. Osoba atakująca musiałaby odgadnąć nazwę specjalnego bloku, oczywiście ...
Używam tego podejścia do pisania dużych dokumentów, które wymagają np. Dostosowania mechanizmów eksportu organizacji.
źródło
Więc w twoim init.el:
źródło
Ponieważ prosisz
następnie wypróbuj to rozwiązanie .
źródło
Zgadzam się z sugestią @Joe Corneli dotyczącą używania haka.
Przyszło mi też do głowy, że możesz wykorzystać tutaj zakładki: postaw konkretny skok na zakładce. Zaletą zakładki do bloku kodu jest to, że zazwyczaj jest on przenoszony automatycznie (np. Wraz ze zmianą zawartości pliku), więc zlokalizowanie bloku zwykle powinno odbywać się automatycznie.
[Ale nie jest dla mnie jasne, dlaczego masz kod w plikach w trybie Org, a nie gdzie indziej. Przyjmujemy to jako dane rozwiązanie problemu, ale zastanawiam się, dlaczego to robisz. Powiadomienie nas o projekcie w tym zakresie może pomóc w lepszej pomocy.]
źródło
Próbowałem poprawić kod z Joe Corneli:
Potrzebujesz tego w pliku init.el:
Za każdym razem, gdy otworzysz bufor w trybie organizacji, wyszuka blok źródłowy o nazwie startblock, a jeśli zostanie znaleziony, wykona go.
W swoich plikach w trybie org możesz następnie umieścić:
źródło