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

目录

前言

[一、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 模式切换逻辑

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

  1. 启动 Vim:默认进入命令模式。
  2. 命令模式 → 插入模式:按iao等插入命令。
  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命令可打开指定文件,若文件不存在则会创建该文件(退出时需手动保存才能生成文件)。

基本语法

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(大写):在光标所在行的上方插入新行,光标定位到新行的行首并进入插入模式。

示例操作

  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返回命令模式,此时文本内容如下:

    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文件,查看文件内容:
bash 复制代码
cat hello.txt

输出结果:

bash 复制代码
Hello Vim! I love Linux!
This is my first Vim edit.

示例 2:强制退出(不保存)

  1. 打开hello.txtvim hello.txt
  2. i进入插入模式,输入无关文本:test force quit
  3. ESC返回命令模式。
  4. :进入底行模式,输入q!,按回车键强制退出。
  5. 返回终端,查看文件内容:
bash 复制代码
cat hello.txt

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

示例 3:另存为新文件

  1. 打开hello.txtvim hello.txt
  2. :进入底行模式,输入w hello_backup.txt,按回车键。
  3. 底部显示**"hello_backup.txt" 2L, 53C written**,表示另存为成功,返回命令模式。
  4. :输入q退出 Vim。
  5. 查看当前目录,新增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命令的效果)。

示例操作

  1. 打开hello.txtvim hello.txt

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

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

    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跳至行首
$ 光标移动到当前行的行尾 光标在该行中间,按$跳至行尾
^ 光标移动到当前行的第一个非空白字符 行首有空格时,按^跳至第一个有效字符

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

复制代码
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 光标跳至下一个单词的开头 光标在HelloH后,按w跳至Vim!V
e 光标跳至当前单词或下一个单词的末尾 光标在HelloH后,按e跳至Helloo
b 光标跳至当前单词或上一个单词的开头 光标在Vim!V后,按b跳至HelloH
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:光标跳至lovel前。

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 删除光标所在位置到下一个单词开头的字符 光标在Helloe后,按dw删除o及后续空格
de 删除光标所在位置到当前单词末尾的字符 光标在Helloe后,按de删除o
db 删除光标所在位置到上一个单词开头的字符 光标在Vimi后,按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 复制光标所在位置到当前单词末尾的字符 光标在Helloe后,按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 行首:

  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 行内容,文本变为:

    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 行内容,文本变为:

    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 替换光标所在位置到当前单词末尾的字符(替换后进入插入模式) 光标在Helloe后,按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. 移动光标到lovel上,按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

示例操作:文本内容:

复制代码
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删除testt,文本变为Line 3: Inden test.
  5. .:重复删除操作,删除e,文本变为Line 3: Indn test.
  6. 移动光标到IndnI上,按~:变为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 → 显示行号,界面如下:

    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 → 临时隐藏高亮,下次查找仍高亮

示例操作:文本内容:

复制代码
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 替换命令

替换命令的基本语法:

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
  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"(区分大小写),结果:

复制代码
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 → 关闭当前分屏

示例操作

  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 + 光标移动命令(如dwd$)实现精准删除,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 常用基础配置(必学)

编辑用户级配置文件:

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 配置生效与目录创建

  1. 保存配置文件:编辑完~/.vimrc后,:wq保存退出。
  2. 创建备份和撤销目录(配置中指定的目录):
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;
}

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

  • 显示行号:每行前显示行号。
  • 语法高亮:关键字#includeintprintf等显示不同颜色。
  • 自动缩进: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 需要cmakepython3-dev,可通过sudo yum install cmake python3-develsudo 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函数片段:

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

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

    cpp 复制代码
    int main(int argc, char *argv[]) {
        /* code */
        return 0;
    }
  3. 光标默认在**/* code */处,输入代码后按Ctrl + j跳转到return 0;**行(片段占位符跳转)。

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

    cpp 复制代码
    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 需cmakepython3-dev,ALE 需clang-tidy/pylint),安装插件前需先通过yumapt安装依赖,否则插件无法正常工作。
  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软件,熟练使用之后可以极大提高大家的工作效率。如果本期博客对大家有帮助的话,欢迎大家在评论区留言,也拜托大家点赞收藏一下,大家的支持就是我最大的动力!

相关推荐
Maple_land1 小时前
第1篇:Linux工具复盘上篇:yum与vim
linux·运维·服务器·c++·centos
shizhan_cloud2 小时前
Linux 硬盘分区管理
linux·运维
蓁蓁啊2 小时前
Ubuntu 虚拟机文件传输到 Windows的一种好玩的办法
linux·运维·windows·单片机·ubuntu
忧郁的橙子.2 小时前
一、Rabbit MQ 初级
服务器·网络·数据库
liao__ran3 小时前
ClickHouse CPU 排查快速参考指南
运维·服务器·clickhouse
liao__ran3 小时前
ClickHouse CPU 排查详细指南
运维·clickhouse
9ilk3 小时前
【仿RabbitMQ的发布订阅式消息队列】 ---- 功能测试联调
linux·服务器·c++·分布式·学习·rabbitmq
G31135422733 小时前
深度学习中适合长期租用的高性价比便宜的GPU云服务器有哪些?
服务器·人工智能·深度学习
q***7483 小时前
在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)
linux·服务器·网络