Linux工具:vim 编辑器 和 gcc/g++ 编译器
vim 编辑器
Linux 系统中的 vim 是一款具有多模式的文本编辑器,它有三种主要模式:命令模式、插入模式和底行模式,还有一些特定模式如:替换模式、可视模式(V-BLOCK)。
在 Linux 命令行中执行 vim
语法:vim [选项] [文件名]
功能:选择 vim 的打开方式
常用选项:
- -R:以只读模式打开文件
- -r:恢复崩溃前的文件(用于恢复未保存的修改)
- +[行号]:打开文件并跳转到指定行的行号
- +[“命令”]:启动 vim 时 vim 可直接执行双引号中的 命令
- -c ‘命令’ :启动后执行 vim 命令,同上
vim -d [文件名1] [文件名2]
:对比两个文件(进入 diff 模式)- --noplugin :禁用插件加载
- -u NONE :不加载任何配置文件(安全模式)
vim -c "oldfiles
:显示最近打开的文件列表- -x:创建或编辑加密文件(首次需设置密码)
- -X:禁用与 X Server 的连接(加速启动)
- -b:以二进制模式打开文件
其它操作:
vim [文件名1] [文件名2] [文件名3] ...
同时打开多个文件- 不写文件名默认打开一个新文件
vim 命令模式
进入 vim 时的模式默认是命令模式,在命令模式下可以快速编辑如光标移动、内容操作等命令,并且输入大多数命令之前都可以加上数字进行批量或更精确的操作。
光标操作相关命令
- gg:快速回归光标
- G:快速定位光标到结尾
- w 或 shift+w:光标移动到前一个单词
- b 或 shift+b:光标移动到下一个单词
- h / j / k / l:光标向 左 / 下 / 上 / 右 移动
- $:光标移动到当前行末尾
- ^ 或 0:光标移动到当前行开始
文本或字符操作命令
- yy:复制当前行
- yw:复制一个单词
- p / P:粘贴到光标 后 / 前
- dd:剪切或删除当前行
- d$ 或 D:删除从当前光标到行尾
- dw:删除一个单词
- x / X:右 / 左 移删除当前行的字符
- r:替换光标位置的字符
- shift + ~:字符大小写切换
- Ctrl + f / Ctrl + b:向下/上翻页
- Ctrl + u / Ctrl + d:向下/上翻半页
撤销操作命令
- u:撤销历史操作
- Ctrl + r:撤销 u 命令操作
查找操作
- #:选中单词命令(n 上找,N 下找)
vim 插入模式
vim 插入模式用于编写文件,在命令模式下按住下面其中一个功能键可以进入该模式:
- i:光标前插入
- a:光标后插入
- o:下方新行插入
- I:行首插入
- A:行尾插入
- O:上方新行插入
返回命令模式只需按一下 Esc 键即可。
vim 底行模式
vim 底行模式可用于与 shell 交互、整体界面操作等等,在命令模式下使用 shift+;
即 :
可进入,使用 Esc 返回命令模式。
查找与编写操作
/[关键字]
(可在命令模式下使用):向下搜索(n 下找,N 上找)?[关键词]
(可在命令模式下使用):向上搜索(n 上找,N 下找):s/旧内容/新内容
:替换当前行第一个匹配:s/旧内容/新内容/g
:替换当前行所有匹配:%s/旧内容/新内容/g
:全局替换(末尾加 c 进入细分替换)
界面操作
:vs [文件名]
:添加可操作的文件,使其多文件操作Ctrl + w + w
:循环切换窗口:e [文件名]
:打开新文件(不关闭当前文件):split
或:sp
:水平分割分屏:vsplit
或:vsp
:垂直分割分屏Ctrl + w + h/j/k/l
:向左/下/上/右切换窗口
文件处理操作
:w
:保存文件:q
:退出文件- ! :带上 ! 的操作有强制的意思
:%!xxd
:将文件以十六进制和 ASCII 字符混合的形式显示:%!xxd -r
:在:%!xxd
格式后恢复原始格式
vim 与 shell 交互
在 vim 中直接执行 shell 命令:
:![命令]
:执行 shell 命令(如:!ls -l
):r ![命令]
:将命令输出插入到当前光标位置(如:r !date
):w !sudo tee %
:用 sudo 权限保存当前文件(无写权限时常用)
其它操作
:ls
:列出所有已打开的文件缓冲区:b [编号]
或:b [文件名]
:切换到指定缓冲区(通过 :ls 查看编号):bn
:切换到下一个缓冲区:bp
:切换到上一个缓冲区
退出 vim 一般操作
:wq
或:x
:保存并退出:q!
:不保存强制退出:wa
+:qa
:保存所有文件并退出
vim 可视模式
可视模式允许玩家批量选择操作文件,在命令模式下使用不同命令进入不同类型的可视模式:
Ctrl + v:进入块可视模式
v:进入字符可视模式
V:进入行可视模式
在可视模式中,选中对应区域后可用 y(复制)、d(删除)、p(粘贴) 等操作,Esc 可以返回命令模式。
如果想要按照行批量插入字符,只允许在块可视模式下先选择区域,使用 shift+i
进入插入模式编写后,再 Esc 返回到命令模式才能生效。
vim 替换模式
在命令模式中使用 shift + r
可以进入替换模式,批量化替换光标位置字符,Esc 返回。
vim 简单配置
配置文件位置:
- 在目录 /etc/vim 下面,有个名为 vimrc 的文件,这是系统中公共的 vim 配置文件,对所有用户都有效。
- 在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root 目录下,通常已经存在一个 .vimrc文件,如果不存在,则可以创建它。
- 切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~
- 打开自己目录下的 .vimrc 文件,执行 vim/.vimrc
常用配置选项,用来测试(可以在 vim 底行模式使用):
- 设置语法高亮:syntax on
- 显示行号:set nu
- 设置缩进的空格数为 4:set shiftwidth=4
使用插件
要配置好看的 vim,原生的配置可能功能不全,可以选择安装插件来完善配置,但要保证用户是自己需要配置的用户。
想了解 vim 更多的读者可以看看这些大佬的文章:
Vim配置和使用
Vim 从入门到精通
手把手教你把Vim改装成一个IDE编程环境(图文)
Linux系列讲解 —— VIM配置与美化
vim配置工具 vimplus 下载地址:vimplus
gcc/g++ 编译器
gcc 和 g++ 都是 GNU 编译器集合(GCC)中的重要工具,可以编译 C(gcc) 和 C++(g++) 代码,但两者之间存在一些明显的区别。
在 Linux 命令行中执行 gcc/g++
语法:
gcc [选项] [源文件] ... -o [输出文件]
g++ [选项] [源文件] ... -o [输出文件]
功能:gcc 将 .c 文件编译成可执行文件,g++ 将 .cpp 文件编译成可执行文件。
常用选项:
- -c :只编译不链接,生成目标文件(.o)
- -g :生成调试信息,用于 gdb 调试
- -Wall :启用所有警告信息
- -O1/-O2/-O3 :优化级别(1 为基本优化,3 为最高优化)
- -I [目录] :指定目录搜索头文件
- -L [目录] :指定目录搜索库文件
- -I(等价 shift+i) [库名] :链接指定的库(如 -lm 链接数学库)
- -std=[标准] :指定语言标准(如 -std=c11 或 -std=c++17)
预处理选项:
- -E :只进行预处理,输出到标准输出
- -D[宏] :定义宏(如 -DDEBUG 定义 DEBUG 宏)
- -U[宏] :取消定义宏
- -I[目录] :添加头文件搜索路径
- -M:生成依赖关系(用于 Makefile)
- -MM :生成依赖关系,忽略系统头文件
编译选项:
- -S :只编译到汇编代码,生成 .s 文件
- -fPIC :生成位置无关代码(用于动态库)
- -fno-stack-protector :禁用栈保护
- -fstack-protector :启用栈保护
- -fomit-frame-pointer :省略帧指针(优化性能)
- -pipe :使用管道代替临时文件(加快编译速度)
优化选项:
- -O0 :不优化(默认)
- -O1 :基本优化
- -O2 :更多优化(推荐)
- -O3 :最高优化
- -Os :优化代码大小
- -Ofast :激进优化(可能不符合标准)
- -flto :启用链接时优化
调试选项:
- -g :生成调试信息
- -ggdb :生成 GDB 专用调试信息
- -g3 :生成更多调试信息(如宏定义)
- -p :生成性能分析信息(用于 gprof)
- -pg :生成性能分析信息(用于 gprof)
链接选项:
- -static :静态链接
- -shared :生成共享库(动态库)
- -L[目录] :添加库文件搜索路径
- -l[库名] :链接指定库(如 -lm 链接数学库)
- -nostdlib :不链接标准库
- -nodefaultlibs :不链接默认库
- -pie :生成位置无关可执行文件
警告选项:
- -w :不生成任何警告信息
- -Wall :启用所有常见警告
- -Wextra :启用额外警告
- -Werror :将警告视为错误
- -Wno-[警告] :禁用特定警告
- -pedantic :严格遵循标准
- -pedantic-errors :严格遵循标准并将警告视为错误
语言标准选项:
- -std=c89 :使用 C89 标准
- -std=c99 :使用 C99 标准
- -std=c11 :使用 C11 标准
- -std=c++98 :使用 C++98 标准
- -std=c++11 :使用 C++11 标准
- -std=c++14 :使用 C++14 标准
- -std=c++17 :使用 C++17 标准
- -std=c++20 :使用 C++20 标准
其它选项:
- -v :显示编译过程详细信息
- -### :显示但不执行编译命令
- -save-temps :保存临时文件(如 .i、.s、.o)
- -march=[架构] :指定目标架构(如 -march=native)
- -mtune=[架构] :优化目标架构(如 -mtune=native)
gcc/g++ 编译步骤
1. 预编译
在使用 gcc/g++ 编译代码时,选项部分加上 -E
即可生成预编译后的代码,此时文件后缀一般规定(在 Linux 下)为 .i
。
在预编译期间,gcc/g++ 会处理基础性任务,如:条件编译、宏替换、移除注释等等,生成一个干净的代码文本。
条件编译的用途:
- 软件可以区分专业度,如收费情况的区分,使用条件编译可以对一份代码进行功能上的裁剪,方便维护。
- 系统内核源代码在条件编译下可以模块化处理,方便特定条件下的需求,如有些单片机使用 Linux 系统并不需要它的网络模块。
- 开发工具与应用软件可以在不同系统下运行使用,如一个软件包既可以在 Linux 下安装使用,也可以在 windows 下安装使用。
2. 编译(编译成汇编)
在使用 gcc/g++ 编译代码时,选项部分加上 -S
即可生成汇编代码,此时文件后缀一般规定(在 Linux 下)为 .s
。
为什么 gcc/g++ 要先编译成汇编代码? 因为需要减少编译成本,如果直接编译成二进制执行的命令,需要自己处理表达的二进制可能出现的 bug, 而编译成汇编代码(汇编代码比二进制代码更易读)可以更容易的排错并使用已经成熟的方法来减少成本。
3. 汇编(生成二进制目标文件)
在使用 gcc/g++ 编译代码时,选项部分加上 -c
即可生成二进制代码,此时文件后缀一般规定(在 Linux 下)为 .o
。
此时生成的文件内容已经可以被系统识别(目标文件)。但是一般情况下,文件中的有些执行方法是不全的,文件只给了方法的链接地址,编译器还需要通过链接将执行方法找到并将链接地址替换为具体的找到方法执行的地址,此时文件才可以称得上是可执行文件。
目标文件是制作动态库与静态库的前提。
4. 链接(生成可执行文件)
在使用 gcc/g++ 编译代码时,选项部分不填默认是将文件直接执行编译 1->2->3->4 这4个步骤生成可执行文件。
链接步骤会将文件链接对应的库文件,最后形成可执行文件。
库文件是一套方法或数据集,为其他程序员开发提供最基本的接口与功能,帮助其二次开发。
库文件分类:
- 动态库:Linux( .so ),windows( .dll )
- 静态库:Linux( .a ),windows( .lib )
链接实行方法:文件链接库文件时,链接地址替换为能找到库中方法的地址。
对于静态库,文件中需要的方法会直接拷贝静态库中的方法,执行时只需调用自己拷贝的那份。
对于动态库,文件中需要的方法只会拷贝找到动态库方法的地址,执行时会寻找动态库的方法。
动静态库对比:
- 链接动态库形成的可执行程序体积一定比静态库小。
- 可执行程序对静态库的依赖度小,但可执行文件不能缺失动态库
- 程序运行需要加载到内存,一个静态库重复链接其它可执行程序,会导致内存中出现大量的重复代码。
- 动态链接,比静态链接节省内存和磁盘资源
动态库本质作用是将语言层面公共的代码,在内存中确保只出现一份,从而节省资源。
gcc 与 g++ 的区别
从编译行为上说,gcc 编译 C语言代码, g++ 编译 C++代码,但是 g++ 也可以编译 C语言的代码,gcc 想要编译 C++代码需要显示链接 C++标准库(
-lstdc++
)。从文件扩展名上说,gcc 只会处理后缀
.c
文件,g++ 可以处理.cpp
也可以处理.c
文件。
注意:使用 gcc 编译 C++代码,一般不会通过 C++ 具有的特性如:类、模版等用法。
对于两者命令行中的选项,除开标准库选项的使用,大部分选项两者都可以共用。