„Bez funkcji org-babel-execute dla c” i „bez funkcji org-babel-execute dla c ++”

16

moja wersja emacsa to 24.3.1.

Rozumiem, że muszę postawić ob-C.el (dostępny tutaj ) na ścieżce, na której Emacs może go przeczytać.

najpierw skopiowałem kod z tego pliku .el do mojego pliku .emacs i zrestartowałem emacsa. potem poszedłem do bloku kodu C (w pliku org) i próbowałem go uruchomić (używając Cc Cc). minibufor powiedział „żadna funkcja org-babel-execute dla C”. ta sama historia rozgrywa się przy próbie wykonania bloku kodu C ++. Zwróć uwagę, że R i Python oceniają doskonale z moich plików org. wydaje się, że problemy dotyczą tylko tych skompilowanych języków.

próbowałem następnie umieścić ten ob-C.el w katalogu ~ / .emacs.d, aby sprawdzić, czy to pomogło. zrestartowałem emacsa i sprawdziłem. to nie działało.

następnie próbowałem umieścić go w katalogu ~ / .emacs.d / lisp i dodałem następujące wiersze do mojego pliku .emacs

(add-to-list 'load-path "~/.emacs.d/lisp/")
(load "ob-C.el")
(require 'ob-C)

po ponownym uruchomieniu emacsa ocena bloków kodu C lub C ++ z pliku org nadal nie działa. ciągle pojawia się ten sam błąd „brak funkcji org-babel-execute dla C” lub „brak funkcji org-babel-execute dla C ++”.

Aktualizacja

zaktualizowałem wersję emacsa do 24.5, usunąłem wszystkie poprzednie podkatalogi elpa i melpa w moim katalogu ~ / .emacs.d. podejrzewając, że ma to związek z kolejnością, w jakiej je umieściłem

(custom-set-variables

'(org-babel-load-languages
(quote
((emacs-lisp . t)
 (C . t)
 (css . t)
 (sh . t)
 (awk . t)
 (R . t))))

i

;; load the pathnames to custom lisp files
(add-to-list 'load-path "~/.emacs.d/lisp/")
(load "ob-C.el")
(require 'ob-C)

bloków kodu, umieszczam ładunek „ob-C.el” przed rzeczą org-babel-load-languages. następnie wykonałem blok kodu c ++ wiele razy. brak szczęścia.

następnie usunąłem wszystko (wyczyściłem blok zmiennych niestandardowych w pliku .emacs) i teraz mój plik .emacs wygląda jak

;; load the pathnames to custom lisp files
(add-to-list 'load-path "~/.emacs.d/lisp/")
(load "ob-C.el")
(require 'ob-C)

;; load the languages that are needed
(org-babel-do-load-languages
'org-babel-load-languages '((C . t)))

To wciąż nie działa.

Kod, który próbuję ocenić w buforze orgmode to:

#+BEGIN_SRC c
printf("Hello world");
#+END_SRC

Bufor My Messages wygląda następująco po ponownym uruchomieniu emacsa i próbie wykonania powyższego bloku kodu:

Loading /home/taeten/.emacs.d/lisp/ob-C.el (source)...done
Wrote /home/taeten/.emacs.d/.emacs.desktop.lock
Desktop: 1 frame, 0 buffers restored.
For information about GNU Emacs and the GNU system, type C-h C-a.
Quit [2 times]
Making completion list... [3 times]
org-babel-execute-src-block: No org-babel-execute function for c! [5   
times]
Ignoring unknown mode `elisp-mode'
File local-variables error: (void-function elisp-mode)
byte-code: Beginning of buffer [6 times]
byte-code: Beginning of buffer
Arjun J Rao
źródło
2
Naprawdę nie potrzebujesz loadi requirebitów. requirewykonuje ładowanie (w przypadku, gdy plik ma provideinstrukcję, co w tym przypadku tak jest), ale nie potrzebujesz również, requireponieważ jest to obsługiwane przez org-babel-do-load-languages, musisz upewnić się, że wymaga tego, orgzanim coś takiego się wydarzy. Poza tym myślę, że Cnie c, próbowałeś tego?
wvxvw
2
o cholera ... zadziałało! C (nie c) i C ++ (nie c ++) w bloku # + BEGIN_SRC było tym, czego wymagało wykonanie wszystkich instrukcji „load” we właściwej kolejności. Dzięki wielkie !
Arjun J Rao

Odpowiedzi:

23

Naprawdę potrzebujesz tylko tego bitu w pliku init:

(org-babel-do-load-languages
 'org-babel-load-languages '((C . t)))

Zauważ, że to stolica C. Umożliwia to Babelowi przetwarzanie bloków źródłowych C, C ++ i D.

wvxvw
źródło
2
To wciąż nie działa. Próbowałem też usunąć wcześniejsze bzdury ob-c.el. Wciąż nie działa. Ten sam komunikat o błędzie „Brak funkcji org-babel-execute dla c ++”
Arjun J Rao
1
@ArjunJRao czy oceniałeś kod po dodaniu go? (Można to oceniać wiele razy). Komunikat o błędzie technicznie oznacza, że ​​nie mógł znaleźć org-babel-execute:c++funkcji, w której zostałby zdefiniowany ob-C.el, ale sposobem, aby powiedzieć Babelowi, że musi się załadować, ob-C.eljest wywołanie org-babel-do-load-languages.
wvxvw
zaktualizowałem moje pytanie.
Arjun J Rao