semantic功能介绍
1,代码自动补全
3,代码导航
启动semantic功能:(semantic-mode 1)
1,Semantic mode 是辅助模式,当这个模式启动了,你打开的每个缓冲区是否会被Semantic mode解析,取决于变量【semantic-new-buffer-setup-functions】,在被解析过的缓冲区里就可以使用semantic提供的函数来完成,代码跳转,查询等。
2,当启动Semantic mode 后,会自动启动一些全局的辅助模式,可以用变量【semantic-default-submodes 】,来决定启动哪些辅助模式。默认被启动的全局的辅助模式是【SemanticDB mode】,【 Global Semantic Idle Scheduler mode 】;当然也可以通过执行函数来手动启动这些辅助模式。在【Development】menu下,也可以找到这些辅助模式。
3,变量【semantic-new-buffer-setup-functions】是一个alist,它的默认值如下。也就是说当打开c,c++,java,js等后缀名的文件,semantic会自动解析这些缓冲区。当然可以添加或者删除主编辑模式到这个alist里。
- c-mode
- c++-mode
- html-mode
- java-mode
- js-mode
- python-mode
4,变量【semantic-default-submodes】是一个alist,它的默认值是【SemanticDB mode】,【 Global Semantic Idle Scheduler mode 】。
下面的值也可以添加到semantic-default-submodes】里。
global-semanticdb-minor-mode’ - Maintain tag database.
global-semantic-idle-scheduler-mode’ - Reparse buffer when idle.
global-semantic-idle-summary-mode’ - Show summary of tag at point.
global-semantic-idle-completions-mode’ - Show completions when idle.
global-semantic-decoration-mode’ - Additional tag decorations.
global-semantic-highlight-func-mode’ - Highlight the current tag.
global-semantic-stickyfunc-mode’ - Show current fun in header line.
global-semantic-mru-bookmark-mode’ - Provide ‘switch-to-buffer’-like
keybinding for tag names.
global-cedet-m3-minor-mode’ - A mouse 3 context menu.
global-semantic-idle-local-symbol-highlight-mode’ - Highlight references
of the symbol under point.
global-semantic-highlight-edits-mode’ - Visualize incremental parser by
highlighting not-yet parsed changes.
global-semantic-show-unmatched-syntax-mode’ - Highlight unmatched lexical
syntax tokens.global-semantic-show-parser-state-mode’ - Display the parser cache state.
Idle Scheduler(global-semantic-idle-scheduler-mode )
这个子模式默认是启动的,作用是:在用户不操作emacs时,会自动重新解析所有需要被重新解析的buffer,如果在重新解析的过程中,有任何用户的输入了,就自动停止解析。
有几个有用的变量:
1,semantic-idle-scheduler-idle-time :默认值是1秒,也就是说当用户1秒没有操作emacs后,就会自动重新解析这个buffer
2,semantic-idle-scheduler-max-buffer-size :可以被重新解析的buffer里面内容byte的最大值,如果超过这个值,就不去重新解析它。目的是,防止某个buffer过大,导致在重新解析它的时间过长,而影响了用户使用emacs的体验。如果是小于或者等于0的话,如果需要被重新解析的话,就无条件的解析。
3,semantic-idle-scheduler-no-working-message :解析时,是否显示工作消息,默认值是nil,不显示。
4,semantic-idle-scheduler-work-idle-time :当重新解析的同时,idle-scheduler还可以做如下的事情。做这些事特别耗时,所以当用户60秒没有操作emacs后,就会做下面的事。此变量的默认值是60秒。
Creating the include path caches required for symbol lookup.
创建 symbol lookup所需要的路径缓存
Create data type caches.
创建数据类型的缓存
Saving SemanticDB caches to disk.
把缓存内容保存到本地磁盘
Speculatively parsing the files in the same directory as the current buffer.
解析和当前buffer在同一目录下的所有文件
5,semantic-idle-work-parse-neighboring-files-flag :控制是否解析和当前buffer在同一目录下的所有文件,默认值是nil,也就是不解析
6,semantic-before-idle-scheduler-reparse-hook :在idle scheduler 开始解析前,运行这个钩子
7,semantic-after-idle-scheduler-reparse-hook :在idle scheduler 解析完成后,运行这个钩子
Idle Summary Mode(global-semantic-idle-summary-mode )
启动这个辅助mode后,当光标移到到某个函数调用的地方,或者变量使用的地方的时候,函数的原型(返回值,参数),变量的类型,会显示在emacs最下面的辅助入力区。如下图,当光标落在printf函数调用的地方时,会显示处printf的原型
1,变量semantic-idle-summary-function 的作用:指定用哪种方式(哪个函数)来显示函数的原型或者变量的定义等,它的默认值:semantic-format-tag-summarize-with-file。下面的函数付给semantic-format-tag-summarize-with-file。下面的函数存放在变量semantic-format-tag-functions 中。
- semantic-format-tag-name
- semantic-format-tag-canonical-name
- semantic-format-tag-abbreviate
- semantic-format-tag-summarize
- semantic-format-tag-summarize-with-file
- semantic-format-tag-short-doc
- semantic-format-tag-prototype
- semantic-format-tag-concise-prototype
- semantic-format-tag-uml-abbreviate
- semantic-format-tag-uml-prototype
- semantic-format-tag-uml-concise-prototype
- semantic-format-tag-prin1
2,变量semantic-idle-summary-out-of-context-faces 的作用:告诉Idle Summary Mode,当光标移动到哪些文本上的时候,不要尝试去显示它的摘要。比如当光标移动到注释位置时,或者双引号里面的字符串的时候,没有必要让Idle Summary Mode执行。这个变量是一个alist,可以添加或者删除元素。它的默认值如下:
- font-lock-comment-face :注释区域
- font-lock-string-face :双引号里面的字符串区域
- font-lock-doc-string-face :注释区域?
- font-lock-doc-face :注释区域?
Idle Completions Mode(global-semantic-idle-completions-mode )
启动这个辅助mode后,就可以有了代码补齐的功能。但是需要注意:代码补齐是在空间的时候才会生效,如果想立即生效请M-x semantic-complete-analyze-inline-idle 。
变量【semantic-complete-inline-analyzer-idle-displayor-class 】控制着补齐的样式,补齐的样式有3种:
- 第一种:Display completions in a tooltip (semantic-displayor-tooltip )
第二种:Display completions “inline” with the buffer text. This is the default value.(semantic-displayor-ghost)
从下图可以看出来,当输入n后,有4个补齐选项。当补齐选项显示出来后,下面的命令就被激活了。
- 回车,ctrl-m:Accept the current completion (
semantic-complete-inline-done
), placing it in the buffer and moving point to the end of the completed tag - M-n :Select the next possible completion (
semantic-complete-inline-down
). The new completion is shown inline, replacing the old completion. - M-p :Select the previous possible completion (
semantic-complete-inline-up
). - TAB,ctrl-i:Accept as much of the completion as possible. If no additional completion can be accepted without ambiguity, select the next possible completion (
semantic-complete-inline-TAB
). - ctrl-g :Quit without completing (
semantic-complete-inline-quit
).
- 回车,ctrl-m:Accept the current completion (
- 第三种:Display completions in a separate window. (semantic-displayor-traditional )
Semantic Database(global-semanticdb-minor-mode )
启动这个辅助mode后,Semantic 会把解析的结果存储到硬盘上(路径: ~/.emacs.d/semanticdb/ ),下次emacs再启动后,还可以继续使用上次的解析结果。
1,变量semanticdb-default-save-directory :控制Semantic Database的存储路径。
2,变量semanticdb-default-file-name :当变量semanticdb-default-save-directory的值是nil时,控制存储解析结果的文件的名字(路径是buffer所在的路径)
3,变量semanticdb-persistent-path :指定哪些路径下的解析结果可以被保存到磁盘。它是一个alist,里面放以字符串的形式放路径。有个特殊的用法,它的值可以是never,always,project 。never:都不保存到磁盘;always:都保存到磁盘;project :变量【semanticdb-project-predicate-functions 】里指定的路径被保存到磁盘。默认值是:always。
4,变量【semanticdb-project-predicate-functions 】:当变量【semanticdb-persistent-path】的值为project 时,它是一个alist,它里面放的路径才会被保存到磁盘。默认值是nil。
Semanticdb Search Configuration
解析时,不只是解析当前buffer,还会自动解析包含的头文件,比如c/c++的头文件。在c/c++的编辑模式中,它会根据头文件是【""】还是【<>】来区分是系统头文件,还是自己项目里定义的头文件。如果是系统头文件,则去系统目录去找。
变量【semanticdb-find-default-throttle 】决定了,怎么去搜索。默认是以时间为代价,去搜索到最大的准确性。
local:查找当前buffer所在目录下的所有文件
project:查找自己指定的路径。用变量【semanticdb-project-roots 】来控制具体的路径信息。它是一个alist。假如使用了boost,则可以把boost的头文件所在的路径。
变量【semanticdb-project-root-functions 】是一个alist,里面放的是自己定义的函数,由一个参数,返回值必须是一个project-root或者nil,或者是a list of string( multiple project roots, for complex systems),函数的返回值覆盖变量【semanticdb-project-roots 】。
用途:估计是根据参数,来动态决定【semanticdb-project-roots 】。
unloaded:如果要的解析结果没加载到内存,则加载到内存,如果还没解析,则马上解析。
system:查找系统的头文件。
- 函数semantic-add-system-include :添加路径到系统路径
- 函数semantic-remove-system-include :从系统路径里,删除某个路径。
- 函数semantic-customize-system-include-path :让当前buffer里的主mode,使用系统路径。
recursive:递归查找头文件里由include了别的头文件。
变量【semanticdb-find-default-throttle 】的默认值:(local project unloaded system recursive)
Smart Jump
函数semantic-ia-fast-jump :跳到变量或者函数定义的地方
怎么跳回来呢??为了跳回去,要使用函数semantic-mrub-switch-tags(c-x B),但老是报出【Semantic Bookmark ring is currently empty】错误。原因是函数semantic-ia-fast-jump调用了函数push-mark,而函数push-mark里面没有做push bookmark的操作,所以要修改函数push-mark,把bookmark放入semantic-mru-bookmark-ring里。放入后再执行semantic-mrub-switch-tags就不会出错了。
注意:执行函数semantic-mrub-switch-tags时,可以指定要跳过去的tags,每次执行semantic-ia-fast-jump后,都把位置push到了变量semantic-mru-bookmark-ring里了,所以执行semantic-mrub-switch-tags时,可以指定这些被push进去的位置
(global-set-key [f12] 'semantic-ia-fast-jump)
(defadvice push-mark (around semantic-mru-bookmark activate)
"Push a mark at LOCATION with NOMSG and ACTIVATE passed to `push-mark'.
If `semantic-mru-bookmark-mode' is active, also push a tag onto
the mru bookmark stack."
(semantic-mrub-push semantic-mru-bookmark-ring
(point)
'mark)
ad-do-it)
;;跳转后再跳回原来的地方
(global-set-key [f11]
(lambda()
(interactive)
(if (ring-empty-p (oref semantic-mru-bookmark-ring ring))
(error "Semantic Bookmark ring is currently empty"))
(let* ((ring (oref semantic-mru-bookmark-ring ring))
(alist (semantic-mrub-ring-to-assoc-list ring))
(first (cdr (car alist))))
(if (semantic-equivalent-tag-p (oref first tag)
(semantic-current-tag))
(setq first (cdr (car (cdr alist)))))
(semantic-mrub-switch-tags first))))
Smart Completion
1,函数semantic-complete-analyze-inline :也是自动补齐,那么和Idle Completions Mode里的自动补齐有什么区别呢?Idle Completions Mode是在空闲时间内执行的自动补齐,而这个是立即启动自动补齐。绑定键:【C-c , 空格】。
补齐方式,也是由变量【semantic-complete-inline-analyzer-idle-displayor-class 】来控制。
Smart Summary
1,函数semantic-ia-show-summary :功能和Idle Summary Mode一样,显示函数,变量的信息。
2,函数semantic-ia-show-doc :显示函数,变量的注释信息。
3,函数semantic-ia-describe-class :显示结构体,类里面的成员信息。
4,当发生不能解析的情况,参考Debugging the Semantic Analyzer
speedbar
让speedbar使用由semantic解析出来的tags,semantic解析出来的tags里的信息比speedbar自己的tags要详细
使用semantic后speedbar的效果如下,比不用semantic多出了【variables】【functions】【misc】,详细了好多哦。
Sticky Function mode
启动(M-x global-semantic-stickyfunc-mode)这个模式后,在emacs最上面一行显示如下图:
c/c++ 学习互助QQ群:877684253
本人微信:xiaoshitou5854
2085156153.png)