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

org

#1

各位好,最近为了使用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)))

#2

没有人耶。。。:disappointed:


#3

你的问题有点难

他们一般解决简单的问题


#4

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


#5

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


#6

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


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

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


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

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


#9

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

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


#10

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


#11

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


#12

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


#13

是指的.elc文件么?


#14

是的

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

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

你能做到这个吗?


#15

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


#16

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


#17

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


#18

打开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))
      )))

然后重新编译


#19

在 。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


#20

看看现在行不行

M-x company-clang