Emacs cedet 语义不会自动完成 scanf 和 malloc 相关函数
有了这个 .emacs 文件,
(load-file "~/Sources/cedet-1.0pre7/common/cedet.el")
(semantic-load-enable-excessive-code-helpers)
;;(semantic-load-enable-semantic-debugging-helpers)
(setq senator-minor-mode-name "SN")
(setq semantic-imenu-auto-rebuild-directory-indexes nil)
(global-srecode-minor-mode 1)
(global-semantic-mru-bookmark-mode 1)
(require 'semantic-decorate-include)
;; gcc setup
(require 'semantic-gcc)
;; smart complitions
(require 'semantic-ia)
(setq-mode-local c-mode semanticdb-find-default-throttle
'(project unloaded system recursive))
(setq-mode-local c++-mode semanticdb-find-default-throttle
'(project unloaded system recursive))
(setq-mode-local erlang-mode semanticdb-find-default-throttle
'(project unloaded system recursive))
(require 'eassist)
;; customisation of modes
(defun alexott/cedet-hook ()
(local-set-key [(control return)] 'semantic-ia-complete-symbol-menu)
(local-set-key "\C-c?" 'semantic-ia-complete-symbol)
;;
(local-set-key "\C-c>" 'semantic-complete-analyze-inline)
(local-set-key "\C-c=" 'semantic-decoration-include-visit)
(local-set-key "\C-cj" 'semantic-ia-fast-jump)
(local-set-key "\C-cq" 'semantic-ia-show-doc)
(local-set-key "\C-cs" 'semantic-ia-show-summary)
(local-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
)
;; (add-hook 'semantic-init-hooks 'alexott/cedet-hook)
(add-hook 'c-mode-common-hook 'alexott/cedet-hook)
(add-hook 'lisp-mode-hook 'alexott/cedet-hook)
(add-hook 'scheme-mode-hook 'alexott/cedet-hook)
(add-hook 'emacs-lisp-mode-hook 'alexott/cedet-hook)
(add-hook 'erlang-mode-hook 'alexott/cedet-hook)
(defun alexott/c-mode-cedet-hook ()
;; (local-set-key "." 'semantic-complete-self-insert)
;; (local-set-key ">" 'semantic-complete-self-insert)
(local-set-key "\C-ct" 'eassist-switch-h-cpp)
(local-set-key "\C-xt" 'eassist-switch-h-cpp)
(local-set-key "\C-ce" 'eassist-list-methods)
(local-set-key "\C-c\C-r" 'semantic-symref)
)
(add-hook 'c-mode-common-hook 'alexott/c-mode-cedet-hook)
;; hooks, specific for semantic
(defun alexott/semantic-hook ()
;; (semantic-tag-folding-mode 1)
(imenu-add-to-menubar "TAGS")
)
(add-hook 'semantic-init-hooks 'alexott/semantic-hook)
(custom-set-variables
'(semantic-idle-scheduler-idle-time 3)
'(semantic-self-insert-show-completion-function (lambda nil (semantic-ia-complete-symbol-menu (point))))
'(global-semantic-tag-folding-mode t nil (semantic-util-modes)))
;(global-semantic-folding-mode)
;; gnu global support
(require 'semanticdb-global)
(semanticdb-enable-gnu-global-databases 'c-mode)
(semanticdb-enable-gnu-global-databases 'c++-mode)
;; ctags
(require 'semanticdb-ectag)
(semantic-load-enable-primary-exuberent-ctags-support)
(global-semantic-idle-tag-highlight-mode 1)
;;; ede customization
(require 'semantic-lex-spp)
(global-ede-mode t)
;; my functions for EDE
(defun alexott/ede-get-local-var (fname var)
"fetch given variable var from :local-variables of project of file fname"
(let* ((current-dir (file-name-directory fname))
(prj (ede-current-project current-dir)))
(when prj
(let* ((ov (oref prj local-variables))
(lst (assoc var ov)))
(when lst
(cdr lst))))))
;; setup compile package
;; TODO: allow to specify function as compile-command
(require 'compile)
(setq compilation-disable-input nil)
(setq compilation-scroll-output t)
(setq mode-compile-always-save-buffer-p t)
(defun alexott/compile ()
"Saves all unsaved buffers, and runs 'compile'."
(interactive)
(save-some-buffers t)
(let* ((r (alexott/ede-get-local-var
(or (buffer-file-name (current-buffer)) default-directory)
'compile-command))
(cmd (if (functionp r) (funcall r) r)))
;; (message "AA: %s" cmd)
(set (make-local-variable 'compile-command) (or cmd compile-command))
(compile compile-command)))
(global-set-key [f9] 'alexott/compile)
;;
(defun alexott/gen-std-compile-string ()
"Generates compile string for compiling CMake project in debug mode"
(let* ((current-dir (file-name-directory
(or (buffer-file-name (current-buffer)) default-directory)))
(prj (ede-current-project current-dir))
(root-dir (ede-project-root-directory prj))
)
(concat "cd " root-dir "; make -j2")))
;;
(defun alexott/gen-cmake-debug-compile-string ()
"Generates compile string for compiling CMake project in debug mode"
(let* ((current-dir (file-name-directory
(or (buffer-file-name (current-buffer)) default-directory)))
(prj (ede-current-project current-dir))
(root-dir (ede-project-root-directory prj))
(subdir "")
)
(when (string-match root-dir current-dir)
(setf subdir (substring current-dir (match-end 0))))
(concat "cd " root-dir "Debug/" "; make -j2")))
;; (concat "cd " root-dir "Debug/" subdir "; make -j3")))
;; Example, Qt customization
;; (setq qt4-base-dir "/usr/include/qt4")
;; (setq qt4-gui-dir (concat qt4-base-dir "/QtGui"))
;; (semantic-add-system-include qt4-base-dir 'c++-mode)
;; (semantic-add-system-include qt4-gui-dir 'c++-mode)
;; (add-to-list 'auto-mode-alist (cons qt4-base-dir 'c++-mode))
;; (add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qconfig.h"))
;; (add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qconfig-large.h"))
;; (add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qglobal.h"))
;;; emacs-rc-cedet.el ends here
(delete-selection-mode t)
其中大部分取自 Alex 的 .emacs
printf 就可以很好地自动完成。 有什么想法吗?
With this .emacs file
(load-file "~/Sources/cedet-1.0pre7/common/cedet.el")
(semantic-load-enable-excessive-code-helpers)
;;(semantic-load-enable-semantic-debugging-helpers)
(setq senator-minor-mode-name "SN")
(setq semantic-imenu-auto-rebuild-directory-indexes nil)
(global-srecode-minor-mode 1)
(global-semantic-mru-bookmark-mode 1)
(require 'semantic-decorate-include)
;; gcc setup
(require 'semantic-gcc)
;; smart complitions
(require 'semantic-ia)
(setq-mode-local c-mode semanticdb-find-default-throttle
'(project unloaded system recursive))
(setq-mode-local c++-mode semanticdb-find-default-throttle
'(project unloaded system recursive))
(setq-mode-local erlang-mode semanticdb-find-default-throttle
'(project unloaded system recursive))
(require 'eassist)
;; customisation of modes
(defun alexott/cedet-hook ()
(local-set-key [(control return)] 'semantic-ia-complete-symbol-menu)
(local-set-key "\C-c?" 'semantic-ia-complete-symbol)
;;
(local-set-key "\C-c>" 'semantic-complete-analyze-inline)
(local-set-key "\C-c=" 'semantic-decoration-include-visit)
(local-set-key "\C-cj" 'semantic-ia-fast-jump)
(local-set-key "\C-cq" 'semantic-ia-show-doc)
(local-set-key "\C-cs" 'semantic-ia-show-summary)
(local-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
)
;; (add-hook 'semantic-init-hooks 'alexott/cedet-hook)
(add-hook 'c-mode-common-hook 'alexott/cedet-hook)
(add-hook 'lisp-mode-hook 'alexott/cedet-hook)
(add-hook 'scheme-mode-hook 'alexott/cedet-hook)
(add-hook 'emacs-lisp-mode-hook 'alexott/cedet-hook)
(add-hook 'erlang-mode-hook 'alexott/cedet-hook)
(defun alexott/c-mode-cedet-hook ()
;; (local-set-key "." 'semantic-complete-self-insert)
;; (local-set-key ">" 'semantic-complete-self-insert)
(local-set-key "\C-ct" 'eassist-switch-h-cpp)
(local-set-key "\C-xt" 'eassist-switch-h-cpp)
(local-set-key "\C-ce" 'eassist-list-methods)
(local-set-key "\C-c\C-r" 'semantic-symref)
)
(add-hook 'c-mode-common-hook 'alexott/c-mode-cedet-hook)
;; hooks, specific for semantic
(defun alexott/semantic-hook ()
;; (semantic-tag-folding-mode 1)
(imenu-add-to-menubar "TAGS")
)
(add-hook 'semantic-init-hooks 'alexott/semantic-hook)
(custom-set-variables
'(semantic-idle-scheduler-idle-time 3)
'(semantic-self-insert-show-completion-function (lambda nil (semantic-ia-complete-symbol-menu (point))))
'(global-semantic-tag-folding-mode t nil (semantic-util-modes)))
;(global-semantic-folding-mode)
;; gnu global support
(require 'semanticdb-global)
(semanticdb-enable-gnu-global-databases 'c-mode)
(semanticdb-enable-gnu-global-databases 'c++-mode)
;; ctags
(require 'semanticdb-ectag)
(semantic-load-enable-primary-exuberent-ctags-support)
(global-semantic-idle-tag-highlight-mode 1)
;;; ede customization
(require 'semantic-lex-spp)
(global-ede-mode t)
;; my functions for EDE
(defun alexott/ede-get-local-var (fname var)
"fetch given variable var from :local-variables of project of file fname"
(let* ((current-dir (file-name-directory fname))
(prj (ede-current-project current-dir)))
(when prj
(let* ((ov (oref prj local-variables))
(lst (assoc var ov)))
(when lst
(cdr lst))))))
;; setup compile package
;; TODO: allow to specify function as compile-command
(require 'compile)
(setq compilation-disable-input nil)
(setq compilation-scroll-output t)
(setq mode-compile-always-save-buffer-p t)
(defun alexott/compile ()
"Saves all unsaved buffers, and runs 'compile'."
(interactive)
(save-some-buffers t)
(let* ((r (alexott/ede-get-local-var
(or (buffer-file-name (current-buffer)) default-directory)
'compile-command))
(cmd (if (functionp r) (funcall r) r)))
;; (message "AA: %s" cmd)
(set (make-local-variable 'compile-command) (or cmd compile-command))
(compile compile-command)))
(global-set-key [f9] 'alexott/compile)
;;
(defun alexott/gen-std-compile-string ()
"Generates compile string for compiling CMake project in debug mode"
(let* ((current-dir (file-name-directory
(or (buffer-file-name (current-buffer)) default-directory)))
(prj (ede-current-project current-dir))
(root-dir (ede-project-root-directory prj))
)
(concat "cd " root-dir "; make -j2")))
;;
(defun alexott/gen-cmake-debug-compile-string ()
"Generates compile string for compiling CMake project in debug mode"
(let* ((current-dir (file-name-directory
(or (buffer-file-name (current-buffer)) default-directory)))
(prj (ede-current-project current-dir))
(root-dir (ede-project-root-directory prj))
(subdir "")
)
(when (string-match root-dir current-dir)
(setf subdir (substring current-dir (match-end 0))))
(concat "cd " root-dir "Debug/" "; make -j2")))
;; (concat "cd " root-dir "Debug/" subdir "; make -j3")))
;; Example, Qt customization
;; (setq qt4-base-dir "/usr/include/qt4")
;; (setq qt4-gui-dir (concat qt4-base-dir "/QtGui"))
;; (semantic-add-system-include qt4-base-dir 'c++-mode)
;; (semantic-add-system-include qt4-gui-dir 'c++-mode)
;; (add-to-list 'auto-mode-alist (cons qt4-base-dir 'c++-mode))
;; (add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qconfig.h"))
;; (add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qconfig-large.h"))
;; (add-to-list 'semantic-lex-c-preprocessor-symbol-file (concat qt4-base-dir "/Qt/qglobal.h"))
;;; emacs-rc-cedet.el ends here
(delete-selection-mode t)
most of which is taken from Alex's .emacs
printf is autocompleted fine.
Any ideas?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当完成失败时要尝试的第一件事是:
看看它说了什么。然后,您可以访问
stdio.h
以查看解析器对该文件的看法。如果您在那里:那么您可以搜索以查看 scanf 是否在那里。如果没有,可能存在解析错误,或者某些杂项 #define 设置不正确。使用上面的内容,您通常可以削减头文件以查看哪里开始出现问题。
根据您的描述,我假设您输入了类似以下内容:
并希望它将扩展为
scanf
。The first thing to try when a completion fails is:
to see what it says. You can then visit
stdio.h
to see what the parser thinks of the file. If while there you do:then you can search to see if scanf is there. If not, there is probably a parsing bug, or some miscellaneous #define that isn't set up correctly. Using the above you can usually whittle away at a header file to see where things start to break down.
Based on your description, I'm assuming you typed in something like:
and was hoping it would expand to
scanf
.