orgsrc block 中使用 company-clang补全C语言代码失败

各位好,最近为了使用org-drill我安装了org-plus-contrib,org升级到了9.2.6

在使用orgsrc block的时候出现了一点小问题,我使用的是company来对代码进行补全,发现company-clang在新版的orgsrc buffer里不能很正常地补全,但是其他语言的backends都可以很正常地工作。

同时在正常的.C文件中 company-clang可以正常补全唯独在src block中不能

虽然并不是很影响体验,但总觉得有点难受,想问一下各位有没有什么解决方案(也有可能是我没有看org的更新说明)

这个是我目前的状态,M-x company-clang后没有正确补全

这个是我期望的状态

以下是我company的配置

  (global-company-mode 1)                                                                                                                                                                             
  (require 'company-math)                                                                                                                                                                                  
  (setq company-idle-delay 0)                                                                                       
  (setq company-minimum-prefix-length 1)                                                                            
  (setq company-selection-wrap-around t) 

company-backend信息

 '(company-backends
   (quote
    (company-bbdb company-eclim company-semantic company-clang company-xcode company-cmake company-capf company-files
		  (company-dabbrev-code company-gtags company-etags company-keywords)
		  company-oddmuse company-dabbrev company-math-symbols-unicode)))

没有人耶。。。:disappointed:

你的问题有点难

他们一般解决简单的问题

:disappointed_relieved: 也许是我没有表述清楚

我先尝试用其他的C的backends吧,看有没有相同的问题 :sob:

追加了一些图片描述,之前描述的不是很详细,还请大家见谅 :pleading_face:

  1. 首先 src block中没有设置buffer-file-name

    所以company-clang的prefix不能得到数据 进而company-clang不能起作用

  1. 即使我通过org-src-mode-hook给他设置了一个临时文件名之后

    company又会提示出错 An error occur in auto-begin

所以说他不仅仅是company-clang的问题 还和company有关系

我觉得正确的做法是 给company-clang的作者提issue

wow!谢谢你的回复,看来这真的是个挺难的问题。。。 目前来看应该是9.2才有的问题,因为我之前9.1用的时候挺正常的,9.2改了好多东西(苦恼)。 再次感谢!我会及时提交issue! :blush:

你知道 byte-compile-file 是做什么用的吗?

额,不太了解,我还是个小白

是指的.elc文件么?

是的

C-h f company-clang 回车 找到company-clang.el 文件

M-x byte-compile-file 输入 company-clang.el 回车

你能做到这个吗?

我试一试,我之前有课忘记回复了,见谅 :joy:

我刚才删除了原有的.elc文件重新编译了一次成功编译了

目前我找了一个替代方案(irony-mode)使用是正常的,但是他们提供的company-irony这个后端也不太正常 看来您说的对,的确和company-mode本身有点关系 :rofl:

打开company-clang.el


(defsubst company-clang--guess-pch-file (file)
  (let ((dir (directory-file-name (file-name-directory file))))
    (when (equal (file-name-nondirectory dir) "Classes")
      (setq dir (file-name-directory dir)))
    (car (directory-files dir t "\\([^.]h\\|[^h]\\).pch\\'" t))))

替换成


(defsubst company-clang--guess-pch-file (file)
  (let ((f-dir (file-name-directory file))
        )
    (if f-dir
        (let ((dir (directory-file-name f-dir)))
          (when (equal (file-name-nondirectory dir) "Classes")
            (setq dir (file-name-directory dir)))
          (car (directory-files dir t "\\([^.]h\\|[^h]\\).pch\\'" t)))
      (car (directory-files default-directory
                            t "\\([^.]h\\|[^h]\\).pch\\'" t))
      )))

然后重新编译

2 个赞

在 。emacs 的最下面 加入


(defun set-org-src-buffer-name ()
  (interactive)
  (cond
   ((equal major-mode 'c-mode)
    (setq buffer-file-name "temp.c"))

   ))

(add-hook 'org-src-mode-hook 'set-org-src-buffer-name)

保存 然后 重启emacs

1 个赞

看看现在行不行

M-x company-clang

1 个赞