首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Linux系统编程:(七)Vim 编辑器完全指南:从入门到精通的全方位实战教程

Linux系统编程:(七)Vim 编辑器完全指南:从入门到精通的全方位实战教程

作者头像
_OP_CHEN
发布于 2026-01-14 10:44:52
发布于 2026-01-14 10:44:52
1.9K0
举报
文章被收录于专栏:C++C++

前言

在 Linux 系统的开发与运维工作中,编辑器是不可或缺的工具。而 Vim 作为一款功能强大的多模式编辑器,凭借其高效的操作方式、强大的定制能力和跨平台特性,成为了 Linux 用户的首选编辑器之一。无论是编写代码、修改配置文件,还是日常文本编辑,Vim 都能凭借丰富的命令和灵活的操作模式大幅提升工作效率。 本文将基于 Linux 基础开发工具的核心知识点,全面详解 Vim 编辑器的使用方法,包括 Vim 与 Vi 的区别、核心模式概念、基本操作流程、常用命令集、操作总结以及个性化配置,下面就让我们正式开始吧!


一、Linux 编辑器 - Vim 使用概述

在 Linux 系统中,文本编辑器种类繁多,从简单的 nano、cat 到功能复杂的 Vim、Emacs,不同编辑器适用于不同场景。其中 Vim(Vi Improved)是 Vi 编辑器的增强版本,不仅完全兼容 Vi 的所有指令,还新增了语法高亮、可视化操作、插件扩展等实用功能,使其在专业性和易用性上都有了质的飞跃。

1.1 Vim 与 Vi 的核心区别

Vi 是 Linux 系统自带的基础文本编辑器,诞生于 Unix 早期版本,功能相对基础但足够满足简单文本编辑需求。而 Vim 在 Vi 的基础上进行了全面升级,主要区别如下:

  • 语法高亮:Vim 能根据文件类型(如 C、C++、Shell 脚本、配置文件等)自动对代码关键字、注释、字符串等进行颜色区分,提高代码可读性。
  • 可视化操作:支持块选择、可视化编辑等功能,方便批量修改文本。
  • 跨平台支持:不仅可在 Linux 终端运行,还能在 Windows、macOS、X Window 等系统中使用。
  • 插件扩展:支持丰富的第三方插件,可通过插件增强代码补全、文件管理、版本控制等功能。
  • 更多实用功能:如多级撤销、代码折叠、正则表达式搜索等。

在实际使用中,Linux 系统通常默认安装 Vi,而 Vim 可能需要手动安装。以 CentOS 和 Ubuntu 系统为例,安装命令如下:

安装 Vim(CentOS 系统)
代码语言:javascript
复制
sudo yum install -y vim

输出结果示例:

代码语言:javascript
复制
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package vim-enhanced.x86_64 2:7.4.629-8.el7_9 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package             Arch          Version                Repository       Size
================================================================================
Installing:
 vim-enhanced        x86_64        2:7.4.629-8.el7_9      updates         1.0 M

Transaction Summary
================================================================================
Install  1 Package

Total download size: 1.0 M
Installed size: 2.9 M
Downloading packages:
vim-enhanced-7.4.629-8.el7_9.x86_64.rpm                       | 1.0 MB  00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : 2:vim-enhanced-7.4.629-8.el7_9.x86_64                       1/1
  Verifying  : 2:vim-enhanced-7.4.629-8.el7_9.x86_64                       1/1

Installed:
  vim-enhanced.x86_64 2:7.4.629-8.el7_9

Complete!
安装 Vim(Ubuntu 系统)
代码语言:javascript
复制
sudo apt install -y vim

输出结果示例:

代码语言:javascript
复制
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  vim-common vim-runtime xxd
Suggested packages:
  ctags vim-doc vim-scripts
The following NEW packages will be installed:
  vim vim-common vim-runtime xxd
0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 6,212 kB of archives.
After this operation, 30.1 MB of additional disk space will be used.
Get:1 http://mirrors.aliyun.com/ubuntu focal/main amd64 xxd amd64 2:8.1.2269-1ubuntu5 [37.5 kB]
Get:2 http://mirrors.aliyun.com/ubuntu focal/main amd64 vim-common amd64 2:8.1.2269-1ubuntu5 [164 kB]
Get:3 http://mirrors.aliyun.com/ubuntu focal/main amd64 vim-runtime all 2:8.1.2269-1ubuntu5 [5,490 kB]
Get:4 http://mirrors.aliyun.com/ubuntu focal/main amd64 vim amd64 2:8.1.2269-1ubuntu5 [520 kB]
Fetched 6,212 kB in 2s (3,106 kB/s)
Selecting previously unselected package xxd.
(Reading database ... 125532 files and directories currently installed.)
Preparing to unpack .../xxd_2%3a8.1.2269-1ubuntu5_amd64.deb ...
Unpacking xxd (2:8.1.2269-1ubuntu5) ...
Selecting previously unselected package vim-common.
Preparing to unpack .../vim-common_2%3a8.1.2269-1ubuntu5_amd64.deb ...
Unpacking vim-common (2:8.1.2269-1ubuntu5) ...
Selecting previously unselected package vim-runtime.
Preparing to unpack .../vim-runtime_2%3a8.1.2269-1ubuntu5_all.deb ...
Adding 'diversion of /usr/share/vim/vim81/doc/help.txt to /usr/share/vim/vim81/doc/help.txt.vim-tiny by vim-runtime'
Adding 'diversion of /usr/share/vim/vim81/doc/tags to /usr/share/vim/vim81/doc/tags.vim-tiny by vim-runtime'
Unpacking vim-runtime (2:8.1.2269-1ubuntu5) ...
Selecting previously unselected package vim.
Preparing to unpack .../vim_2%3a8.1.2269-1ubuntu5_amd64.deb ...
Unpacking vim (2:8.1.2269-1ubuntu5) ...
Setting up xxd (2:8.1.2269-1ubuntu5) ...
Setting up vim-common (2:8.1.2269-1ubuntu5) ...
Setting up vim-runtime (2:8.1.2269-1ubuntu5) ...
Setting up vim (2:8.1.2269-1ubuntu5) ...
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vim (vim) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vimdiff (vimdiff) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/rvim (rvim) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/rview (rview) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/vi (vi) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/view (view) in auto mode
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/ex (ex) in auto mode
Processing triggers for man-db (2.9.1-1) ...

安装完成后,可通过以下命令验证 Vim 版本:

代码语言:javascript
复制
vim --version

输出结果示例(部分):

代码语言:javascript
复制
VIM - Vi IMproved 8.1 (2018 May 18, compiled Jun 15 2020 16:41:35)
Included patches: 1-2269
Modified by team+vim@tracker.debian.org
Compiled by team+vim@tracker.debian.org
Huge version without GUI.  Features included (+) or not (-):
+acl               -farsi             +mouse_sgr         +tag_binary
+arabic            +file_in_path      -mouse_sysmouse    -tag_old_static
+autocmd           +find_in_path      +mouse_urxvt       -tag_any_white
+autochdir         +float             +mouse_xterm       -tcl
-autoservername    +folding           +multi_byte        +termguicolors
-balloon_eval      -footer            +multi_lang        +terminal
+balloon_eval_term +fork()            -mzscheme          +terminfo
-browse            +gettext           +netbeans_intg     +termresponse
++builtin_terms    -hangul_input      +num64             +textobjects
+byte_offset       +iconv             +packages          +textprop
+channel           +insert_expand     +path_extra        +timers
+cindent           +job               -perl              +title
-clientserver      +jumplist          +persistent_undo   -toolbar
-clipboard         +keymap            +postscript        +user_commands
+cmdline_compl     +lambda            +printer           +vartabs
+cmdline_hist      +langmap           +profile           +vertsplit
+cmdline_info      +libcall           -python            +virtualedit
+comments          +linebreak         +python3           +visual
+conceal           +lispindent        +quickfix          +visualextra
+cryptv            +listcmds          +reltime           +viminfo
+cscope            +localmap          +rightleft         +vreplace
+cursorbind        -lua               -ruby              +wildignore
+cursorshape       +menu              +scrollbind        +wildmenu
+dialog_con        +mksession         +signs             +windows
+diff              +modify_fname      +smartindent       +writebackup
+digraphs          +mouse             -sound             -X11
-dnd               -mouseshape        +spell             -xfontset
-ebcdic            +mouse_dec         +startuptime       -xim
+emacs_tags        +mouse_gpm         +statusline        -xpm
+eval              -mouse_jsbterm     -sun_workshop      -xsmp
+ex_extra          +mouse_netterm     +syntax            -xterm_clipboard
+extra_search      +mouse_sgr         +tag_bind          -xterm_save
      system vimrc file: "$VIM/vimrc"
        user vimrc file: "$HOME/.vimrc"
second user vimrc file: "~/.vim/vimrc"
         user exrc file: "$HOME/.exrc"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H   -Wdate-time  -g -O2 -fdebug-prefix-map=/build/vim-Yf7H7j/vim-8.1.2269=. -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc   -L. -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now

1.2 Vim 的适用场景

Vim 凭借其高效的操作逻辑和强大的功能,适用于以下场景:

  • 代码编写:支持多种编程语言的语法高亮、缩进优化、代码折叠等功能,配合插件可实现代码补全、语法检查。
  • 配置文件修改:Linux 系统的大部分配置文件(如/etc/profile、/etc/nginx/nginx.conf等)均为纯文本格式,Vim 的多模式操作能快速修改配置。
  • 远程服务器操作:通过 SSH 连接远程服务器时,终端环境下 Vim 是最便捷的文本编辑工具,无需图形界面支持。
  • 批量文本处理:借助 Vim 的正则表达式替换、块操作等功能,可快速处理大量文本(如日志分析、数据格式转换)。

二、Vim 的基本概念

Vim 的核心特性是多模式编辑,不同模式下的操作逻辑和命令各不相同。初学者最容易困惑的就是模式切换,因此掌握 Vim 的基本模式是学好 Vim 的关键。

2.1 Vim 的三种核心模式

Vim 提供了多种编辑模式,其中最常用、最基础的三种模式分别是:命令模式(Normal mode)、插入模式(Insert mode)和底行模式(Last line mode)。熟练掌握这三种模式的切换方式和核心功能,就能应对大部分文本编辑场景。

2.1.1 命令模式(Normal mode)
  • 进入方式:启动 Vim 后默认进入命令模式;在插入模式或底行模式下按ESC键可返回命令模式。
  • 核心功能:控制光标移动、文本选择、删除、复制、粘贴、替换、撤销等基础操作,是 Vim 模式切换的 “中转站”。
  • 操作特点:无需输入冒号或其他前缀,直接按下对应命令键即可执行操作(如按x删除光标所在字符)。
2.1.2 插入模式(Insert mode)
  • 进入方式:在命令模式下通过特定命令(i、a、o)进入。
  • 核心功能:输入文本内容,与普通文本编辑器的编辑状态类似。
  • 操作特点:底部状态栏会显示-- INSERT --标识,此时输入的字符会直接插入到文本中,按ESC键可返回命令模式。
2.1.3 底行模式(Last line mode)
  • 进入方式:在命令模式下按Shift + ;(即输入冒号:)进入。
  • 核心功能:文件保存、退出、查找替换、行号显示、跳转指定行等高级操作。
  • 操作特点:光标会移动到屏幕底部的命令输入栏,输入命令后按回车键执行,执行完成后自动返回命令模式(部分命令除外),底部状态栏会显示输入的命令。

2.2 模式切换逻辑

三种核心模式的切换关系如下:

  1. 启动 Vim:默认进入命令模式。
  2. 命令模式 → 插入模式:按i、a、o等插入命令。
  3. 插入模式 → 命令模式:按ESC键(无论当前输入到何种状态,按ESC均可快速返回)。
  4. 命令模式 → 底行模式:按:(冒号)。
  5. 底行模式 → 命令模式:按ESC键或执行命令后自动返回。

模式切换示意图:

2.3 其他模式(了解即可)

除了三种核心模式,Vim 还提供了其他进阶模式,适用于特定场景:

  • 可视化模式(Visual mode):在命令模式下按v(字符可视化)、V(行可视化)、Ctrl + v(块可视化)进入,用于选择文本块进行批量操作(如复制、删除、替换)。
  • 替换模式(Replace mode):在命令模式下按R进入,输入的字符会直接替换光标所在位置的字符,直到按ESC返回命令模式。
  • 选择模式(Select mode):类似可视化模式,但更接近图形界面编辑器的选择逻辑,按Ctrl + g可切换到可视化模式。

Vim 官方文档中总共定义了 12 种模式(6 种基础模式 + 6 种附加模式),但对于初学者而言,无需掌握所有模式,先熟练运用三种核心模式即可满足日常使用,后续可根据需求逐步学习进阶模式。

三、Vim 的基本操作

Vim 的基本操作围绕 “文件管理” 和 “模式切换” 展开,包括文件的打开、编辑、保存、退出等核心流程,掌握这些操作是使用 Vim 的基础。

3.1 打开文件

在终端中通过vim命令可打开指定文件,若文件不存在则会创建该文件(退出时需手动保存才能生成文件)。

基本语法
代码语言:javascript
复制
vim [文件名]
示例 1:打开已存在的文件

假设当前目录下有test.c文件,打开命令如下:

代码语言:javascript
复制
vim test.c

执行后会进入 Vim 的命令模式,界面显示test.c的文件内容(若文件为空则显示空白界面),底部状态栏会显示文件名、行数、列数等信息。

示例 2:创建并打开新文件

打开不存在的hello.txt文件(退出时保存会生成该文件):

代码语言:javascript
复制
vim hello.txt

执行后进入 Vim 命令模式,界面空白,底部状态栏显示"hello.txt" [New File],表示当前是新文件。

示例 3:打开文件并跳转到指定行

若文件较大,可直接跳转到指定行,语法如下:

代码语言:javascript
复制
vim +[行号] [文件名]

例如,打开test.c并跳转到第 10 行:

代码语言:javascript
复制
vim +10 test.c

执行后进入命令模式,光标直接定位到第 10 行,底部状态栏显示"test.c" 15L, 320C(15L 表示 15 行,320C 表示 320 个字符)。

3.2 模式切换实战

3.2.1 命令模式 → 插入模式(三种常用方式)

在命令模式下,进入插入模式的常用命令有三种,适用场景不同:

  • i:在光标当前位置插入文本(光标不动,新输入的字符插入到光标左侧)。
  • a:在光标下一个位置插入文本(光标向右移动一位,新输入的字符插入到光标原来的位置右侧)。
  • o:在光标所在行的下方插入新行,光标定位到新行的行首并进入插入模式。
  • O(大写):在光标所在行的上方插入新行,光标定位到新行的行首并进入插入模式。

示例操作:

  1. 打开hello.txt文件:vim hello.txt(命令模式)。
  2. 按i进入插入模式,底部状态栏显示-- INSERT --。
  3. 输入文本:Hello Vim!。
  4. 按ESC返回命令模式,底部-- INSERT --标识消失。
  5. 按o在当前行下方插入新行,进入插入模式,输入:This is my first Vim edit.。
  6. 按ESC返回命令模式。
  7. 移动光标到第一行末尾(后续会讲解光标移动命令),按a在光标后插入文本: I love Linux!。
  8. 按ESC返回命令模式,此时文本内容如下:
代码语言:javascript
复制
Hello Vim! I love Linux!
This is my first Vim edit.
3.2.2 命令模式 → 底行模式

在命令模式下按:(冒号),光标会移动到屏幕底部,进入底行模式,此时可输入底行命令。

示例操作:

  1. 处于命令模式,按:进入底行模式,底部显示:。
  2. 输入w(保存命令),按回车键执行,底部显示"hello.txt" [New File] 2L, 53C written,表示文件保存成功,自动返回命令模式。

3.3 保存与退出文件

文件编辑完成后,需通过底行命令保存并退出,常用的保存退出命令如下:

命令

功能描述

适用场景

:w

保存当前文件(不退出)

编辑过程中随时保存,防止内容丢失

:q

退出 Vim(文件已保存时)

保存后退出

:wq

保存并退出 Vim

编辑完成后保存退出

:q!

强制退出 Vim(不保存修改)

编辑错误或无需保存时强制退出

:w!

强制保存文件

文件为只读时(需权限)强制保存

:w [文件名]

另存为指定文件

不想覆盖原文件时使用

示例 1:保存并退出
  1. 编辑完hello.txt后,处于命令模式。
  2. 按:进入底行模式,输入wq,按回车键。
  3. 退出 Vim,返回终端,当前目录下生成hello.txt文件,查看文件内容:
代码语言:javascript
复制
cat hello.txt

输出结果:

代码语言:javascript
复制
Hello Vim! I love Linux!
This is my first Vim edit.
示例 2:强制退出(不保存)
  1. 打开hello.txt:vim hello.txt。
  2. 按i进入插入模式,输入无关文本:test force quit。
  3. 按ESC返回命令模式。
  4. 按:进入底行模式,输入q!,按回车键强制退出。
  5. 返回终端,查看文件内容:
代码语言:javascript
复制
cat hello.txt

输出结果仍为原内容,新增的test force quit未被保存,说明q!命令成功放弃修改并退出。

示例 3:另存为新文件
  1. 打开hello.txt:vim hello.txt。
  2. 按:进入底行模式,输入w hello_backup.txt,按回车键。
  3. 底部显示"hello_backup.txt" 2L, 53C written,表示另存为成功,返回命令模式。
  4. 按:输入q退出 Vim。
  5. 查看当前目录,新增hello_backup.txt文件,内容与hello.txt一致:
代码语言:javascript
复制
ls
cat hello_backup.txt

输出结果:

代码语言:javascript
复制
hello.txt  hello_backup.txt
Hello Vim! I love Linux!
This is my first Vim edit.

3.4 放弃修改(撤销操作)

在编辑过程中,若误操作可通过命令模式的撤销命令恢复,常用撤销相关命令如下:

  • u:撤销上一次操作(可多次按u撤销多步操作)。
  • Ctrl + r:恢复撤销操作(即 “反撤销”,撤销u命令的效果)。

示例操作:

1. 打开hello.txt:vim hello.txt。

2. 按i进入插入模式,在第三行输入This is a mistake.。

3. 按ESC返回命令模式,此时文本内容:

代码语言:javascript
复制
Hello Vim! I love Linux!
This is my first Vim edit.
This is a mistake.

4. 按u撤销上一次插入操作,第三行的This is a mistake.消失。

5. 按Ctrl + r恢复撤销,第三行内容重新出现。

6. 按u再次撤销,第三行内容消失,按:wq保存退出。

四、Vim 正常模式命令集

命令模式是 Vim 的核心模式,提供了丰富的文本操作命令,涵盖光标移动、文本删除、复制粘贴、替换、撤销等功能。熟练掌握这些命令能大幅提升编辑效率,以下是最常用的命令分类详解。

4.1 光标移动命令

Vim 的光标移动命令非常灵活,支持按字符、单词、行、段落、屏幕等维度移动,无需依赖方向键,仅用字母键即可完成高效移动。

4.1.1 基础移动(按字符 / 行)

命令

功能描述

示例

h

光标向左移动 1 格

按h,光标左移

j

光标向下移动 1 行

按j,光标下移

k

光标向上移动 1 行

按k,光标上移

l

光标向右移动 1 格

按l,光标右移

0(数字 0)

光标移动到当前行的行首

光标在该行中间,按0跳至行首

$

光标移动到当前行的行尾

光标在该行中间,按$跳至行尾

^

光标移动到当前行的第一个非空白字符

行首有空格时,按^跳至第一个有效字符

示例操作:假设文本内容如下(光标初始在第一行Hello的H后):

代码语言:javascript
复制
Hello Vim! I love Linux!  # 行1
This is my first Vim edit.  # 行2
  1. 按l5 次,光标移动到Vim!的!后。
  2. 按$,光标跳至行 1 末尾(Linux!的!后)。
  3. 按0,光标跳至行 1 行首(H前)。
  4. 按j,光标下移到行 2 的行首。
  5. 按^,若行 2 行首无空格,光标保持在行首;若有空格,跳至第一个非空格字符(T前)。
  6. 按k,光标返回行 1 行首。
4.1.2 按单词移动

命令

功能描述

示例

w

光标跳至下一个单词的开头

光标在Hello的H后,按w跳至Vim!的V前

e

光标跳至当前单词或下一个单词的末尾

光标在Hello的H后,按e跳至Hello的o后

b

光标跳至当前单词或上一个单词的开头

光标在Vim!的V后,按b跳至Hello的H前

W(大写)

按 “长单词” 移动(忽略标点符号)

光标在Vim!的!后,按W跳至I前(忽略!)

E(大写)

按 “长单词” 移动,跳至单词末尾

光标在Vim!的V后,按E跳至!后

B(大写)

按 “长单词” 移动,跳至单词开头

光标在I前,按B跳至Vim!的V前

说明:Vim 中 “单词” 的定义为:由字母、数字、下划线组成的连续字符序列;“长单词” 的定义为:由非空白字符组成的连续字符序列(忽略标点符号)。

示例操作:文本内容:Hello Vim! I love Linux!(光标初始在H后)

  1. 按w:光标跳至Vim!的V前。
  2. 按e:光标跳至Vim!的!后。
  3. 按w:光标跳至I前。
  4. 按b:光标跳回Vim!的V前。
  5. 按W:光标跳至I前(与w效果一致,因!后是空格)。
  6. 按e:光标跳至I后。
  7. 按w:光标跳至love的l前。
4.1.3 按屏幕移动(翻页)

命令

功能描述

类似操作

Ctrl + f

屏幕向前翻一页(滚动到下一页)

类似 PageDown 键

Ctrl + b

屏幕向后翻一页(滚动到上一页)

类似 PageUp 键

Ctrl + d

屏幕向前滚动半页

向下滚动半屏

Ctrl + u

屏幕向后滚动半页

向上滚动半屏

Ctrl + e

屏幕向下滚动 1 行(光标不动)

屏幕下移,光标位置不变

Ctrl + y

屏幕向上滚动 1 行(光标不动)

屏幕上移,光标位置不变

H

光标移动到屏幕顶部行的行首

屏幕顶部

M

光标移动到屏幕中间行的行首

屏幕中间

L

光标移动到屏幕底部行的行首

屏幕底部

示例操作:假设打开一个 100 行的longfile.txt文件,当前屏幕显示第 1-20 行:

  1. 按Ctrl + f:屏幕翻到第 21-40 行,光标在第 21 行首。
  2. 按Ctrl + b:屏幕返回第 1-20 行,光标在第 1 行首。
  3. 按Ctrl + d:屏幕滚动到第 11-30 行,光标在第 11 行首。
  4. 按H:光标跳至屏幕顶部行(第 1 行)首。
  5. 按M:光标跳至屏幕中间行(第 10 行)首。
  6. 按L:光标跳至屏幕底部行(第 20 行)首。
4.1.4 按文本全局移动

命令

功能描述

示例

gg

光标移动到文本的第一行首

无论当前在第几行,按gg跳至文首

G(大写)

光标移动到文本的最后一行首

按G跳至文尾

[行号]G

光标移动到指定行的行首

按50G跳至第 50 行首

Ctrl + g

显示当前光标位置信息(行号、列号、总行数)

底部显示10,1-8 5%(第 10 行,第 1-8 列,占总文本 5%)

示例操作:文本共 50 行,当前光标在第 20 行:

  1. 按gg:光标跳至第 1 行首。
  2. 按G:光标跳至第 50 行首。
  3. 按30G:光标跳至第 30 行首。
  4. 按Ctrl + g:底部状态栏显示30,1-0 60%(第 30 行,第 1 列,占总文本 60%)。

4.2 文本删除命令

Vim 的删除命令以d(delete)为核心,配合光标移动命令可实现不同范围的文本删除,删除的内容会被存入 Vim 缓冲区,可通过粘贴命令恢复。

4.2.1 基础删除命令

命令

功能描述

示例

x

删除光标所在位置的 1 个字符

光标在a上,按x删除a

X(大写)

删除光标所在位置左侧的 1 个字符

光标在a后,按X删除a

#x

删除光标所在位置及右侧共#个字符

按3x删除光标处及右侧 2 个字符(共 3 个)

#X

删除光标所在位置左侧共#个字符

按2X删除光标左侧 2 个字符

dd

删除光标所在的整行

光标在第 5 行,按dd删除第 5 行

#dd

从光标所在行开始,删除#行

按5dd删除光标行及下方 4 行(共 5 行)

D

删除光标所在位置到行尾的所有字符

光标在该行中间,按D删除光标后至行尾内容

d$

与D功能一致,删除光标到行尾

同D

d^

删除光标所在位置到行首的所有字符(不含光标处字符)

光标在该行中间,按d^删除行首至光标前内容

dw

删除光标所在位置到下一个单词开头的字符

光标在Hello的e后,按dw删除o及后续空格

de

删除光标所在位置到当前单词末尾的字符

光标在Hello的e后,按de删除o

db

删除光标所在位置到上一个单词开头的字符

光标在Vim的i后,按db删除Vi

示例操作:文本内容(光标初始在H后):Hello Vim! I love Linux!

  1. 按x:删除H后的e,文本变为Hllo Vim! I love Linux!。
  2. 按3x:删除H后的llo,文本变为H Vim! I love Linux!。
  3. 按X:删除H左侧无字符,无效果;移动光标到V后,按X删除V,文本变为H im! I love Linux!。
  4. 按dd:删除当前行,文本仅剩第二行(若为单行则文本为空)。
  5. 重新打开文件,按d$:删除光标到行尾,若光标在V前,文本变为Hello。
4.2.2 组合删除命令(配合光标移动)

Vim 的删除命令支持 “命令 + 范围” 的组合模式,即d + 光标移动命令,表示删除 “光标当前位置到光标移动后位置” 的文本。常用组合如下:

  • d0:删除光标到行首(同d^)。
  • d$:删除光标到行尾(同D)。
  • dw:删除光标到下一个单词开头。
  • de:删除光标到当前单词末尾。
  • db:删除光标到上一个单词开头。
  • dj:删除光标所在行及下一行(同2dd)。
  • dk:删除光标所在行及上一行。
  • dG:删除光标所在行到文本末尾的所有行。
  • dgg:删除光标所在行到文本开头的所有行。
  • d[行号]G:删除光标所在行到指定行的所有行。

示例操作:文本共 10 行,光标在第 3 行:

  1. 按dG:删除第 3-10 行,仅剩第 1-2 行。
  2. 按dgg:删除第 1-3 行(当前光标在第 3 行),仅剩第 4-10 行。
  3. 按d5G:删除第 3-5 行,剩余行自动上移。

4.3 复制与粘贴命令

Vim 的复制命令以y(yank)为核心,粘贴命令为p(put),复制的内容会存入缓冲区,支持跨文件粘贴。

4.3.1 复制命令

命令

功能描述

示例

yw

复制光标所在位置到当前单词末尾的字符

光标在Hello的e后,按yw复制o

#yw

复制光标所在位置开始的#个单词

按2yw复制当前单词及下一个单词

yy

复制光标所在的整行

按yy复制当前行

#yy

从光标所在行开始,复制#行

按3yy复制光标行及下方 2 行(共 3 行)

y$

复制光标所在位置到行尾的字符

光标在该行中间,按y$复制光标后至行尾

y^

复制光标所在位置到行首的字符

光标在该行中间,按y^复制行首至光标前

yG

复制光标所在行到文本末尾的所有行

按yG复制光标行至文尾

ygg

复制光标所在行到文本开头的所有行

按ygg复制光标行至文首

示例操作:文本内容:

代码语言:javascript
复制
Line 1: Hello Vim!
Line 2: This is a test.
Line 3: I love Linux.

光标在第 2 行首:

  1. 按yy:复制第 2 行(Line 2: This is a test.)。
  2. 按3yy:复制第 2-4 行(若只有 3 行则复制第 2-3 行)。
  3. 移动光标到第 1 行末尾,按yw:复制Vim!。
  4. 按y$:复制第 1 行光标后至行尾的Vim!(同yw效果)。
4.3.2 粘贴命令

命令

功能描述

示例

p(小写)

粘贴缓冲区内容到光标所在位置的下方(行复制)或右侧(字符复制)

复制行后按p,在光标行下方粘贴;复制字符后按p,在光标右侧粘贴

P(大写)

粘贴缓冲区内容到光标所在位置的上方(行复制)或左侧(字符复制)

复制行后按P,在光标行上方粘贴;复制字符后按P,在光标左侧粘贴

示例操作:延续上面的复制示例:

1. 复制第 2 行(yy)后,移动光标到第 3 行尾,按p:在第 3 行下方粘贴第 2 行内容,文本变为:

代码语言:javascript
复制
Line 1: Hello Vim!
Line 2: This is a test.
Line 3: I love Linux.
Line 4: This is a test.

2. 移动光标到第 1 行的Vim!后,按P:在Vim!左侧粘贴之前复制的Vim!,第 1 行变为Line 1: Hello Vim!Vim!。

3. 复制第 1 行(yy)后,移动光标到第 2 行首,按P:在第 2 行上方粘贴第 1 行内容,文本变为:

代码语言:javascript
复制
Line 1: Hello Vim!Vim!
Line 2: Hello Vim!Vim!
Line 3: This is a test.
Line 4: I love Linux.
Line 5: This is a test.

4.4 替换命令

Vim 的替换命令用于修改光标所在位置的字符,常用命令如下:

命令

功能描述

示例

r(小写)

替换光标所在位置的 1 个字符(替换后仍处于命令模式)

光标在a上,按r后输入b,将a替换为b

R(大写)

进入替换模式,持续替换光标所在位置及右侧字符,按ESC返回命令模式

按R后输入abc,替换光标处及右侧 3 个字符

cw

替换光标所在位置到当前单词末尾的字符(替换后进入插入模式)

光标在Hello的e后,按cw输入i,将lo替换为i

c#w

替换光标所在位置开始的#个单词(替换后进入插入模式)

按c2w输入test,替换当前单词及下一个单词

cc

替换光标所在的整行(替换后进入插入模式)

按cc输入New line.,替换当前行内容

#cc

替换光标所在行开始的#行(替换后进入插入模式)

按2cc输入两行新内容,替换当前行及下一行

示例操作:文本内容:Hello Vim! I love Linux!(光标在Vim!的i上)

  1. 按r输入o:将i替换为o,文本变为Hello Vom! I love Linux!,仍处于命令模式。
  2. 按R输入ersion:替换Vom!为Version,文本变为Hello Version I love Linux!,按ESC返回命令模式。
  3. 移动光标到love的l上,按cw输入like:将love替换为like,文本变为Hello Version I like Linux!,自动进入插入模式,按ESC返回。
  4. 按cc输入This is a replaced line.:替换当前行,文本变为This is a replaced line.。

4.5 撤销与恢复命令

命令

功能描述

示例

u

撤销上一次操作

误删字符后按u恢复

#u

撤销上#次操作

按3u撤销最近 3 步操作

Ctrl + r

恢复撤销的操作(反撤销)

撤销后发现操作正确,按Ctrl + r恢复

U(大写)

撤销对当前行的所有修改

对某行多次修改后,按U恢复该行原始状态

示例操作:

  1. 打开文本:Hello Vim!。
  2. 按x删除V,文本变为Hello im!。
  3. 按u:恢复V,文本变回Hello Vim!。
  4. 按dd删除该行,文本为空。
  5. 按u:恢复该行,文本变回Hello Vim!。
  6. 按Ctrl + r:再次删除该行,文本为空。
  7. 按u恢复该行,按i输入 I love Vim!,文本变为Hello Vim! I love Vim!。
  8. 按U:撤销对当前行的所有修改,文本变回Hello Vim!。

4.6 其他常用命令

命令

功能描述

示例

J(大写)

合并光标所在行与下一行(删除换行符)

两行文本间按J合并为一行

>>

光标所在行向右缩进 1 个制表位

按>>缩进当前行

<<

光标所在行向左缩进 1 个制表位

按<<取消当前行缩进

#>>

光标所在行及下方#-1行向右缩进

按3>>缩进当前行及下方 2 行

#<<

光标所在行及下方#-1行向左缩进

按2<<取消当前行及下方 1 行缩进

.(点号)

重复上一次操作

按x删除字符后,按.重复删除

~(波浪号)

切换光标所在字符的大小写

光标在a上按~变为A,在B上按~变为b

示例操作:文本内容:

代码语言:javascript
复制
Line 1: Hello Vim!
Line 2: This is line 2.
Line 3: Indent test.
  1. 光标在第 1 行尾,按J:合并第 1-2 行,文本变为Line 1: Hello Vim!Line 2: This is line 2.。
  2. 移动光标到第 3 行,按>>:第 3 行向右缩进 1 个制表位,文本变为 Line 3: Indent test.。
  3. 按<<:第 3 行向左缩进,恢复原样。
  4. 按x删除test的t,文本变为Line 3: Inden test.。
  5. 按.:重复删除操作,删除e,文本变为Line 3: Indn test.。
  6. 移动光标到Indn的I上,按~:变为i,文本变为Line 3: indn test.。

五、Vim 末行模式命令集

底行模式(末行模式)通过输入命令实现文件管理、查找替换、行号显示等高级功能,命令以冒号:开头,按回车键执行,常用命令分类详解如下:

5.1 文件管理命令

命令

功能描述

示例

:w

保存当前文件

:w → 保存文件,返回命令模式

:w!

强制保存文件(需权限)

只读文件修改后,:w!强制保存

:w [文件名]

另存为指定文件

:w backup.txt → 另存为 backup.txt

:wq

保存并退出 Vim

:wq → 保存文件并退出

:wq!

强制保存并退出

只读文件修改后,:wq!强制保存退出

:q

退出 Vim(文件已保存)

无修改时,:q直接退出

:q!

强制退出(不保存修改)

有修改但无需保存时,:q!强制退出

:x

保存并退出(同:wq,但文件无修改时不更新文件时间戳)

:x → 保存退出,比:wq更高效

:e [文件名]

在当前 Vim 会话中打开另一个文件

:e newfile.txt → 打开 newfile.txt

:e!

放弃当前修改,重新加载当前文件

误修改后,:e!恢复文件原始内容

:saveas [文件名]

另存为指定文件(同:w [文件名])

:saveas copy.txt → 另存为 copy.txt

示例操作:

  1. 编辑test.txt后,:w → 保存文件,底部显示"test.txt" 3L, 60C written。
  2. 想另存为test_backup.txt,:w test_backup.txt → 底部显示"test_backup.txt" 3L, 60C written。
  3. 继续编辑后,:x → 保存并退出 Vim。
  4. 重新打开test.txt,误删内容后,:e! → 恢复原始内容。
  5. 打开newfile.txt,:e newfile.txt → 切换到 newfile.txt 编辑。

5.2 行号相关命令

命令

功能描述

示例

:set nu

显示行号(nu = number)

:set nu → 每行前显示行号

:set nonu

隐藏行号

:set nonu → 取消行号显示

:set nu!

切换行号显示状态(显示↔隐藏)

:set nu! → 切换行号显示

:[行号]

跳转到指定行

:5 → 跳转到第 5 行

:$

跳转到最后一行

:$ → 跳转到文尾

:1

跳转到第一行

:1 → 跳转到文首

示例操作:

1. 打开test.c文件,:set nu → 显示行号,界面如下:

代码语言:javascript
复制
  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     printf("Hello Vim!\n");
  6     return 0;
  7 }

2. 输入:10 → 若文件只有 7 行,光标跳至第 7 行(最后一行)。

3. 输入:$ → 跳至第 7 行。

4. 输入:set nonu → 隐藏行号,恢复无行号显示。

5.3 查找与替换命令

查找与替换是 Vim 的强大功能之一,支持普通字符查找、正则表达式查找,替换功能支持全局替换、指定范围替换等。

5.3.1 查找命令

命令

功能描述

示例

/[关键字]

从光标位置向后查找关键字

/Vim → 向后查找 “Vim”

?[关键字]

从光标位置向前查找关键字

?Hello → 向前查找 “Hello”

n

继续查找下一个匹配项(与查找方向一致)

/Vim后按n → 查找下一个 “Vim”

N

继续查找上一个匹配项(与查找方向相反)

/Vim后按N → 查找上一个 “Vim”

:set ic

查找时忽略大小写(ic = ignore case)

:set ic → 查找 “vim” 时匹配 “Vim”“VIM” 等

:set noic

查找时区分大小写

:set noic → 恢复区分大小写

:set hlsearch

高亮显示所有匹配项

:set hlsearch → 高亮查找结果

:set nohlsearch

取消高亮显示

:set nohlsearch → 取消高亮

:nohl

临时取消高亮(不修改 hlsearch 设置)

:nohl → 临时隐藏高亮,下次查找仍高亮

示例操作:文本内容:

代码语言:javascript
复制
Hello Vim!
Vim is a powerful editor.
I love Vim and Linux.
  1. 输入/Vim → 向后查找 “Vim”,光标跳至第一行的 “Vim”。
  2. 按n → 光标跳至第二行的 “Vim”。
  3. 按n → 光标跳至第三行的 “Vim”。
  4. 按n → 底部显示Pattern not found (press RETURN),无更多匹配项。
  5. 输入?Linux → 向前查找 “Linux”,光标跳至第三行的 “Linux”。
  6. 按N → 向前查找下一个 “Linux”,无匹配项,底部显示Pattern not found。
  7. 输入:set ic → 忽略大小写,输入/vim → 匹配所有 “Vim”。
  8. 输入:set hlsearch → 高亮所有匹配的 “Vim”。
  9. 输入:nohl → 临时取消高亮。
5.3.2 替换命令

替换命令的基本语法:

代码语言:javascript
复制
:[范围]s/[查找内容]/[替换内容]/[选项]
  • 范围:指定替换的范围(如无范围,默认只替换当前行的第一个匹配项)。
  • s:替换命令标识(substitute)。
  • 查找内容:需要替换的字符或正则表达式。
  • 替换内容:替换后的字符。
  • 选项:替换规则(如全局替换、确认替换等)。

常用范围:

  • n,m:替换第 n 行到第 m 行的匹配项。
  • %:替换整个文件的所有匹配项(等价于1,$)。
  • .:当前行。
  • $:最后一行。

常用选项:

  • g:全局替换(global),替换指定范围内的所有匹配项(无 g 则只替换每个行的第一个匹配项)。
  • c:确认替换(confirm),替换前提示用户确认(y = 替换,n = 不替换,a = 全部替换,q = 退出替换)。
  • i:忽略大小写(ignore case)。
  • I:区分大小写(默认)。
  • p:替换后显示替换结果。

常用替换命令示例:

命令

功能描述

示例

:s/old/new

替换当前行的第一个 “old” 为 “new”

当前行有 “old old”,替换后为 “new old”

:s/old/new/g

替换当前行的所有 “old” 为 “new”

当前行有 “old old”,替换后为 “new new”

:%s/old/new

替换整个文件每行的第一个 “old” 为 “new”

所有行的第一个 “old” 被替换

:%s/old/new/g

替换整个文件的所有 “old” 为 “new”

全局替换所有 “old”

:3,8s/old/new/g

替换第 3-8 行的所有 “old” 为 “new”

指定行范围全局替换

:%s/old/new/gc

全局替换 “old” 为 “new”,替换前确认

每次替换前提示用户

:%s/old/new/gi

全局替换 “old” 为 “new”,忽略大小写

匹配 “Old”“OLD” 等并替换

示例操作:文本内容(共 5 行):

代码语言:javascript
复制
1. old text old
2. Old content
3. test old data
4. old old old
5. no match

1. 光标在第 2 行,:s/Old/New → 替换第 2 行的第一个 “Old” 为 “New”,第 2 行变为New content。

2. 光标在第 4 行,:s/old/new/g → 替换第 4 行所有 “old” 为 “new”,第 4 行变为new new new。

3. :%s/old/New/g → 全局替换所有 “old” 为 “New”(区分大小写),结果:

代码语言:javascript
复制
1. New text New
2. Old content
3. test New data
4. new new new
5. no match

4. :%s/old/New/gi → 全局替换 “old” 为 “New”,忽略大小写,第 2 行变为New content。

5. :1,3s/old/New/gc → 替换第 1-3 行的 “old” 为 “New”,并提示确认:

代码语言:javascript
复制
replace with New (y/n/a/q/l/^E/^Y)?
  • 按y → 替换当前匹配项。
  • 按a → 替换所有剩余匹配项。
  • 按q → 退出替换。

5.4 多文件编辑命令

Vim 支持同时打开多个文件,通过底行命令切换文件、分屏编辑等。

命令

功能描述

示例

:args [文件1] [文件2] ...

指定多个文件作为编辑对象

:args a.txt b.txt c.txt → 打开 3 个文件

:next(缩写:n)

切换到下一个文件

:n → 切换到下一个文件

:previous(缩写:prev)

切换到上一个文件

:prev → 切换到上一个文件

:first

切换到第一个文件

:first → 切换到第一个文件

:last

切换到最后一个文件

:last → 切换到最后一个文件

:args

查看当前编辑的文件列表

:args → 显示所有打开的文件

:split [文件名](缩写:sp)

水平分屏打开文件

:sp b.txt → 水平分屏打开 b.txt

:vsplit [文件名](缩写:vsp)

垂直分屏打开文件

:vsp c.txt → 垂直分屏打开 c.txt

Ctrl + w + w

在分屏窗口间切换

按Ctrl + w + w → 切换到下一个分屏

:close(缩写:clo)

关闭当前分屏窗口

:clo → 关闭当前分屏

示例操作:

  1. 终端中打开多个文件:vim a.txt b.txt c.txt。
  2. 底行输入:args → 底部显示a.txt b.txt c.txt,当前编辑 a.txt。
  3. 输入:n → 切换到 b.txt。
  4. 输入:prev → 切换回 a.txt。
  5. 输入:sp c.txt → 水平分屏打开 c.txt,上半屏为 a.txt,下半屏为 c.txt。
  6. 按Ctrl + w + w → 切换到下半屏(c.txt)。
  7. 输入:vsp b.txt → 垂直分屏打开 b.txt,下半屏左侧为 c.txt,右侧为 b.txt。
  8. 输入:clo → 关闭当前分屏(b.txt)。
  9. 输入:wqall → 保存所有文件并退出 Vim。

5.5 其他常用底行命令

命令

功能描述

示例

:help [命令]

查看指定命令的帮助文档

:help w → 查看:w命令的帮助

:help vim-modes

查看 Vim 所有模式的帮助

:help vim-modes → 显示 12 种模式说明

:cd [目录]

切换 Vim 的当前工作目录

:cd /home/user → 切换到 /home/user

:pwd

显示当前工作目录

:pwd → 显示当前目录路径

:! [终端命令]

在 Vim 中执行终端命令(不退出 Vim)

:!ls → 查看当前目录文件列表

:set fileencoding

查看当前文件编码

:set fileencoding → 显示utf-8

:set fileencoding=utf-8

设置文件编码为 UTF-8

:set fileencoding=utf-8 → 转换文件编码

示例操作:

  1. 输入:help dd → 打开dd命令的帮助文档,按q退出帮助。
  2. 输入:cd /tmp → 切换 Vim 工作目录到 /tmp。
  3. 输入:pwd → 底部显示/tmp。
  4. 输入:!date → 执行终端date命令,显示当前时间,按回车键返回 Vim。
  5. 输入:set fileencoding → 若文件编码为 UTF-8,底部显示fileencoding=utf-8。

六、Vim 操作总结

Vim 的操作看似复杂,但核心逻辑围绕 “模式切换” 和 “命令组合” 展开,只要掌握了以下的核心要点,就能熟练运用 Vim 进行高效编辑。

6.1 核心模式切换总结

  • 启动 Vim → 命令模式(默认模式)。
  • 命令模式 ↔ 插入模式:i/a/o 进入,ESC 返回。
  • 命令模式 ↔ 底行模式:: 进入,ESC 或执行命令后返回。
  • 可视化模式:命令模式下按v/V/Ctrl + v进入,ESC 返回。

模式切换口诀:启动默认命令模,插入就用 i/a/o,底行模式冒号调,ESC 一键回命令。

6.2 常用命令分类总结

6.2.1 快速上手必备命令(入门必记)

功能

命令(命令模式)

命令(底行模式)

打开文件

vim 文件名

-

保存文件

-

:w

退出 Vim

-

:q、:wq、:q!

光标移动

h/j/k/l(上下左右)

-

插入文本

i/a/o

-

删除字符

x

-

删除整行

dd

-

复制整行

yy

-

粘贴

p/P

-

撤销操作

u

-

查找关键字

/关键字、?关键字

-

6.2.2 高效编辑常用命令(进阶必备)

功能

命令

说明

行首 / 行尾移动

0/$

快速跳至行首 / 行尾

单词移动

w/e/b

按单词高效移动光标

文本翻页

Ctrl + f/b

快速翻页,适合大文件

全局移动

gg/G

跳至文首 / 文尾

全局替换

:%s/old/new/g

批量修改文本

分屏编辑

:sp/:vsp

多文件同时编辑

重复操作

.(点号)

重复上一次有效操作

反撤销

Ctrl + r

恢复误撤销的操作

6.3 操作技巧总结

  1. 减少方向键使用:命令模式下h/j/k/l移动光标,比方向键更高效(无需移动手位)。
  2. 善用组合命令:d + 光标移动命令(如dw、d$)实现精准删除,y + 光标移动命令实现灵活复制。
  3. 批量操作优先用可视化模式:选择文本块后按d删除、y复制、s替换,高效处理批量文本。
  4. 查找替换加确认:全局替换时加c选项(如:%s/old/new/gc),避免误替换。
  5. 随时保存:编辑过程中按:w定期保存,防止意外退出导致内容丢失。
  6. 利用帮助文档:遇到未知命令时,:help 命令查看官方文档,快速掌握用法。

6.4 常见问题与解决方案

  1. 误按Ctrl + s导致 Vim 卡死:按Ctrl + q解锁(终端流控制快捷键冲突)。
  2. 无法退出 Vim:确保处于命令模式,输入:q(已保存)或:q!(强制退出)。
  3. 查找时不区分大小写::set ic开启忽略大小写,:set noic恢复。
  4. 替换后想要撤销:命令模式下按u,撤销底行模式的替换操作。
  5. 中文乱码::set fileencoding=utf-8设置文件编码为 UTF-8。

七、简单 Vim 配置

Vim 支持通过配置文件自定义编辑环境,如设置行号、语法高亮、缩进规则等。配置文件分为系统级配置和用户级配置,用户级配置仅对当前用户生效,推荐优先使用用户级配置。

7.1 配置文件位置

  • 系统级配置文件:/etc/vimrc(对所有用户生效,修改需 root 权限)。
  • 用户级配置文件:~/.vimrc(当前用户主目录下,仅对当前用户生效,无则创建)。
7.2 常用基础配置(必学)

编辑用户级配置文件:

代码语言:javascript
复制
vim ~/.vimrc

添加以下配置(每行一条配置,可根据需求调整):

代码语言:javascript
复制
" 基础配置(双引号后为注释)
set nu                  " 显示行号
set nonu                " 注释掉此行则隐藏行号(默认显示)
set syntax on           " 开启语法高亮
set autoindent          " 自动缩进(新行继承上一行的缩进)
set smartindent         " 智能缩进(针对代码的自动缩进优化)
set shiftwidth=4        " 缩进宽度为4个空格
set tabstop=4           " Tab键宽度为4个空格
set expandtab           " 将Tab键转换为空格(避免不同编辑器Tab显示不一致)
set softtabstop=4       " 按Tab键时,实际插入4个空格
set hlsearch            " 高亮显示查找结果
set incsearch           " 增量查找(输入查找关键字时实时匹配)
set ignorecase          " 查找时忽略大小写
set smartcase           " 当查找关键字包含大写字母时,自动区分大小写
set wrap                " 自动换行(长行内容换行显示)
set linebreak           " 按单词边界换行(避免单词拆分)
set scrolloff=5         " 光标距离屏幕顶部/底部5行时自动滚动
set mouse=a             " 启用鼠标支持(终端中可使用鼠标操作)
set encoding=utf-8      " 设置编码为UTF-8,避免中文乱码
set fileencoding=utf-8  " 设置文件编码为UTF-8
set showmode            " 底部状态栏显示当前模式(如-- INSERT --)
set showcmd             " 底部状态栏显示当前输入的命令
set laststatus=2        " 始终显示状态栏(显示文件名、行号、列号等信息)
set wildmenu            " 命令行补全时显示菜单
set cursorline          " 高亮显示光标所在行(方便定位光标)
set cursorcolumn        " 高亮显示光标所在列(可选,根据需求开启)
set backup              " 开启备份(编辑文件时生成备份文件,后缀为~)
set backupdir=~/.vim/backup/  " 备份文件存放目录(需手动创建)
set undofile            " 开启持久化撤销(关闭文件后重新打开仍可撤销操作)
set undodir=~/.vim/undo/      " 撤销历史存放目录(需手动创建)

7.3 配置生效与目录创建

  1. 保存配置文件:编辑完~/.vimrc后,:wq保存退出。
  2. 创建备份和撤销目录(配置中指定的目录):
代码语言:javascript
复制
mkdir -p ~/.vim/backup ~/.vim/undo

生效配置:

  • 重新打开 Vim,配置自动生效。
  • 无需重启 Vim,在 Vim 中执行:source ~/.vimrc,配置立即生效。

7.4 配置效果验证

打开一个 C 语言文件test.c,验证配置效果:

代码语言:javascript
复制
vim test.c

输入以下代码:

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    printf("Hello Vim config!\n");
    if (1) {
        printf("Indent test.\n");
    }
    return 0;
}

我们可以尝试一下验证以下效果:

  • 显示行号:每行前显示行号。
  • 语法高亮:关键字#include、int、printf等显示不同颜色。
  • 自动缩进:if语句内的printf自动缩进 4 个空格。
  • Tab 键转换:按 Tab 键插入 4 个空格(而非制表符)。
  • 光标行高亮:光标所在行背景高亮。
  • 状态栏显示:底部状态栏显示test.c、行号、列号、模式等信息。

7.5 进阶配置(插件安装)

原生 Vim 功能有限,通过安装插件可增强代码补全、文件管理、代码片段等功能。下面我为大家提供了以 Vim-Plug 为插件管理器的一些常用插件及安装方法。

7.5.1 安装 Vim-Plug(插件管理器)

Vim-Plug 是一款轻量、高效的 Vim 插件管理器,支持插件一键安装、更新、卸载,且支持延迟加载插件以提升 Vim 启动速度。

1. 下载 Vim-Plug(Linux/macOS 系统)

打开终端,执行以下命令下载 Vim-Plug 并安装到用户级插件目录(~/.vim/autoload/):

代码语言:javascript
复制
# 下载plug.vim到autoload目录(确保目录存在)
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

若因网络问题无法访问 GitHub,也可使用国内镜像源(如 Gitee):

代码语言:javascript
复制
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://gitee.com/mirrors/vim-plug/raw/master/plug.vim
2. 验证安装

安装完成后,打开 Vim 并在底行模式输入以下命令:

代码语言:javascript
复制
:PlugStatus

若安装成功,底部会显示PlugStatus: No plugins defined.(表示尚未配置插件),且无报错信息;若提示E492: Not an editor command: PlugStatus,则说明安装失败,需重新检查命令和网络。

3. Windows 系统安装

若在 Windows 系统(如 cmd、Git Bash)中使用 Vim,执行以下命令:

代码语言:javascript
复制
# PowerShell中执行
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
    ni $HOME/vimfiles/autoload/plug.vim -Force
7.5.2 配置常用插件(基础必备)

插件配置需在~/.vimrc中添加特定格式的配置块,遵循 “call plug#begin(插件目录) → 插件列表 → call plug#end()” 的结构。以下是开发中常用的基础插件及配置:

1. 插件配置模板(更新~/.vimrc)

编辑~/.vimrc,在原有基础配置后添加以下内容:

代码语言:javascript
复制
" ==================== Vim-Plug插件配置 ====================
" 定义插件安装目录(默认~/.vim/plugged,可自定义)
call plug#begin('~/.vim/plugged')

" 1. 代码补全插件:YouCompleteMe(支持多语言语法补全)
" 特点:实时补全、支持C/C++/Python/Go等多种语言、可配置语法检查
Plug 'ycm-core/YouCompleteMe', { 'do': './install.py --all' }  
" --all表示安装所有语言支持,若仅需C/C++支持,可改为--clang-completer

" 2. 文件管理器插件:NERDTree(可视化目录树)
" 特点:支持鼠标操作、目录快速导航、文件类型图标显示
Plug 'preservim/nerdtree'
Plug 'ryanoasis/vim-devicons'  " 配合NERDTree显示文件类型图标(需终端支持图标)

" 3. 代码片段插件:vim-snippets(预设常用代码片段)
" 特点:支持C/C++/Python/Shell等语言、可自定义片段、Tab键触发补全
Plug 'honza/vim-snippets'
Plug 'SirVer/ultisnips'  " 代码片段引擎(需与vim-snippets配合使用)

" 4. 语法检查插件:ALE(异步语法检查)
" 特点:实时检查代码语法错误、支持多语言、可集成linter工具(如clang-tidy、pylint)
Plug 'dense-analysis/ale'

" 5. 代码注释插件:vim-commentary(快速注释/取消注释)
" 特点:支持单行/多行注释、不同语言自动适配注释格式(//、#、/* */等)
Plug 'tpope/vim-commentary'

" 6. 光标移动增强:vim-easymotion(快速跳转光标)
" 特点:通过快捷键+字符组合快速跳转到任意位置,提升大文件导航效率
Plug 'easymotion/vim-easymotion'

" 插件配置结束
call plug#end()

" ==================== 插件使用配置(根据插件需求添加) ====================
" ------------------- NERDTree配置 -------------------
map <F3> :NERDTreeToggle<CR>  " 按F3键快速打开/关闭目录树
autocmd VimEnter * NERDTree   " Vim启动时自动打开NERDTree
autocmd BufEnter * if winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | q | endif  " 关闭最后一个窗口时自动退出Vim
let g:NERDTreeShowHidden=1    " 显示隐藏文件(如.gitignore、.vimrc)
let g:NERDTreeDevIconsEnable=1  " 启用文件图标显示

" ------------------- ultisnips配置 -------------------
let g:UltiSnipsExpandTrigger='<tab>'  " 按Tab键触发代码片段补全
let g:UltiSnipsJumpForwardTrigger='<c-j>'  " 按Ctrl+j跳转到片段下一个占位符
let g:UltiSnipsJumpBackwardTrigger='<c-k>'  " 按Ctrl+k跳转到片段上一个占位符
let g:UltiSnipsEditSplit='vertical'  " 垂直分屏编辑自定义片段

" ------------------- ALE配置 -------------------
let g:ale_lint_on_save=1  " 保存文件时自动进行语法检查
let g:ale_lint_on_enter=1  " 打开文件时自动进行语法检查
let g:ale_lint_on_text_changed='always'  " 文本变化时实时检查
let g:ale_sign_error='✗'  " 错误标识(可自定义符号)
let g:ale_sign_warning='⚠'  " 警告标识(可自定义符号)
" 为C/C++配置clang-tidy作为linter(需先安装clang-tidy:sudo yum install clang-tidy 或 sudo apt install clang-tidy)
let g:ale_linters={'c': ['clang-tidy'], 'cpp': ['clang-tidy']}

" ------------------- vim-commentary配置 -------------------
" 按gc注释/取消注释(默认快捷键,无需额外配置,示例:
" - 命令模式下:gc + 光标移动(如gc3j注释当前行及下方2行)
" - 可视化模式下:选中文本后按gc快速注释)

" ------------------- vim-easymotion配置 -------------------
map <Leader>s <Plug>(easymotion-overwin-f)  " 按\s(\为Leader键)搜索字符并跳转
let g:EasyMotion_smartcase=1  " 搜索时智能区分大小写(同Vim基础配置)
2. 安装插件(关键步骤)

配置完成后,保存~/.vimrc并重新打开 Vim,在底行模式执行以下命令安装插件:

代码语言:javascript
复制
:PlugInstall

执行后会显示插件安装进度界面,左侧为插件列表,右侧为安装状态(Installed表示安装成功)。安装过程中需等待依赖下载(如 YouCompleteMe 需编译安装,耗时较长,需保持网络畅通)。

  • 安装成功:底部会显示Finished. X plugins installed.(X 为插件数量)。
  • 安装失败:查看右侧报错信息(常见原因:网络问题、依赖缺失),根据提示修复(比如安装 YouCompleteMe 需要cmake和python3-dev,可通过sudo yum install cmake python3-devel或sudo apt install cmake python3-dev安装依赖)。
7.5.3 插件使用实战示例
1. NERDTree(文件管理器)
  • 打开 / 关闭:按F3键快速切换目录树显示状态,启动 Vim 时会自动打开。
  • 操作示例:
    1. 打开test.c文件:vim test.c,左侧自动显示 NERDTree 目录树。
    2. 用方向键导航到test.c文件,按Enter键打开文件。
    3. 按o键在当前窗口打开文件,按i键水平分屏打开,按s键垂直分屏打开。
    4. 按R键刷新目录树(新增 / 删除文件后刷新),按a键在当前目录新建文件。
2. 代码片段(ultisnips + vim-snippets)

以 C 语言为例,快速生成main函数片段:

新建test.c文件:vim test.c。

进入插入模式(按i),输入main,按Tab键触发片段补全,自动生成以下代码:

代码语言:javascript
复制
int main(int argc, char *argv[]) {
    /* code */
    return 0;
}

光标默认在/* code */处,输入代码后按Ctrl + j跳转到return 0;行(片段占位符跳转)。

自定义片段:按Ctrl + n新建文件,输入mysnippet.snippets,添加自定义片段(如 C 语言循环片段):

代码语言:javascript
复制
for (int ${1:i} = 0; ${1:i} < ${2:count}; ${1:i}++) {
    ${3:// code}
}

保存后,在 C 文件中输入for并按Tab,即可触发自定义循环片段。

3. 语法检查(ALE)

以 C 语言的语法错误检查为例:

  1. 在test.c中输入错误代码:int main() { printf("Hello"); }(缺少#include <stdio.h>)。
  2. 保存文件(:w),ALE 会自动检查并在左侧显示警告标识(⚠)。
  3. 将光标移动到printf处,底部状态栏会显示错误信息:warning: implicit declaration of function 'printf' is invalid in C99 [-Wimplicit-function-declaration]。
  4. 添加#include <stdio.h>后保存,警告标识自动消失,说明语法检查生效。
4. 快速注释(vim-commentary)
  • 单行注释:光标在目标行,命令模式下按gcc,该行会添加//注释(C/C++)或#注释(Shell/Python)。
  • 多行注释:光标在起始行,按gc3j(注释当前行及下方 2 行),或可视化模式下选中多行后按gc。
  • 取消注释:对已注释的行执行相同命令(如gcc),即可取消注释。
7.5.4 插件管理(更新、卸载、查看)

Vim-Plug 提供便捷的插件管理命令,在底行模式执行即可:

命令

功能描述

示例

:PlugInstall

安装配置文件中新增的插件

新增插件后执行,自动下载安装

:PlugUpdate

更新所有已安装的插件

插件有新版本时执行,更新到最新版

:PlugUpgrade

更新 Vim-Plug 本身

提升插件管理器稳定性和功能

:PlugClean

卸载配置文件中已删除的插件

删除call plug#begin()和call plug#end()之间移除的插件

:PlugStatus

查看所有插件的安装状态

显示插件是否已安装、是否有更新、安装路径等

示例操作:

  1. 更新所有插件::PlugUpdate,执行后会显示更新进度,完成后底部提示更新结果。
  2. 卸载插件:在~/.vimrc中删除对应插件的Plug语句(如删除Plug 'preservim/nerdtree'),执行:PlugClean,按y确认卸载,即可删除 NERDTree 插件。
  3. 查看插件状态::PlugStatus,底部显示所有插件的状态(如[OK] nerdtree表示安装正常,[UPDATED] youcompleteme表示有更新)。
7.5.5 注意事项
  1. 依赖安装:部分插件需系统依赖支持(如 YouCompleteMe 需cmake、python3-dev,ALE 需clang-tidy/pylint),安装插件前需先通过yum或apt安装依赖,否则插件无法正常工作。
  2. 终端兼容性:文件图标(vim-devicons)需终端支持 Unicode 图标(如 Alacritty、Kitty、Windows Terminal),若使用默认终端(如 CentOS 的 GNOME Terminal),可能无法显示图标,可注释let g:NERDTreeDevIconsEnable=1关闭图标功能。
  3. 性能优化:插件过多可能导致 Vim 启动变慢,可通过以下方式优化:
    • 对非必需插件使用延迟加载(Vim-Plug 支持Plug '插件名', { 'on': '命令' },仅在执行指定命令时加载插件)。
    • 关闭插件的冗余功能(如 ALE 关闭实时检查,仅保存时检查)。
  4. 配置备份:~/.vimrc和~/.vim目录包含个人所有配置和插件,建议定期备份(如tar -czf vim_config_backup.tar.gz ~/.vimrc ~/.vim),更换设备时可直接恢复。

通过以上配置,Vim 将从基础编辑器升级为功能强大的 “轻量级 IDE”,支持代码补全、语法检查、文件管理等核心开发需求。后续大家也可以根据个人开发语言(如 Python、Go、Java)和习惯,进一步添加专项插件(如 Python 的jedi-vim、Go 的vim-go等),持续优化编辑体验。


总结

本期博客为大家详细介绍了Linux中的vim编辑器的使用全指南,vim编辑器是大家无论在学习Linux过程中,还是日后在企业工作中所必须掌握的一个Linux软件,熟练使用之后可以极大提高大家的工作效率。如果本期博客对大家有帮助的话,欢迎大家在评论区留言,也拜托大家点赞收藏一下,大家的支持就是我最大的动力!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 前言
  • 一、Linux 编辑器 - Vim 使用概述
    • 1.1 Vim 与 Vi 的核心区别
      • 安装 Vim(CentOS 系统)
      • 安装 Vim(Ubuntu 系统)
    • 1.2 Vim 的适用场景
  • 二、Vim 的基本概念
    • 2.1 Vim 的三种核心模式
      • 2.1.1 命令模式(Normal mode)
      • 2.1.2 插入模式(Insert mode)
      • 2.1.3 底行模式(Last line mode)
    • 2.2 模式切换逻辑
    • 2.3 其他模式(了解即可)
  • 三、Vim 的基本操作
    • 3.1 打开文件
      • 基本语法
      • 示例 1:打开已存在的文件
      • 示例 2:创建并打开新文件
      • 示例 3:打开文件并跳转到指定行
    • 3.2 模式切换实战
      • 3.2.1 命令模式 → 插入模式(三种常用方式)
      • 3.2.2 命令模式 → 底行模式
    • 3.3 保存与退出文件
      • 示例 1:保存并退出
      • 示例 2:强制退出(不保存)
      • 示例 3:另存为新文件
    • 3.4 放弃修改(撤销操作)
  • 四、Vim 正常模式命令集
    • 4.1 光标移动命令
      • 4.1.1 基础移动(按字符 / 行)
      • 4.1.2 按单词移动
      • 4.1.3 按屏幕移动(翻页)
      • 4.1.4 按文本全局移动
    • 4.2 文本删除命令
      • 4.2.1 基础删除命令
      • 4.2.2 组合删除命令(配合光标移动)
    • 4.3 复制与粘贴命令
      • 4.3.1 复制命令
      • 4.3.2 粘贴命令
    • 4.4 替换命令
    • 4.5 撤销与恢复命令
    • 4.6 其他常用命令
  • 五、Vim 末行模式命令集
    • 5.1 文件管理命令
    • 5.2 行号相关命令
    • 5.3 查找与替换命令
      • 5.3.1 查找命令
      • 5.3.2 替换命令
    • 5.4 多文件编辑命令
    • 5.5 其他常用底行命令
  • 六、Vim 操作总结
    • 6.1 核心模式切换总结
    • 6.2 常用命令分类总结
      • 6.2.1 快速上手必备命令(入门必记)
      • 6.2.2 高效编辑常用命令(进阶必备)
    • 6.3 操作技巧总结
    • 6.4 常见问题与解决方案
  • 七、简单 Vim 配置
    • 7.1 配置文件位置
      • 7.2 常用基础配置(必学)
    • 7.3 配置生效与目录创建
    • 7.4 配置效果验证
  • 7.5 进阶配置(插件安装)
    • 7.5.1 安装 Vim-Plug(插件管理器)
    • 7.5.2 配置常用插件(基础必备)
    • 7.5.3 插件使用实战示例
    • 7.5.4 插件管理(更新、卸载、查看)
    • 7.5.5 注意事项
  • 总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档