4. Vim编辑器:Vim的三种模式、基本编辑操作、配置与插件管理

说到嵌入式Linux开发,Vim是绕不开的编辑器。我见过不少新手,一进终端看到Vim界面就懵了——想退出都不知道怎么退。其实Vim没那么可怕,它只是思维方式跟普通编辑器不太一样。

我个人习惯把Vim比作「三态开关」:普通模式、插入模式、可视模式。你只要搞懂这三个状态怎么切换,基本操作就通了。下面我们一个一个来看。

4.1 Vim的三种模式

Vim的核心设计理念就是「模式」。说白了,键盘在不同模式下干不同的事。普通模式下按字母是命令,插入模式下按字母才是输入文字。

模式 作用 进入方式 退出方式
普通模式 导航、复制、粘贴、删除等操作 启动Vim默认进入 按 Esc 从其他模式返回
插入模式 输入和编辑文本内容 按 i、a、o 等 按 Esc
可视模式 选中文本块,然后批量操作 按 v(字符)、V(行)、Ctrl+v(块) 按 Esc
小技巧: 如果你不确定当前在哪个模式,看左下角状态栏。显示 -- INSERT -- 就是插入模式,显示 -- VISUAL -- 就是可视模式,什么都不显示就是普通模式。

嗯,这里要注意:普通模式才是Vim的「家」。做完任何操作,我都习惯按一下 Esc 回到普通模式。这个习惯能帮你避免很多误操作。

4.2 基本编辑操作

基本操作我分成四类来讲:移动、编辑、保存退出、搜索替换。你把这四类练熟了,日常编辑就没问题了。

4.2.1 光标移动

在普通模式下,移动光标不用方向键,用 h j k l。为什么?因为手指不用离开键盘主区域,效率高很多。

  • h — 左移一个字符
  • j — 下移一行
  • k — 上移一行
  • l — 右移一个字符
  • w — 跳到下一个单词开头
  • b — 跳到上一个单词开头
  • 0 — 跳到行首
  • $ — 跳到行尾
  • gg — 跳到文件开头
  • G — 跳到文件末尾
  • :n — 跳到第n行(比如 :42 跳到第42行)

我的经验: 在嵌入式开发中,经常要查看内核日志或设备树文件,这些文件动辄几千行。用 gg 和 G 快速定位头尾,用 :n 跳转到报错行号,比鼠标滚轮快十倍。

4.2.2 编辑操作

编辑操作的核心是「组合」。Vim的命令可以组合使用,比如 d2w 表示「删除两个单词」。

  • i — 在光标前插入
  • a — 在光标后插入
  • o — 在下一行插入新行
  • dd — 删除当前行
  • yy — 复制当前行
  • p — 粘贴到光标下方
  • u — 撤销
  • Ctrl+r — 重做
  • x — 删除光标所在字符

举个例子:你想把第5行到第10行复制到文件末尾。怎么做?

:5,10y      // 复制第5到10行
G           // 跳到文件末尾
p           // 粘贴

我曾经在调试一个U-Boot启动脚本时,需要把一段配置重复粘贴到多个位置。用Vim的复制粘贴,配合 . 命令(重复上一次操作),几秒钟就搞定了。要是用鼠标复制粘贴,得来回切窗口,效率差远了。

4.2.3 保存与退出

这是新手最头疼的部分。记住这几个就够了:

命令 作用
:w 保存文件
:q 退出(未修改时)
:wq 保存并退出
:q! 强制退出,不保存
:x 保存并退出(同 :wq)
避坑指南: 我曾经在编辑一个内核配置文件时,不小心改了内容,想直接退出却按了 :q,结果Vim提示「No write since last change」。这时候别慌,用 :q! 强制退出就行。记住:! 在Vim里表示「强制执行」。

4.2.4 搜索与替换

搜索和替换在嵌入式开发中非常常用。比如你要在设备树文件里查找某个GPIO引脚配置:

  • /keyword — 向下搜索 keyword
  • ?keyword — 向上搜索 keyword
  • n — 跳转到下一个匹配
  • N — 跳转到上一个匹配
  • :%s/old/new/g — 全局替换 old 为 new
  • :s/old/new/g — 替换当前行所有匹配

举个例子,把文件里所有的 uart0 改成 uart1:

:%s/uart0/uart1/g

你想想看,如果文件有几百行,手动改得改到什么时候?一条命令就搞定了。

4.3 Vim配置

Vim的配置文件是 ~/.vimrc。每次启动Vim,它都会读取这个文件。我建议你从最简单的配置开始,慢慢加。

下面是我个人常用的基础配置:

" 显示行号
set number

" 语法高亮
syntax on

" 自动缩进
set autoindent
set smartindent

" Tab键宽度设为4个空格
set tabstop=4
set shiftwidth=4
set expandtab

" 搜索时忽略大小写
set ignorecase
set smartcase

" 显示匹配的括号
set showmatch

" 启用鼠标支持(在终端中)
set mouse=a

小提示: 配置文件的注释用 " 开头。每加一条配置,最好写一句注释说明它是干什么的。这样几个月后你回头看,还能想起来当初为什么加它。

把这些内容写入 ~/.vimrc,重启Vim就能生效。你也可以在Vim里执行 :source ~/.vimrc 立即生效,不用重启。

4.4 插件管理

Vim本身功能已经很强了,但加上插件,它能变成真正的IDE。我推荐用 vim-plug 来管理插件,它轻量、配置简单。

4.4.1 安装vim-plug

在终端执行:

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

4.4.2 配置插件

在 ~/.vimrc 里添加插件配置:

call plug#begin()

" 文件树浏览
Plug 'preservim/nerdtree'

" 状态栏美化
Plug 'vim-airline/vim-airline'

" 代码注释插件
Plug 'preservim/nerdcommenter'

" Git集成
Plug 'tpope/vim-fugitive'

call plug#end()

4.4.3 安装插件

保存 ~/.vimrc 后,在Vim里执行:

:PlugInstall

vim-plug 会自动下载并安装所有列出的插件。安装完成后重启Vim,就能看到效果了。

我的建议: 嵌入式开发中,我必装的插件是 NERDTree(文件浏览)和 vim-airline(状态栏)。前者让你在终端里像IDE一样浏览文件树,后者能清晰显示当前模式、文件名、行号等信息。别一上来就装几十个插件,先装两三个用顺手了再加。

4.5 Vim模式与操作流程总览

下面这张图总结了Vim的三种模式切换和核心操作流程,你可以把它当作速查表:

Vim 三种模式与核心操作流程 普通模式 导航 / 复制 / 删除 / 粘贴 插入模式 输入和编辑文本 可视模式 选中文本块批量操作 i / a / o Esc v / V / Ctrl+v Esc 核心操作速查 移动:h/j/k/l w/b 0/$ gg/G :n 编辑:dd yy p u/Ctrl+r x i/a/o 保存退出::w :q :wq :q! :x 搜索替换:/keyword ?keyword n/N :%s/old/new/g 配置:~/.vimrc | 插件管理:vim-plug | :PlugInstall

这张图把三种模式的关系和核心操作都串起来了。你刚开始用Vim时,可以把这张图打印出来贴在工位上。遇到不知道怎么操作的时候,扫一眼就明白了。

最后说一句:Vim的学习曲线确实陡,但一旦跨过那个坎,你会发现它真的快。我见过很多嵌入式工程师,从「被迫用Vim」到「离不开Vim」,这个过程通常只需要两周。别急,慢慢来。