"Nenhuma função org-babel-execute para c" e "função não org-babel-execute para c ++"

14

minha versão do emacs é 24.3.1.

Eu entendo que tenho que colocar o ob-C.el (disponível aqui ) em um caminho onde o Emacs possa lê-lo.

Copiei primeiro o código desse arquivo .el para o meu arquivo .emacs e reiniciei o emacs. então eu fui para um bloco de código C (dentro de um arquivo organizacional) e tentei executá-lo (usando Cc Cc). o minibuffer disse 'nenhuma função de org-babel-execute para C'. a mesma história aconteceu ao tentar executar um bloco de código C ++. note que R e python avaliam perfeitamente dentro dos meus arquivos organizacionais. os problemas parecem estar apenas com essas linguagens compiladas.

Eu tentei colocar esse ob-C.el dentro do diretório ~ / .emacs.d para ver se isso ajudou. emacs reiniciado e verificado. não funcionou.

então tentei colocá-lo em um diretório ~ / .emacs.d / lisp e adicionei as seguintes linhas ao meu arquivo .emacs

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

depois de reiniciar o emacs, a avaliação dos blocos de código C ou C ++ a partir de um arquivo organizacional ainda não funciona. Eu continuo recebendo o mesmo erro "nenhuma função org-babel-execute para C" ou "nenhuma função org-babel-execute para C ++".

Atualizar

atualizei minha versão do emacs para 24.5, excluí todos os subdiretórios elpa e melpa anteriores no diretório ~ / .emacs.d. suspeitando que tinha a ver com a ordem em que eu coloquei meu

(custom-set-variables

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

e

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

blocos de código, eu coloquei a carga "ob-C.el" antes da coisa org-babel-load-languages. Em seguida, executei o bloco de código c ++ várias vezes. sem sorte

então eu removi tudo (limpei o bloco de variáveis ​​personalizadas no arquivo .emacs) e agora meu arquivo .emacs se parece

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

Ainda não está funcionando.

O código que estou tentando avaliar em um buffer orgmode é:

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

O buffer do My Messages fica assim após reiniciar o emacs e tentar executar o bloco de código acima:

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
fonte
2
Você realmente não precisa do loade requirepedaços. requirecarrega (no caso de o arquivo ter uma providedeclaração, o que nesse caso é o caso), mas você também não precisa do requireporque isso é tratado org-babel-do-load-languages, você precisa se certificar de exigir isso organtes que isso aconteça. Além disso, acho que Cnão c, você tentou isso?
Wvxvw
2
oh caramba ... funcionou! C (não c) e C ++ (não c ++) dentro do bloco # + BEGIN_SRC foi o que foi necessário depois de ter feito todas as instruções 'load' na ordem correta. Valeu mesmo, cara !
Arjun J Rao

Respostas:

22

Você realmente só precisa desse bit no seu arquivo init:

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

Note que é uma capital C. Isso permite que o Babel processe os blocos de origem C, C ++ e D.

wvxvw
fonte
2
Ainda não está funcionando. Eu tentei remover a porcaria ob-c.el anterior também. Ainda não funciona. Mesma mensagem de erro "Nenhuma função org-babel-execute para c ++"
Arjun J Rao
1
@ArjunJRao você avaliou o código depois de adicioná-lo? (Não há problema em avaliá-lo várias vezes). A mensagem de erro tecnicamente significa que não foi possível encontrar a org-babel-execute:c++função, que seria definida ob-C.el, mas a maneira de informar ao Babel que ele precisa carregar ob-C.elé chamar org-babel-do-load-languages.
Wwxvw 27/10/2015
Eu atualizei minha pergunta.
Arjun J Rao