“Tidak ada fungsi eksekusi-org-babel untuk c” dan “fungsi eksekusi-tanpa-org-babel untuk c ++”

15

versi emacs saya adalah 24.3.1.

saya mengerti saya harus meletakkan ob-C.el (tersedia dari sini ) di jalur di mana Emacs dapat membacanya.

pertama-tama saya menyalin kode dari file .el itu ke file .emacs saya dan me-restart emacs. kemudian saya pergi ke blok kode C (dalam file org) dan mencoba untuk mengeksekusinya (menggunakan Cc Cc). minibuffer mengatakan 'no fungsi org-babel-execute untuk C'. cerita yang sama dimainkan dengan mencoba mengeksekusi blok kode C ++. perhatikan bahwa R dan python mengevaluasi dengan sempurna dari dalam file org saya. masalahnya tampaknya hanya dengan bahasa yang dikompilasi ini.

Saya kemudian mencoba meletakkan ob-C.el ini di dalam direktori ~ / .emacs.d untuk melihat apakah itu membantu. restart emacs dan diperiksa. tidak berhasil.

kemudian saya mencoba memasukkannya ke direktori ~ / .emacs.d / lisp dan menambahkan baris berikut ke file .emacs saya

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

setelah memulai ulang emacs, mengevaluasi blok kode C atau C ++ dari dalam file org masih tidak berfungsi. saya tetap mendapatkan kesalahan yang sama "tidak ada fungsi org-babel-execute untuk C" atau "tidak ada fungsi org-babel-eksekusi untuk C ++"

Memperbarui

saya meningkatkan versi emacs saya ke 24.5, menghapus semua subdirektori elpa dan melpa sebelumnya di direktori ~ / .emacs.d saya. mencurigai itu ada hubungannya dengan urutan di mana saya menempatkan saya

(custom-set-variables

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

dan

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

blok kode, saya meletakkan load "ob-C.el" sebelum org-babel-load-languages. saya kemudian mengeksekusi blok kode c ++ beberapa kali. tidak berhasil.

kemudian saya menghapus semuanya (membersihkan blok variabel set-kustom di file .emacs) dan sekarang file .emacs saya terlihat seperti

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

Itu masih tidak berfungsi.

Kode yang saya coba evaluasi dalam buffer orgmode adalah:

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

Buffer Pesan Saya terlihat seperti ini setelah memulai ulang emacs dan mencoba mengeksekusi blok kode di atas:

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
sumber
2
Anda benar-benar tidak membutuhkan loaddan requirebit. requiretidak memuat (jika file memiliki providepernyataan, yang dalam hal ini memang), tetapi Anda juga tidak memerlukannya requirekarena ini ditangani oleh org-babel-do-load-languages, Anda perlu memastikan untuk meminta orgsebelum semua itu terjadi. Juga, saya pikir Ctidak c, apakah Anda mencobanya?
wvxvw
2
ohh sial ... berhasil! C (bukan c) dan C ++ (bukan c ++) di dalam blok # + BEGIN_SRC adalah apa yang diperlukan setelah melakukan semua pernyataan 'muat' dalam urutan yang benar. Terima kasih banyak kawan!
Arjun J Rao

Jawaban:

22

Anda benar-benar hanya membutuhkan bit ini di file init Anda:

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

Perhatikan itu modal C. Ini memungkinkan Babel untuk memproses blok sumber C, C ++ dan D.

wvxvw
sumber
2
Masih tidak bekerja. Saya mencoba menghapus omong kosong ob-c.el sebelumnya juga. Masih tidak bekerja. Pesan kesalahan yang sama "Tidak ada fungsi org-babel-execute untuk c ++"
Arjun J Rao
1
@ ArjunJRao apakah Anda mengevaluasi kode setelah menambahkannya? (Tidak apa-apa untuk mengevaluasinya beberapa kali). Pesan kesalahan secara teknis berarti bahwa ia tidak dapat menemukan org-babel-execute:c++fungsi, yang akan didefinisikan ob-C.el, tetapi cara untuk memberi tahu Babel bahwa ia perlu memuat ob-C.eladalah dengan menelepon org-babel-do-load-languages.
wvxvw
saya memperbarui pertanyaan saya.
Arjun J Rao