文章目录
- vim
- vim基本概念
- vim的常用三种模式
- vim三种模式的相互转换
- vim命令模式下的命令集
- 移动光标
- 删除文字
- 剪切/删除
- 复制
- 替换
- 撤销和恢复
- 跳转至指定行
- vim底行模式下的命令集
- gcc/g++
- gcc/g++的作用
- gcc/g++的语法
- 预处理
- 编译
- 汇编
- 链接
- 函数库
- 动静态库
- 动态链接的优缺点
- 静态链接的优缺点
vim
vim基本概念
vim是Linux下的一个多模式的编译器 简单来说就是写代码的工具 不提供编译调试等功能
有语法高亮功能 可视化操作不仅可以在终端运行 还可以运行与x windows mac os windows
vim的常用三种模式
1、命令模式
控制光标的移动 字符,字或行 的删除 ,移动复制某区段
以及切换到插入模式和底行模式下
2、插入模式(使用最频繁的模式)
只有在插入模式下 才可以进行文字的输入
以及切换到命令模式
3、底行模式
文件保存或退出 也可以进行 文件替换 找字符串 列出行号等
以及切换到命令模式
vim三种模式的相互转换
命令模式切换到插入模式
输入a
:进入插入模式后 从目标光标所在位置的下一个位置开始输入文字
输入i
: 进入插入模式后 从光标当前位置开始输入
输入0
:进入插入模式后 插入新的一行 从行首开始输入文字
命令模式 切换到底行模式
输入shift+;
插入模式/底行模式切换命令模式
按ESC即可
插入模式和底行模式之间不能相互转换
vim命令模式下的命令集
移动光标
- vim可以直接使用键盘来控制光标的上下左右移动,正规的vim使用的是小写字母
h j k l
分别控制光标左下上右移动一格 也可以使用方向键进行移动 - 按
G
:移动到文章的最后 - 按
gg
:进入到文本开始 - 按
$(shift+4)
:移动到光标所在行的行尾 - 按
^(shift+6)
:移动到光标所在行的行首 - 按
n+Enter
:光标向下移动n行 - 按
n+l
:光标进去到改行的第n个位置 - 按
ctrl+b
:屏幕向前翻一页 - 按
ctrl+f
:屏幕向后翻一页 - 按
ctrl+u
:屏幕向前翻半页 - 按
ctrl+d
:屏幕向后翻半页 - 按
w
:光标进入到下个字的开头 - 按
e
:光标进入到下个字的自尾 - 按
b
:光标回到上个字的开头
删除文字
- 按
x
:每按一次删除光标所在位置一个字符 - 按
n+x
:删除光标所在位置后面的n个字符 - 按
X
:删除光标所在位置前一个字符 - 按
n+X
:删除光标所在位置后前面的n个字符
剪切/删除
- 按
dd
:剪切/删除光标所在行 - 按
n+dd
:从光标所在行开始剪切/删除n行 - 按
p
:将剪切的内容复制到光标所在位置下一行 - 按
n+p
:将剪切的内容复制到光标所在位置下一行开始复制n行
复制
- 按
yy
:复制光标所在行到缓冲区 - 按
n+yy
:复制从光标所在行往下数n行字符到缓冲区 - 按
p
:将缓冲区的字符粘贴到光标所在位置下一行 - 按
yw
:将光标所在位置到字尾的字符复制到缓冲区 - 按
n+yw
:复制n个字到缓冲区
替换
- 按
r
: 替换光标所在处的字符 - 按
R
:替换光标所在位置的字符 直到按下esc停止uu - 按
ctrl+~
:快速切换大小写
撤销和恢复
- 按
u
:撤销 - 按
ctrl+r
:恢复
跳转至指定行
- 按
n+G
:移动到第n行行首
vim底行模式下的命令集
在使用底行模式之前 先按ESC键确定自己处于命令模式 然后再按shift+;
进入底行模式
- 输入
set nu
:按回车后在文件中的每一行前列出行号 - 输入
set nonu
:按回车后在文件中的取消列出的行号 - 输入
数字
:按回车后就会跳转到该行行首 - 输入
w
:保存文件 - 输入
w!
:强制保存 - 输入
q
:退出文件 - 输入
q!
:强制退出文件 - 输入
wq
:保存并退出文件 - 输入
vs+文件名
:进行多文件操作 - 输入
ctrl+ww
:光标在不同文件中切换 !+其他指令
:在不退出vim的情况下执行Linux其他命令
gcc/g++
gcc/g++的作用
gcc/g++分别是GUN中的c和c++编译器
对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
对于 .c和.cpp文件,g++则统一当做cpp文件编译
在使用gcc之前 应该了解一个.c源文件到一个.exe可执行程序经历了哪些过程和函数库 # 程序编译链接的四个过程
- 预处理
完成头文件的展开 删去注释 宏替换等工作
- 编译
将源代码翻译成汇编语言 语法分析 词法分析 语义分析等
- 汇编
汇编代码转换成为二进制指令产生目标文件
- 链接
将汇编过程产生的二进制指令进行连接 生成可执行程序
gcc/g++的语法
gcc/g++ 选项 文件
常用选项:
-E :只进行预处理 不会生成文件 需要自己重定向到一个文件里
-S: 编译到汇编语言(生成.s文件) 不进行汇编和链接
-c:编译到目标文件 (生成.o文件) 不进行链接
-o:将执行结果输出到指定文件中
-static:对生成的文件采用静态链接
预处理
gcc -E -o test.i test.c
将源文件test.c进行预处理后停止 将是执行结果输出到test.i文件中
可以看到预处理阶段完成了头文件的展开 删去注释 宏替换等工作
编译
gcc -S test.s
将预处理阶段产生的test.i文件编译产生.s汇编文件
汇编
gcc -c test.s
将汇编文件test.s编译成产生.o目标文件
链接
gcc test.o
将目标文件链接产生可执行程序a.out
如果你也和我一样 不喜欢a.out 用-o进行重定向gcc -o test.exe test.o
可执行程序也是二进制指令
函数库
我们在c程序中,并没有实现printf函数,且在预编译中包含的头文件stiod.h中也仅仅只是有该函数的声明 并没有定以实现该函数 那么printf函数在哪里实现的呢?
在Linux中 系统把这些函数都实现在一个名为libc.so.6(Linux中的一个动态链接库 包含了标准c库的实现)的文件中 在没有特别指定时 gcc会到系统默认的路径’‘/usr/lib’'下进行查找,也就是链接到libc.so.6库函数中去 这样就能实现函数printf了 这也就是链接的作用
库函数一般分为静态库和动态库
动静态库
- 静态库是指在编译链接时 把库文件的代码全部加入到可执行文件中 因此生成的可执行程序文件会比较大 但在运行时也就不需要库文件了在linux下后缀名一般为.a windows中后缀名为.lib
- 动态库则是在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库 这样可以节省系统的开销 在Linux下后缀为.so windows后缀为.dll 前面所说的libc.so.6就是动态库
- gcc在编译时默认使用动态链接(使用file命令验证)
file 命令
语法: file 文件名
功能: 辨识文件类型
gcc/g++在编译时默认采用动态链接 我们也可以加上-static选项使用静态链接的方式编译
gcc -o newtest.exe test.c -static
采用静态链接 可执行程序会比较大
我们也可以查看一个可执行程序所依赖的库(使用ldd命令)
ldd 命令
语法: ldd 可执行程序
功能: 查看一个可执行程序依赖的库