“ ไม่มีฟังก์ชั่น org-babel-execute สำหรับ c” และ“ no-org-babel-execute ฟังก์ชั่นสำหรับ c ++”


16

เวอร์ชั่น emacs ของฉันคือ 24.3.1

ฉันเข้าใจว่าฉันต้องวาง ob-C.el (หาได้จากที่นี่ ) ในเส้นทางที่ Emacs สามารถอ่านได้

ฉันคัดลอกโค้ดจากไฟล์. el ไปยังไฟล์. emacs ของฉันก่อนแล้วรีสตาร์ท emacs จากนั้นฉันไปที่บล็อกรหัส C (ภายในไฟล์ org) และพยายามเรียกใช้งาน (ใช้ Cc Cc) minibuffer กล่าวว่า 'ไม่มีฟังก์ชั่น 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 ++ หลายครั้ง ไม่มีโชค.

จากนั้นฉันก็ลบทุกอย่าง (ล้างออกชุดบล็อกตัวแปรที่กำหนดเองในไฟล์. 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 คือสิ่งที่ใช้หลังจากทำคำสั่ง 'โหลด' ทั้งหมดในลำดับที่ถูกต้อง ขอบคุณมาก ๆ !
Arjun J Rao

คำตอบ:


23

คุณต้องการเพียงบิตนี้ในไฟล์ init ของคุณ:

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

หมายเหตุ: Cมันเป็นทุน สิ่งนี้ทำให้ Babel ประมวลผลบล็อก C, C ++ และ D


2
มันไม่ทำงานยัง ฉันพยายามลบ ob-c.el crap ก่อนหน้านี้ด้วย ยังไม่ทำงาน ข้อความแสดงข้อผิดพลาดเดียวกัน "ไม่มีฟังก์ชั่น 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

ฉันอัปเดตคำถามของฉัน
Arjun J Rao
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.