将 Emacs 打造成阅读源代码的神器 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hikkikuma1991
V2EX    Emacs

将 Emacs 打造成阅读源代码的神器

  •  1
     
  •   hikkikuma1991 2015-11-12 09:41:17 +08:00 7699 次点击
    这是一个创建于 3625 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Start

    Emacs 是一个功能相对较多而且很复杂的 texteditor ,所以想要熟练使用必须要对 emacs 的一些基本概念进行解,解这些概念最好的教程就是 emacs 自带的 “ Emacs Tutorial “。可以通过点击菜单栏的 Help->Emacs Tutorial(choose language)进行学习。

    将 Emacs打造成舒适的代码阅读器

    要想将 Emacs 打造成舒适的代码阅读环境除需要 Emacs 本体之外,还需要几种插 件来帮助我们实现这个愿望。 Emacs 是一种扩展性很强的编辑器,并且定义一种 elisp 语言来专门配置 Emacs 并开发新的功能。我们为将 emacs 打造成代码阅读器所 需要的插件主要有 CEDET , ECB 以及 CSCOPE ,下面分别介绍一下这几个插件的作用。

    CEDET

    cedet 是一堆完全用 elisp 实现的 emacs 工具的集合。包含很多的功能,这个插件 的主要目的是为 Emacs 提供基础功能的支持以使其变成变成类似 Eclipse 或 VS 系列 这样的高级开发环境。

    ECB

    ECB 是“ Emacs Code Browser ”的简称,从其名字就可以看出这个插件的作用是将 Emacs 变成一
    个代码浏览器。使用ECB 之后的效果可见下图。
    ecb

    CSCOPE

    Cscope 是一款开源免费的 C/C++浏览工具,自带一个基于文本的用户界面,通过 cscope 可以很方便地找到某个函数或变的定义位置、被调用的位置等信息。 Cscope 对 C /C++支持较好,也可以自己定制来支持 Java 和 Perl 、 Python 等脚本语 言。所以 CSCOPE 是一个为代码浏览提供基础功能的程序,这个程序并是为 Emacs 而专门开发的,因此要想在 Emacs 上使用这个程序需要在 Emacs 中安装插件调 用 CSCOPE 提供的功能。

    安装

    接下来介绍这些插件的安装过程,首先 CEDET 的支持是直接包含在 emacs 中的并 需要额外安装,因此我们只要安装 ECB 和 CSCOPE 就可以。在介绍具体的安装过程 之前先介绍下 emacs 的插件配置过程。

    Emacs 的插件配置

    简单地说 Emacs 的插件配置主要有以下两步,第一步是将插件文件拷贝到 emacs 的 插件文件夹(默认是~文件夹下的.emacs.d/)中,第二部是在 emacs 的配置文件 (~下的.emacs )中描述这个插件的路径 loadpath)并启用插件。

    ECB 的安装

    https://github.com/alexott/ecb 下载 ecb 的 tar 文件,解压后将解压出来的文件 拷贝到.emacs.d 中并编辑 emacs 配置文件加入以下代码。注意将文件的位置改成自 己的位置。

    将 ECB 的路径添加到读取列表中 (addtolist 'loadpath "/home/augustus/.emacs.d/ecbmaster") 告诉 emacs 启用 ecb (require 'ecb) 

    保存 emacs 配置文件并重新启动 emacs 就可以在菜单栏的 Tools>Start Code Browser 打开 ecb。

    CSCOPE 的安装

    首先要在系统上安装 CSCOPE

    sudo aptget install cscope 

    然后去 CSCOPE 的官网 http://cscope.sourceforge.net/ 下载源码包,并将其中的 xcscope.el 拷贝到
    loadpath 包含的目录里。并在.emacs 里面加上

    告诉 emacs 启用 cscope (require 'xcscope) 

    至此,用 emacs 来阅读 c/c++源代码所需要的工具包都安装好,当然用 emacs 来写代码调试代码都是很方便的,也有很多相关的插件,但这已在本文的范围之内。

    CSCOPE 使用方法

    下面我们用 bitvisor 的源代码为例展示一下用这套工具阅读源码的强大之处。首先我们用配置好的 emacs 打开 vtmain.c 文件,然后在菜单栏里选择 Tools>Start Code Browser(ECB)来开启 ECB ,也可以使用 Mx 'ecbactivate 来开启 ecb 。并且可以看到菜单栏里出现CSCOPE 的菜单,下面我就来一一介绍下 CSCOPE 提供的 这些功能都有什么作用。

    建立索引

    首先 CSCOPE 对源码进行分析时需要对要分析的源码建立一个索引,否则就没办法 提供诸如代码跳转之类的功能。通过在菜单栏选择 Cscope>Cscope Database>Set Initial Dictionary 设置代码的初始目录,然后再选择 create list of files to index 并选择一个目录,这样 cscope 就会对该目录下的所有源 代码建立索引,也就意味着在你选择的这个目录范围之内的所有源代码都可以在你阅读和分析的时候进行变函数等内容的跳转。

    功能介绍

    Find Symbol

    我们以 Find Symbol 这个指令为例介绍下 CSCOPE 的使用,其他的指令和这个指令的 功能是类似的。如文字意思所述,这个指令提供的功能是在源代码中搜索一个 Symbol ,这个 Symbol 可以理解为变,函数名称,类名等有意义的符号。通过选 中想要查找的内容然后选择这个指令就可以在所有源码中搜索选中的这个符号。 然后就会看到下图的内容

    function

    CSCOPE 给出所有包含这个 Symbol 的文件 list , 只要点击鼠标中键就可以查看对应的那行代码。当你看完代码想要回到跳转之前的那段代码只要选择 Cscope 菜单里的 pop mark 功能就好。类似的功能有 Find globaldefinition no prompting, Find text String, Find egrep pattern, Find a file 等,都可以通过名字来判断功能,使用方法上和 Find Symbol 是一样 的。当然如果完全用鼠标选择这些功能的话效率是非常低下的,所以我们需要快 捷键来提高我们的工作效率, Emacs 本身为这些功能定义好一组快捷键,但是使 用起来一点都方便,以 Find Symbol 为例他的快捷键是'Cc s s',也就是说要按下 Control+C 再按 s s 才能完成这一功能,所以我们要改造 Cscope 的快捷键。

    自定义快捷键

    在 emacs 里自定义快捷键是一件十分方便和快捷的事情,只要打开.emacs 文件进行 设置就可以,这里我给出一段.emacs 中设置快捷键的代码

    将 findthisfile 功能绑定到 Ctrl+F4 上 (definekey globalmap [(control f4)] 'cscopefindthisfile) 将 findthissymbol 功能绑定到 Ctrl+F5 上 (definekey globalmap [(control f5)] 'cscopefindthissymbol) (definekey globalmap [(control f6)] 'cscopefindthistextstring) (definekey globalmap [(control f7)] 'cscopefindglobaldefinitionnoprompting) (definekey globalmap [(control f8)] 'cscopepopmark) (definekey globalmap [(control f9)] 'cscopeprevsymbol) (definekey globalmap [(control f10)] 'cscopenextsymbol) (definekey globalmap [(control f11)] 'cscopeprevfile) (definekey globalmap [(control f12)] 'cscopenextfile) 

    这样通过一番调试和适应之后就能很快的学会 Emacs 看源代码啦!

    7 条回复    2015-11-12 13:24:38 +08:00
    hei1000
        1
    hei1000  
       2015-11-12 09:46:15 +08:00 via Android
    楼主辛苦了,但是真的是自己写的吗,为什么都少了-
    hikkikuma1991
        2
    hikkikuma1991  
    OP
       2015-11-12 09:48:32 +08:00
    @hei1000 是自己写的~原文是写在 csdn 博客里的,然后直接拷贝 markdown 过来,可能格式上有点变化吧。原文链接:http://blog.csdn.net/ldk412046549/article/details/49684393
    hikkikuma1991
        3
    hikkikuma1991  
    OP
       2015-11-12 09:49:08 +08:00
    @hei1000 因为我的 csdn 都没人看呜呜呜呜
    hikkikuma1991
        4
    hikkikuma1991  
    OP
       2015-11-12 09:57:22 +08:00
    啊,如果看到的大家记得注意一楼所说的 - 符号的问题,这文章我是直接从 org-mode 生成的 pdf 拷出来的,不知道什么原因 - 符号都消失了 T 。 T 然后我现在又没办法 edit 这篇文章了
    hei1000
        5
    hei1000  
       2015-11-12 10:30:40 +08:00
    @hikkikuma1991 没人看大概是因为这样的文章好多吧
    ceyes
        6
    ceyes  
       2015-11-12 13:23:01 +08:00
    其实我就想要个类似于 vim 下的 taglist 插件,不用复杂的索引,能看当前文件的函数、变量、结构就满足了,楼主有推荐吗?

    ECB 始终没弄出喜欢的界面,不喜欢,也达不到 source insight 的强大,而且不用鼠标的话,跳来跳去也不方便啊~~ CEDET 配置太复杂了,没搞明白咋玩。

    我这两天折腾了 helm, helm-swoop, helm-projectile, 搜索和跳转非常爽,推荐之。

    http://tuhdo.github.io/helm-intro.html
    http://tuhdo.github.io/helm-projectile.html
    http://emacsist.com/10295
    odirus
        7
    odirus  
       2015-11-12 13:24:38 +08:00
    我也喜欢 Emacs ,折腾新语言的时候用文本编辑器,折腾完之后用 IDE 进行开发。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1169 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 17:39 PVG 01:39 LAX 10:39 JFK 13:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86