目录
??前言
??1. 什么是vim
??2. vim的使用
vim的基本操作:
??3. 命令模式下的命令集
??4. 底行模式下的命令集
??5. vim的个性设置
??6. gcc/g++的使用
?? 扩展:程序从编译到运行的翻译过程
预处理(进行宏替换):
编译(生成汇编):
汇编(生成机器可识别代码):
链接(生成可执行文件或库文件):
?? 扩展:函数库
?? 总结:
??前言
这篇文章会围绕如何在Linux中编译和编辑代码进行讲解,其中会讲解vim是什么,vim的模式有哪些,在不同模式下的命令,以及如何个性化配置自己的vim,最后通过gcc/g++编译自己的代码。
其中,文章会花费大长篇幅讲解vim在不同模式下的命令集,当然这也是非常简单的,不需要可以去记住,熟能生巧。
??1. 什么是vim
在Linux系统中,绝大部分的配置文件都是以ASCII的纯文本形式存在的,因此利用简单的文本编辑软件就能修改设置了,这就要求我们系统管理员至少要熟悉一种文本处理工具。
什么是纯文本文件?文件记录的都是0和1,而我们编码系统讲这些0和1转成我们认识的文字,。纯文本文件中只有换行,制表符等少数格式控制字符和一般的可见字符。ASCII就是其中一种广泛使用的文字编码系统。
那Linux有很多文本编辑器,如emacs,pico,nano与vim等。既然这么多,为什么要学习vim呢。接下来我们了解一下vim的优点吧。
在介绍vim之前,我们还要说一下vim的前身vi,vi也是一款文本编辑器,因为太过于老旧,被vim所替代,你也可以将vim视为vi的高级版本。
vi / vim的优点:
1. 所有的UNIX-like系统都会内置vi文本编辑器,其他的文本编辑器则不一定会存在;
2. 很多软件的编辑接口都会主动调用vi;
3. vim具有程序编辑能力,可以主动以字体颜色辨别语法的正确性,方便程序设计;
4. 因为程序简单,编辑速度快;
——《鸟哥的Linux私房菜》
举例来说,当你使用vim去编辑一个C语言程序文件时,vim会根据文件的扩展名或是文件内的开头信息,判断文件的内容而自动调用程序的语法判断样式,在以颜色来显示程序代码与一般样式,此外vim可以直接帮你进行程序出错(debug)功能。因此,vim也可以是程序编辑器。
讲到这里,我们已经讲解了什么是vim,为什么要学vim了。总结一下,vim是一款文本编辑器,也是一款程序编辑器。通过学习vim,我们就可以在Linux上编辑我们的代码了。
??2. vim的使用
vim的模式总共有12:命令模式(普通模式),插入模式(编辑模式),底行模式(命令行模式),替换模式,可视模式。当然不同地方对这五个模式有不同的名称。这里我们只需要学习前三个即可。
● 命令模式:
控制屏幕光标的移动,字符,子或行的删除。移动复制某区段进入Insert mode(插入模式)下,或者进入last line mode(底行模式)。
● 插入模式:
只有在插入模式下,才可以进行文字的出入,按ESC可以返回命令模式。该模式也是我们后面最常频繁的编辑模式。
● 底行模式:
文本的保存和退出,也可以进行文本替换,找字符,列出行号等操作。在命令模式下,按shift+;即可进入该模式。
vim的基本操作:
1.【正常模式】切换至【插入模式】:
● 输入a:从当前位置的下一个位置进入【插入模式】
● 输入o:从当前行的下一行进入【插入模式】
● 输入i:从当前位置进入【插入模式】
2.【插入模式】切换至【正常模式】:
● 按ESC
【正常模式】切换至【底行模式】:
● shit + ;其实就是输入;
3. 退出vim
先从【正常模式】切换至【底行模式】,再在底行模式下输入:
● w :保存当前文件。
● q! : 不存盘,强制退出。
● wq : 保存并退出。
??3. 命令模式下的命令集
进入插入模式:
● 按[ i ]切换进入插入模式,即从光标当前位置开始输入文件。
● 按[ a ]切换进入插入模式,即从当前光标的下一个位置开始输入文字。
● 按[ o ]切换进入插入模式,即插入新的一行,从行首开始输入文字。
从插入模式切换至命令模式:
● 按[ ESC ] 键
移动光标:
● vim可以使用键盘上的↑↓→←按键来控制上下左右移动,但正规的vim是用小写字母h , j , k , l ,分别控制光标的左,下,上,右移一格。
● G : 移动到文章的最后。
● shift + 4 ($) : 移动到光标所在行的行尾。
● shift + 6 (^):移动到光标所在行的行首。
● w:光标跳到下个字的开头。
● e: 光标跳到下个字的字尾。
● b:光标回到上个字的开头
● gg:回到文章的开始
● shift + g : 进入文章末端
删除文字:
● x:删除光标所在位置的一个字符。(从前往后)
● shift + x:从后往前删除光标所在位置。
● dd:删除光标所在行。
复制:
● yy : 复制当前行。
●p:拷贝当前行
替换:
● r:进入替换模式,替换光标所处的字符。
撤销上一步操作:
● u : 误执行一个命令,回到上一个命令。
● ctrl + r:撤销恢复,即撤销的撤销。
以上操作部分可以带数字执行,即[ n ] + 命令,例如 4 + shift + g 就是跳转到第4行。这里为了不增加学习压力,所以没有上述命令没有给出,如果感兴趣可以下来自己实验。
??4. 底行模式下的命令集
● 列出行号
su nu
● 查找字符
/字符
● 保存文件
w
● 离开vim
q: q就是退出,如果无法离开,就在后面+!,强制离开vim。
wq:保存退出。
??5. vim的个性设置
vim的原生配置可能不太齐全,所以使用起来并不是很方便,比如我们想用代码补齐,vim并不会自带,但是vim支持安装插件,我们可以选择安装插件来完善配置。
这里,给大家推荐GiteeS上的一个项目,可以快速帮助大家完成个性配置:
VimForCpp: 快速将vim打造成c++ IDE,点进去后,下滑,找到一行指令,在Linux中输入即可,注意,要确保用户不能是root!!!否则,会出现兼容性等一系列问题。
??6. gcc/g++的使用
以上,我们对vim有了一定了解,vim是一款文本编辑器和代码编辑器,编辑好我们的代码后,我们就要对代码进行编译,gcc/g++就是用来编译我们代码的工具。
gcc:编译C语言代码
g++:编译C/C++语言代码。
这里扩展一下,C++程序文件,可以是.cc,.cxx,.cpp为后缀名的。当然Linux系统是不以后缀名区分文件的,但是vim和gcc/g++这些软件会区分。
格式 : gcc/g++ [选项] 要编译的文件 [选项] [目标文件]
一般情况下,不指定文件名,只需要gcc/g++ filename即可,默认生成a.out可执行文件。当然我们也可以带上-o 选项,即可命令生成的可执行文件。
?? 扩展:程序从编译到运行的翻译过程
以上代码经过预处理,编译,汇编,链接生成我们的可执行程序。
预处理(进行宏替换):
实例: gcc –E hello.c –o hello.i
●预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
●预处理指令是以#号开头的代码行。
●选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
●选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
编译(生成汇编):
实例: gcc –S hello.i –o hello.s
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
汇编(生成机器可识别代码):
实例: gcc –c hello.s –o hello.o
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
链接(生成可执行文件或库文件):
gcc hello.o –o hello
在成功编译后,就进入了链接阶段。
?? 扩展:函数库
在C语言中,我们知道,printf是库函数的一种,但在程序中,没有定义printf函数的实现,且在预处理阶段包含的“stdio.h”中也只有函数的声明,而没有定义函数的实现,那么哪里实现printf函数呢?
在Linux系统中,这些函数的实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc回到系统默认搜索路径“/usr/lib”下进行查找,也就是连接到libc.so.6库函数中去,这样就能实现printf函数了,而这也就是链接的作用。
函数库一般分为静态库和动态库两种:
● 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
● 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc默认生成的二进制程序,是动态链接的。
?? 总结:
以上,我们对Linux中如何编辑和编译代码做了解,也给出如何操作vim即gcc/g++,同样的也给出两个扩展。同样的,这两个扩展也是非常重要的,对于一名合格的Linux,C/C++工程师来说,了解这些是非常有必要的。因为本文的重点不是这,所以也只是粗略的讲解了一下,并没有深入讲解。如果大家对此感兴趣,可以再评论区留言讨论,博主会对此发布新文章进行讲解。
最后,希望大家在评论区积极讨论,点赞,收藏,关注Thanks?(?ω?)?