【问题标题】:org-mode doesn't like c++-modeorg-mode 不喜欢 c++-mode
【发布时间】:2023-03-04 00:37:02
【问题描述】:

我正在使用org-mode (Emacs: 24.3.1, org-mode: 7.9.3f 8.0.6) 作为不同语言的代码 sn-ps 数据库(目前主要elisp 和 python)。这在使用 org-mode-babel 时效果很好,即按照the documentation 中的说明创建“代码字段”后,我可以通过发出C-c '(即org-edit-special)使用正确的主模式编辑代码。但是,在编辑 C++ 源 sn-ps 如

#+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 是我用来存储 sn-ps 的文件的名称)。此外,我无法保存在临时缓冲区(实际打开)中所做的任何更改,也无法使用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)

评论后,一切正常。我假设问题的发生是因为ac-clang 想要在源文件上执行 clang,因为它是一个纯粹的虚拟缓冲区(意思是:没有关联的文件),所以它不存在。但是,我不想在编写程序时失去对使用ac-clang 的支持......我认为如果ac-cc-mode-clang-config 仅在我进行真正的C++ 编辑(而不是org-mode c++ 编辑)时执行,这可能会解决.任何想法如何解决这个问题?

【问题讨论】:

    标签: emacs org-mode


    【解决方案1】:

    这对我有用:

    #+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-babel-do-load-languages
     'org-babel-load-languages
      '( (perl . t)
         (ruby . t)
         (sh . t)
         (python . t)
         (emacs-lisp . t)
         (matlab . t)
        (C . t)))
    

    【讨论】:

    • 正如我对@fniessen 的回答所写的评论:使用C++(大写C 会产生错误org-edit-src-code: No such language mode: C++-mode。我已将org-mode 更新为8.0.6(作者的最新版本) elpa repo)但仍然没有运气...... :-(
    【解决方案2】:

    尝试使用“C++”(大写 C)或“cpp”。还可以尝试使用最近的版本(一周左右)。我认为 Eric Sc​​hulte 已经为此修补了一些东西。

    【讨论】:

    • 使用C++(大写C):No such language mode: C++-mode,当使用cpp时会打印与之前相同的错误。我以前在网上某处读过它时试过这个。我正在使用melpa 上提供的最新版本,将尝试更新。
    【解决方案3】:

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

    如果您希望在打开文件时执行配置过程(即,如果包含路径依赖于某些文件/缓冲区局部变量),您应该将配置包装在以下 sn-p 中:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多