目录
1vim的基本概念
vim基本分三种模式:
- 正常模式/命令模式(Normal mode):控制屏幕光标的移动,字符,字或行的删除,移动复制某段区域
- 插入模式(Insert mode):只有在Insert mode模式下,才可以输入文字,按[esc]可回到命令行模式
- 末行模式(last line mode):文件的保存或退出,也可以进行替换,字符串查找,列出行号等操作,在命令模式下,shift+:进入该模式
要查看所有的模式:help vim-modes
一共有12中模式:six BASIC modes 和 six ADDITIONAL modes
2vim的基本操作
- vim + 文件名:进入全屏编辑画面(正常模式),需要切换到[插入模式]才能输入文字
- [正常模式]切换到[插入模式]: 1:---[a] 2:---[i] 3---[o].
- [插入模式]切换到[正常模式]: [esc]
- [正常模式]切换到[末行模式]: [shit + :]
- vim保存及退出: w:保存当前文件 wq保存并退出 q!不保存强制退出 wq!保存强制退出
- 代码缩进对齐: [gg = G]
- 代码屏蔽 [ctrl + v ]切换为视图模式,[r]替换为‘/’
3vim正常模式命令集
1:插入模式
- 按[i] 切换插入模式从光标当前位置开始输入
- 按[a] 进入插入模式后,从光标所在位置的下一个位置开始输入
- 按[o] 进入插入模式,是插入新的一行,从行首开始输入
- 从插入模式进入命令模式[esc],按两下直接从底行模式回到正常模式
2:移动光标
- [h] [j] [k] [l] 分别是控制光标左,下,上,右
- [G]:移动到文章最后
- [w]:光标跳到下个字的开头
- [e]:光标跳到下个字的字尾
- [b]:光标回到上个字的开头
- [gg]:进入文本开始
- [shift + g]:进入文本末端
- [ctrl + b]:屏幕往后移动一页
- [ctrl + f]:屏幕往前移动一页
- [ctrl + u]:屏幕往后移动半页
- [ctrl + d]:屏幕往前移动半页
3:删除文字
- [x]:每按一次删除光标所在位置的一个字符
- [#x]:删除光标所在位置后面包含自己在内的#个字符
- [X]:大写X,表示删除光标所在位置前一个字符
- [#X]:删除不包含光标在内的前面#个字符
- [dd]:删除光标所在行
- [#dd]:删除光标开始的#行
4:复制
- [yw]:将光标所在之处到字尾的字符复制到缓冲区
- [#yw]:复制#个字到缓冲区
- [yy]:复制光标所在行
- [#yy]:从光标开始复制#行
- [p]:将缓冲区的字符贴到光标所在位置(所有与y有关的复制命令都必须与p配合)
5:替换
- [r]:替换光标所在处字符
- [R]:替换光标所到之处的字符,直到[esc]为止
6:撤销
- [u]:回到上一个操作
- [ctrl + r]:撤销的恢复
7:更改
- [cw]:更改光标所到处的字到字尾出
- [c#w]:表示更改#个字
8:跳到指定行
- [#G]:表示光标移动到#行
- [ctrl + g]:列出光标所在行占比例
4vim末行模式命令集
- [set nu]:列出行号
- [#]:冒号后输入一个数字按回车,就会跳到对应行
- [/关键字]:先按[/]在输入想寻找的字符,如果第一次不是要找的,可以按[n]往后寻找
- [?关键字]:先按[?]在输入想寻找的字符,如果第一次不是要找的,可以按[n]往前寻找
分屏操作
同时上下分屏(不管文件存在不存在):
1:vim -on test1.c test2.c
2:split 文件名(已经打开一个文件时,在增加一个文件)
同时左右分屏(不管文件存在不存在):
1:vim -On test1.c test2.c (大写O)
2:vnew 文件名(已经打开一个文件时,在增加一个文件)
方向控制
ctrl + w + l 右
ctrl + w + h 左
ctrl + w + k 上
ctrl + w + j 下
(如果分屏少直接ctrl + w + w切换)
编译器的使用
1:背景知识
- 预处理:进行宏替换
- 编译:生成汇编
- 汇编:生成机器可识别代码
- 链接:生成可执行文件或库文件
2:gcc如何完成
格式:gcc [选项] 要编译文件 [选项] [目标文件]
(!gcc:上一次执行的gcc)
预处理:
- 预处理主要功能是宏定义,文件包含,条件编译,去注释等
- 预处理指令以#开头的代码行
- 实例:gcc -E hello.c -o hello.i
- -E:让gcc在预处理之后停止编译过程
- -o:是指目标文件,-i为已经与预处理过的c程序
编译
- 在这个阶段,gcc首先检查代码的规范性,是否有语法错误等,已确定代码实际要做的工作,检查无误后,gcc把代码翻译成汇编语言
- -S:可以查看,只编译而不汇编
汇编
- 汇编阶段是把编译阶段生成的.s转换为目标文件
- 生成机器可识别代码
- -c:可以查看已转化为.o 的二进制目标代码
链接
- 成功编译后进入链接阶段,删除可执行文件
- 实列:gcc hello.o hello
静态库与动态库:
静态库:编译时把代码链接到可执行文件中。程序运行的时候将不再需要静态库
动态库:程序运行时才去链接动态库的代码,多个程序可以共享使用库的代码
gcc选项
1、无选项编译链接
例:命令:gcc test.c
//会默认生成a.out可执行程序
2、-E: 进行预处理和编译,生成汇编文件。
命令:gcc -E test.c
//会生成test.i文件
3、-S: 进行预处理,编译,汇编等步骤,生成“.s”文件
例:命令:gcc -S test.c
//会生成test.s文件
4、-c: 会直接生成二进制目标文件
例:命令:gcc -c test.c
//会生成test.o文件
5、-o :对生成的目标进行重命名
例:命令:gcc -o test test.c
//会生成名字是test可执行文件而不是默认的a.out
6、-pipe: 使用管道代替编译中的临时文件
例:命令:gcc -pipe -o test test.c
7、-include file :包含某个代码。相当于在文件中加入#include
例:gcc test.c -include /root/file.h
8、-C:在预处理的时候不删除注释信息,一般和-E使用。
9、-llibrary:定制编译的时候使用的库
例:gcc -lpthread test.c //在编译的时候要依赖pthread这个库
10、-Ldir:定制编译的时候搜索库的路径。如果是自己定制的库,可以用它来定制搜索目录,否则编译器只在标准库目录里面找,dir就是目录的名字
11、-O0(字母o和数字0):没有优化
-O1:-O1位缺省值
-O2:二级优化
-O3:最高级优化
级别越大优化越好,但编译时间边长。
调试器gdb的使用
要使用gdb调试,必须先在源代码生成二进制代码时,加上-g选项(在生成可执行程序时,在可执行程序添加可调式信息)
实列:gcc -g test.c -o test
开始使用
- 开始调试:gdb + 文件名,结束调试:quit 或 ctrl + d
- list/l 行号:每次10行显示代码
- list/l 函数名:列出函数的代码
- run/r:运行程序(需要在后面添加命令行参数 r -a 参数或是set + 参数)
- start:开始调试(逐步)
- next/n:每次执行一句,不进入函数
- step/s:进去函数调用
- break/b 行号:在某一行设置断点
- break/b 函数名:在某个函数开头设置断点
- info break/i b:查看断点信息
- finish:执行到当前函数返回,然后停下来等待命令
- continue/c:从当前位置开始连续执行程序
- delete breakpoints:删除所有断点
- d n:删除序号为n的断点
- dispaly 变量名:跟踪查看一个变量,每次停下来都显示它的值
- p var:打印var变量的值
- bt:打印函数调用栈
- watch var :监控变量var的改变(变量改变时停下)
自动化构建工具make/Makefile
背景
- make是一条命令,Makefile是一个文件,两个搭配使用
- make是一个解释Makefile中指令的命令工具
- 一个工程中的源文件不计其数,其按类型,功能,模块分别放在若干个目录中,Makefile定义了一系列规则来指定,哪些文件需要先编译,后编译,重新编译,甚至于进行更复杂的过程操作
- 会不会写Makefile,从侧面说明一个人是否具有完成大项目的能力
- Makefile带来的好处就是“自动化编译”,一旦写好只需要一个make命令,整个工程就能完全自动编译,极大提高了效率
#表示注释
#[要生成的目标文件名称]:[依赖文件]
#[制表符Tab]如何通过依赖文件对象生成目标文件的编译命令
all:test test1
test:test.c tmp.c
gcc test.c tmp.c -o test
test1:test.c tmp.c
gcc test.c tmp.c -o test1
#永远只生成第一个对象,生成后则退出,因此如果要生成多个对象,就需要在前边一个包含所有要生成的对象
#几个预定义变量
# $@ 代表要生成的目标对象
# $^ 代表依赖对象
# $< 代表所有文件中的第一个
# .PHONY 声明伪对象,这个伪对象每次都需要生成
.PHONY :test test1
all:test test1
test:test.c tmp.c
gcc $^ -o $@
test1:test.c tmp.c
gcc $< -o $@
依赖关系: .c 文件依赖.i文件,
.i文件 依赖.s文件,
.s文件 依赖 .o文件
原理
- make会在当前目录下找名字叫“makefile”或“Makefile”的文件
- 如果找到,它会找文件中的第一个目标文件,并把它作为最终的目标文件
- 如果不存在那么它就会执行后面所定义的命令来生成这个文件
- 如果所依赖的.o文件不存在,那么make会在当前文件中找目标为.o文件的依赖性,再根据规则生成一个.o文件
- .c和.h文件肯定存在,于是make会生成.o文件,然后在用.o文件声明执行文件
- 这就是整个依赖性,make会一层一层去找文件的依赖关系,直到最终编译出第一个目标文件
- 在寻找过程中,如果出现错误,比如最后被依赖的文件找不到,make就会直接退出,并且报错。而对于所以的命令错误,或编译不成功,make根本不理
进度条程序
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<string.h>
4 int main()
5 {
6 int i = 0;
7 char buff[102] = {0};//初始化为0,保证字符串长度不会再改变
8 const char *cycle = "|/-\\";
9 while(i <= 100)
10 {
11 printf("[%-100s][%d%%][%c]\r",buff,i,cycle[i%5]);//“\r”回车符,与换行符区别是:不换行,光标跳的本行的行首然后开始覆盖
12 fflush(stdout);//立即刷新缓冲区,可以使进度条走的很流畅
13 buff[i++] = '#';
14 usleep(100000);
15 }
16 printf("\n");
17 return 0;
18 }
软件管理器yum
有那些软件包
- 在Linux下安装软件太麻烦,所以有人提前编译好,做成软件包放在一个服务器上,可以直接进行安装
- 软件包和软件管理器yum,就好比app和应用商店的关系
- yum需要在联网状态才能正常工作
yum list | grep gcc
yum list命令可以罗列出一个有那些包,数目非常多,可以使用grep筛选
软件包名称 :主版本号,次版本号,程序源代码发行号,软件包发行号,主机平台,cpu构架
如何安装
sudo yum install 文件名
最后只需要按Y确定即可
- 安装软件时由于需要向系统目录写入内容,所以需要root账户,或者sudo才能完成
- yum安装只能一个装完了才能再装另一个,否则会报错
如何卸载
sudo yum remove 文件名
Y确定即可