«No-org-babel-execute функция для c» и «no-org-babel-execute функция для c ++»

15

моя версия Emacs - 24.3.1.

я понимаю, что я должен поместить ob-C.el (доступный здесь ) в путь, где Emacs может прочитать его.

Сначала я скопировал код из этого файла .el в мой файл .emacs и перезапустил emacs. затем я пошел в блок кода C (в файле org) и попытался выполнить его (используя Cc Cc). Минибуфер сказал «нет функции org-babel-execute для C». та же самая история разыгрывается при попытке выполнить блок кода C ++. обратите внимание, что R и Python отлично оценивают мои файлы org. проблемы, кажется, только с этими скомпилированными языками.

Затем я попытался поместить этот ob-C.el в каталог ~ / .emacs.d, чтобы понять, помогло ли это. перезапустил emacs и проверил. это не сработало.

Затем я попытался поместить его в каталог ~ / .emacs.d / lisp и добавил следующие строки в мой файл .emacs.

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

после перезапуска emacs оценка блоков кода C или C ++ из файла org по-прежнему не работает. я продолжаю получать ту же ошибку "нет функции org-babel-execute для C" или "нет функции org-babel-execute для C ++".

Обновить

я обновил свою версию emacs до 24.5, удалил все предыдущие подкаталоги elpa и melpa в моем каталоге ~ / .emacs.d. подозревая, что это было связано с порядком, в котором я разместил мой

(custom-set-variables

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

и

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

блоки кода, я помещаю нагрузку "ob-C.el" перед вещью org-babel-load-languages. Затем я выполнил блок кода C ++ несколько раз. неудачно.

затем я удалил все (очистил блок custom-set-variable в файле .emacs), и теперь мой файл .emacs выглядит так

;; 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)))

Его все еще не работает.

Код, который я пытаюсь оценить в буфере Orgmode:

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

Мой буфер сообщений выглядит следующим образом после перезапуска emacs и попытки выполнить вышеуказанный блок кода:

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
Арджун Дж Рао
источник
2
Вы действительно не нужны loadи requireбиты. requireвыполняет загрузку (в случае, если в файле есть provideоператор, что в данном случае и выполняется), но вам также не нужно requireэто делать, потому что он обрабатывается org-babel-do-load-languages, вам необходимо убедиться, что требуется, orgпрежде чем что-либо из этого произойдет. Кроме того, я думаю, что Cнет c, ты пробовал это?
wvxvw
2
о блин ... это сработало! C (не c) и C ++ (не c ++) внутри блока # + BEGIN_SRC - это то, что требовалось после выполнения всех операторов load в правильном порядке. Большое спасибо, человек!
Арджун Дж Рао

Ответы:

22

Вам действительно нужен только этот бит в вашем файле инициализации:

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

Обратите внимание, это столица C. Это позволяет Babel обрабатывать исходные блоки C, C ++ и D.

wvxvw
источник
2
Это не работает до сих пор. Я тоже пытался удалить раннее дерьмо ob-c.el. До сих пор не работает. То же сообщение об ошибке «Нет функции org-babel-execute для c ++»
Arjun J Rao
1
@ArjunJRao Вы оценили код после его добавления? (Это нормально, чтобы оценить это несколько раз). Технически сообщение об ошибке означает, что оно не может найти org-babel-execute:c++функцию, которая будет определена в ob-C.el, но способ сказать Бабелу, что она должна быть загружена, ob-C.elэто вызвать org-babel-do-load-languages.
wvxvw
я обновил свой вопрос.
Арджун Дж Рао