JDWA 技术文档
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
首页
  • 数据库
  • 前端开发
  • 后端开发
  • 开发工具
  • 虚拟化技术
  • KVM显卡直通
  • FPGA仿真固件
  • 项目实战
  • 踩坑记录
  • 开发心得
  • 软件工具
  • 学习资料
  • 开发环境
更新日志
关于我
Gitee
GitHub
  • 数据库

    • 数据库教程
    • MySQL免安装版使用指南
    • MySQL性能优化实践
    • Redis入门与实践
    • MinIO快速部署指南
    • MinIO基础使用教程
  • 前端开发

    • 前端开发教程
    • Vue.js开发最佳实践
    • CSS常用技巧与解决方案
    • JavaScript实用技巧与编程模式
    • CSS Grid布局教程
  • 后端开发

    • 后端开发教程
    • Spring Boot实战指南
    • Node.js Express 框架开发实战指南
    • Python Flask 框架开发指南
  • 开发工具

    • 开发工具教程
    • Git 基础教程
    • Git工作流实践指南
    • VS Code 全面使用指南
    • VS Code必装插件推荐
    • Docker基础入门
    • IntelliJ IDEA 使用技巧
    • Eclipse配置与优化
    • Sublime Text 高级技巧
    • Vim 从入门到精通
    • Maven 详解
    • Gradle 入门与进阶
    • Webpack 配置指南
    • npm 与 yarn 使用技巧
    • Makefile 编写指南
    • Navicat 使用指南
    • MCP本地部署教程
  • 虚拟化技术

    • JDWA虚拟化技术专题
    • KVM虚拟机去虚拟化技术详解
  • KVM显卡直通

    • KVM显卡GPU直通教程
  • FPGA仿真固件

    • FPGA仿真固件开发指南
    • 基础-完整设备仿真定制固件开发指南
    • 中级-完整设备仿真定制固件开发指南
    • 高级-完整设备仿真定制固件开发指南

Vim 从入门到精通

Tips

本教程全面介绍Vim编辑器的使用方法,从基础命令到高级定制,适合初学者和有经验的用户。

1. Vim简介

Vim(Vi IMproved)是一款强大、高度可定制的文本编辑器,起源于Unix的Vi编辑器。它以其高效的键盘操作、模式化编辑方式和丰富的功能,成为程序员和系统管理员的重要工具。

1.1 为什么学习Vim

  • 效率:一旦掌握,编辑效率远超普通编辑器
  • 普遍性:几乎所有Unix/Linux系统都预装了Vi/Vim
  • 轻量:在远程服务器或嵌入式环境中表现优异
  • 可定制性:可以根据个人需求高度定制
  • 键盘驱动:最小化鼠标使用,提高效率
  • 长期投资:学习曲线陡峭,但回报丰厚

1.2 Vim与NeoVim

Vim:

  • 广泛使用的传统版本
  • 稳定,兼容性好
  • 几乎所有平台都可用

NeoVim:

  • Vim的现代化分支
  • 更好的默认设置和插件系统
  • 内置终端模拟器
  • 异步插件支持
  • Lua脚本支持

本教程内容适用于两者,特殊差异会特别说明。

2. 安装与基本配置

2.1 安装

Windows安装:

  • 下载安装程序:Vim官网
  • 或使用包管理器: winget install vim、choco install vim

macOS安装:

# 使用Homebrew
brew install vim
# 或安装MacVim (GUI版本)
brew install macvim

Linux安装:

# Ubuntu/Debian
sudo apt install vim

# CentOS/RHEL
sudo yum install vim

# Arch Linux
sudo pacman -S vim

NeoVim安装:

# Windows (使用Chocolatey)
choco install neovim

# macOS
brew install neovim

# Ubuntu/Debian
sudo apt install neovim

# CentOS/RHEL
sudo yum install neovim

2.2 基本配置文件

Vim使用配置文件来自定义行为:

  • Vim: ~/.vimrc (Unix/Linux) 或 _vimrc (Windows)
  • NeoVim: ~/.config/nvim/init.vim

最小化配置示例:

" 设置基本选项
set nocompatible              " 不兼容Vi
set number                    " 显示行号
set ruler                     " 显示光标位置
set incsearch                 " 增量搜索
set hlsearch                  " 高亮搜索结果
set ignorecase                " 搜索忽略大小写
set smartcase                 " 智能大小写搜索
set backspace=indent,eol,start " 允许退格键删除
set autoindent                " 自动缩进
set smartindent               " 智能缩进
set expandtab                 " 使用空格替代制表符
set tabstop=4                 " 制表符宽度
set shiftwidth=4              " 缩进宽度
set softtabstop=4             " 软制表符宽度
set encoding=utf-8            " UTF-8编码
set fileencoding=utf-8        " 文件UTF-8编码
syntax on                     " 开启语法高亮
filetype plugin indent on     " 根据文件类型自动加载插件和缩进规则

2.3 颜色主题

Vim支持多种颜色主题:

" 内置颜色主题
colorscheme desert      " 沙漠主题
" 其他内置选项: blue, darkblue, default, delek, desert, 
" elflord, evening, koehler, morning, murphy, pablo, 
" peachpuff, ron, shine, slate, torte, zellner

" 设置深色或浅色背景
set background=dark     " 或 light

3. Vim模式

Vim的一个核心概念是模式编辑。主要模式包括:

3.1 普通模式 (Normal Mode)

  • 默认模式,用于导航和操作文本
  • 按Esc键从任何模式返回普通模式

基本导航命令:

  • h: 左移
  • j: 下移
  • k: 上移
  • l: 右移
  • w: 下一个词头
  • e: 下一个词尾
  • b: 上一个词头
  • 0: 行首
  • $: 行尾
  • gg: 文件开头
  • G: 文件末尾
  • Ctrl+u: 上翻半页
  • Ctrl+d: 下翻半页

3.2 插入模式 (Insert Mode)

  • 用于插入和编辑文本
  • 从普通模式进入插入模式的方法:
    • i: 在光标位置前插入
    • I: 在行首插入
    • a: 在光标位置后插入
    • A: 在行尾插入
    • o: 在下方新行插入
    • O: 在上方新行插入

3.3 可视模式 (Visual Mode)

  • 用于选择文本块
  • 从普通模式进入可视模式的方法:
    • v: 字符可视模式
    • V: 行可视模式
    • Ctrl+v: 块可视模式

3.4 命令行模式 (Command Mode)

  • 用于执行命令
  • 从普通模式按:进入
  • 常用命令:
    • :w: 保存
    • :q: 退出
    • :wq 或 :x: 保存并退出
    • :q!: 强制退出不保存
    • :help: 查看帮助

4. 基本编辑操作

4.1 文本操作

在普通模式下:

  • x: 删除光标下字符
  • dd: 剪切(删除)当前行
  • yy: 复制当前行
  • p: 粘贴到光标后
  • P: 粘贴到光标前
  • u: 撤销
  • Ctrl+r: 重做
  • .: 重复上一个命令

4.2 操作符和动作

Vim的操作遵循"操作符+动作"模式:

  • 操作符:

    • d: 删除
    • y: 复制
    • c: 修改(删除并进入插入模式)
    • >: 增加缩进
    • <: 减少缩进
    • g~: 切换大小写
    • gu: 转为小写
    • gU: 转为大写
  • 动作:

    • w: 直到下个词头
    • e: 直到词尾
    • $: 直到行尾
    • 0: 直到行首
    • iw: 当前词
    • i(: 括号内内容
    • ip: 当前段落

示例:

  • dw: 删除到下个词头
  • ci": 修改双引号内的内容
  • yap: 复制整个段落
  • >i{: 增加大括号内内容的缩进

4.3 数字参数

Vim命令可以接受数字前缀来重复操作:

  • 5j: 向下移动5行
  • 3dd: 删除3行
  • 10x: 删除10个字符
  • 2yy: 复制2行

4.4 查找和替换

  • /pattern: 向前查找
  • ?pattern: 向后查找
  • n: 查找下一个
  • N: 查找上一个
  • *: 查找光标下的词

替换命令:

  • :%s/old/new/g: 替换全文
  • :10,20s/old/new/g: 替换10-20行
  • :%s/old/new/gc: 替换全文,但每次都询问

5. 高级编辑技巧

5.1 标记和跳转

  • ma: 设置标记a(可以是任何字母)
  • ```a`: 跳转到标记a的行和列
  • ``a`: 跳转到标记a的行
  • :marks: 显示所有标记

特殊标记:

  • ``.`: 上次修改位置
  • ``^`: 上次插入位置
  • ``[`: 上次修改或复制起点
  • ``]`: 上次修改或复制终点

5.2 文本对象

文本对象允许操作结构化文本:

语法: [操作符][i/a][对象]

  • i: 内部 (inside)
  • a: 周围 (around)

对象:

  • w: 词
  • s: 句子
  • p: 段落
  • ( 或 ): 括号
  • { 或 }: 大括号
  • [ 或 ]: 方括号
  • < 或 >: 尖括号
  • ", ', `: 各种引号
  • t: XML/HTML标签

示例:

  • di": 删除双引号内的内容
  • ya]: 复制方括号及其内容
  • cit: 修改标签内的内容

5.3 寄存器

Vim提供多个寄存器存储文本:

  • 无名寄存器: " (默认)
  • 命名寄存器: "a 到 "z
  • 系统剪贴板: "+ (X11)或"* (Windows/macOS)
  • 只读寄存器: ":, "., "%

示例:

  • "ayy: 复制当前行到寄存器a
  • "ap: 从寄存器a粘贴
  • "+y: 复制到系统剪贴板
  • "+p: 从系统剪贴板粘贴

5.4 宏

宏可以记录和回放一系列操作:

  • qa: 开始录制宏到寄存器a
  • q: 结束录制
  • @a: 执行寄存器a中的宏
  • @@: 重复上次执行的宏
  • 5@a: 执行宏a五次

示例用途:

  • 对多行进行相同的复杂编辑
  • 格式化数据
  • 生成重复但有变化的代码

6. 窗口和缓冲区管理

6.1 缓冲区

缓冲区是加载到内存中的文件:

  • :ls 或 :buffers: 列出所有缓冲区
  • :bn: 下一个缓冲区
  • :bp: 上一个缓冲区
  • :b [名称或编号]: 切换到特定缓冲区
  • :bd: 删除当前缓冲区

6.2 窗口分割

  • :split 或 :sp [文件名]: 水平分割
  • :vsplit 或 :vsp [文件名]: 垂直分割
  • Ctrl+w [h,j,k,l]: 在窗口间移动
  • Ctrl+w [H,J,K,L]: 移动窗口位置
  • Ctrl+w =: 使所有窗口等宽等高
  • Ctrl+w _: 最大化当前窗口高度
  • Ctrl+w |: 最大化当前窗口宽度
  • :close: 关闭当前窗口
  • :only: 仅保留当前窗口

6.3 标签页

  • :tabnew [文件名]: 新标签页
  • :tabc: 关闭当前标签页
  • :tabo: 仅保留当前标签页
  • gt: 下一个标签页
  • gT: 上一个标签页
  • {i}gt: 跳到第i个标签页

7. 文件和目录操作

7.1 文件浏览器

内置的netrw插件:

  • :Explore 或 :Ex: 在当前窗口打开
  • :Sexplore 或 :Sex: 在水平分割窗口打开
  • :Vexplore 或 :Vex: 在垂直分割窗口打开

操作:

  • Enter: 打开文件或目录
  • -: 返回上级目录
  • d: 创建目录
  • D: 删除文件/目录
  • R: 重命名文件/目录
  • s: 改变排序方式

7.2 文件操作

  • :e [文件名]: 编辑文件
  • :w [文件名]: 保存文件
  • :sav [文件名]: 另存为
  • :r [文件名]: 读取文件内容到当前位置
  • :!command: 执行shell命令
  • :r !command: 将命令输出插入文件

8. Vim配置进阶

8.1 Vimscript基础

Vimscript是Vim的脚本语言:

变量:

" 变量定义
let g:var_name = 'value'  " 全局变量
let s:var_name = 'value'  " 脚本作用域变量
let b:var_name = 'value'  " 当前缓冲区变量
let l:var_name = 'value'  " 函数局部变量

条件语句:

if condition
    " 执行代码
elseif another_condition
    " 执行代码
else
    " 执行代码
endif

循环:

for i in range(1, 5)
    echo i
endfor

while condition
    " 执行代码
endwhile

函数:

function! MyFunction(arg1, arg2)
    " 函数体
    return result
endfunction

8.2 映射

自定义键映射:

  • map: 所有模式
  • nmap: 普通模式
  • imap: 插入模式
  • vmap: 可视模式
  • cmap: 命令行模式

前缀nore表示非递归映射 (如nnoremap)。

示例:

" 将;映射为:
nnoremap ; :

" 定义快速保存
nnoremap <leader>w :w<CR>

" 快速编辑vimrc
nnoremap <leader>ev :vsplit $MYVIMRC<CR>
nnoremap <leader>sv :source $MYVIMRC<CR>

Leader键: 默认是\,可以自定义:

let mapleader = ","  " 设置,为leader键

8.3 自动命令

自动命令允许在特定事件发生时执行代码:

augroup MyGroup
    autocmd!  " 清除组内已有的自动命令
    autocmd FileType python setlocal expandtab shiftwidth=4 softtabstop=4
    autocmd BufWritePre *.py :%s/\s\+$//e  " 保存Python文件前删除行尾空格
augroup END

常用事件:

  • BufNewFile: 创建新文件
  • BufRead/BufReadPost: 读取文件后
  • BufWrite/BufWritePre: 写入文件前
  • FileType: 设置文件类型时
  • VimEnter: Vim启动后
  • CursorHold: 光标停留时

9. 插件管理与推荐

9.1 插件管理器

Vim-Plug (推荐):

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

" 配置:
call plug#begin('~/.vim/plugged')

" 插件列表
Plug 'tpope/vim-surround'
Plug 'preservim/nerdtree'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
Plug 'morhetz/gruvbox'

call plug#end()

" 安装插件: :PlugInstall
" 更新插件: :PlugUpdate
" 删除不再使用的插件: :PlugClean

9.2 必备插件

  1. 文件导航:

    • NERDTree: 文件浏览器
    • fzf.vim: 模糊查找器
    • ctrlp.vim: 文件查找器
  2. 代码补全:

    • YouCompleteMe: 强大的补全引擎
    • coc.nvim: 智能补全框架(NeoVim推荐)
    • vim-lsp: 语言服务器协议客户端
  3. 编辑增强:

    • vim-surround: 处理成对符号
    • vim-commentary: 注释代码
    • vim-repeat: 增强.重复命令
    • vim-multiple-cursors: 多光标编辑
  4. 美观与界面:

    • gruvbox: 颜色主题
    • vim-airline: 状态栏美化
    • indentLine: 缩进线
  5. Git集成:

    • vim-fugitive: Git包装器
    • vim-gitgutter: 显示git差异

9.3 语言特定插件

根据编程语言选择插件:

Python:

Plug 'python-mode/python-mode'  " Python开发环境
Plug 'vim-python/python-syntax' " 增强Python语法高亮

JavaScript/Web:

Plug 'pangloss/vim-javascript'  " JavaScript支持
Plug 'MaxMEllon/vim-jsx-pretty' " JSX支持
Plug 'leafgarland/typescript-vim' " TypeScript支持
Plug 'mattn/emmet-vim'          " HTML/CSS展开缩写

Go:

Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }

Rust:

Plug 'rust-lang/rust.vim'

10. 实用技巧与最佳实践

10.1 高效编辑技巧

  1. 快速移动:

    • 使用f{char}和t{char}快速移动到字符
    • 使用/{pattern}和?{pattern}搜索跳转
    • 使用%在匹配的括号间跳转
    • 使用H, M, L跳到屏幕顶部、中部、底部
  2. 快速编辑:

    • 使用ci(, ci", ci{等快速修改括号内内容
    • 使用.重复上次更改
    • 使用J合并行
    • 使用>>和<<进行缩进
  3. 批量操作:

    • 使用可视块模式Ctrl+v进行多行编辑
    • 使用:g/pattern/command对匹配行执行命令
    • 使用宏录制重复操作

10.2 Vim + Tmux工作流

Tmux和Vim的结合可以创建强大的终端工作环境:

基本Tmux命令:

  • tmux new -s name: 创建新会话
  • Ctrl+b d: 分离会话
  • tmux a -t name: 附加到会话
  • Ctrl+b c: 创建新窗口
  • Ctrl+b %: 垂直分割窗格
  • Ctrl+b ": 水平分割窗格

Vim与Tmux集成:

" 在.vimrc中添加
Plug 'christoomey/vim-tmux-navigator'

Tmux配置(.tmux.conf):

# 启用Vim复制模式
setw -g mode-keys vi

# 智能窗格导航与vim集成
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
    | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind-key -n C-h if-shell "$is_vim" "send-keys C-h"  "select-pane -L"
bind-key -n C-j if-shell "$is_vim" "send-keys C-j"  "select-pane -D"
bind-key -n C-k if-shell "$is_vim" "send-keys C-k"  "select-pane -U"
bind-key -n C-l if-shell "$is_vim" "send-keys C-l"  "select-pane -R"

10.3 常见问题解决

  1. 中文输入问题:

    " 在.vimrc中添加
    set ambiwidth=double
    
  2. 复制粘贴问题:

    " 避免粘贴时的自动缩进问题
    set pastetoggle=<F2>  " F2切换粘贴模式
    
  3. 键位映射冲突:

    • 使用verbose map <key>查看键位映射
    • 使用非递归映射(noremap)避免循环引用
  4. 性能优化:

    " 减少重绘和代码检查
    set lazyredraw
    set nocursorline
    set norelativenumber
    

11. Vim未来发展

11.1 NeoVim相比Vim的优势

  • 更好的默认设置
  • 异步任务支持
  • 内置终端
  • Lua脚本支持
  • 更现代的代码库
  • 对LSP的原生支持
  • 浮动窗口

11.2 VSCode中的Vim

VSCode中的Vim模式提供了现代IDE与Vim编辑效率的结合:

  • 安装"Vim"扩展
  • 在settings.json中配置Vim选项
  • 使用:!命令在终端中执行命令
  • 使用VSCode命令面板结合Vim命令

11.3 移动设备上的Vim

  • 在iOS上使用iVim
  • 在Android上使用Termux+Vim
  • 学习最基本的Vim命令以适应移动环境的限制

结语

掌握Vim是一项长期投资,初期可能感觉进度缓慢,但随着技能的提升,您将享受到前所未有的编辑效率。建议循序渐进学习,首先掌握基础导航和编辑命令,然后逐步增加高级功能的使用。

记住Vim学习的经典建议:"一次学习一个命令,每天实践"。祝您在Vim的世界中探索愉快!

Prev
Sublime Text 高级技巧
Next
Maven 详解