Vim实践与学习-06编程

这里的内容是针对编程序或者阅读源代码时候使用的,本来它的有些内容可以属于其它类的,但是这里单独用"编程相关"将这类命令集中起来了。

编译并自动定位第一个错误

输入 :make filename

注意:在vi中编译test.c,直接用 :make test 就可以了,注意是不带后缀的哟。如果有makefile的话可以再vi直接敲 :make ,然后就能够定位到第一个错误上面了。

关于ctags跳转

通常我们需要使用名为ctags的程序来生成这样的tag文件。vim能直接使用ctags程序所生成的tag文件。

安装ctags

$sudo apt-get install ctags

注意这里是在ubuntu下。

为当前目录文件生成tags文件

$ctags -R ./

$ctags -R

这里,如果 ctags -R ../ 将会也生成父目录文件的tags,ctags利用tags进行跳转。

载入当前标签

输入 :set tags=tags .

这将载入(当前目录的)所需标签文件,如果不载入则没有ctags所需要的tags文件,为了实现自动载入启动可以在~/.vimrc加入如下内容:

if has("ctags")
  if filereadable("tags")
    set tags=tags
  endif
endif

直接打开文件并跳转到函数

$vim -t func

这样,将打开vim并且直接跳转到func函数的位置。

跳转到当前光标函数实现内部

输入 [Ctrl]] .

实现这个功能需要有tags标签。

回到[Ctrl][之前的位置

输入 [Ctrl]T .

这里,应该是 [Ctrl]] 之前的位置,有待修改。

分割一个窗口并跳转到当前光标函数实现内部

输入 [Ctrl]w ] .

跳转到指定函数实现处

输入 :tag func .

或输入 :tselect func

这样将跳到func函数的实现地方,tag func如果有多个将自动跳到第1个,tselect func如果多个则显示一个所有匹配列表,让你选择哪个。这里标签名可以用[Tab]进行命令补全.

新开一个窗口,查看tag的函数

输入 :stag tagname .

这里,tagname是一个tag标签(例如函数名)效果相当于首先用:split,再用tag tagname.窗口是水平的。

如果有多个tag匹配则:

  • 切换到下一个匹配标签处: 输入 :tnext
  • 切换到上一个匹配标签处: 输入 :tprev
  • 切换到第一个匹配标签处: 输入 :tfirst
  • 切换到最后一个匹配标签处: 输入 :tlast
  • 显示所有匹配标签: 输入 :tags
  • 显示所有匹配标签并让你选择指定的: 输入 :tselect

关于代码折叠

设置可以折叠

输入 :set fdm=syntax .

或输入 :set fdm=indent .

这里,fdm实际上是foldmethod的简写,第1个syntax方式是按照语法进行折叠(我倾向用这个所以后面都是对这个方式折叠下的命令),第2个是对大括号内的进行折叠。

对当前代码块进行折叠

输入 zc .

这里,需要把当前光标放置到需要折叠的代码块的内部,因为一般程序结构都是嵌套的,这个命令折叠的是最内层的代码块。

对当前代码块所在范围代码块全部折叠

输入 zC .

这里,折叠的不仅仅是最内层的代码块了,而是连带着递归地折叠了包含该代码块的这个代码块。

展开当前代码最外层折叠

输入 zo .

这里,是对光标下的折叠代码块最外层折叠进行打开,内层的折叠仍旧折叠着,除非你移动到那里再次用这个命令打开折叠,有时候你按一下左右方向键也会打开折叠。

展开当前代码包含的所有折叠

输入 zO .

这里,展开的不仅仅是最外层的代码块了,而是连带着递归地展开了该代码块包含的所有内层代码块。

折叠当前文件所有可能折叠的代码

输入 zM .

这样,将把当前文件的所有可以折叠的代码进行折叠。

展开当前文件所有折叠的代码

输入 zR .

或输入 :set foldlevel=999 .

这样,将把当前文件的所有折叠的代码展开。

全部展开或折叠当前文件所有可以折叠的代码

输入 zi .

这里,相当于zR和zM命令的“综合”,这个命令在全部折叠和全部展开两个命令之间进行“开关”切换。

到当前打开的折叠的开始处

输入 [z .

到当前打开的折叠的末尾处

输入 ]z .

跳到下一个折叠的开始处

输入 zj .

这里,关闭的折叠也被计入。

跳到上一个折叠的末尾处

输入 zk .

这里,关闭的折叠也被计入。

cscope的使用

cscioe功能

可以解决类似如下的问题:

  1. 符号在哪里实用的?
  2. 在哪里定义的?
  3. 变量从哪里得到它的值的?
  4. 全局变量的定义?
  5. 这个函数在源代码中的什么文件中?
  6. 什么函数调用了这个函数?
  7. 这个函数调用了什么函数?
  8. 消息“out of space”来自哪里?
  9. 这个源文件在目录中的结构?
  10. 哪些文件包含了这个头文件?

软件下载

http://sourceforge.net/project/showfiles.php?group_id=4664

软件安装

  1. ./configure --with-flex (注:如果平台是Linux,最好带上 --with-flex 选项)
  2. make (注:我没有遇到错误)
  3. make install (注: 直接安装好了)

cscope配置

修改vim配置文件vimrc.你可以修改/etc/vimrc使用所有用户都使用本配置文件,当然你还可以修改~/.vimrc

  1. 下载cscope配置文件:cscope_map.vim (http://cscope.sourceforge.net/cscope_maps.vim
  2. 把cscope_map.vim里从 if has("cscope")? 到 endif里边的内容复制到/etc/vimrc里边去
  3. 里边的命令意思自己琢磨

cscope相关命令

生成索引文件,在源代码目录中输入: $cscope -Rb

另外,有的时候: $cscope -Rbkq<回车>

这里,

  • R 表示把所有子目录里的文件也建立索引
  • b 表示cscope不启动自带的用户界面,而仅仅建立符号数据库
  • q生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
  • k在生成索引文件时,不搜索/usr/include目录

更多查看man.

vim下的相关命令

简单的帮助命令列表

输入 :cs help

或输入 :cs

cs是cscope的简写命令,后面也是如此。

添加一个新的cscope数据库链接

输入 :cs add cscope.out

这样,把当前目录下面的cscope.out这个cscope数据文件添加了,就可以利用其中的内容了,如果没有链接数据库,那么就用不了相应的功能了。可以把这个命令加入到.vimrc中,省得人工输入。

查看当前已经链接的cscope数据库链接

输入 :cs show

查找相关命令

查找C语言符号,即查找函数名、宏、枚举值等出现的地方

输入 :cs find s <符号名> .

或输入 cs f s <符号名> .

这里,等价于 :cs find 0 .

查找函数、宏、枚举等定义的位置,类似ctags所提供的功能

输入 :cs find g <符号名> .

或输入 cs f g <符号名> .

这里,等价于 :cs find 1 .

查找本函数调用的函数

输入 :cs find d <符号名> .

或输入 :cs f d <符号名> .

这里,等价于 :cs find 2 .

查找调用本函数的函数

输入 :cs find c <符号名> .

或输入 :cs f c <符号名> .

这里,等价于 :cs find 3 .

查找指定的字符串

输入 :cs find t <符号名> .

或输入 :cs f t <符号名> .

这里等价于 :cs find 4

查找egrep模式,相当于egrep功能,但查找速度快多了

输入 :cs find e <字符串> .

或输入 :cs f e <字符串> .

这里,等价于 :cs find 6 ,注意没有5.

查找并打开文件,类似vim的find功能

输入 :cs find f <文件> .

或输入 :cs f f <文件> .

这里,等价于 :cs find 7 .

查找包含本文件的文件

输入 :cs find i <文件>

这里等价于 :cs find 8 .

以上的 cs find 均可简写为 cs f .

将cscope的数据库内容作为tags

输入 :set cst .

或输入 :set cscopetag .

这样就 会把cscope的数据库当成tag文件了,在只有cscopt.out的情况下可以用[Ctrl]]进入相应的函数了。这样只用cscope不用ctags了。关闭这个功能是 :set nocst .但是cscope无法在tag的时候自动不全标号,另外,cscope虽然搜索全局字符串似乎挺好,但是在用cscope的方式tag函数的时候,如果源文件修改了例如增加几个空行之类的,那么回出现定位错位,而ctags就不会。

察看光标下的函数

输入 [Ctrl]\g .

这里,是加入cscope.vim的相关语句到.vimrc中之后有的快捷键。cscope.vim内容在“其他相关“里面最后有列出了。

察看调用光标下函数的函数

输入 [Ctrl]\c .

还有其他等等,察看脚本内容就知道了,实际是 [Ctrl]\ 等价于输入 :cs f ,之后输入相应的字符f,g,c等,就可以查找当前光标下标号的东西了。

到当前局部变量的定义处

输入 gd .

这里,当前的意思是光标停留其上的单词。

到当前全局变量的定义处

输入 gD .

跳转到当前代码块的开头

输入 [{ .

这里代码块一般是用 {} 扩起来的。

查找在头文件中的某个相关定义

输入 [Ctrl]w[Ctrl]i .

这样,vim可以直接根据头文件进行查看,察看当前光标下的符号在头文件的相关定义。

注释第1行到第20行

输入 :1,20s/^/\/\//g .

这里, ^ 表示在行首插入,因为Vim/Vi替换命令格式中默认 / 为分隔符,这样就需要使用转义符 \ ,表示 / 就要写成 \/ 才可以,所以命令如上所示。强烈建议各位看官使用,省时省力省键盘还,如果shell的注释符号'#'就不用转义了。

简单重排功能

当前行向右移一个shiftwidth

输入 >> .

这里, 整行会向右移一个 shiftwidth(预设是 8 个字元,可重设)。

当前行向左移一个shiftwidth

输入 << .

这里, 整行会向左移一个 shiftwidth(预设是 8 个字元,可重设)。

{} , ()[] 等符号括起来的文本都右移

输入 >% .

这里,您必须把光标放在这些符号( {} , ()[] )上面.

{} , ()[] 等符号括起来的文本都左移

输入 <% .

这里,您必须把光标放在这些符号( {} , ()[] )上面.

自动缩进选中代码的格式

  1. 输入 v
  2. 移动光标,选择待调整的代码块,
  3. 输入 = 。

这里,关键是先进入选择模式选择相应的代码,然后按 ‘=’键,如果只按=就格式化当前行(需移动一下光标才看得出来)。

打开一个预览窗口来显示函数 write_char

输入 :ptag write_char .

这样之后,光标会自动移动回原来的位置。窗口是水平的。

关闭预览窗口

输入 :pclose .

这里,尽管当前光标不在预览窗口,也会关闭预览窗口。

在预览窗口中编辑一个指定的文件

输入 =:pedit = 。

这在编辑头文件时很有用,这里的是要编辑的文件名,还可以同时定位到函数比如: :pedit +/funcs defs.h 。这样可以在原有光标不变的情况下在预览窗口中修改。

查找当前文件和任何包含文件中的单词并在预览窗口中显示匹配

输入 psearch <函数名>

这在使用没有标签文件的库函数时十分有用。虽然它不是很智能,但是它能够到库头文件中搜索。

quickfix定位代码错误的使用

Quickfix模式的主要思想是保存一个位置列表,然后提供一系列命令,实现在这个位置列表中跳转。加快你的开发速度。

假设:你编写了一个程序,在vi中输入 :make 调用makefile来编译的时候程序中有错误,回车就会返回编辑界面(实际会自动定位到第一个错误)。运行如下命令可以定位错误:

显示并定位到第n个错误

输入 :cc n .

这样就会自动定位到第n个错误的位置,并显示相应的错误信息,如果没有n参数,就重现当前错误信息。

定位到当前错误的下一个错误处

输入 :cn .

这样如果当前在第n个错误的状态,这样会切换到第n+1个错误并定位到相应的位置。

定位到当前错误的上一个错误处

输入 :cp .

这样如果当前在第n个错误的状态,这样会切换到第n-1个错误并定位到相应的位置。

列出当前所有错误列表

输入 :cl .

这样列出一个错误列表,只是显示出了所有错误回车就又回到先前界面了。

在当前窗口底部打开一个quickfix窗口列出所有错误信息

输入 :cw .

这样会在当前窗口底部新开一个窗口,方便的看到所有错误信息,还可以把光标移动到相应的错误之处然后回车,就会回到代码窗口并定位到相应的错误位置。

回到上一个错误列表

输入 :colder .

或输入 :col .

这样回到上一次的quickfix错误列表,例如再次编译还有错误,这个命令返回的是上次而不是这次的错误列表,运用cw等都是上次的错误信息。

进入较新的错误列表

输入 :cnewer .

或输入 :cnew .

这个命令的作用和前面colder相反,进入更新的错误列表。

关于自动补全

显示自动补全列表

输入 [Ctrl]p

这里,是在插入模式下进行的,例如当前输入了 aa 字符,然后输入[Ctrl]p这样会列出所有以aa为开头的单词列表。它们会在当前缓冲区、其它缓冲区,以及当前文件所包含的头文件中查找以光标前关键字开始的单词。

选择自动补全列表中匹配的下一项

输入 [Ctrl]n .

这样如果有多个匹配的单词项那么会高亮下一项进行选择。如果不够则循环显示。

选择自动补全列表中匹配的上一项

输入 [Ctrl]p .

这样如果有多个匹配的单词项那么会高亮上一项进行选择。如果不够则循环显示。

自动匹配整个行

输入 [Ctrl]x[Ctrl]l .

这里,注意要在编辑状态下面运行的,会弹出文件中所有的整个行,之后用[Ctrl]p等就可以自动匹配了。

如果CTRL-N和CTRL-P补全时查找所包含的头文件,耗时会比较久。此时,可以在’complete‘选项中去掉'i'标记 :set complete-=i

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 1. 关于Vim vim是我最喜欢的编辑器,也是linux下第二强大的编辑器。 虽然emacs是公认的世界第一,我...
    Dyworldhua阅读 1,359评论 0 2
  • 曾经使用了几年多的Vim,手册也翻过一遍。虽然现在不怎么用vim了,曾经的笔记还是贴出来,与喜欢vim的朋友分享。...
    Sylar丶阅读 876评论 0 0
  • 1. Vim的几种模式 正常模式:可以使用快捷键命令,或按:输入命令行。 插入模式:可以输入文本,在正常模式下,按...
    红线路亚湾阅读 16,874评论 0 1
  • 1.输入psv就会看到一个psvm的提示,此时点击tab键一个main方法就写好了。psvm 也就是public ...
    兜兜又喊阿兵哥阅读 1,100评论 0 0
  • 前段时间,无意中在电视上看到推荐,《催眠大师》,由莫文蔚和徐峥主演。整个电影中没有几个人,但是情节却一直牵动着人的...
    王韩明月阅读 363评论 0 1