semantic功能介绍
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)
semantic功能介绍的更多相关文章
- .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...
- 微信小程序产品定位及功能介绍
产品定位及功能介绍 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 小程序注册 注册小程序帐号 在微信公众平台官网首页(mp.weixin.qq ...
- 带你走近AngularJS - 基本功能介绍
带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...
- MWeb 1.4 新功能介绍一:引入文件夹到 MWeb 中管理,支持 Octpress、Jekyll 等静态博客拖拽插入图片和实时预览
之前在 MWeb 中打开非文档库中的 Markdown 文档,如果文档中有引用到本机图片,是没办法在 MWeb 中显示出来和预览的.这是因为 Apple 规定在 Mac App Store(MAS) ...
- Joomla软件功能介绍与开源程序大比拼Joomla,wordpress,Drupal哪个好?
Joomla 软件功能介绍: Joomla!是一套在国外相当知名的内容管理系统 (Content Management System, CMS),它属于Portal(企业入口网站)类型,顾名思义 ...
- CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系
CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...
- python中列表、元组、字典内部功能介绍
一.列表(list) 常用功能的介绍:
- 网页引导:jQuery插件实现的页面功能介绍引导页效果
现在很多网站不仅是介绍,更多的是有一些功能,怎么样让客户快速的知道网站有哪些功能呢?这里pagewalkthrough.js插件能帮我们实现,它是一个轻量级的jQuery插件,它可以帮助我们创建一个遮 ...
- 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍
回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...
随机推荐
- grant localhost and % for mysql
- Hive表的几种存储格式
Hive的文件存储格式: textFile textFile为默认格式 存储方式:行存储 缺点:磁盘开销大:数据解析开销大:压缩的text文件,hive无法进行合并和拆分 sequencefile 二 ...
- Linux系统学习 四、网络基础—互联网概述,互联网接入方式
互联网概述 WWW:万维网 FTP:文件传输协议 E-MAIL:电子邮件 WWW 典型的C/S架构 URL:统一资源定位 协议+域名或IP:端口+网页路径+网页名 http://www.xxx.com ...
- FFT/NTT初探
做了全家桶然后写了几道入门题. FFT.ref NTT.ref Luogu4238 [模板]多项式求逆 Link 套牛顿迭代完事.有一个细节问题是:这次运算多项式有几项就只赋几项的值,其他位置(次数大 ...
- 关于jvm的常识介绍
1.关于jvm的组成(只介绍1.8,以前的版本不多介绍) vm stack,native method stack,program counter register,heap,metaspace 2. ...
- acwing 70-72 剑指OFFER 二叉树相关
地址 https://www.acwing.com/problem/content/66/ https://www.acwing.com/problem/content/67/ https://www ...
- NOIP2019游记
道歉:本文章很快打完了,所以有脏话 第零天 早上睡到6点半九点半从学校出发 有种很忙碌的感觉 在车上异常无聊,和zsf用笔记本看了阿丽塔战斗天使,感觉蛮好看的 阿丽塔的形象很丰富 叙事由雾到开 推荐 ...
- 最小化MarkdownPad 2安装体积(win10)
一.原因 MarkdownPad2在Win10当中可能无法正常运行,右侧预览界面会出现错误"This view has crashed!"查阅官网FAQ得知大多数情况下安装Awes ...
- CF750G New Year and Binary Tree Paths(DP)
神仙题.为啥我第一眼看上去以为是个普及题 路径有两种,第一种是从 LCA 一边下去的,第二种是从 LCA 两边都下去了的. 先考虑第一种. 先枚举路径长度 \(h\). 当 LCA 编号是 \(x\) ...
- 基于Django的Rest Framework框架的分页组件
本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...