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 桌面环境的文本编辑器