vim 命令详解#

vim(Vi IMproved)是 Linux 系统中最强大、最流行的文本编辑器之一。它是 vi 编辑器的增强版本,提供了丰富的功能和高效的编辑能力。

入门#

基本概念#

vim 有多种工作模式:

  • 普通模式:默认模式,用于移动光标、删除、复制等操作
  • 插入模式:用于输入文本
  • 命令模式:用于执行保存、退出等命令
  • 可视模式:用于选择文本块

基本操作#

启动和退出#

# 打开文件
vim filename.txt

# 打开文件并跳转到指定行
vim +10 filename.txt

# 打开文件并跳转到第一个匹配的模式
vim +/pattern filename.txt

# 退出 vim(普通模式下)
:q          # 退出(未修改)
:q!         # 强制退出(不保存修改)
:wq         # 保存并退出
:x          # 保存并退出(同 :wq)

模式切换#

# 从普通模式进入插入模式
i           # 在光标前插入
I           # 在行首插入
a           # 在光标后插入
A           # 在行尾插入
o           # 在下方新建一行并插入
O           # 在上方新建一行并插入

# 从插入模式返回普通模式
Esc         # 返回普通模式

# 进入命令模式
:           # 进入命令模式

# 进入可视模式
v           # 字符可视模式
V           # 行可视模式
Ctrl+v      # 块可视模式

光标移动#

# 基本移动
h           # 左移
j           # 下移
k           # 上移
l           # 右移

# 词移动
w           # 移到下一个词首
b           # 移到上一个词首
e           # 移到当前词尾

# 行移动
0           # 移到行首
^           # 移到行首第一个非空字符
$           # 移到行尾

# 文件移动
gg          # 移到文件开头
G           # 移到文件结尾
:10         # 移到第10行

常用选项#

选项说明
+n打开文件后跳转到第 n 行
+/pattern打开文件后跳转到第一个匹配的模式
-b二进制模式
-R只读模式

中级#

编辑操作#

删除操作#

# 删除字符
x           # 删除光标所在字符
X           # 删除光标前一个字符

# 删除词
dw          # 删除从光标到下一个词首
d$          # 删除从光标到行尾
d0          # 删除从光标到行首

# 删除行
dd          # 删除当前行
5dd         # 删除5行(包括当前行)
dG          # 删除到文件结尾
dgg         # 删除到文件开头

复制和粘贴#

# 复制
yy          # 复制当前行
5yy         # 复制5行
yw          # 复制一个词
y$          # 复制到行尾

# 粘贴
p           # 在光标后粘贴
P           # 在光标前粘贴

撤销和重做#

u           # 撤销
Ctrl+r      # 重做
.           # 重复上一个操作

查找和替换#

# 查找
/pattern    # 向下查找 pattern
?pattern    # 向上查找 pattern
n           # 查找下一个
N           # 查找上一个

# 替换
:s/old/new/         # 替换当前行第一个匹配
:s/old/new/g        # 替换当前行所有匹配
:%s/old/new/g       # 替换整个文件所有匹配
:%s/old/new/gc      # 替换时需要确认
:10,20s/old/new/g   # 替换第10-20行

文件操作#

# 保存
:w          # 保存
:w filename  # 另存为
:w!         # 强制保存(只读文件需要权限)

# 打开新文件
:e filename # 打开新文件
:bn         # 下一个缓冲区
:bp         # 上一个缓冲区
:ls         # 列出所有缓冲区
:b n        # 切换到第n个缓冲区

高级#

高级编辑#

多行编辑#

# 块选择模式
Ctrl+v      # 进入块可视模式
# 选择文本块后:
I           # 在每行开头插入
A           # 在每行结尾插入
c           # 修改选中的块
r           # 用一个字符替换选中的块

# 批量操作示例
# 1. Ctrl+v 进入块可视模式
# 2. 选择多行
# 3. Shift+i 进入插入模式
# 4. 输入要插入的内容
# 5. Esc 等待应用

宏录制#

# 录制宏
qa          # 开始录制宏到寄存器a
# 执行一系列操作
q           # 停止录制

# 执行宏
@a          # 执行寄存器a中的宏
@@          # 重复上一个宏
10@a        # 执行10次

# 宏示例:在每行末尾添加分号
qa          # 开始录制
A           # 移到行尾
;           # 输入分号
Esc         # 返回普通模式
j           # 移到下一行
q           # 停止录制
# 然后用 @@ 或 100@ 应用到多行

寄存器操作#

# 查看寄存器
:reg        # 查看所有寄存器

# 使用寄存器
"ayy        # 复制到寄存器a
"ap         # 粘贴寄存器a的内容
"+y         # 复制到系统剪贴板
"+p         # 从系统剪贴板粘贴
"*y         # 复制到选择缓冲区
"*p         # 从选择缓冲区粘贴

分屏编辑#

# 分屏
:split      # 水平分屏
:vsplit     # 垂直分屏
:sp filename # 水平分屏打开文件
:vsp filename # 垂直分屏打开文件

# 分屏导航
Ctrl+w h    # 移到左边的窗口
Ctrl+w j    # 移到下边的窗口
Ctrl+w k    # 移到上边的窗口
Ctrl+w l    # 移到右边的窗口
Ctrl+w w    # 在窗口间循环

# 分屏操作
Ctrl+w =    # 使所有窗口大小相等
Ctrl+w +    # 增加当前窗口高度
Ctrl+w -    # 减少当前窗口高度
Ctrl+w >    # 增加当前窗口宽度
Ctrl+w <    # 减少当前窗口宽度
Ctrl+w q    # 关闭当前窗口

折叠#

# 折叠命令
zf          # 创建折叠
zo          # 打开折叠
zc          # 关闭折叠
za          # 切换折叠状态
zR          # 打开所有折叠
zM          # 关闭所有折叠

# 折叠方法
:set foldmethod=manual    # 手动折叠
:set foldmethod=indent   # 基于缩进折叠
:set foldmethod=syntax   # 基于语法折叠
:set foldmethod=marker   # 基于标记折叠

大师#

高级配置#

vimrc 配置#

# 基本配置
set number               # 显示行号
set relativenumber       # 显示相对行号
set tabstop=4            # tab 宽度
set shiftwidth=4         # 缩进宽度
set expandtab            # 用空格代替 tab
set autoindent           # 自动缩进
set smartindent          # 智能缩进
set cursorline           # 高亮当前行
set showmatch            # 显示匹配的括号
set incsearch            # 增量搜索
set hlsearch             # 高亮搜索结果
set ignorecase           # 忽略大小写
set smartcase            # 智能大小写
set wildmenu             # 命令行补全增强
set laststatus=2         # 始终显示状态栏
set encoding=utf-8       # 编码设置
set fileencoding=utf-8   # 文件编码

# 语法高亮
syntax on
filetype plugin indent on

# 颜色方案
colorscheme desert       # 设置颜色方案

插件管理#

# 使用 vim-plug 插件管理器
# 在 ~/.vimrc 中添加:

call plug#begin('~/.vim/plug')

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

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

" 语法检查
Plug 'dense-analysis/ale'

" 自动补全
Plug 'neoclide/coc.nvim'

" 括号自动配对
Plug 'jiangmiao/auto-pairs'

call plug#end()

# 安装插件
:PlugInstall

# 更新插件
:PlugUpdate

# 卸载插件
:PlugClean

高级搜索#

# 正则表达式搜索
/\<word\>           # 匹配完整单词
/^pattern           # 行首匹配
/pattern$           # 行尾匹配
/pattern\|pattern2  # 或操作
/pattern\&pattern2  # 与操作
/\vpattern          # very magic 模式(简化正则)

# 搜索特殊字符
/\.                 # 搜索点
/\\                 # 搜索反斜杠
/\$                 # 搜索美元符号

# 替换高级用法
:%s/\vfoo(bar)/baz\1/g    # 保留捕获组
:%s/\n/ /g                # 替换换行符
:%s/\s\+$//g              # 删除行尾空格

文本对象#

# 文本对象操作
ci"         # 修改引号内的内容
ca"         # 修改引号及内容
di"         # 删除引号内的内容
da"         # 删除引号及内容
yi"         # 复制引号内的内容
ya"         # 复制引号及内容

# 其他文本对象
ciw         # 修改当前词
caw         # 修改当前词及空格
ci(         # 修改括号内的内容
ci[         # 修改方括号内的内容
ci{         # 修改花括号内的内容
cit         # 修改标签内的内容

自动命令#

# 自动命令示例
autocmd BufRead,BufNewFile *.py setlocal tabstop=4 shiftwidth=4 expandtab
autocmd BufRead,BufNewFile *.js setlocal tabstop=2 shiftwidth=2 expandtab
autocmd BufWritePre *.py :%s/\s\+$//e  # 保存前删除行尾空格
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab

# 自动保存
autocmd CursorHold * update

# 自动切换目录
autocmd BufEnter * lcd %:p:h

无敌#

脚本编程#

Vim 脚本基础#

" 变量
let s:variable = "value"
let g:global_var = "global"
let l:local_var = "local"

" 函数
function! MyFunction()
    echo "Hello, World!"
endfunction

" 带参数的函数
function! MyFunctionWithArgs(arg1, arg2)
    echo a:arg1 . " " . a:arg2
endfunction

" 调用函数
call MyFunction()
call MyFunctionWithArgs("Hello", "World")

" 条件语句
if exists('g:my_var')
    echo "Variable exists"
elseif !empty(g:my_var)
    echo "Variable is not empty"
else
    echo "Variable is empty"
endif

" 循环
for i in range(1, 10)
    echo i
endfor

let i = 0
while i < 10
    echo i
    let i += 1
endwhile

自定义命令#

" 自定义命令
command! Hello echo "Hello, World!"

" 带参数的自定义命令
command! -nargs=1 SayHello echo "Hello, " . <args>

" 带范围的自定义命令
command! -range=% CountLines echo <line2> - <line1> + 1 . " lines"

" 使用示例
:Hello
:SayHello John
:10,20CountLines

高级技巧#

会话管理#

# 保存会话
:mksession session.vim

# 加载会话
:source session.vim

# 保存会话(覆盖)
:mks! session.vim

# 启动时加载会话
vim -S session.vim

标签页管理#

# 标签页操作
:tabnew filename    # 新建标签页
:tabclose           # 关闭当前标签页
:tabonly            # 关闭其他标签页
:tabn               # 下一个标签页
:tabp               # 上一个标签页
:tabfirst           # 第一个标签页
:tablast            # 最后一个标签页

# 快捷键
gt                  # 下一个标签页
gT                  # 上一个标签页
2gt                 # 切换到第2个标签页

差异比较#

# 水平分屏比较
vim -d file1.txt file2.txt

# 在 vim 中打开差异模式
:diffthis           # 当前窗口进入差异模式
:diffoff            # 关闭差异模式

# 差异操作
do                  # 获取差异(从其他窗口)
dp                  # 放置差异(到其他窗口
]c                  # 下一个差异
[c                  # 上一个差异
:diffupdate         # 更新差异

拼写检查#

# 启用拼写检查
:set spell

# 设置语言
:set spelllang=en_us
:set spelllang=zh_cn

# 拼写检查操作
]s                  # 下一个拼写错误
[s                  # 上一个拼写错误
z=                  # 查看拼写建议
zg                  # 添加到单词表
zw                  # 从单词表移除

性能优化#

# 性能相关设置
set lazyredraw           # 不在执行宏时重绘
set synmaxcol=200        # 只高亮前200列
set regexpengine=1       # 使用旧的正则引擎(更快)
set ttyfast              # 更快的终端连接
set updatetime=300        # 更快的更新时间

# 禁用不必要的功能
set noswapfile           # 不使用交换文件
set nobackup             # 不创建备份文件
set nowritebackup        # 不写入备份文件

调试和故障排除#

# 调试模式
:echo &option            # 查看选项值
:verbose set option?     # 查看选项详细信息
:scriptnames             # 列出所有加载的脚本
:messages                # 查看消息历史

# 性能分析
:profile start profile.log
:profile func *
:profile file *
" 执行一些操作
:profile pause
:q

# 查看映射
:map                     # 列出所有映射
:map <key>               # 查看特定键的映射
:verbose map <key>       # 查看映射详细信息

最佳实践#

1. 配置管理#

  • 将常用配置保存在 ~/.vimrc
  • 使用版本控制系统管理配置文件
  • 为不同项目创建特定的配置

2. 学习路径#

  • 先掌握基本模式和操作
  • 学习常用快捷键和命令
  • 逐步学习高级功能
  • 最后学习脚本编程

3. 工作效率#

  • 使用宏重复操作
  • 利用寄存器管理剪贴内容
  • 使用分屏同时编辑多个文件
  • 配置适合自己的快捷键

4. 插件选择#

  • 只安装必要的插件
  • 定期更新和清理插件
  • 学习插件的高级功能
  • 避免插件冲突

5. 性能考虑#

  • 避免加载过多的插件
  • 使用异步插件提高性能
  • 合理配置语法高亮
  • 在大文件中使用合适的设置

常见问题#

Q: 如何退出 vim?#

A: 按 Esc 进入普通模式,然后输入 :q 退出,:q! 强制退出,:wq 保存并退出。

Q: 如何撤销操作?#

A: 在普通模式下按 u 撤销,Ctrl+r 重做。

Q: 如何复制到系统剪贴板?#

A: 使用 "+y 复制,"+p 粘贴(需要 vim 支持 clipboard 功能)。

Q: 如何显示行号?#

A: 输入 :set number 显示行号,:set nonumber 隐藏行号。

Q: 如何替换文本?#

A: 使用 :%s/old/new/g 替换整个文件,:%s/old/new/gc 替换时需要确认。

相关命令#

  • vi - vim 的前身
  • nano - 简单易用的文本编辑器
  • emacs - 另一个强大的文本编辑器
  • gedit - GNOME 桌面环境的文本编辑器