vim详解
- 引言
- vim
- Vim的三种模式及模式切换
- 普通模式下操作
- 底行模式下操作
- gcc与g++
- gcc的使用(g++类似)
- 预编译
- 编译
- 汇编
- 链接
- 静态库与动态库
- 总结
引言
vim(vi improved)编辑器是从 vi 发展出来的一个文本编辑器。 代码补全、编译及错误跳转、语法高亮等方便编程的功能特别丰富,在程序员中被广泛使用。
vim 可以说是程序开发者的一项很好用的工具,它更是一个程序开发工具而不只是文字处理软件。
在vim中编辑代码可以使程序员的手指集中在键盘中央,从而提高效率。
在vim中编辑代码后,要执行代码就需要编译器,在Linux中使用gcc
与g++
编译C与C++代码
vim
为方便演示,我们touch
一个test_vim.c
文件,并使用vim 文件名
以vim方式打开这个文件:
Vim的三种模式及模式切换
vim编辑器有许多模式,在这里只介绍三种常用的模式:命令(普通)模式Normal mode
、底行模式Last line mode
、插入模式Insert mode
:
命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入到Insert mode或者到 last line mode下:
使用vim 文件名
打开后的状态就是命令(正常)模式:
插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,是使用的最频繁的编辑模式。在命令模式下按i
即可进入该模式,按Esc
键可回到命令行模式:
这个模式中可以正常编辑代码,就不赘述了。
末行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下按:
即可进入该模式,按Esc
键可回到普通模式:
普通模式下操作
由于空文件下无法观察普通模式的操作,所以先使用插入模式在test_vim.c
文件中输入一些内容:
常用命令:
-
移动光标
小写英文字母h
、j
、k
、l
,分别控制光标左、下、上、右移一格:
G
:移动到文章的最后
$
:移动到光标所在行的“行尾”
^
:移动到光标所在行的“行首”
w
:光标跳到下个字的开头
e
:光标跳到下个字的字尾
b
:光标回到上个字的开头
#l
:光标移到该行的第#个位置
gg
:进入到文本开始
ctrl + b
:屏幕向后移动一页
ctrl + f
:屏幕向前移动一页
ctrl + u
:屏幕向后移动半页
ctrl + d
:屏幕向前移动半页
(移动光标的命令就不举例使用了) -
删除文字
x
:每按一次,删除光标所在位置的一个字符
#x
:表示删除光标所在位置的后(包含自己在内)#个字符
X
:每按一次,删除光标所在位置的前一个字符
#X
:表示删除光标所在位置的前#个字符
dd
:删除光标所在行
#dd
:从光标所在行开始删除#行
-
复制
yw
:将光标所在之处到字尾的字符复制到缓冲区中
#yw
:复制#个字到缓冲区
yy
:复制光标所在行到缓冲区。
#yy
:表示拷贝从光标所在行向下#行文字
p
:将缓冲区内的字符贴到光标所在位置
需要注意的是:所有与y
有关的复制命令都必须与p
配合才能完成复制与粘贴功能
-
替换
r
:替换光标所在处的字符。
R
:替换光标所到之处的字符,直到按下Esc
键为止。
-
撤销上一次操作
u
:回到上一个操作,按多次可以执行多次回复
ctrl + r
: 撤销的恢复 -
更改
cw
:更改光标所在处的字到字尾处
c#w
:表示更改#个字符 -
跳至指定的行
ctrl+g
: 列出光标所在行的行号
#G
:表示移动光标至文章的第#行行首
底行模式下操作
常用命令:
-
列出行号
set nu
: 在文件中的每一行前面列出行号。
(我使用的vim环境已经是配置过的,所以会默认显示行号) -
跳到文件中的某一行
#
:跳到第#行 -
查找字符
/关键字
: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按n
会往后寻找
?关键字
:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按n
会往前寻找 -
保存与退出
w
: 可以将文件保存起来,使用!
强制保存
q
:退出vim,后加!
强制离开vim
wq
:保存并退出
gcc与g++
在之前的C语言部分,我们知道我们所写的C代码要经过一系列处理为可执行程序后才能被系统执行,其中包括预编译、编译、汇编、链接
在Windows环境下我们经常使用Visual Studio、DevC、VC等开发环境环境进行代码的编写、编译与运行。而在Linux下我们使用vim
编写代码后,就使用gcc
与g++
编译C与C++代码:
gcc的使用(g++类似)
首先创建一个test_gcc.c
文件,并使用vim在其中编辑一段代码:
预编译
在预编译中会进行头文件包含、宏替换、注释删除、条件编译等,在Linux中执行完预编译后会生成一个.i
文件
使用 gcc -E 依赖文件 -o 目标.i文件
就可以实现将原文件只处理到预编译结束,生成.i
文件为止:
我们可以使用vim打开这个test_gcc.i
文件查看预编译后的代码:
可以看到,与之前的代码对比,将stdio.h文件拷贝到这里,并删除了注释,将M替换为100。
编译
编译即将预编译后的文件转化为汇编代码,在这之前还需要做词法分析、语法分析、语义分析、代码优化等的行为,在这过程中将会检查代码中的错误(即编译错误)。编译结束后会生成一个.s
文件
使用gcc -S 原文件 -o 目标.s文件
就可以实现将原文件只处理到编译结束,生成.s文件中止,(原文件可以为.c
文件,也可以是已经预编译后的.i
文件)
当然我们也可以使用vim查看这个.s
文件:
汇编
汇编即将之前生成的汇编代码生成目标代码(在这里就是机器可识别的二进制代码),这其中还要进行符号表的生成等(符号与其地址),之后会生成一个.o
文件
使用 gcc -c 原文件 -o 目标.o文件
就可以将原文件处理到汇编结束,生成.o文件为止(原文件可以为之前的任意状态的文件)
我们当然也可以通过vim查看这个.o
文件(但这并没有什么意义,因为完全看不懂,这里就不展示了)
链接
在进行完之前的处理后,就需要将我们写的文件与库,或者与我们写的其他文件链接起来,最终生成一个可执行程序。这个过程中会重新定位符表
使用 gcc 原文件 -o 可执行文件
就可以实现将之前任一状态的文件处理后进行链接从而生成一个可执行程序:
./
打开这个可执行程序就可以运行了:
需要注意的是,当编辑的代码中含有C99标准及以后的语法时,需要在编译时加上 -std=c99
选项
静态库与动态库
我们在文件中包含的stdio.h只是头文件,即声明。而这些函数的定义是在库中的,这也就是为什么我们需要将我们写的代码与库进行链接后才能生成可执行程序。 系统中有两种类型的库,即静态库与动态库。
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中。所以生成的文件比较大,但在运行时也就不再需要库文件了,其后缀名一般为.a
动态库是在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so
gcc 在编译时默认使用动态库(可以通过file
查看):
总结
到此,关于Linux工具中的编译器vim
与编译器gcc
/g++
就介绍完了
在下一篇文章中将介绍其余的Linux工具,希望大家持续关注哦
如果大家认为我对某一部分没有介绍清楚或者某一部分出了问题,欢迎大家在评论区提出
如果本文对你有帮助,希望一键三连哦
希望与大家共同进步哦