当前位置: 首页 > news >正文

Vim 使用从入门到精通

Vim 从入门到精通:一份终极配置指南

欢迎来到 Vim 的世界!Vim 是一款高度可配置的文本编辑器,以其强大的功能和极高的效率而闻名。Vim 的精髓在于“个性化定制”,通过修改其配置文件 .vimrc,你可以将它打造成完全符合自己习惯的编程利器。

这份基础重构版指南是迄今为止最完整的一版。我们补充了 Vim 最核心的模式概念和内置快捷键,并将其与所有高级配置技巧整合,形成了一套从零到精通的完整学习路径。

目录

  1. 基础入门:你的 vimrc 文件
  2. Vim 的核心:模式 (Modes) [核心补充]
  3. 高效操作的基石:Vim 内置快捷键 [核心补充]
    • 移动 (Movement)
    • 编辑 (Editing)
    • 搜索 (Searching)
    • 可视模式 (Visual Mode)
  4. 核心参数配置 (:set 命令)
    • 如何查询一个设置的值?(解惑 :set ts?)
    • 界面显示
    • 编辑与格式化
    • 搜索行为
    • 文件与备份
    • 窗口与缓冲区
    • 命令行与补全
  5. 键盘快捷键映射 (Key Mapping) [小白详解]
  6. 深入理解 Vim 的剪贴板:寄存器 (Registers)
  7. 命令行模式:文件操作高级技巧
  8. Vim 中的正则表达式 (Regular Expressions)
  9. 插件管理 (Plugin Management)
  10. 高级技巧:自动命令 (Autocmd) [小白详解]
  11. 继续探索:推荐学习资源

一、基础入门:你的 vimrc 文件

Vim 的所有配置都存储在一个名为 vimrc 的纯文本文件中。当你启动 Vim 时,它会自动加载并执行这个文件里的命令。

  • 位置:
    • Linux / macOS: ~/.vimrc
    • Windows: $HOME/_vimrc$VIM/_vimrc
  • 如何编辑: 直接用 Vim 打开它即可!vim ~/.vimrc
  • 注释: 在 vimrc 文件中,以双引号 " 开头的行为注释行,不会被执行。

二、Vim 的核心:模式 (Modes)

要理解 Vim,首先必须理解模式。与其他编辑器不同,Vim 不会让你一打开就直接打字。它将文本编辑命令执行分离开来,置于不同的模式下。

为什么要有模式? 这种设计让你在不使用鼠标的情况下,仅用键盘就能完成光标移动、复制、删除、替换等所有操作,极大地提升了效率。

以下是 Vim 最主要的几种模式:

模式名称主要功能如何进入如何退出
普通模式 (Normal Mode)命令中心。用于移动光标、删除文本、复制粘贴等。这是 Vim 的默认模式。打开 Vim 即是;从任何其他模式按 <Esc>-
插入模式 (Insert Mode)输入文本。就像普通的文本编辑器一样,你按下的键会直接显示在屏幕上。从普通模式按 i, a, o, I, A, O<Esc> 返回普通模式
可视模式 (Visual Mode)选择文本。用于高亮选中文本块,以便对其进行复制、删除等操作。从普通模式按 v (字符), V (行), <C-v> (块)<Esc> 返回普通模式
命令行模式 (Command-Line Mode)执行命令。用于输入以 : 开头的 “Ex” 命令,如保存、退出、替换。从普通模式按 :<Esc> 或执行完命令自动返回
替换模式 (Replace Mode)替换文本。输入会覆盖光标下的已有文本,而不是插入。从普通模式按 R<Esc> 返回普通模式

初学者的关键:时刻清楚自己处于哪种模式。如果不确定,多按几下 Esc,这总能让你安全地返回到普通模式


三、高效操作的基石:Vim 内置快捷键

在掌握了模式之后,你就可以学习 Vim 强大的内置快捷键了。这些快捷键绝大多数都在普通模式下使用。

移动 (Movement)

按键功能描述
h, j, k, l左、下、上、右 (Vim 移动的基础,请练习使用它们代替方向键)
w移动到下一个单词 (word) 的开头
b回退 (backward) 到上一个单词的开头
e移动到当前单词的结尾 (end)
0移动到当前行的绝对行首 (第 0 列)
^移动到当前行第一个非空白字符
$移动到当前行的行尾
gg移动到文件的第一行
G移动到文件的最后一行
:{n}{n}G移动到第 n 行 (例如, 10G 跳转到第 10 行)
H, M, L移动到屏幕的顶部 (High)中部 (Middle)底部 (Low)
Ctrl + d向下滚动半页 (Down)
Ctrl + u向上滚动半页 (Up)
Ctrl + f向下滚动一页 (Forward)
Ctrl + b向上滚动一页 (Backward)
%在配对的括号 (), [], {} 之间跳转

编辑 (Editing)

Vim 的编辑操作遵循 [操作符][范围] 的语法,极具组合性。

按键功能描述组合示例
i在光标进入插入 (Insert) 模式
a在光标进入插入 (Append) 模式
o在当前行下方新建一行并进入插入模式
O在当前行上方新建一行并进入插入模式
I在当前行第一个非空白字符处进入插入模式
A在当前行行尾进入插入模式
d删除 (Delete) 操作符dw (删除一个单词), d$ (删除到行尾), dgg (删除到文件头)
dd删除当前整行
c修改 (Change) 操作符 (删除后立即进入插入模式)cw (修改一个单词), c$ (修改到行尾)
cc修改当前整行
y复制 (Yank) 操作符yw (复制一个单词), y$ (复制到行尾)
yy复制当前整行
p在光标后粘贴 (Put)
P在光标前粘贴
x删除光标下的单个字符
r{char}替换 (Replace) 光标下的单个字符为 {char}ra (将当前字符替换为 ‘a’)
u撤销 (Undo) 上一步操作
Ctrl + r重做 (Redo)
.重复上一次的修改命令 (极其强大!)
>>将当前行增加缩进
<<将当前行减少缩进

搜索 (Searching)

按键功能描述
/{pattern}向下搜索 {pattern}
?{pattern}向上搜索 {pattern}
n跳转到下一个 (next) 搜索结果
N跳转到上一个搜索结果
*向下搜索光标当前所在的单词
#向上搜索光标当前所在的单词

可视模式 (Visual Mode)

进入可视模式后,你可以移动光标来扩大选区,然后对选中的文本执行命令。

按键功能描述
v进入字符可视模式
V进入行可视模式
Ctrl + v进入块可视模式 (可以选择矩形文本块)
在选中后…
d or x删除选中部分
y复制选中部分
c修改选中部分
>增加选中部分的缩进
<减少选中部分的缩进

四、核心参数配置 (:set 命令)

(…该章节所有内容与 V3.0 一致,此处完整保留…)

这是 vimrc 中最常见的部分,使用 :set 命令可以控制 Vim 的各种行为和外观。

如何查询一个设置的值?(解惑 :set ts?)

在 Vim 的命令行模式下,在任何 set 选项后面加上一个问号 ?,就可以查询该选项当前的值。

所以,:set ts? sw? et? 并不是一个单一的命令。它实际上是三个独立命令的简写,Vim 允许你将它们写在一行来执行:

  1. :set ts? (等同于 :set tabstop?):查询 tabstop 的值。
  2. :set sw? (等同于 :set shiftwidth?):查询 shiftwidth 的值。
  3. :set et? (等同于 :set expandtab?):查询 expandtab 的值。

界面显示

设置项默认值功能描述示例
number (nu)nonumber显示行号。set number
relativenumber (rnu)norelativenumber显示相对行号,便于快速跳转。set relativenumber
cursorline (cul)nocursorline高亮显示当前光标所在的行。set cursorline
wrapwrap自动换行,长行会折叠到下一行显示。set nowrap
linebreak (lbr)nolinebreak在单词边界处进行换行,避免单词被截断。set linebreak
showmatch (sm)noshowmatch短暂高亮显示匹配的括号。set showmatch
laststatus (ls)1控制状态栏的显示。0:不显示, 1:仅双窗口显示, 2:总是显示。set laststatus=2
ruler (ru)noruler在状态栏右下角显示光标的行号和列号。set ruler
showcmd (sc)noshowcmd (Vim), showcmd (Neovim)在状态栏右下角显示未完成的命令。set showcmd
scrolloff (so)0光标上下保留的最小行数,保持上下文可见。set scrolloff=8
sidescrolloff0光标左右保留的最小列数。set sidescrolloff=5
termguicolorsnotermguicolors启用 24 位真彩色支持(需要终端支持)。set termguicolors
syntax依赖系统启用语法高亮。syntax on
colorscheme (colors)依赖系统设置颜色主题。colorscheme desert

编辑与格式化

设置项默认值功能描述示例
tabstop (ts)8一个 Tab 字符显示的宽度(空格数)。set tabstop=4
shiftwidth (sw)8自动缩进和 >>/<< 命令使用的宽度。set shiftwidth=4
expandtab (et)noexpandtab将 Tab 键转换为空格。set expandtab
autoindent (ai)noautoindent新行自动继承上一行的缩进。set autoindent
smartindent (si)nosmartindent开启更智能的 C 语言风格缩进。set smartindent
cindentnocindent开启更严格、可配置的 C 语言风格缩进。set cindent
undofilenoundofile开启持久化撤销,关闭 Vim 后历史记录不丢失。set undofile
undodir依赖系统持久化撤销文件的存放目录。set undodir=~/.vim/undodir
pastenopaste进入粘贴模式,避免粘贴代码时格式错乱。set paste
mouse"" (空)启用鼠标支持。a:所有模式, n:普通模式, i:插入模式。set mouse=a
clipboard"" (空)与系统剪贴板集成。unnamed, unnamedplusset clipboard=unnamedplus

搜索行为

设置项默认值功能描述示例
hlsearch (hls)nohlsearch高亮显示所有搜索匹配结果。set hlsearch
incsearch (is)noincsearch在输入搜索词时,实时显示匹配结果。set incsearch
ignorecase (ic)noignorecase搜索时忽略大小写。set ignorecase
smartcase (scs)nosmartcase如果搜索词包含大写字母,则不忽略大小写。set smartcase

文件与备份

设置项默认值功能描述示例
backupnobackup保存文件时创建备份文件(通常带 ~ 后缀)。set nobackup
writebackupwritebackup保存时先创建备份,成功写入后再删除备份(安全选项)。set nowritebackup
swapfileswapfile为编辑中的文件创建交换文件(用于恢复)。set noswapfile
encodinglatin1utf-8Vim 内部使用的字符编码。强烈建议 utf-8set encoding=utf-8
fileencoding (fenc)"" (空)当前文件写入磁盘时使用的编码。set fileencoding=utf-8
fileformats (ffs)unix,dosVim 识别的换行符格式。unix (\n), dos (\r\n)。set fileformats=unix,dos,mac

窗口与缓冲区

设置项默认值功能描述示例
splitright (spr)nosplitright创建垂直分屏时,新窗口出现在右侧。set splitright
splitbelow (sb)splitbelow创建水平分屏时,新窗口出现在下方。set splitbelow
hiddennohidden允许在未保存缓冲区的情况下切换到其他缓冲区。set hidden
switchbuf""控制切换缓冲区时的行为,例如在当前窗口打开。set switchbuf=useopen

命令行与补全

设置项默认值功能描述示例
wildmenunowildmenu启用一个可视化的命令行补全菜单。set wildmenu
wildmodefull定义命令行补全的行为。longest,list 是一个不错的选择。set wildmode=longest:full,full
history50 (Vim), 10000 (Neovim)命令历史记录的条数。set history=1000
confirmnoconfirm当操作可能导致信息丢失时(如退出未保存文件),弹出对话框确认。set confirm

五、键盘快捷键映射 (Key Mapping) [小白详解]

这是本篇指南的核心增强部分。我们将彻底讲清楚快捷键映射的每一个细节。

核心概念:为什么用 noremap

Vim 有两套映射命令:map 系列和 noremap 系列。

  • map递归映射。如果你把 A 映射到 B,又把 B 映射到 C,那么按下 A 会触发 C。这很容易导致意想不到的后果。
  • noremap非递归映射。如果你把 A 映射到 B,即使 B 被映射到 C,按下 A 只会触发 B。

结论:永远使用 noremap 系列命令,除非你非常清楚地知道你需要递归映射。 这能避免 99% 的快捷键冲突问题。

  • nnoremap: Normal 模式
  • inoremap: Insert 模式
  • vnoremap: Visual 模式
  • cnoremap: Command 模式

语法精讲:拆解一个快捷键命令

让我们用一个例子来彻底搞懂语法:nnoremap <leader>w :w<CR>

  • nnoremap:我们刚才讲过,代表“在 Normal 普通模式下,创建一个非递归的映射”。
  • <leader>w:这是触发键。它由两部分组成:
    • <leader>: 前导键。这是一个特殊的、可自定义的“占位符”。你可以把它想象成一个快捷键的“启动按钮”。默认是反斜杠 \,但它不好按,所以几乎所有人都会修改它。最常见的设置是空格键
      " 在你的 vimrc 文件顶部添加这句
      let mapleader = " "
      
      设置后,<leader> 就代表空格键了。
    • w:紧跟在前导键后面的普通按键。
    • 所以,<leader>w 在上面的设置下,就代表先按一下空格键,再按一下 w 键
  • :w<CR>:这是要执行的操作。它也由两部分组成:
    • :w: 这是 Vim 的命令行命令,意思是“保存文件”。
    • <CR>: 这是一个特殊的按键表示法,代表 Carriage Return,也就是键盘上的回车键 (Enter)
  • 总结nnoremap <leader>w :w<CR> 这整句话的意思是:“请帮我在普通模式下创建一个快捷键,当我依次按下空格w后,Vim 要自动帮我输入 :w 并敲下回车,从而实现保存文件的功能。”

关键表格:Vim 中的按键表示法

为了定义快捷键,你需要知道如何在 vimrc 中表示键盘上的那些特殊按键。

真实按键 (Keyboard Key)Vim 表示法 (Vim Notation)示例描述
Control (Ctrl)<C-...><C-s>按住 Ctrl 再按 s
Alt (或 Option on Mac)<A-...><M-...><A-j>按住 Alt 再按 j
Shift<S-...><S-Up>按住 Shift 再按上箭头
回车 (Enter / Return)<CR>:w<CR>用于执行命令
Esc<Esc>inoremap jj <Esc>从插入模式返回普通模式
空格 (Space)<Space>nnoremap <Space> :noh<CR><leader> 通常被设为空格
Tab<Tab>nnoremap <Tab> %% 是跳转到匹配括号
上/下/左/右箭头<Up>, <Down>, <Left>, <Right>nnoremap <C-k> <Up>不推荐用箭头,但可以映射
功能键 F1-F12<F1>, <F2>nnoremap <F5> :!python %<CR>执行当前 Python 脚本
Leader 键<leader><leader>w你自定义的前导键

常见误区:"+y 不是组合键!

初学者经常被 vnoremap <leader>y "+y 这样的命令搞糊涂。

  • <leader>y:这是触发键(比如空格+y)。
  • "+y:这不是按键!" 是 Vim 中指定寄存器的命令。
    • +:代表系统剪贴板寄存器
    • y:代表 yank (复制) 命令。
  • 所以 "+y 的意思是:“执行复制操作,并将结果发送到系统剪贴板”。

这行命令的完整翻译是:“在可视模式下,当我选中一些文本后,按下空格+y,Vim 会将选中的文本复制到我的电脑系统剪贴板里,这样我就可以粘贴到浏览器等其他软件中了。”

同理,y$ 的意思是:执行 y (复制) 命令,作用范围是到 $ (行尾)。

保姆级教程:创建你的第一个快捷键

目标:我们想在普通模式下,按 Ctrl + s 快速保存文件。

  • Step 1: 确定需求 (Define the Goal)

    • 我不想每次都输入 :w 然后回车来保存文件,太慢了。我想要一个像其他编辑器一样的 Ctrl + s 保存快捷键。
  • Step 2: 找到对应的 Vim 命令 (Find the Vim Command)

    • 保存文件的命令是 :w。为了让它执行,后面需要跟一个回车 <CR>。所以,我们需要执行的操作是 :w<CR>
  • Step 3: 选择触发按键 (Choose the Trigger Keys)

    • 我们选择了 Ctrl + s。根据上面的表格,它在 Vim 中的表示法是 <C-s>
  • Step 4: 选择正确的映射命令 (Select the Right Mapping Command)

    • 我们希望这个快捷键在普通模式 (Normal Mode) 下生效,并且为了安全,使用非递归版本。所以命令是 nnoremap
  • Step 5: 组合成最终命令 (Assemble the Final Command)

    • 将各部分组合起来:nnoremap <C-s> :w<CR>
  • Step 6: 添加到 vimrc 并使其生效 (Add to vimrc and Apply)

    1. 用 Vim 打开你的配置文件: vim ~/.vimrc
    2. 在文件的任意位置(推荐是快捷键映射区域)添加这一行:
      " My custom shortcuts
      nnoremap <C-s> :w<CR>
      
    3. 保存并退出 (:wq)。
    4. 关键一步:让配置生效。你有两个选择:
      • A) 重启 Vim:关闭所有 Vim 窗口再重新打开。
      • B) 重新加载配置 (推荐):在 Vim 中执行命令 :so % (so 是 source 的缩写, % 代表当前文件)。
  • Step 7: 测试 (Test)

    1. 打开任意一个文件: vim test.txt
    2. 进入插入模式(按 i),随便输入一些文字。
    3. 返回普通模式(按 Esc)。
    4. 现在,按下 Ctrl + s
    5. 如果你在左下角看到类似 "test.txt" written 的消息,恭喜你,快捷键配置成功!

六、深入理解 Vim 的剪贴板:寄存器 (Registers)

什么是寄存器?

你可以把寄存器想象成 Vim 内置的、拥有多个不同“隔间”的剪贴板。你平时在 Windows/Mac 里用的 Ctrl+C / Cmd+C 只是一个单一的剪贴板,新的内容会覆盖旧的。而 Vim 提供了大量寄存器,让你能同时保存和取用多份不同的文本。

  • 如何使用:在执行复制(y)、删除(d)、粘贴(p)等操作之前,先输入 " (双引号) 和一个寄存器的名字。

表格一:Vim 的常用寄存器

寄存器名称符号功能描述示例
无名寄存器"默认寄存器。y, d, p 如果不指定,就用它。yy (复制当前行到无名寄存器)
系统剪贴板+最常用! 与操作系统的剪贴板互通。"+yy (复制当前行到系统剪贴板)
主选择区 (X11)*在 Linux/Unix 系统中,通常指鼠标中键粘贴的内容。"*p (粘贴来自鼠标中键选择的内容)
编号寄存器0 to 9自动保存你最近的复制和删除历史。"0p (粘贴上次复制的内容)
0 保存最近一次复制 (y) 的内容。"1p (粘贴上次删除的内容)
1-9 保存最近 9 次删除 (d) 的内容,"1 是最新的。
具名寄存器a to z用户自定义寄存器,可以随意使用。"ayy (复制当前行到 ‘a’ 寄存器)
A to Z追加内容到对应的小写具名寄存器。"Adw (删除一个单词并追加到 ‘a’ 寄存器)
黑洞寄存器_任何送到这里的内容都会被丢弃,不影响任何其他寄存器。"_dd (删除当前行,但不保存到任何地方)
只读寄存器.上次插入的文本。
%当前文件名。
#轮换文件名。
:上次执行的 Ex 命令。

表格二:使用寄存器的命令

命令格式操作详细说明
"{register}y{motion}复制到…"+yiw:复制 (y) 当前光标下的单词 (iw) 到系统剪贴板 (+)。
"{register}d{motion}删除到…"_d$:删除 (d) 从光标到行尾 ($) 的内容,并丢弃 (_)。
"{register}p从…粘贴"ap:在光标后粘贴 (p) 来自 ‘a’ 寄存器 (a) 的内容。
"{register}P从…粘贴(之前)"aP:在光标前粘贴 (P) 来自 ‘a’ 寄存器 (a) 的内容。
let @{register} = "..."设置寄存器内容let @a = "hello":直接将字符串 “hello” 存入 ‘a’ 寄存器。
:reg {registers}查看寄存器内容:reg a0+:显示 ‘a’, ‘0’, 和 ‘+’ 寄存器里当前的内容。

实战总结:

  • 复制到系统剪贴板,方便粘贴到其他程序?用 "+y
  • 从其他程序粘贴到 Vim?用 "+p
  • 想安全地删除一些内容,又不想覆盖你刚复制的东西?用 "_d
  • 交换两段文字?先把第一段 d (它会进入 " 寄存器),再选中第二段 p (会用第一段替换),此时第二段文字被存入了 " 寄存器,到第一段原来的位置 p 即可。

七、命令行模式:文件操作高级技巧

命令功能描述示例
:e <path>编辑一个新文件。:e index.html
:sp <path>水平分割窗口打开文件。:sp styles.css
:vs <path>垂直分割窗口打开文件。:vs script.js
:%s/old/new/g在整个文件中查找并替换。%表示所有行。:%s/foo/bar/g
:/pattern搜索指定的模式。:/function
:ls列出所有打开的缓冲区(buffer)。:ls
:b <number/name>切换到指定的缓冲区。:b 2:b index
:help <topic>打开 Vim 的内置帮助文档。:help :w
:! <command>执行外部 shell 命令。:!ls -la
:saveas {filename}另存为并切换:saveas new_feature.js
:'<,'>w {filename}(可视模式下) 将选中部分写入到 {filename}:'<,'>w selected_code.py
:%w >> {filename}将所有行追加{filename} 的末尾。:%w >> log.txt
:e!重新加载当前文件,放弃所有未保存的修改。:e!
:r {filename}读取 {filename} 的内容,并插入到光标下方。:r header.html
:r! {command}执行 shell 命令,并将其输出插入到光标下方。:r! date
:w将当前缓冲区的内容写入到关联的文件。:w
:w!强制写入 (例如,当文件是只读时)。需要权限。:w!
:q退出当前窗口。如果文件有未保存修改则会失败。:q
:q!强制退出,丢弃所有未保存的修改。:q!
:wq:x保存并退出:x 更智能,仅在有修改时才写入。:wq
:w {filename}另存为。将缓冲区内容写入到 {filename},但 Vim 仍关联原文件。:w backup.txt
:saveas {filename}另存为并切换。将文件存为 {filename},并让当前缓冲区关联这个新文件。:saveas new_feature.js
:%w {filename}所有行写入到 {filename} (会覆盖)。:%w all_content.txt
:10,20w {filename}仅将第 10 到 20 行写入到 {filename}:10,20w snippet.txt
:'<,'>w {filename}(在可视模式下选择后) 将选中部分写入到 {filename}:'<,'>w selected_code.py
:%w >> {filename}将所有行追加{filename} 的末尾。:%w >> log.txt
:e {filename}编辑一个新文件。:e index.html
:e!重新加载当前文件,放弃所有未保存的修改。:e!
:r {filename}读取 {filename} 的内容,并插入到光标下方。:r header.html
:r! {command}执行 shell 命令 {command},并将其输出插入到光标下方。:r! date (插入当前日期)

这些是在普通模式下按 : 后输入的命令,用于文件操作、编辑、窗口管理等。


八、Vim 中的正则表达式 (Regular Expressions)

正则表达式是 Vim 搜索和替换功能的基石。

  • 搜索: 在普通模式下按 / 然后输入正则表达式。
  • 替换: 使用 :s 命令,格式为 :[range]s/pattern/replacement/[flags]

Vim 正则元字符

元字符描述示例(在搜索中)
.匹配任意单个字符。/h.t 匹配 “hat”, “hot” 等。
*匹配前一个原子零次或多次。/ab*c 匹配 “ac”, “abc”, “abbc”。
\+匹配前一个原子一次或多次 (需要转义)。/ab\+c 匹配 “abc”, “abbc”。
\?匹配前一个原子零次或一次 (需要转义)。/ab\?c 匹配 “ac”, “abc”。
^匹配行首。/^start
$匹配行尾。/end$
[]匹配方括号内的任意一个字符。/[abc] 匹配 “a” 或 “b” 或 “c”。
\d匹配数字 [0-9]/\d\+ 匹配一个或多个数字。
\w匹配单词字符 [a-zA-Z0-9_]/\w\+ 匹配一个单词。
\s匹配空白字符(空格,Tab)。/\s\+ 匹配一个或多个空白。
\(\)捕获分组 (需要转义)。/\(foo\)\(bar\)
|或操作符 (需要转义)。/foo|bar

“Very Magic” 模式: 为了避免频繁地转义 +, ?, |, () 等字符,你可以在模式前加上 \v,这会让语法更接近标准的 ERE (Extended Regular Expression)。


九、插件管理 (Plugin Management)

现代 Vim 用户几乎都会使用插件管理器,vim-plug 是一个非常流行且易于使用的选择。

  1. 安装 vim-plug (详见 vim-plug 官网)。
  2. 配置 vimrc:
    call plug#begin('~/.vim/plugged')
    " 在此列出你的插件
    Plug 'preservim/nerdtree'
    Plug 'junegunn/fzf.vim'
    call plug#end()
    
  3. 安装插件: 保存 vimrc 后,在 Vim 中运行命令 :PlugInstall

十、高级技巧:自动命令 (Autocmd) [小白详解]

autocmd 能在特定事件 (Event) 发生时,自动执行指定的命令 (Command)。这让 Vim 变得非常“智能”。

保姆级教程:实现文件类型专属配置

目标:我们希望 Vim 能自动识别文件类型,并应用不同的缩进规则。

  • 当编辑 Python 文件 (.py) 时,我们希望一个 Tab 等于 4 个空格

  • 当编辑 JavaScript 文件 (.js) 时,我们希望一个 Tab 等于 2 个空格

  • Step 1: 确定需求 (Define the Goal)

    • 为不同编程语言设置不同的、符合社区规范的缩进风格。
  • Step 2: 找到对应的 Vim 命令 (Find the Vim Commands)

    • 我们需要设置三个参数:
      • tabstop (ts): Tab 字符显示宽度。
      • shiftwidth (sw): 自动缩进宽度。
      • expandtab (et): 将 Tab 转换为空格。
    • 为了不影响其他文件,我们使用 setlocal 而不是 setsetlocal 只对当前文件生效。
    • Python 配置命令: setlocal tabstop=4 shiftwidth=4 expandtab
    • JavaScript 配置命令: setlocal tabstop=2 shiftwidth=2 expandtab
  • Step 3: 确定触发事件 (Determine the Trigger Event)

    • 我们希望在 Vim 识别出文件类型之后执行这些命令。这个事件叫做 FileType
  • Step 4: 组合成 autocmd 命令 (Assemble the autocmd Command)

    • autocmd FileType <文件类型> <要执行的命令>
    • Python 的自动命令: autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtab
    • JavaScript 的自动命令: autocmd FileType javascript setlocal tabstop=2 shiftwidth=2 expandtab
  • Step 5: 使用 augroup 规范化管理 (Organize with augroup)

    • 如果你不把 autocmd 包裹在 augroup 里,每次你重新加载 vimrc (:so %),它都会重复添加一次自动命令,导致一个事件触发多次。augroup 可以解决这个问题。
    • 语法结构:
      augroup MyAutoCmds  " 创建一个组,名字随意autocmd!          " 关键!清除这个组里所有旧的命令" 在这里放入你所有的 autocmd 命令autocmd FileType python setlocal tabstop=4 shiftwidth=4 expandtabautocmd FileType javascript setlocal tabstop=2 shiftwidth=2 expandtab
      augroup END         " 结束组定义
      
  • Step 6: 添加到 vimrc 并测试 (Add to vimrc and Test)

    1. 打开 ~/.vimrc
    2. 将上面完整的 augroup 代码块粘贴进去。
    3. 保存并重新加载配置 (:so %)。
    4. 测试 Python:
      • 在 Vim 中打开一个 Python 文件: :e test.py
      • 查看缩进设置,输入命令 :set ts? sw? et?
      • Vim 应该会显示 tabstop=4, shiftwidth=4, expandtab
    5. 测试 JavaScript:
      • 在同一个 Vim 实例中,打开一个 JS 文件: :e test.js
      • 再次查看缩进设置: :set ts? sw? et?
      • Vim 现在应该显示 tabstop=2, shiftwidth=2, expandtab
    6. 如果结果符合预期,说明你的自动命令配置成功了!Vim 现在会为你自动切换缩进风格。

十一、继续探索:推荐学习资源

  1. vimtutor - 内置交互式教程

    • 如何使用:在终端里输入 vimtutor 命令。
    • 为什么推荐:学习 Vim 的第一站,通过实际操作教学。
  2. :help - Vim 的内置圣经

    • 如何使用:在 Vim 中输入 :help <你想查询的命令>
    • 为什么推荐:最准确、最全面的官方文档。
  3. Vim Cheat Sheet (速查表)

    • 网址:https://vim.rtorr.com/
    • 为什么推荐:设计精美、可交互的速查网站。
  4. Vim Fandom (formerly Vim Wiki)

    • 网址:https://vim.fandom.com/wiki/Vim_Tips_Wiki
    • 为什么推荐:巨大的 Vim 技巧知识库。
  5. Awesome Neovim/Vim (GitHub)

    • 网址:https://github.com/rockerBOO/awesome-neovim
    • 为什么推荐:精心整理的插件、颜色主题和资源列表。
  6. r/vim (Reddit 社区)

    • 网址:https://www.reddit.com/r/vim/
    • 为什么推荐:活跃的英文 Vim 社区,适合提问与交流。

结语

Vim 的学习曲线可能很陡峭,但它带来的回报是巨大的。这份增强版指南希望能为你扫清学习道路上最大的几个障碍,让你真正体会到定制 Vim 的乐趣和强大。

最好的学习方法就是不断地实践、探索和调整。从基础开始,逐步添加,慢慢地,你就会打造出一个专属于你的、无可替代的编辑器。祝你编码愉快!

http://www.dtcms.com/a/390770.html

相关文章:

  • 快速实现 Excel 表格转 SVG:Java 教程
  • [极客大挑战 2019]LoveSQL
  • Excel和WPS表格中选中全部空单元格并输入相同内容
  • 日志易制造业安全UEBA解决方案
  • Java 将 HTML 转换为 Excel:实用指南
  • MySQL索引篇---数据结构的选择
  • 【STM32 CubeMX + Keil】 中断、NVIC 、EXTI
  • BIGO一面面试总结
  • Ansible-fetch模块
  • DevExpress WPF中文教程:DataGrid - 服务器数据和大型数据源
  • Vue项目不同页面显示不同的title
  • NW820NW825美光固态闪存NW829NW832
  • aosp13/14/15/16如何实现窗口局部区域高斯模糊毛玻璃效果及Winscope原生重大bug发现
  • Java微服务架构设计模式精解
  • 设计模式面试之单例模式常问知识点
  • 深入解析 MySQL 元数据锁 (MDL) 与 SHOW PROCESSLIST 实战
  • 能不能写一个可以在linux使用的类nano编辑器
  • Rocky10 使用kubeadm部署K8s v1.34 一主两从
  • 深入理解Buffer:数据世界的“蓄水池“
  • 通义万相开源 Wan2.2-S2V-14B,实现图片+音频生成电影级数字人视频
  • windows c++环境 使用VScdoe配置opencv
  • JVM(四)-- 对象的实例化内存布局和直接内存
  • G1垃圾回收器的优势
  • 内存分配策略
  • Python采集Tik Tok视频详情,Tik TokAPI接口(json数据返回)
  • 实时通信技术大比拼:长轮询、短轮询、WebSocket 与 SSE 深度解析及实战指南
  • ICML 2025|图像如何与激光雷达对齐并互补?迈向协调的多模态3D全景分割
  • 基于Web的3D工程应用图形引擎——HOOPS Communicator技术解析
  • 【每日一问】运放的失调电压是什么?对于电路有何影响?
  • 【轨物方案】轨物科技新型储能管理系统:以AIoT技术驱动储能资产全生命周期价值最大化