org-mode不喜欢c ++ - mode

时间:2013-07-29 13:30:01

标签: emacs org-mode

我正在使用org-mode(Emacs:24.3.1,org-mode: 7.9.3f 8.0.6)来获取不同语言的代码片段数据库(目前为止主要是elisp和python)。使用org-mode-babel工作非常好,即在the documentation中解释创建“代码字段”后,我可以通过发出C-c '使用正确的主模式编辑代码(即{{1 }})。但是,在编辑C ++源代码段时,例如

org-edit-special

错误消息

#+begin_src c++
std::vector<int> v( 100 );
std::iota( std::begin( v ), std::end( v ), 0 ); // Fill with 0, 1, ..., 99.
#+end_src

是固定的(byte-code: Language mode `c++-mode' fails with: "Buffer *Org Src snippets.org[ c++ ]* has no process" 是我用来存储代码段的文件的名称)。此外,我无法保存在临时缓冲区(实际打开)中所做的任何更改,并且无法使用snippets.org退出临时缓冲区。

之前有人遇到过这个问题吗?


更新:我找到了罪魁祸首!自动完成源C-c '负责将其搞砸。我的ac-source-clang-async配置:

ac-clang

评论出来后,一切都很顺利。我假设问题发生是因为(defun ac-cc-mode-clang-setup () (message " * calling ac-cc-mode-clang-setup") (setq ac-clang-complete-executable "~/.emacs.d/site-lisp/emacs-clang-complete-async/clang-complete") (setq ac-clang-cflags (mapcar (lambda (item)(concat "-I" item)) (split-string " /usr/include/c++/4.7 /usr/include/c++/4.7/x86_64-linux-gnu /usr/include/c++/4.7/backward /usr/lib/gcc/x86_64-linux-gnu/4.7/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed /usr/include/x86_64-linux-gnu /usr/include /usr/local/root_v5.32.04/include " ))) (setq ac-clang-flags ac-clang-cflags) ;; (setq ac-sources (append '(ac-source-clang-async ac-source-yasnippet) ac-sources)) (setq ac-sources '(ac-source-filename ac-source-clang-async ac-source-yasnippet)) (ac-clang-launch-completion-process) (ac-clang-update-cmdlineargs)) (defun ac-cc-mode-clang-config () (message " * calling ac-cc-mode-clang-config") (add-hook 'c-mode-common-hook 'ac-cc-mode-clang-setup) (add-hook 'auto-complete-mode-hook 'ac-common-setup)) (ac-cc-mode-clang-config) 想要在源文件上执行clang,这不存在,因为它是一个纯虚拟缓冲区(意思是:没有关联的文件)。但是,我不想在编写程序时失去对使用ac-clang的支持......我认为如果只在我进行真正的C ++编辑时执行ac-clang,这可能会得到解决(不是{{ 1}} c ++编辑)。任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

这对我有用:

#+begin_src C++ :includes '(<vector> <numeric> <iostream>) :flags -std=c++11
  std::vector<int> v( 100 );
  std::iota( std::begin( v ), std::end( v ), 0 );
  std::cout << v[7];
#+end_src

#+RESULTS:
: 7

Emacs 24.3.4。组织8.0.6。

ORG-设置

(org-babel-do-load-languages
 'org-babel-load-languages
  '( (perl . t)
     (ruby . t)
     (sh . t)
     (python . t)
     (emacs-lisp . t)
     (matlab . t)
    (C . t)))

答案 1 :(得分:0)

尝试使用“C ++”(大写C)或“cpp”。也尝试使用最新版本(一周左右)。我认为Eric Sc​​hulte已为此修补了一些内容。

答案 2 :(得分:0)

解决了!这实际上已经是ac-clang-async中的一个错误,它在不久前被修复了。但是,如果您具有配置ac-clang-async的函数,则问题仍然存在,只要执行c-mode-common-hook(或类似的挂钩),就会执行该函数。然后配置过程中断org

如果您希望在打开文件时执行配置过程(即,如果包含路径依赖于某个文件/缓冲区本地变量),则应将配置包装在以下代码段中:

(defun my-ac-clang-config()
  (let ((filename (buffer-file-name)))
    (if filename
      ; Your config stuff
    )
   )
 )