vim是Linux下的一个多模式的编译器 简单来说就是写代码的工具 不提供编译调试等功能
有语法高亮功能 可视化操作不仅可以在终端运行 还可以运行与x windows mac os windows
1、命令模式
控制光标的移动 字符,字或行 的删除 ,移动复制某区段
以及切换到插入模式和底行模式下
2、插入模式(使用最频繁的模式)
只有在插入模式下 才可以进行文字的输入
以及切换到命令模式
3、底行模式
文件保存或退出 也可以进行 文件替换 找字符串 列出行号等
以及切换到命令模式
命令模式切换到插入模式
输入a
:进入插入模式后 从目标光标所在位置的下一个位置开始输入文字
输入i
: 进入插入模式后 从光标当前位置开始输入
输入0
:进入插入模式后 插入新的一行 从行首开始输入文字
命令模式 切换到底行模式
输入shift+;
插入模式/底行模式切换命令模式
按ESC即可
插入模式和底行模式之间不能相互转换
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停止uuctrl+~
:快速切换大小写u
:撤销ctrl+r
:恢复n+G
:移动到第n行行首在使用底行模式之前 先按ESC键确定自己处于命令模式 然后再按shift+;
进入底行模式
set nu
:按回车后在文件中的每一行前列出行号set nonu
:按回车后在文件中的取消列出的行号数字
:按回车后就会跳转到该行行首w
:保存文件w!
:强制保存q
:退出文件q!
:强制退出文件wq
:保存并退出文件vs+文件名
:进行多文件操作ctrl+ww
:光标在不同文件中切换!+其他指令
:在不退出vim的情况下执行Linux其他命令gcc/g++分别是GUN中的c和c++编译器
对于 .c和.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
对于 .c和.cpp文件,g++则统一当做cpp文件编译
在使用gcc之前 应该了解一个.c源文件到一个.exe可执行程序经历了哪些过程和函数库 # 程序编译链接的四个过程
完成头文件的展开 删去注释 宏替换等工作
将源代码翻译成汇编语言 语法分析 词法分析 语义分析等
汇编代码转换成为二进制指令产生目标文件
将汇编过程产生的二进制指令进行连接 生成可执行程序
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了 这也就是链接的作用
库函数一般分为静态库和动态库
file 命令
语法: file 文件名
功能: 辨识文件类型
gcc/g++在编译时默认采用动态链接 我们也可以加上-static选项使用静态链接的方式编译
gcc -o newtest.exe test.c -static
采用静态链接 可执行程序会比较大
我们也可以查看一个可执行程序所依赖的库(使用ldd命令)
ldd 命令
语法: ldd 可执行程序
功能: 查看一个可执行程序依赖的库
在使用make/makefile之前 先了解一下各个文件之间的依赖关系和依赖方法
在重新产生一个可执行程序时 都应该将之前生成可执行程序以及生成的文件进行清理 即项目是需要清理的
make clean命令是用来清除所有的目标文件 以便重新编译 像清除这种没有被第一个目标文件直接或间接关联 那么他后面所定义的命令将不会被自动执行
一般这种clean的目标文件 直接将他设置位伪目标 .PHONY修饰,为目标的特性是可以强制执行
gdb 可执行程序
:进入调试ctrl+d 或者 q
:退出调试list/l 行号
:显示指定行之后的源码 每次显示10行list/l 函数名
:显示函数的源码b 行号
:在指定行设置断点b函数名
:在指定函数开头设置断点info b
:查看自己打的断点信息d breakpoints
:删除所有断点d 断点编号
:删除对应的断点disable 断点编号
:禁用断点enable 断点编号
:启用断点r(run)
:运行程序n(next)
:单条执行、逐过程执行 与vs中调试器的F10一样s(step)
:进入函数调用 逐语句执行 与vs中调试器的F11一样p (print) 变量名/&变量名
:显示变量的值或地址display 变量名/&变量名
:一直显示变量的内容或地址undisplay 编号
取消一直显示变量的内容或地址c(continue)
:从一个断点运行到下一个断点finsh
:将一个函数运行结束就停下来until
:直接运行到指定行set var
:修改一个变量的内容(不用修改源代码 进行多分支测试)