一.vim
1.删除和跳转
跳转到指定行
88G (命令模式)
:88 (末行模式)
跳转文件首
gg (命令模式)
跳转文件尾
G (命令模式)
自动格式化程序
gg=G (命令模式)
大括号对应
% (命令模式)
光标移至行首
0 (命令模式)
执行结束,工作模式不变
光标移至行尾
$ (命令模式)
执行结束,工作模式不变
删除单个字符
x (命令模式)
执行结束,工作模式不变
删除一个单词
dw (命令模式)
光标至于首字母进行操作
删除光标至行尾
D (命令模式)
d$(命令模式)
删除光标至行首
d0 (命令模式)
删除指定N行
在光标所在行
dd (命令模式) 删除1行
Ndd (命令模式) 删除N行 光标所在行往后
替换单个字符
将代替换的字母用光标选中
r (命令模式)
再将欲替换的字符
删除指定区域:
按V (命令模式)
切换为“可视模式”
hjkl
挪移光标来选中待删除区域
d 删除该区域数据
删除实际上是剪切,放进了缓冲区了
2.复制和粘贴
复制一行:
yy (命令模式)
光标所在行
粘贴一行
小p (命令模式)
光标后一行粘贴
大P (命令模式)
光标前一行粘贴
3.查找和替换
查找:
命令模式下
按“/”输入欲搜索关键字,回车
使用n检索下一个,用N检索上一个
光标放在单词的任意一个字符下
按“ * ” / “ # ”检索下一个/上一个
单个替换:
将光标置于待替换行上,按“:”进入末行模式
输入 s /原数据/新数据
行首个替换:
将光标置于待替换行上,按“:”进入末行模式
输入 %s /原数据/新数据
注:每次只会替换每一行的首个
全部替换:
将光标置于待替换行上,按“:”进入末行模式
输入 %s /原数据/新数据/g
区域替换:
按“:”进入末行模式
输入 行首,行尾s /原数据/新数据/g
4.其它操作
撤销、反撤销
u、crtl+r (命令模式)
分屏操作
“:”进入末行模式
启动分屏:
sp
上下分屏,后可跟文件名
ctrl+w
切换光标在哪个屏中
vsp 文件
左右分屏,后可跟文件名
跳转至man手册
将光标置于待查看函数单词上,使用K(命令模式)跳转
指定卷,nK
查看宏定义
将光标置于待查看宏定义单词上,使用
[d
查看定义语句
编译.c文件
: 进入末行模式
!gcc hello.c -o hello1 编译
enter
: 进入末行模式
!./hello1 运行
Ctrl+p:生成tags
Ctrl+]:跳转到函数定义
Ctrl+t:从函数定义返回
Ctrl+o:在左侧打开文件列表
F4:在右侧打开函数列表
Ctrl+n:补齐函数,向下翻
二.gcc
1.gcc编译四步骤
预处理、编译、汇编、链接
编译阶段消耗时间、系统资源最多
2.编译常用参数
-v
/-v/-version 查看gcc版本号
-l(L的小写)
指定动态库苦命
-L
指定动态库路径
-On
n=0~3 编译优化,n越大优化的越多
-Wall
提示更多警告信息
-E
生成预处理文件
-I
当.c文件引用了自己创建的头文件,且该头文件不在.c文件
的目录下,这时候可以通过加上 -I./.h文件的文件夹名,来
指明头文件的位置
gcc -I./inc hello.c -o hello100 ./hello100
-c
只进行预处理、编译、汇编,得到的是二进制文件
-g
编译时添加调试语句,不加的话是无法对文件进行调试的
用gdb工具进行调试,后面会进行说明
-D
gcc hello.c -D HELLO //向程序中“动态”注册宏义,比如用于 //#ifdef HELLO //#difine HI 20 //#endif 使main方法中能不打印HI出来 也可以用宏来做一个开关
-M
只是将依赖输出到终端,要想输出到文件,需要用-MF去指定
生成文件的依赖关系,同时也把一些标准库的头文件包含了进来
注意:该选项默认打开了 -E 选项, -E 参数的用处是使得编译器在预处理结束时就停止编译
gcc -M main.c 》》》》 main.o: main.c defs.h \ /usr/include/stdio.h \ /usr/include/features.h \ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \ /usr/include/bits/types.h \ /usr/include/bits/pthreadtypes.h \ /usr/include/_G_config.h /usr/include/wchar.h \ /usr/include/bits/wchar.h /usr/include/gconv.h \ /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \ /usr/include/bits/stdio_lim.h
-MM
生成文件的依赖关系,和 -M 类似,但不包含标准库的头文件
[....]# gcc -MM main.c main.o: main.c defs.h
-MG
要求把缺失的头文件按存在对待,并且假定他们和源文件在同一目录下,必须和 ‘-M’ 选项一起用。
-MF File
当使用了 “-M” 或者 “-MM” 选项时,则把依赖关系写入名为 “File” 的文件中。若同时也使用了 “-MD” 或 “-MMD”,“-MF” 将覆写输出的依赖文件的名称 。
gcc -M -MF main.d main.c # main.c的依赖写进了main.d文件中 # 本目录下只生成了main.d,不会生成main.out,main.i # 因为-M,到预处理后就停止了,而预处理是需要-o指定main.i他才会生成 # -E是需要-o指定生成的目标他才会生成,没有-o,gcc -E是不会生成.i文件
-MD
等同于 -M -MF File,但是默认关闭了 -E 选项。其输出的文件名是基于 -o 选项
若给定了 -o 选项,则输出的依赖文件名是 -o 指定的文件名,并添加 .d 后缀
若没有给定-o,则输出的依赖文件名是要编译的文件的名,并添加 .d 后缀
同时继续指定的编译工作。(依赖关系写进文件后继续执行编译)
注意:-MD 不会像 -M 那样阻止正常的编译任务,因为它默认关闭了 -E 选项,比如命令中仅使用了 -c 选项而没有指定 -o 选项时,若同时使用了 -M 选项,则不会生成 .o 文件,若使用的是 -MD 选项,则会生成 .o 文件
gcc -E -MD main.c # 本目录下生成了文件:main.d # 终端上也输出了 main.c 文件的预处理结果(main.c文件没被更改到) # 没有-o给定main预处理后输出的文件名称,用输出的mian.c的main作为输出名称 gcc -E main.c //不使用 '-o',则把预处理后的结果输出在终端上,并不会生成main.i文件去存放 gcc -S main.c //不使用 '-o',则自动生成main.s,存放的是main.c预处理、编译后的结果 gcc -c main.c //不使用 '-o',则自动生成main.o,存放的是预处理、编译、汇编后的结果 gcc main.c/i/o //不使用 '-o',则把结果默认输出到 a.out 可执行文件中
-MMD
类似于“-MD”,但是输出的依赖文件中,不包含标准头文件
-MP
生成的依赖文件里面,依赖规则中的所有 h 依赖项都会在该文件中生成一个伪目标,其不依赖任何其他依赖项。该伪规则将避免删除了对应的头文件而没有更新"Makefile”去匹配新的依赖关系而导致 make 出错的情况出现。
-MT Target
在生成的依赖文件中,指定依赖规则中的目标
示例
*************例1*****************
gcc -E -o tmp.i -MD main.c
本目录下生成了以下文件:
tmp.d tmp.i
**************例2****************
gcc -c -MD main.c
# 没有-o指定,将要编译的文件名作为依赖文件的名,加上.d后缀
本目录下生成了以下文件:
main.d main.o
***************例3***************
gcc -c -o tmp.o -MD main.c
# 根据-o指定的tmp.o的文件名tmp作为依赖关系存入的文件名
本目录下生成了以下文件:
tmp.d tmp.o
**************例4****************
gcc -c -o main.o -MD main.c -MF main.d
本目录下生成了以下文件:
main.o main.d
# MD默认是关闭-E的,因此-c可以正常生成main.o文件
# 只不过生成前会讲main.c文件的依赖关系写进指定的main.d
****************例5**************
gcc -MD main.c
本目录下生成了以下文件:
a.out main.d
****************例6**************
gcc -M -MD main.c
本目录下生成了以下文件:
main.d
不会生成 a.out 可执行文件, '-M' 默认打开了 '-E' 选项,使得编译器在预处理结束后就停止编译
*****************例7**************
gcc -c -M -MF main.d main.c
本目录下生成了以下文件:
main.d
不会生成 main.o 文件,因为 '-M' 默认打开了 '-E' 选项,使得编译器在预处理结束后就停止编译
***********例8********************
gcc -c -o m.o -M -MF main.d main.c
本目录下生成了以下文件:
main.d m.o
***********例9********************
gcc -c -MM -MD main.c
生成的main.d文件内容如下:
main.o:main.c defs.h
***********例10********************
gcc -c -MM -MD main.c -MP
生成的 main.d 文件内容如下:
main.o:main.c defs.h
defs.h:
该选项会生成“defs.h:”伪目标,其没有任何依赖项,若不是用'-MP'选项,则不会生成该文件
***********例11********************
gcc -MF main.d-MG-MM-Mp -M main.d -MT main.o main.c
cat main.d
#查看生成的依赖文件的内容main.d main.o: main.c
注:依赖规则中 main.d和main.0 目标都是通过“-MT”选项指定的
为啥例8 跟 例7 不一样,生成了 m.o 文件,而不受 -M 的影响而终止编译呢?
GCC 编译器在处理命令行选项时有一个特定的顺序。如果没有指定-o选项,编译器会默认将目标文件命名为"a.out"。但是当使用 -M 选项时,GCC 将输出依赖关系文件而不是目标文件。因此如果你不指定-o选项,编译器会将生成的目标文件命名为“a.out”,并且将输出重走向到依赖关系文件"main.d”,这样就导致了预期之外的行为。
通过增加 -o选项并指定目标文件的名称为“main.o”,你告诉编译器将生成的目标文件命名为"main.o”,而不是默认的“a.out"。这样编译器就不会将输出重定向到依赖关系文件"main.d”,从而避免了预处理后终止的问题。
标签:文件,gcc,模式,生成,vim,main,光标 From: https://blog.csdn.net/caiji0169/article/details/142427059