本文为 Linux 开发工具专题的第二部分,涵盖 vim 编辑器的进阶操作(光标移动、复制粘贴、批量化注释、分屏、配置)以及 gcc 编译器的完整翻译过程(预处理、编译、汇编、链接),最后简要介绍动静态库的概念。帮助同学们在 Linux 环境下高效编写和编译代码。
一、课程目标
今天我们继续 Linux 开发工具的学习,主要内容包括:
-
vim 编辑器深入:命令模式下的光标移动、复制粘贴、删除、替换、批量化注释、分屏操作、配置方法
-
gcc/g++ 编译器:程序的完整翻译过程(预处理、编译、汇编、链接),对应选项和中间文件
-
动静态库概念:动态库(.so)与静态库(.a)的基本认识
注意 :从本节课开始,建议同学们使用普通账号 进行代码编写,避免 root 权限隐藏潜在问题。需要提权时使用
sudo。
二、vim 编辑器深入
2.1 光标移动命令(命令模式)
| 命令 | 作用 |
|---|---|
gg |
光标定位到文件第一行 |
G(Shift+g) |
光标定位到文件最后一行 |
nG(如 5G) |
光标定位到第 n 行 |
$(Shift+4) |
光标定位到当前行行尾 |
^(Shift+6) |
光标定位到当前行行首(第一个非空字符) |
h / j / k / l |
左 / 下 / 上 / 右(每个字符为单位) |
w |
以单词为单位向后(右)移动 |
b |
以单词为单位向前(左)移动 |
带数字加速 :上述命令前都可加数字,如
5w向右移动 5 个单词,10j向下移动 10 行。
为什么用 hjkl 而不是方向键?
-
历史原因:老式键盘没有独立方向键,hjkl 就是方向键
-
效率原因:手不离开主键盘区,配合其他命令更快
-
兼容性:某些场景(如块选择)只能用 hjkl
2.2 编辑命令(复制、粘贴、删除、替换)
| 命令 | 作用 |
|---|---|
yy |
复制当前行 |
nyy(如 5yy) |
复制从当前行开始的 n 行 |
p |
在光标所在位置的下一行粘贴 |
dd |
剪切(删除)当前行 |
ndd |
剪切(删除)从当前行开始的 n 行 |
x |
删除光标所在位置的字符(向后删) |
nx |
删除光标后 n 个字符 |
X(Shift+x) |
删除光标左侧的字符(向前删) |
r |
替换光标所在位置的单个字符(输入 r 后再输入新字符) |
nr |
替换光标后 n 个字符为同一字符 |
R(Shift+r) |
进入替换模式(Replace),输入的内容会覆盖原有字符,按 ESC 退出 |
~(Shift+波浪号) |
切换大小写(光标所在字符,可带数字批量) |
2.3 撤销与重做
| 命令 | 作用 |
|---|---|
u |
撤销上一步操作(可多次按,持续撤销) |
Ctrl + r |
重做(撤销刚才的撤销) |
注意 :一旦保存并退出文件(
:wq),重新打开后无法再撤销之前的操作。
2.4 进入插入模式的多种方式
| 命令 | 作用 |
|---|---|
i |
在光标当前位置进入插入模式 |
a |
在光标后一个位置进入插入模式 |
o |
在下一行新建一行并进入插入模式 |
这三个(
i、a、o)最常用,够用了。
2.5 底行模式常用命令
进入底行模式:命令模式下按 :(Shift + 分号)
| 命令 | 作用 |
|---|---|
w |
保存(write) |
q |
退出(quit) |
wq |
保存并退出 |
q! |
强制退出(不保存) |
w! |
强制保存(只读文件时) |
set nu |
显示行号 |
set nonu |
取消行号 |
vs 文件名 |
垂直分屏打开另一个文件 |
!命令 |
在底行中执行 shell 命令(如 !gcc code.c) |
%s/旧/新/g |
全局替换(% 表示整个文件,g 表示全局) |
示例:
:!ls -l # 查看当前目录文件,按任意键返回 vim :%s/hello/world/g # 将全文的 hello 替换为 world


2.6 分屏操作
:vs test.c # 垂直分屏,右侧打开 test.c

-
切换光标到另一个分屏 :
Ctrl + w按两次(Ctrl w w) -
光标在哪个分屏,底行命令就作用于哪个分屏
-
可以连续
:vs多次,实现多屏
2.7 批量化注释与去注释(块视图模式)
批量化注释 (以 C 语言的 // 为例):
命令模式下按
Ctrl + v进入块视图模式(左下角显示VISUAL BLOCK)使用
h/j/k/l或nG等命令选中要注释的行区域(选中第一列)按
Shift + i(大写 I)进入插入模式输入
//(注释符)按
ESC,等待一两秒,选中的所有行都会自动加上//


批量化去注释:
Ctrl + v进入块视图选中注释符所在的那一列(可能需要按
l向右扩展选择)按
d删除选中的列
这个技巧非常实用,可以快速注释/取消注释大段代码。
2.8 快速查找
-
命令模式下,将光标移动到某个单词(如
main)上,按Shift + #(即#,在数字 3 上面),所有该单词会被高亮 -
按
n跳转到下一个 匹配项,按N跳转到上一个
2.9 打开文件时直接定位到指定行
vim code.c +14 # 打开 code.c 并将光标定位到第 14 行
这在编译报错时非常有用:根据错误提示的行号,直接定位。
2.10 vim 配置
-
裸 vim(未配置)没有行号、语法高亮、自动缩进等功能
-
配置文件:用户家目录下的
.vimrc(隐藏文件) -
每个用户独立配置,不影响其他人
-
常见配置项(写入
~/.vimrc): -
下面是我在网上找的配置文件内容可以直接复制
sql
"实现backspace删除
set nocompatible
set backspace=indent,eol,start
set number
" 突出显示当前行
set cursorline
" 设定 tab 长度为 4
set tabstop=4
" 搜索时高亮显示被找到的文本
set hlsearch
"开启新行时使用智能缩进
set smartindent
"显示命令
set showcmd
"命令行高度
set cmdheight=2
syntax on " Set syntax highlighting
set autoindent " Set up automatic indentation
set mouse=a " Set mouse is always available, set mouse= (empty) cancel
set cc=80 " Column 80 highlighted, set cc=0 cancellation
set cursorline " Settings to highlight the current row
set cindent " Format C language
set st=4 " Set the width of the soft tab to 4 spaces
set shiftwidth=4 " The width automatically indented when setting a new line is 4 spaces
set sts=4 " Set the number of spaces inserted when the Tab key is pressed in insertion mode to 4
set ruler " Show the status of the last line
set showmode " The status of this row is displayed in the lower left corner.
set bg=dark " Show different background tones
set hlsearch " Enable Search Highlight
set laststatus=2 " Always display the status bar
"设置自动补全符号
" Set Automatically Complete Parentheses
inoremap ' ''<ESC>i
inoremap " ""<ESC>i
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap < <><ESC>i
inoremap { {<CR>}<ESC>O
"autocmd BufNewFile *.c 0r /usr/share/vim/vimfiles/template.c
"设置头文件及主函数模板
autocmd BufNewFile *.c 0r /etc/vim/template.c
"恢复复制粘贴功能
if has('mouse')
set mouse-=a
endif
一键配置方案(仅支持 CentOS 7,普通用户执行):
curl -sLf https://gitee.com/makecodeforcpy/vimforcpp/raw/master/install.sh | bash source ~/.bashrc
-
不要用 root 执行
-
如果下载慢或失败,多试几次,或手动从 GitHub/Gitee 找其他配置
三、gcc/g++ 编译器
3.1 基本编译
gcc code.c -o mycode # 编译 code.c,生成可执行文件 mycode ./mycode # 运行


-o选项指定输出文件名,不写则默认生成a.out
3.2 程序的翻译过程
一个 C/C++ 程序从源代码到可执行文件要经历四个阶段:预处理 → 编译 → 汇编 → 链接。
| 阶段 | 作用 | gcc 选项 | 生成文件后缀 |
|---|---|---|---|
| 预处理 | 头文件展开、宏替换、去注释、条件编译 | -E |
.i |
| 编译 | 将 C 语言翻译成汇编语言 | -S |
.s |
| 汇编 | 将汇编语言翻译成机器码(可重定位目标文件) | -c |
.o(Windows 下为 .obj) |
| 链接 | 将多个 .o 文件和库链接成可执行文件 |
无(直接 gcc -o) |
可执行文件 |
记忆技巧 :选项
-E、-S、-c对应键盘左上角的ESC(E、S、C),中间文件后缀.i、.s、.o可以联想为 ISO(镜像文件后缀)。
3.3 分步演示
1. 预处理:
gcc -E code.c -o code.i
code.i仍然是 C 语言文件,但已经展开了头文件、替换了宏、去掉了注释
2. 编译:
gcc -S code.i -o code.s # 也可以直接从 .c 开始:gcc -S code.c -o code.s
code.s是汇编语言文件
3. 汇编:
gcc -c code.s -o code.o # 或 gcc -c code.c -o code.o
code.o是二进制可重定位目标文件,不能直接运行
4. 链接:
gcc code.o -o code # 链接成可执行文件 ./code

3.4 多文件编译
通常做法:先将每个 .c 文件编译成 .o,最后统一链接。
gcc -c main.c -o main.o gcc -c add.c -o add.o gcc main.o add.o -o program
-
好处:修改某个文件只需重新编译该文件,再链接即可,节省时间
-
也方便制作库文件
3.5 查看可执行文件依赖的库
ldd code # 查看 code 依赖哪些动态库

输出中通常有 libc.so.6 → 这就是 C 标准库(动态库)
四、动静态库简介
4.1 什么是库?
库是预先编译好的二进制代码 ,供其他程序调用。例如 printf 函数的实现就在 C 标准库中。
4.2 动态库与静态库
| 类型 | Linux 后缀 | Windows 后缀 | 特点 |
|---|---|---|---|
| 动态库 | .so(shared object) |
.dll |
程序运行时加载,节省内存,更新方便 |
| 静态库 | .a(archive) |
.lib |
编译时链接到可执行文件中,程序独立,体积大 |
-
我们平时用
gcc默认链接的是动态库 (如libc.so) -
查看系统 C 标准库:
ls -l /lib64/libc.so.*
4.3 为什么要有库?
-
代码复用,避免重复造轮子
-
隐藏实现细节,只提供接口
-
动态库可实现热更新
关于动静态库的制作和使用,后续会有专题讲解。
五、本节课总结
5.1 vim 核心命令汇总
| 类别 | 常用命令 |
|---|---|
| 光标移动 | gg, G, nG, $, ^, w, b, hjkl |
| 复制粘贴 | yy, nyy, p |
| 删除剪切 | dd, ndd, x, X |
| 替换 | r, nr, R |
| 撤销重做 | u, Ctrl+r |
| 进入插入 | i, a, o |
| 底行操作 | :w, :q, :wq, :set nu, :vs, :!命令, :%s/old/new/g |
| 块视图 | Ctrl+v 进入,配合 hjkl 选择,I 批量插入,d 批量删除 |
| 查找 | Shift+# 高亮单词,n / N 跳转 |
5.2 gcc 编译流程
预处理:gcc -E code.c -o code.i 编译: gcc -S code.i -o code.s 汇编: gcc -c code.s -o code.o 链接: gcc code.o -o code
5.3 动静态库一句话理解
-
动态库:运行时找你要,大家共用一份
-
静态库:编译时把你 copy 进程序,自己独享