目录
[一、Linux 编辑器 - Vim 使用概述](#一、Linux 编辑器 - Vim 使用概述)
[1.1 Vim 与 Vi 的核心区别](#1.1 Vim 与 Vi 的核心区别)
[安装 Vim(CentOS 系统)](#安装 Vim(CentOS 系统))
[安装 Vim(Ubuntu 系统)](#安装 Vim(Ubuntu 系统))
[1.2 Vim 的适用场景](#1.2 Vim 的适用场景)
[二、Vim 的基本概念](#二、Vim 的基本概念)
[2.1 Vim 的三种核心模式](#2.1 Vim 的三种核心模式)
[2.1.1 命令模式(Normal mode)](#2.1.1 命令模式(Normal mode))
[2.1.2 插入模式(Insert mode)](#2.1.2 插入模式(Insert mode))
[2.1.3 底行模式(Last line mode)](#2.1.3 底行模式(Last line mode))
[2.2 模式切换逻辑](#2.2 模式切换逻辑)
[2.3 其他模式(了解即可)](#2.3 其他模式(了解即可))
[三、Vim 的基本操作](#三、Vim 的基本操作)
[3.1 打开文件](#3.1 打开文件)
[示例 1:打开已存在的文件](#示例 1:打开已存在的文件)
[示例 2:创建并打开新文件](#示例 2:创建并打开新文件)
[示例 3:打开文件并跳转到指定行](#示例 3:打开文件并跳转到指定行)
[3.2 模式切换实战](#3.2 模式切换实战)
[3.2.1 命令模式 → 插入模式(三种常用方式)](#3.2.1 命令模式 → 插入模式(三种常用方式))
[3.2.2 命令模式 → 底行模式](#3.2.2 命令模式 → 底行模式)
[3.3 保存与退出文件](#3.3 保存与退出文件)
[示例 1:保存并退出](#示例 1:保存并退出)
[示例 2:强制退出(不保存)](#示例 2:强制退出(不保存))
[示例 3:另存为新文件](#示例 3:另存为新文件)
[3.4 放弃修改(撤销操作)](#3.4 放弃修改(撤销操作))
[四、Vim 正常模式命令集](#四、Vim 正常模式命令集)
[4.1 光标移动命令](#4.1 光标移动命令)
[4.1.1 基础移动(按字符 / 行)](#4.1.1 基础移动(按字符 / 行))
[4.1.2 按单词移动](#4.1.2 按单词移动)
[4.1.3 按屏幕移动(翻页)](#4.1.3 按屏幕移动(翻页))
[4.1.4 按文本全局移动](#4.1.4 按文本全局移动)
[4.2 文本删除命令](#4.2 文本删除命令)
[4.2.1 基础删除命令](#4.2.1 基础删除命令)
[4.2.2 组合删除命令(配合光标移动)](#4.2.2 组合删除命令(配合光标移动))
[4.3 复制与粘贴命令](#4.3 复制与粘贴命令)
[4.3.1 复制命令](#4.3.1 复制命令)
[4.3.2 粘贴命令](#4.3.2 粘贴命令)
[4.4 替换命令](#4.4 替换命令)
[4.5 撤销与恢复命令](#4.5 撤销与恢复命令)
[4.6 其他常用命令](#4.6 其他常用命令)
[五、Vim 末行模式命令集](#五、Vim 末行模式命令集)
[5.1 文件管理命令](#5.1 文件管理命令)
[5.2 行号相关命令](#5.2 行号相关命令)
[5.3 查找与替换命令](#5.3 查找与替换命令)
[5.3.1 查找命令](#5.3.1 查找命令)
[5.3.2 替换命令](#5.3.2 替换命令)
[5.4 多文件编辑命令](#5.4 多文件编辑命令)
[5.5 其他常用底行命令](#5.5 其他常用底行命令)
[六、Vim 操作总结](#六、Vim 操作总结)
[6.1 核心模式切换总结](#6.1 核心模式切换总结)
[6.2 常用命令分类总结](#6.2 常用命令分类总结)
[6.2.1 快速上手必备命令(入门必记)](#6.2.1 快速上手必备命令(入门必记))
[6.2.2 高效编辑常用命令(进阶必备)](#6.2.2 高效编辑常用命令(进阶必备))
[6.3 操作技巧总结](#6.3 操作技巧总结)
[6.4 常见问题与解决方案](#6.4 常见问题与解决方案)
[七、简单 Vim 配置](#七、简单 Vim 配置)
[7.1 配置文件位置](#7.1 配置文件位置)
[7.2 常用基础配置(必学)](#7.2 常用基础配置(必学))
[7.3 配置生效与目录创建](#7.3 配置生效与目录创建)
[7.4 配置效果验证](#7.4 配置效果验证)
[7.5 进阶配置(插件安装)](#7.5 进阶配置(插件安装))
[7.5.1 安装 Vim-Plug(插件管理器)](#7.5.1 安装 Vim-Plug(插件管理器))
[1. 下载 Vim-Plug(Linux/macOS 系统)](#1. 下载 Vim-Plug(Linux/macOS 系统))
[2. 验证安装](#2. 验证安装)
[3. Windows 系统安装](#3. Windows 系统安装)
[7.5.2 配置常用插件(基础必备)](#7.5.2 配置常用插件(基础必备))
[1. 插件配置模板(更新~/.vimrc)](#1. 插件配置模板(更新~/.vimrc))
[2. 安装插件(关键步骤)](#2. 安装插件(关键步骤))
[7.5.3 插件使用实战示例](#7.5.3 插件使用实战示例)
[1. NERDTree(文件管理器)](#1. NERDTree(文件管理器))
[2. 代码片段(ultisnips + vim-snippets)](#2. 代码片段(ultisnips + vim-snippets))
[3. 语法检查(ALE)](#3. 语法检查(ALE))
[4. 快速注释(vim-commentary)](#4. 快速注释(vim-commentary))
[7.5.4 插件管理(更新、卸载、查看)](#7.5.4 插件管理(更新、卸载、查看))
[7.5.5 注意事项](#7.5.5 注意事项)
前言
在 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 系统)
bash
sudo yum install -y vim
输出结果示例:
bash
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 系统)
bash
sudo apt install -y vim
输出结果示例:
bash
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 版本:
bash
vim --version
输出结果示例(部分):
bash
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 模式切换逻辑
三种核心模式的切换关系如下:
- 启动 Vim:默认进入命令模式。
- 命令模式 → 插入模式:按
i、a、o等插入命令。- 插入模式 → 命令模式:按
ESC键(无论当前输入到何种状态,按ESC均可快速返回)。- 命令模式 → 底行模式:按
:(冒号)。- 底行模式 → 命令模式:按
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命令可打开指定文件,若文件不存在则会创建该文件(退出时需手动保存才能生成文件)。
基本语法
bash
vim [文件名]
示例 1:打开已存在的文件
假设当前目录下有test.c文件,打开命令如下:
bash
vim test.c
执行后会进入 Vim 的命令模式,界面显示test.c的文件内容(若文件为空则显示空白界面),底部状态栏会显示文件名、行数、列数等信息。
示例 2:创建并打开新文件
打开不存在的hello.txt文件(退出时保存会生成该文件):
bash
vim hello.txt
执行后进入 Vim 命令模式,界面空白,底部状态栏显示**"hello.txt" [New File]**,表示当前是新文件。
示例 3:打开文件并跳转到指定行
若文件较大,可直接跳转到指定行,语法如下:
bash
vim +[行号] [文件名]
例如,打开test.c并跳转到第 10 行:
bash
vim +10 test.c
执行后进入命令模式,光标直接定位到第 10 行,底部状态栏显示**"test.c" 15L, 320C**(15L 表示 15 行,320C 表示 320 个字符)。
3.2 模式切换实战
3.2.1 命令模式 → 插入模式(三种常用方式)
在命令模式下,进入插入模式的常用命令有三种,适用场景不同:
- i:在光标当前位置插入文本(光标不动,新输入的字符插入到光标左侧)。
- a:在光标下一个位置插入文本(光标向右移动一位,新输入的字符插入到光标原来的位置右侧)。
- o:在光标所在行的下方插入新行,光标定位到新行的行首并进入插入模式。
- O(大写):在光标所在行的上方插入新行,光标定位到新行的行首并进入插入模式。
示例操作:
打开
hello.txt文件:vim hello.txt(命令模式)。按
i进入插入模式,底部状态栏显示-- INSERT --。输入文本:
Hello Vim!。按
ESC返回命令模式,底部-- INSERT --标识消失。按
o在当前行下方插入新行,进入插入模式,输入:This is my first Vim edit.。按
ESC返回命令模式。移动光标到第一行末尾(后续会讲解光标移动命令),按
a在光标后插入文本:I love Linux!。按
ESC返回命令模式,此时文本内容如下:Hello Vim! I love Linux!
This is my first Vim edit.
3.2.2 命令模式 → 底行模式
在命令模式下按:(冒号),光标会移动到屏幕底部,进入底行模式,此时可输入底行命令。
示例操作:
- 处于命令模式,按
:进入底行模式,底部显示:。 - 输入**
w(保存命令),按回车键执行,底部显示"hello.txt" [New File] 2L, 53C written**,表示文件保存成功,自动返回命令模式。
3.3 保存与退出文件
文件编辑完成后,需通过底行命令保存并退出,常用的保存退出命令如下:
| 命令 | 功能描述 | 适用场景 |
|---|---|---|
| :w | 保存当前文件(不退出) | 编辑过程中随时保存,防止内容丢失 |
| :q | 退出 Vim(文件已保存时) | 保存后退出 |
| :wq | 保存并退出 Vim | 编辑完成后保存退出 |
| :q! | 强制退出 Vim(不保存修改) | 编辑错误或无需保存时强制退出 |
| :w! | 强制保存文件 | 文件为只读时(需权限)强制保存 |
| :w [文件名] | 另存为指定文件 | 不想覆盖原文件时使用 |
示例 1:保存并退出
- 编辑完
hello.txt后,处于命令模式。 - 按
:进入底行模式,输入wq,按回车键。 - 退出 Vim,返回终端,当前目录下生成
hello.txt文件,查看文件内容:
bash
cat hello.txt
输出结果:
bash
Hello Vim! I love Linux!
This is my first Vim edit.
示例 2:强制退出(不保存)
- 打开
hello.txt:vim hello.txt。 - 按
i进入插入模式,输入无关文本:test force quit。 - 按
ESC返回命令模式。 - 按
:进入底行模式,输入q!,按回车键强制退出。 - 返回终端,查看文件内容:
bash
cat hello.txt
输出结果仍为原内容,新增的test force quit未被保存,说明q!命令成功放弃修改并退出。
示例 3:另存为新文件
- 打开
hello.txt:vim hello.txt。 - 按
:进入底行模式,输入w hello_backup.txt,按回车键。 - 底部显示**"hello_backup.txt" 2L, 53C written**,表示另存为成功,返回命令模式。
- 按
:输入q退出 Vim。 - 查看当前目录,新增
hello_backup.txt文件,内容与hello.txt一致:
bash
ls
cat hello_backup.txt
输出结果:
hello.txt hello_backup.txt
Hello Vim! I love Linux!
This is my first Vim edit.
3.4 放弃修改(撤销操作)
在编辑过程中,若误操作可通过命令模式的撤销命令恢复,常用撤销相关命令如下:
- u:撤销上一次操作(可多次按
u撤销多步操作)。 - Ctrl + r:恢复撤销操作(即 "反撤销",撤销
u命令的效果)。
示例操作:
-
打开
hello.txt:vim hello.txt。 -
按
i进入插入模式,在第三行输入This is a mistake.。 -
按
ESC返回命令模式,此时文本内容:Hello Vim! I love Linux!
This is my first Vim edit.
This is a mistake. -
按u撤销上一次插入操作,第三行的
This is a mistake.消失。 -
按Ctrl + r恢复撤销,第三行内容重新出现。
-
按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后):
Hello Vim! I love Linux! # 行1
This is my first Vim edit. # 行2
- 按
l5 次,光标移动到Vim!的!后。 - 按
$,光标跳至行 1 末尾(Linux!的!后)。 - 按
0,光标跳至行 1 行首(H前)。 - 按
j,光标下移到行 2 的行首。 - 按
^,若行 2 行首无空格,光标保持在行首;若有空格,跳至第一个非空格字符(T前)。 - 按
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后)
- 按
w:光标跳至Vim!的V前。 - 按
e:光标跳至Vim!的!后。 - 按
w:光标跳至I前。 - 按
b:光标跳回Vim!的V前。 - 按
W:光标跳至I前(与w效果一致,因!后是空格)。 - 按
e:光标跳至I后。 - 按
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 行:
- 按
Ctrl + f:屏幕翻到第 21-40 行,光标在第 21 行首。 - 按
Ctrl + b:屏幕返回第 1-20 行,光标在第 1 行首。 - 按
Ctrl + d:屏幕滚动到第 11-30 行,光标在第 11 行首。 - 按
H:光标跳至屏幕顶部行(第 1 行)首。 - 按
M:光标跳至屏幕中间行(第 10 行)首。 - 按
L:光标跳至屏幕底部行(第 20 行)首。
4.1.4 按文本全局移动
| 命令 | 功能描述 | 示例 |
|---|---|---|
| gg | 光标移动到文本的第一行首 | 无论当前在第几行,按gg跳至文首 |
| G(大写) | 光标移动到文本的最后一行首 | 按G跳至文尾 |
| [行号]G | 光标移动到指定行的行首 | 按50G跳至第 50 行首 |
| Ctrl + g | 显示当前光标位置信息(行号、列号、总行数) | 底部显示10,1-8 5%(第 10 行,第 1-8 列,占总文本 5%) |
示例操作:文本共 50 行,当前光标在第 20 行:
- 按
gg:光标跳至第 1 行首。 - 按
G:光标跳至第 50 行首。 - 按
30G:光标跳至第 30 行首。 - 按
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!
- 按
x:删除H后的e,文本变为Hllo Vim! I love Linux!。 - 按
3x:删除H后的llo,文本变为H Vim! I love Linux!。 - 按
X:删除H左侧无字符,无效果;移动光标到V后,按X删除V,文本变为H im! I love Linux!。 - 按
dd:删除当前行,文本仅剩第二行(若为单行则文本为空)。 - 重新打开文件,按
d$:删除光标到行尾,若光标在V前,文本变为Hello。
4.2.2 组合删除命令(配合光标移动)
Vim 的删除命令支持 "命令 + 范围" 的组合模式,即d + 光标移动命令,表示删除 "光标当前位置到光标移动后位置" 的文本。常用组合如下:
- d0:删除光标到行首(同
d^)。- d$:删除光标到行尾(同
D)。- dw:删除光标到下一个单词开头。
- de:删除光标到当前单词末尾。
- db:删除光标到上一个单词开头。
- dj:删除光标所在行及下一行(同
2dd)。- dk:删除光标所在行及上一行。
- dG:删除光标所在行到文本末尾的所有行。
- dgg:删除光标所在行到文本开头的所有行。
- d[行号]G:删除光标所在行到指定行的所有行。
示例操作:文本共 10 行,光标在第 3 行:
- 按
dG:删除第 3-10 行,仅剩第 1-2 行。 - 按
dgg:删除第 1-3 行(当前光标在第 3 行),仅剩第 4-10 行。 - 按
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复制光标行至文首 |
示例操作:文本内容:
Line 1: Hello Vim!
Line 2: This is a test.
Line 3: I love Linux.
光标在第 2 行首:
- 按
yy:复制第 2 行(Line 2: This is a test.)。 - 按
3yy:复制第 2-4 行(若只有 3 行则复制第 2-3 行)。 - 移动光标到第 1 行末尾,按
yw:复制Vim!。 - 按
y$:复制第 1 行光标后至行尾的Vim!(同yw效果)。
4.3.2 粘贴命令
| 命令 | 功能描述 | 示例 |
|---|---|---|
| p(小写) | 粘贴缓冲区内容到光标所在位置的下方 (行复制)或右侧(字符复制) | 复制行后按p,在光标行下方粘贴;复制字符后按p,在光标右侧粘贴 |
| P(大写) | 粘贴缓冲区内容到光标所在位置的上方 (行复制)或左侧(字符复制) | 复制行后按P,在光标行上方粘贴;复制字符后按P,在光标左侧粘贴 |
示例操作:延续上面的复制示例:
-
复制第 2 行(
yy)后,移动光标到第 3 行尾,按p:在第 3 行下方粘贴第 2 行内容,文本变为:Line 1: Hello Vim!
Line 2: This is a test.
Line 3: I love Linux.
Line 4: This is a test. -
移动光标到第 1 行的
Vim!后,按P:在Vim!左侧粘贴之前复制的Vim!,第 1 行变为Line 1: Hello Vim!Vim!。 -
复制第 1 行(
yy)后,移动光标到第 2 行首,按P:在第 2 行上方粘贴第 1 行内容,文本变为: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上)
- 按
r输入o:将i替换为o,文本变为Hello Vom! I love Linux!,仍处于命令模式。 - 按
R输入ersion:替换Vom!为Version,文本变为Hello Version I love Linux!,按ESC返回命令模式。 - 移动光标到
love的l上,按cw输入like:将love替换为like,文本变为Hello Version I like Linux!,自动进入插入模式,按ESC返回。 - 按
cc输入This is a replaced line.:替换当前行,文本变为This is a replaced line.。
4.5 撤销与恢复命令
| 命令 | 功能描述 | 示例 |
|---|---|---|
| u | 撤销上一次操作 | 误删字符后按u恢复 |
| #u | 撤销上#次操作 |
按3u撤销最近 3 步操作 |
| Ctrl + r | 恢复撤销的操作(反撤销) | 撤销后发现操作正确,按Ctrl + r恢复 |
| U(大写) | 撤销对当前行的所有修改 | 对某行多次修改后,按U恢复该行原始状态 |
示例操作:
- 打开文本:
Hello Vim!。 - 按
x删除V,文本变为Hello im!。 - 按
u:恢复V,文本变回Hello Vim!。 - 按
dd删除该行,文本为空。 - 按
u:恢复该行,文本变回Hello Vim!。 - 按
Ctrl + r:再次删除该行,文本为空。 - 按
u恢复该行,按i输入I love Vim!,文本变为Hello Vim! I love Vim!。 - 按
U:撤销对当前行的所有修改,文本变回Hello Vim!。
4.6 其他常用命令
| 命令 | 功能描述 | 示例 |
|---|---|---|
| J(大写) | 合并光标所在行与下一行(删除换行符) | 两行文本间按J合并为一行 |
| >> | 光标所在行向右缩进 1 个制表位 | 按>>缩进当前行 |
| << | 光标所在行向左缩进 1 个制表位 | 按<<取消当前行缩进 |
| #>> | 光标所在行及下方#-1行向右缩进 |
按3>>缩进当前行及下方 2 行 |
| #<< | 光标所在行及下方#-1行向左缩进 |
按2<<取消当前行及下方 1 行缩进 |
| .(点号) | 重复上一次操作 | 按x删除字符后,按.重复删除 |
| ~(波浪号) | 切换光标所在字符的大小写 | 光标在a上按~变为A,在B上按~变为b |
示例操作:文本内容:
Line 1: Hello Vim!
Line 2: This is line 2.
Line 3: Indent test.
- 光标在第 1 行尾,按
J:合并第 1-2 行,文本变为Line 1: Hello Vim!Line 2: This is line 2.。 - 移动光标到第 3 行,按
>>:第 3 行向右缩进 1 个制表位,文本变为Line 3: Indent test.。 - 按
<<:第 3 行向左缩进,恢复原样。 - 按
x删除test的t,文本变为Line 3: Inden test.。 - 按
.:重复删除操作,删除e,文本变为Line 3: Indn test.。 - 移动光标到
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 |
示例操作:
- 编辑
test.txt后,:w→ 保存文件,底部显示"test.txt" 3L, 60C written。 - 想另存为
test_backup.txt,:w test_backup.txt→ 底部显示"test_backup.txt" 3L, 60C written。 - 继续编辑后,
:x→ 保存并退出 Vim。 - 重新打开
test.txt,误删内容后,:e!→ 恢复原始内容。 - 打开
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 → 跳转到文首 |
示例操作:
-
打开
test.c文件,:set nu→ 显示行号,界面如下:1 #include <stdio.h>
2
3 int main()
4 {
5 printf("Hello Vim!\n");
6 return 0;
7 } -
输入
:10→ 若文件只有 7 行,光标跳至第 7 行(最后一行)。 -
输入
:$→ 跳至第 7 行。 -
输入
: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 → 临时隐藏高亮,下次查找仍高亮 |
示例操作:文本内容:
Hello Vim!
Vim is a powerful editor.
I love Vim and Linux.
- 输入
/Vim→ 向后查找 "Vim",光标跳至第一行的 "Vim"。 - 按
n→ 光标跳至第二行的 "Vim"。 - 按
n→ 光标跳至第三行的 "Vim"。 - 按
n→ 底部显示Pattern not found (press RETURN),无更多匹配项。 - 输入
?Linux→ 向前查找 "Linux",光标跳至第三行的 "Linux"。 - 按
N→ 向前查找下一个 "Linux",无匹配项,底部显示Pattern not found。 - 输入
:set ic→ 忽略大小写,输入/vim→ 匹配所有 "Vim"。 - 输入
:set hlsearch→ 高亮所有匹配的 "Vim"。 - 输入
:nohl→ 临时取消高亮。
5.3.2 替换命令
替换命令的基本语法:
bash
:[范围]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 行):
1. old text old
2. Old content
3. test old data
4. old old old
5. no match
-
光标在第 2 行,
:s/Old/New→ 替换第 2 行的第一个 "Old" 为 "New",第 2 行变为New content。 -
光标在第 4 行,
:s/old/new/g→ 替换第 4 行所有 "old" 为 "new",第 4 行变为new new new。
3. :%s/old/New/g → 全局替换所有 "old" 为 "New"(区分大小写),结果:
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",并提示确认:
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 → 关闭当前分屏 |
示例操作:
- 终端中打开多个文件:
vim a.txt b.txt c.txt。 - 底行输入
:args→ 底部显示a.txt b.txt c.txt,当前编辑 a.txt。 - 输入
:n→ 切换到 b.txt。 - 输入
:prev→ 切换回 a.txt。 - 输入
:sp c.txt→ 水平分屏打开 c.txt,上半屏为 a.txt,下半屏为 c.txt。 - 按
Ctrl + w + w→ 切换到下半屏(c.txt)。 - 输入
:vsp b.txt→ 垂直分屏打开 b.txt,下半屏左侧为 c.txt,右侧为 b.txt。 - 输入
:clo→ 关闭当前分屏(b.txt)。 - 输入
: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 → 转换文件编码 |
示例操作:
- 输入
:help dd→ 打开dd命令的帮助文档,按q退出帮助。 - 输入
:cd /tmp→ 切换 Vim 工作目录到 /tmp。 - 输入
:pwd→ 底部显示/tmp。 - 输入
:!date→ 执行终端date命令,显示当前时间,按回车键返回 Vim。 - 输入
: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 操作技巧总结
- 减少方向键使用:命令模式下
h/j/k/l移动光标,比方向键更高效(无需移动手位)。 - 善用组合命令:
d + 光标移动命令(如dw、d$)实现精准删除,y + 光标移动命令实现灵活复制。 - 批量操作优先用可视化模式:选择文本块后按
d删除、y复制、s替换,高效处理批量文本。 - 查找替换加确认:全局替换时加
c选项(如:%s/old/new/gc),避免误替换。 - 随时保存:编辑过程中按
:w定期保存,防止意外退出导致内容丢失。 - 利用帮助文档:遇到未知命令时,
:help 命令查看官方文档,快速掌握用法。
6.4 常见问题与解决方案
- 误按
Ctrl + s导致 Vim 卡死:按Ctrl + q解锁(终端流控制快捷键冲突)。 - 无法退出 Vim:确保处于命令模式,输入
:q(已保存)或:q!(强制退出)。 - 查找时不区分大小写:
:set ic开启忽略大小写,:set noic恢复。 - 替换后想要撤销:命令模式下按
u,撤销底行模式的替换操作。 - 中文乱码:
:set fileencoding=utf-8设置文件编码为 UTF-8。
七、简单 Vim 配置
Vim 支持通过配置文件自定义编辑环境,如设置行号、语法高亮、缩进规则等。配置文件分为系统级配置和用户级配置,用户级配置仅对当前用户生效,推荐优先使用用户级配置。
7.1 配置文件位置
- 系统级 配置文件:/etc/vimrc(对所有用户生效,修改需 root 权限)。
- 用户级 配置文件:~/.vimrc(当前用户主目录下,仅对当前用户生效,无则创建)。
7.2 常用基础配置(必学)
编辑用户级配置文件:
bash
vim ~/.vimrc
添加以下配置(每行一条配置,可根据需求调整):
bash
" 基础配置(双引号后为注释)
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 配置生效与目录创建
- 保存配置文件:编辑完
~/.vimrc后,:wq保存退出。 - 创建备份和撤销目录(配置中指定的目录):
bash
mkdir -p ~/.vim/backup ~/.vim/undo
生效配置:
- 重新打开 Vim,配置自动生效。
- 无需重启 Vim,在 Vim 中执行**:source ~/.vimrc**,配置立即生效。
7.4 配置效果验证
打开一个 C 语言文件test.c,验证配置效果:
bash
vim test.c
输入以下代码:
cpp
#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/):
bash
# 下载plug.vim到autoload目录(确保目录存在)
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
若因网络问题无法访问 GitHub,也可使用国内镜像源(如 Gitee):
bash
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://gitee.com/mirrors/vim-plug/raw/master/plug.vim
2. 验证安装
安装完成后,打开 Vim 并在底行模式输入以下命令:
bash
:PlugStatus
若安装成功,底部会显示PlugStatus: No plugins defined.(表示尚未配置插件),且无报错信息;若提示E492: Not an editor command: PlugStatus,则说明安装失败,需重新检查命令和网络。
3. Windows 系统安装
若在 Windows 系统(如 cmd、Git Bash)中使用 Vim,执行以下命令:
bash
# 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,在原有基础配置后添加以下内容:
bash
" ==================== 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,在底行模式执行以下命令安装插件:
bash
: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 时会自动打开。 - 操作示例 :
- 打开
test.c文件:vim test.c,左侧自动显示 NERDTree 目录树。 - 用方向键导航到
test.c文件,按Enter键打开文件。 - 按o键在当前窗口打开文件,按
i键水平分屏打开,按s键垂直分屏打开。 - 按R键刷新目录树(新增 / 删除文件后刷新),按
a键在当前目录新建文件。
- 打开
2. 代码片段(ultisnips + vim-snippets)
以 C 语言为例,快速生成main函数片段:
-
新建
test.c文件:vim test.c。 -
进入插入模式(按
i),输入main,按Tab键触发片段补全,自动生成以下代码:cppint main(int argc, char *argv[]) { /* code */ return 0; } -
光标默认在**/* code */处,输入代码后按Ctrl + j跳转到return 0;**行(片段占位符跳转)。
-
自定义片段:按Ctrl + n新建文件,输入mysnippet.snippets,添加自定义片段(如 C 语言循环片段):
cppfor (int ${1:i} = 0; ${1:i} < ${2:count}; ${1:i}++) { ${3:// code} }保存后,在 C 文件中输入
for并按Tab,即可触发自定义循环片段。
3. 语法检查(ALE)
以 C 语言的语法错误检查为例:
- 在
test.c中输入错误代码:int main() { printf("Hello"); }(缺少#include <stdio.h>)。 - 保存文件(:w),ALE 会自动检查并在左侧显示警告标识(⚠)。
- 将光标移动到printf处,底部状态栏会显示错误信息:warning: implicit declaration of function 'printf' is invalid in C99 [-Wimplicit-function-declaration]。
- 添加**#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 | 查看所有插件的安装状态 | 显示插件是否已安装、是否有更新、安装路径等 |
示例操作:
- 更新所有插件::PlugUpdate,执行后会显示更新进度,完成后底部提示更新结果。
- 卸载插件:在
~/.vimrc中删除对应插件的Plug语句(如删除Plug 'preservim/nerdtree'),执行**:PlugClean**,按y确认卸载,即可删除 NERDTree 插件。 - 查看插件状态::PlugStatus,底部显示所有插件的状态(如
[OK] nerdtree表示安装正常,[UPDATED] youcompleteme表示有更新)。
7.5.5 注意事项
- 依赖安装 :部分插件需系统依赖支持(如 YouCompleteMe 需
cmake、python3-dev,ALE 需clang-tidy/pylint),安装插件前需先通过yum或apt安装依赖,否则插件无法正常工作。 - 终端兼容性 :文件图标(vim-devicons)需终端支持Unicode图标(如 Alacritty、Kitty、Windows Terminal),若使用默认终端(如 CentOS 的 GNOME Terminal),可能无法显示图标,可注释
let g:NERDTreeDevIconsEnable=1关闭图标功能。 - 性能优化 :插件过多可能导致 Vim 启动变慢,可通过以下方式优化:
- 对非必需插件使用延迟加载(Vim-Plug 支持
Plug '插件名', { 'on': '命令' },仅在执行指定命令时加载插件)。 - 关闭插件的冗余功能(如 ALE 关闭实时检查,仅保存时检查)。
- 对非必需插件使用延迟加载(Vim-Plug 支持
- 配置备份 :
~/.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软件,熟练使用之后可以极大提高大家的工作效率。如果本期博客对大家有帮助的话,欢迎大家在评论区留言,也拜托大家点赞收藏一下,大家的支持就是我最大的动力!