VIM的使用以及Makefile的编写

一、有关vi与vim
1、概念
- vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器。他是我们使用Linux系统不能缺少的工具。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,学会它后,我们将会在Linux的世界里畅行无阻。
- vim 具有程序编辑的能力,可以以字体颜色辨别语法的正确性,方便程序设计;因为程序简单,编辑速度相当快速。
- vim可以当作vi的升级版本,他可以用多种颜色的方式来显示一些特殊的信息。
- vim会依据文件扩展名或者是文件内的开头信息, 判断该文件的内容而自动的执行该程序的语法判断式,再以颜色来显示程序代码与一般信息。
- vim里面加入了很多额外的功能,例如支持正则表达式的搜索、多文件编辑、块复制等等。
总之,这对于我们在Linux上进行一些配置文件的修改工作时是很棒的功能。
2、模式
vim目前总共有12种模式,其中对于我们目前来说,底行模式,插入模式,命令模式,下面我们来一一来介绍这些模式。
二、VIM的使用
1、几种常用模式
- 正常/命令模式:控制屏幕光标的移动,字符、字或⾏行的删除,移动复制某区段及进入Insert mode下,或者到 lastline mode。
- 插入模式(Insert mode)只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
- 末行模式:文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。
- 在命令模式下,shift+: 即可进⼊入该模式。要查看你的所有模式:打开vim,底行模式直接输⼊。
2、几种模式的转换
这里写图片描述
3、vim基础命令集
* 插⼊模式
按「i」切换进⼊插入模式「insert mode」,按“i”进⼊插⼊模式后是从光标当前位置开始输⼊文件;
按「a」进⼊插⼊模式后,是从目前光标所在位置的下一个位置开始输⼊文字;
按「o」进⼊插入模式后,是插入新的一行,从行⾸开始输入文字
* 命令模式
1)移动光标
vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英⽂字「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
按「G」:移动到文章的最后
按「 」:移动到光标所在⾏的“行尾”  
按「^」:移动到光标所行的“⾏⾸”  
按「w」:光标跳到下个字的开头  
按「e」:光标跳到下个字的字尾  
按「b」:光标回到上个字的开头  
按「#l」:光标移到该行的第#个位置,如:5l,56l  
按[gg]:进入到⽂文本开始  
按[shift+g]:进入⽂文本末端  
按「ctrl」+「b」:屏幕往“后”移动一页  
按「ctrl」+「f」:屏幕往“前”移动一页  
按「ctrl」+「u」:屏幕往“后”移动半页  
按「ctrl」+「d」:屏幕往“前”移动半页  
Shift+g == G 移动到文章的最后  
Shift+4 ==
移动到光标所在行的行尾
Shift+6 == ^移动到光标所在行的行首
2)删除⽂字
「x」:每按一次,删除光标所在位置的一个字符
「#x」:例如,「6x」表⽰示删除光标所在位置的“后⾯(包含⾃己在内)”6个字符
「X」:⼤写的X,每按一次,删除光标所在位置的“前面”一个字符
「#X」:例如,「20X」表示删除光标所在位置的“前⾯”20个字符
「dd」:删除光标所在行
「#dd」:从光标所在开始删除#行
d$ 删除光标到行尾的内容;
J 清除光标所处的行与上一行之间的空格,把光标行和上一行接在一起;
3)复制
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表⽰示拷⻉从光标所在的该行“往下数”6⾏文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。p 在光标之后粘帖;shift+p 在光标之前粘帖
shift p:往当前光标之前复制
4)替换
「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为⽌止。
5)撤销上一次操作
「u」:如果您误执⾏行⼀个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执⾏多次回复。
「ctrl + r」: 撤销的恢复
6)更改
「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字
7)跳至指定的行
「ctrl」+「g」列出光标所在⾏的⾏号。
「#G」:例如,「15G」,表示移动光标⾄文章的第15⾏首

几种特殊用法:按shift %可查找括号匹配(光标跳转)
跳转至下一个顶格的大括号(函数查找){{(两个)
* 末行模式
注意:在使⽤用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进⼊末⾏模式。
1)列出行号
「set nu」: 输⼊「set nu」后,会在文件中的每一行前面列出行号
!man 函数名:可查找函数的具体定义
2)跳到⽂件中的某一⾏
「#」:「#」号表示一个数字,在冒号后输⼊一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到⽂章的第15行。
3)查找字符
「/关键字」: 先按「/」键,再输⼊您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以⼀直按「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输⼊您想寻找的字符,如果第⼀次找的关键字不是您想要的,可以⼀直按「n」会往前寻找到您要的关键字为止。
问题:/ 和 ?查找有和区别?
/:利用这种方式查找是正向查找,按照从头到尾的顺序查找
?:这种方式的查找是按照反向查找,是按照从尾到头的顺序开始查找
两种查找方式,均是循环式的查找,第一次出现的位置都是该字符第一次出现的所在行。
4)替换字符
:s /SEARCH/REPLACE/g 注:把当前光标所处的行中的SEARCH单词,替换成REPLACE,并把所有SEARCH高亮显示;
:%s /SEARCH/REPLACE 注:把文档中所有SEARCH替换成REPLACE;
:#,# s /SEARCH/REPLACE/g 注:#号表示数字,表示从多少行到多少行,把SEARCH替换成REPLACE;
注:在这之中,g表示全局查找;我们注意到,就是没有替换的地方,也会把SEARCH高亮显示;

在底行模式下:vsp +目标文件 进行分屏模式
Ctrl+ww切换光标的位置
多个文件之间的切换:例如从add.c切换到add.h gt切换标签页, g+shift+t 反向切换
这里写图片描述
在底行模式下,利用鼠标切换,设置set mouse=a

r add.c 将add.c中的内容全部加载到当前文件中,最后在替换
* 可视模式
选择多行
shift v:按行选择
ctrl v :按列选择
在Linux中一次注释多行:在Windows下的方法也可用,这块将一种特殊的方法
Ctrl v进入可视化模式中的按列选择,按列选中需要注释的几行——>shift i +//(注释符),此处已经注释——->按Esc键回到正常模式,此处已经显示注释多行
一次删除多行注释:按Ctrl v进入可视化模式中的按列选择,按列选中需要取消注释的几行,注意此处在按列选择中只选择//(注释符两个字符)—–>x 删除

三、有gcc/g++
(一)背景知识(详细过程请参考《程序员的自我修养》)
预处理(进行宏替换).i
编译(生成汇编).s
汇编(生成机器可识别代码).o
链接(生成可执行文件或者库文件)
(二)gcc过程
* 预处理
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作⽤用是让 gcc 在预处理结束后停⽌止编译过程。
选项“-o”是指目标文件,“.i”⽂件为已经过预处理的C原始程序。
* 编译
在这个阶段中,gcc ⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使⽤用“-S”选项来进行查看,该选项只进⾏行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s
* 汇编
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
在此可使⽤用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o
* 链接
在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello
(三)gcc总结

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件⾥里⾯面
  • -S 编译到汇编语⾔言不进行汇编和链接
  • -c 编译到目标代码
  • -o ⽂文件输出到 ⽂文件
  • -static 此选项对⽣生成的⽂文件采⽤用静态链接
  • -g ⽣生成调试信息。GNU 调试器可利⽤用该信息。
  • -share 此选项将尽量使⽤用动态库,所以⽣生成⽂文件⽐比较⼩小,但是需要系统由动态库.
  • -O0
    -O1
    -O2
    -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w 不生成任何警告信息。
  • -Wall ⽣生成所有警告信息。
    (四)静态库与动态库
    这里写图片描述
    四、Linux调制器—-gdb的使用
    用Linux生成的可执行程序,默认为release版本,gcc默认不会加任何调试信息,因此如果需要调试,则需要加-g选项
    例如:gcc -g O0(表示优化级别,可以不加) test.c——>生成可执行程序a.out(此处没有重新命名)
    下面利用gdb调试即gdb a.out
    list/l ⾏号:显⽰源代码,接着上次的位置往下列,每次列10⾏。
    list/l 函数名:列出某个函数的源代码。一般默认为main前后一共10行
    r或run:运⾏行程序。运行到第一个断点处
    n 或 next:单条执⾏行。不会进入函数内部
    s或step:进⼊入函数调⽤用
    break(b) ⾏行号:在某⼀⾏行设置断点
    break 函数名:在某个函数开头设置断点
    b 20 if i==9循环中在第20行i=9处设置断点
    info break :查看断点信息。简写i b
    finish:执⾏行到当前函数返回,然后挺下来等待命令,即退出当前函数
    print(p):打印表达式的值,通过表达式可以修改变量的值或者调⽤用函数,p 变量:打印变量值。
    set var:修改变量的值 set var i=99:将i的值设置为99
    continue(或c):从当前位置开始连续⽽而⾮非单步执⾏行程序
    delete breakpoints:删除所有断点
    delete breakpoints n:删除序号为n的断点
    disable breakpoints:禁⽤用断点
    enable breakpoints:启⽤用断点
    info(或i) breakpoints:参看当前设置了哪些断点
    display 变量名:跟踪查看⼀一个变量,每次停下来都显⽰示它的值
    undisplay:取消对先前设置的那些变量的跟踪(设置的先后顺序,即为序号)
    until X行号:跳⾄X行
    breaktrace(或bt):查看各级函数调⽤用及参数
    info(i) locals:查看当前栈帧局部变量的值
    whatisa:查看变量a的类型
    quit:退出gdb(或者ctrl+d)
    五、make/Makefile的使用
    背景
    会不会写makefile,从一个侧面说明了一个⼈人是否具备完成大型工程的能力一个工程中的源⽂文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚⾄至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,⽐比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可⻅见,makefile都成为了一种在⼯工程⽅方⾯面的编译方法。make是一条命令,makefile是一个⽂文件,两个搭配使用,完成项目自动化构建。
    格式
    **目标文件:依赖文件
    (Tab键(必须))命令**
    例如:有源程序test.c
    最简单的Makefile文件,只有一个文件
    这里写图片描述
    这样,在使用make命令时,就会自动生成相应的程序,但是当程序有改动时,就会出现问题,因此需要一个清理旧文件的工程,但是他不生成相对应的文件,因此在Makefile中就需要伪目标文件,从而完成清理工作。
    这里写图片描述
    当工程特别大的时候,因此每一个Makefile编写,如果按照上面的写法,会浪费很多的时间,因此需要在对其进行简化,从而提高时间利用率
    这里写图片描述
    当然,Makefile中也可以定义变量,如下所示
cc=gcc
test:test.c
    $(cc) -o $@ $^

在这里需要注意的就是,在定义变量姿势,等号的左右两端都不能有空格,否则将产生错误。
如果Makefile中需要多个文件的时候,利用伪目标文件,从而生成多个目标文件,如下所示:

.PHONY:ALL
ALL:test1,test2
test1:test1.c
    gcc -o $@ $^
test2:test2.c
    gcc -o $@ $^

这里,在对make与Makefile做一个简短的总结,如下所示:
原理:
make是如何工作的,在默认的方式下,也就是我们只输入make命令。那么,
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标⽂文件(target),在上面的例子中,他会找到“hello”这个文件,并把这个文件作为最终的目标文件。
3. 如果hello文件不存在,或是hello所依赖的后面的hello.o文件的文件修改时间要比hello这个文件(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成hello这个文件。
4. 如果hello所依赖的hello.o文件不存在,那么make会在当前文件中找目标为hello.o文件的依赖性,如果找到则再根据那一个规则⽣生成hello.o文件。(这有点像一个堆栈的过程)
5. 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o ⽂件声明make的终极任务,也就是执行⽂文件hello了。
6. 这就是整个make的依赖性,make会一层又⼀一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
7. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。
8. make只管文件的依赖性,即如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。
9. 项目清理,工程是需要被清理的
10. 像clean这种,没有被第一个目标⽂文件直接或间接关联,那么它后面所定义的命令将不会被⾃自动执行,不过,我们可以显示要make执行。即命令—“make clean”,以此来清除所有的目标文件,以便重编译。
11. 但是一般我们这种clean的目标文件,我们将它设置为伪目标,⽤用 .PHONY 修饰,伪目标的特性是,总是被执⾏行的。
12. 可以将我们的 hello 目标文件声明成伪目标,测试一下。
现在我们来实现一个进度条的小程序,如下所示:

  1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5     char bar[102]={0};
  6     int i=0;
  7     const char *flag="|/-\\";//zhuan yi zi fu 
  8     while(i<101)
  9     {
 10         printf("[%-100s],[%d%%],[%c]\r",bar,i,flag[i%4]);
 11         fflush(stdout);
 12         bar[i++]='#';
 13         bar[i]=0;//finsh of 0
 14         sleep(1);
 15     }
 16     return 0;
 17 }
 18 

结果如下所示:
这里写图片描述

有关Linux中基本命令的使用,就这么多了,希望可以帮助到大家,,
只有不停的奔跑,才能不停留在原地!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值