vim编辑器和gcc/g++编辑器的使用讲解

vim编辑器

1 vim的基本概念

vim是Linux的编写代码的工具,是一种多模式的编辑器。

Linux中vim的常用的模式大概可以分为三种,分别是:
命令模式 (command mode)、插入模式 (Insert mode)和底行模式(last line mode)

各种模式下的功能如下:

命令模式 :

控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode

插入模式 :
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式

底行模式 :
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入

那么我们的新建的文件的默认模式是什么呢?

我们在xshell上一探究竟:

可以看到我新建的一个文件用vim打开后默认时插入模式

但是有些版本打开默认时命令模式

那么该如何切换各种模式呢?

复制代码
从命令模式到插入模式,输入i即可
从插入模式到命令模式,按Esc键即可
从命令模式到底行模式,按shift键加;键即可
从底行模式到命令模式,按Esc键即可
插入模式和底行模式不能直接进行转换

2 vim的基本操作

进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:

例如:

复制代码
vim test.c 创建test.c文件并且直接进入该文件的编辑

想要退出vim及保存文件,需要切换到底行模式,输入指定的指令:

但是编辑文件时为插入模式,所以先要按Esc键,然后shift+;

例如:

复制代码
 w (保存当前文件)
 wq (输入「wq」,存盘并退出vim)
 q! (输入q!,不存盘强制退出vim)
 w!(强制保存)

输入wq后我们就可以保存并且退出了

3 vim命令模式命令集

3.1 光标的移动

在命令行模式下光标的移动可以通过各种指令来出来,Linux中不支持鼠标的使用

复制代码
vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
按「G」:移动到文章的最后
按「 $ 」:移动到光标所在行的"行尾"
按「^」:移动到光标所在行的"行首"
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l
按[gg]:进入到文本开始
按[shift+g]:进入文本末端
按「ctrl」+「b」:屏幕往"后"移动一页
按「ctrl」+「f」:屏幕往"前"移动一页
按「ctrl」+「u」:屏幕往"后"移动半页
按「ctrl」+「d」:屏幕往"前"移动半页
3.2 删除文字
复制代码
「x」:每按一次,删除光标所在位置的一个字符
「#x」:例如,「6x」表示删除光标所在位置的"后面(包含自己在内)"6个字符
「X」:大写的X,每按一次,删除光标所在位置的"前面"一个字符
「#X」:例如,「20X」表示删除光标所在位置的"前面"20个字符
「dd」:删除光标所在行(可以作为剪切,dd后可以p粘贴)
「#dd」:从光标所在行开始删除#行
3.3 复制
复制代码
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。
3.4 替换
复制代码
「r」:替换光标所在处的字符
「R」:替换光标所到之处的字符,直到按下「ESC」键为止
3.5 撤销
复制代码
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次回复。
「ctrl + r」: 撤销的恢复,就是撤销上一次的撤销
3.6 更改
复制代码
「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字
3.7 调至指定行

「ctrl」+「g」列出光标所在行的行号。

「#G」:例如,「15G」,表示移动光标至文章的第15行行首

4 vim底行模式命令集

4.1 列出行号
复制代码
「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号

例如:

4.2 跳到文件的某一行
复制代码
「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行

例如:

输入5后光标跳转到第5行

4.3 查找字符
复制代码
「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按
「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直
按「n」会往前寻找到您要的关键字为止

二者的区别就是一个按n往前找,一个按n往后找

例如:

4.4 保存退出
复制代码
 w (保存当前文件)
 wq (输入「wq」,存盘并退出vim)
 q! (输入q!,不存盘强制退出vim)
 w!(强制保存)

gcc/g++编辑器

gcc和g++两个编译器分别用于c语言和c++的编译

1 gcc如何完成

复制代码
 gcc [选项] 要编译的文件 [选项] [目标文件]

例如:

2 gcc的三个阶段

2.1 预处理(进行宏替换)

有一个点大家要记住:
预处理后代码还是C语言!

复制代码
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc --E hello.c --o hello.i
选项"-E",该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项"-o"是指目标文件,".i"文件为已经过预处理的C原始程序。
2.2 编译(生成汇编)

这个过程只是将代码转成汇编语言,并不会进行汇编过程

复制代码
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查
无误后,gcc 把代码翻译成汇编语言。
用户可以使用"-S"选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc --S hello.i --o hello.s
2.3 汇编(生成机器可识别代码)

这个过程就是将汇编语言进行汇编,转为能够被计算机识别的二进制代码文件

又称为可重定向目标文件

复制代码
汇编阶段是把编译阶段生成的".s"文件转成目标文件
读者在此可使用选项"-c"就可看到汇编代码已转化为".o"的二进制目标代码了
实例: gcc --c hello.s --o hello.o
2.4 链接(生成可执行文件或者库文件)

到这里就是将多个后缀为.o的文件合并形成一个可执行文件(exe)

复制代码
在成功编译之后,就进入了链接阶段。
实例: gcc hello.o --o hello

我们可以用file查一下:

3 函数库

我们的C程序中,并没有定义"printf"的函数实现,且在预编译中包含的"stdio.h"中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实"printf"函数的呢?

最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了 ,在没有特别指定时,gcc 会到系统默认的搜索路径"/usr/lib"下进行查找,也就是链接到 libc.so.6 库函数中去 ,这样就能实现函数"printf"了,而这也就是链接的作用

函数库一般分为静态库和动态库两种

例如,在windows中 :
.dll就是动态库,.lib就是静态库

静态库是指编译链接时**,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大**,但在运行时也就不再需要库文件了。其后缀名一般为".a"

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库 ,这样可以节省系统的开销。动态库一般后缀名为".so", 如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。其实动态库的使用就是存储一个地址,从而建立链接

部分系统没有安装静态库,安装命令如下:

复制代码
yum install -y glibc -static  c语言静态库
yum install -y libstdc++ -static  c++静态库

4 gcc选项

复制代码
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S  编译到汇编语言不进行汇编和链接
-c  编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w  不生成任何警告信息。
-Wall 生成所有警告信息。

好了,本篇博文的分享到这里就结束了,感谢大家的支持!

相关推荐
且从容.40 分钟前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道1 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
且从容.4 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落5 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨6 小时前
WSL2的安装与使用
linux·wsl
微小的鱼6 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng6 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Ravenq~6 小时前
无头转换:把 .docx 变成 PDF,不打开编辑器
pdf·编辑器
Android系统攻城狮7 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
Linux-lucky18 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu