Vim是vi编辑器发展而来的。vi是早期Unix系统中的编辑器,Vim是在vi的增强版,在此基础上添加许多新的功能
这里的Vim与我们平时使用的VS2022编译器不一样,VS2022是一款集成开发环境,可以用于,编写代码-调试代码理-编译运行代码。
在Linux中:
在早期的键盘上,是没有 ↑↓←→的方向键,在Vim中移动光标是通过h、j、k、l这四个按键控制。当然现在Vim也支持使用方向键,但在实际中,并不会使用方向键,在使用上方向将并没有hjkl四个按键顺手。类似于在游戏中我们不会使用方向将来操控角色,而是用wasd来控制方向。
直接输入vim,进入vim的环境查看它版本信息。
额,进去之后别慌,此时vim正处于命令模式,注意观察左下脚的单词 NORMAL
,此时的状态指的就是命令模式,又被称为正常模式,在命令模式中,输入的任何按键都可以被视为一条指令,当然这条指令是合法的才会生效。在命令模式中输入 Shirt + zz
即可退出,别搞错了,英文输入法才会起效果~。
命令模式:normal mode
又称为正常模式,Linux会将输入的所有内容当作为命令,它只识别支持的命令,乱按键盘是没用滴~ ,可以控制光标的移动,代码、字符串、行的复制、粘贴、删除等操作。此模式无法进行编辑
在Windows中,使用 CTRL + c / v进行复制粘贴的快捷方式,实际上是一个指令,和命令模式中的命令操作本质是一样的。
插入模式: insert mode
对文件输入内容,在命令模式中输入 i
即可进入,通过ESC可以退出插入模式,切回命令模式。
底行模式:Last line mode
文件保存、退出、查找字符串、列出行号等操作。在命令模式中输入 Shift + ;
,通过ESC可以退出底行模式,切回命令模式。
安装Vim
sudo yum install vim //普通用户
yun install vim //超级用户
通过vim打开文件进行编辑
vim [文件名]
刚开始使用Vim进行编辑看见的是这样:
啊,这该怎么玩它,什么按键按下去也没有效果。此时Vim处于命令模式,想要进行代码的编辑,需要输入 i
切换到插入模式,左下脚有INSERT的字样,成功进入插入模式。
在插入模式中进行编辑,又发现一些问题,为什么没有快捷输入,报错信息,换行不会自动大四个空格,等等等,放在就是用着变扭
第一次使用的vim是刚出厂的什么内容都还没有进行配置,语法高亮、自动换行等内容,而这些可以通过手动在 vim ~/.vimrc
中进行配置,打造属于自己的vim编辑器。.vimrc的配置
在普通账户的加目录中执行一下命令,即可自动配置vim的环境,需要在联网环境运行。[配置Vim环境](VimForCpp: 快速将vim打造成c++ IDE)
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
特点,退出vim前,光标在那一行,再次使用vim进入该文件时,光标还是在哪一行
切换插入模式
命令模式 | 结果 |
---|---|
i | 进入插入模式,光标在哪,进入插入模式光标就指向哪 |
a | 进入插入模式,光标在当前位置后移一个位置 |
o | 进入插入模式,光标换到下一行 |
上下定位
命令模式 | 结果 |
---|---|
gg | 光标直接定位到第一行 |
shift + g == G | 光标定位到文本结尾 |
数字 + gg | 使光标定位到任意行 |
gg
G
48 + gg:
90 + gg
通过数字加gg的方式定位光标在效率上明显快很多,而想要在一行内完成左右定位,该咋办捏~
左右定位
命令模式 | 结果 |
---|---|
Shift + 4 == $ | 光标定位到改行内容的结尾 |
Shift + 6 == ^ | 光标定位到改行有效内容的起始位置 |
w | 以单词为单位,使光标前移动 |
b | 以单词为单位,使光标后移动 |
数字 + w、b | 通过数字控制移动的单词个数 |
h、j、k、l :h控制光标先左移动一个单位;j控制光标向下移动一个单位;k控制光标向上移动一个单位;l控制光标向右移动一个单位
不使用方向键:在键盘初期没有 ↑ ↓ ← →键位
$:注意需要使用英文输入法
^
3w
命令模式 | 结果 |
---|---|
yy | 复制当前行 |
p | 粘贴到当前行的下一行 |
dd | 剪切或删除当前行 |
dd + p | 完整剪切逻辑,可以通过数字进行配合 |
数字 + yy | 从第一行复制的指定数字对应的行号 |
数字 + p | 数字大小可以指定粘贴多少份。 |
数字 + dd | 从光标所在这一行开始向下指定剪切多少行 |
数字 + x | 向后删除的一个字符。通过数字配合指定向后删除字符的个数 |
数字 + X | 注意了,这是大写的X,向前删除一个字符。 |
命令模式 | 结果 |
---|---|
u | 撤销 |
CTRL + r | 对u进行撤销 |
这两个命令在逻辑上呈现环装,可以进行相互撤销,写错东西,删错了可别慌,只要还没有退出vim还有补救滴~
退出vim出后,无法进行撤销操作
命令模式 | 结果 |
---|---|
~ (Shift + `) | 快速转换大小写 |
r + 需要替换的字符 | 将光标选中的内容进行替换。 |
数字 + r + 需要替换的字符 | 数字大小,表示从当前光标指定的内容向后替换的字符个数 |
Shift + r
:从命令模式切换到替换模式,光标在哪里进行输入,直接进行替换
需要在命令模式输入冒号进行切换,shift + ; == :
底行模式输入,help可以观察viim的模式,和一些相关信息,看不懂英文没关系,有翻译软件呐~
底行模式 | 结果 |
---|---|
w | 保存当前文件 |
q | 退出文件 |
wq | 退出并保存 |
! | 强制执行,可以与上述三个指令配合执行。 |
Shift + zz | 退出vim |
底行模式 | 结果 |
---|---|
/ + 查找的字符串 | 定位到该字符串出现的第一次出现的位置 |
/ + 查找的字符串 / 数字 | 定位到下一个出现字符串的位置 |
还可以在擦找到一个字符串后不断的按n,向后查找
! + 命令
:在不退出vim,使用命令行命令
例如:在底行模式中编译运行test.c文件
vs + 文件名
:实现分屏操作。在分屏中,光标在哪个屏幕,使用哪个文件
CTRL + ww:将光标移动到下一个屏幕
其余的操作与正常使用一个fengping
%s/替换的字符串/替换后的内容/g
global:整体的
底行模式 | 结果 |
---|---|
%s/printf/print/g | 将文本中所有printf替换为print |
CTRL + v
:进入视图模式
shitf+i,进入插入模式
视图模式 + h j k l选择注释的区域 + shift+i + // + Esc
:批量化注释:
视图模式 + (gg + shift+g) + shift+i + // + Esc
:全注释:
视图模式 + h j k l选择注释的区域 + d
:批量化删除
成功进入视图模式:
批量化注释:
通过hjkl,或者gg,G选择待注释的区域
Shift + i,进入插入模式输入 //
,进行注释
Esc,退出
批量化删除,在视图模式中使用,hjkl,或者gg,G控制待删除的区域
d,在键盘上输入d。完成删除
使用vim + 文件名 + 数字:可以指定打开文件后,指定光标所在的行号。
注意,这是在退出Vim编辑器后执行的命令行指令
!g
:执行最近使用的gcc命令
!l
:执行最近使用的LL命令
!w
:执行最近使用的which命令
可以通过 !
,对任意指令进行配合。
修改vim的本质是去修改家目录下,.vimrc这个配置文件,在里边设置配置项目
从权限的角度来看,一个账户配置的vim,只能在当前账户中使用,
底行模式 | 结果 |
---|---|
set nu | 设置行号 |
set nonu | 取消行号 |
格式 gcc [选项] 要编译的文件 [选项] [目标文件]
生成可执行文件,默认生成的可执行文件名称为,a.out
运行可执行文件:
也可以指定生成的可执行文件名
gcc test.c -o test
生成.i
文件
Linux中,头文件一般放在:/usr/include/
这个目录中
gcc -E code.c -o code.i
没有添加 -o
命令,会将生成后的 code.i文件内容全部打印出来
code.i
生成
-o
后面更上的文件名,表名要生成目标文件的文件名称
-E
:从现在开始,进行程序的编译,一旦预处理完成,就停止
将C语言编译为汇编语言,生成 .s
文件
gcc -S code.c -o code.s
code.s
生成汇编语言文件
-S
:开始进行程序编译,编译做完,完成汇编就停止。
将汇编语言编译生成二进制文件,生成 .o
文件
gcc -c code.c -o code.o
此处的二进制文件为,可重定位目标二进制文件,无法执行
-c
:开始进行程序的翻译,汇编完成就停下来。
可以使用 od + 文件名 打开
没有前置完成-ES的操作直接 -c会将上述的操作执行,会直接生成 code.o的文件
gcc -c code.c -o code.o 可重定位目标文件
将.o文件与库文件进行链接,生成可执行文件
gcc code.o -o code
在介绍动静态库之前,先原谅我叨叨几句介绍语言的发展。
计算机只认识二进制!!
现有语言、还是先有编译器呢~
作者水平有限,无法深入讲解
在Linux中可以完成代码的编译链接,离不开库的存在,在Linux中就默认存在着C/C++的库,头文件
ls /usr/include/ //查看Linux中的头文件
libxxxx.so
、静态库libxxxx.a
。lib作为前缀,so作为后缀
xxxx.dll
、静态库xxxx.lib
。.dll为动态库的后缀,.lib为静态库的后缀
通过ldd指令可以查看,进行链接时依赖了那些库。
ldd code 可以查看链接时依赖了什么文件
libc.so.6
,C标准库,掐头去尾单剩一个C
,它就是库名。
在进一步罗列库文件的信息。
ls /lib64/ld-linux-x86-64.so.2 -l
动态链接:
我是一位很喜欢上网的同学,最近刚刚以全市前3的成绩进了市一中,原本我是打算高高兴兴的进去学校,然而我傻眼了,隔壁有个学长告诉我这所市一中要求不能携带手机、电脑,我想着这可难办了,平时我学习成绩很好就是因为学习可以上网查资料,学累了可以玩游戏放松放松。此时学长说你先别急,我给你一串地址,在这学校附近有一家网吧,平时在周末咋们学校的同学都是去这个网吧上网的。
而某一天,某某老师发现,学校附近有一家网吧,学校的同学们一到周末都去网吧上网,老师想着这可不行,必须把这家网吧封了,因为它严重的影响到学生们的作风。网吧被封禁了(没有动态库),会导致所有的可执行文件运行出错
静态链接:
发现网吧被封了之后,我这可不行了,一个学期过去,我无法上网,导致我的学习成绩下滑了两名,不在是全校的top3了,回家之后我就去找老爸告状。此时老爸一听,这可不行我儿的学习成绩开始下滑了,是因为无法在学校上网导致的。
之后,老爸给学校商量,让我可以搞台电脑放在学校里给我用。我就携带电脑到学校去,这个过程称为静态链接
静态链接:将我们要的库方法,直接拷贝到我们的可执行程序中。
动态链接和静态链接的区别:
通过动态链接生成的可执行程序
通过动态链接生成的可执行程序,可以发现静态链接消耗的内存是,动态链接的100倍左右。
在Linux中,gcc默认执行的是动态链接,需要静态链接就只能手动执行。通过 file
查看文件的链接信息,可以发现,code是 dynamically linked
,翻译过来就是动态链接。
gcc默认不存在静态库,执行这条命令将会会报错。进行静态链接,系统中必须存在静态库
gcc code.c -o code-s -static 静态链接库
安装静态库:
sudo yum install glibc-static libstdc++-static -y
c库 c++库
通过file查看code-s的信息,可以发现链接方式是,statically linked
,也就是静态链接。
在普通账户中使用sudo创建了一个code.c文件,创建好后输入byte的密码,Linux提示byte不存在sudoers文件中。
ls -l /etc/sudoers
通过打印sudoers的信息发现,只有超级管理员才可以查看这个文件,没有修改的权限。
配置:
使用root账号打开这个文件,找到第100行,配置系统信任的账号。最左侧这一栏是普通账户名称,别写错了。
点击ESC切换到命令模式,然后切换到,底行模式进行保存退出,记得加感叹号强制保存退出,即使是超级用户也需要添加,Linux对这方面进行了限制。
代码中可以通过条件编译完成对代码的裁剪,实现增删改。
可以通过设置裁剪的规则,完成在不同场景下生成不同版本的可执行程序。例如xshell的免费版本、收费版本,它们本质是通过条件编译完成功能的阉割。而不是写两份代码分别维护免费版本,收费版本,这样太过于麻烦
下列摘取自豆包
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=584n2qj9rwfh
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有