1. 为什么需要掌握vi/vim
在终端环境下工作时,vi/vim几乎是每个开发者的必备技能。这个诞生于1976年的文本编辑器,至今仍是Linux系统的标配工具。我刚开始接触命令行时,面对这个没有图形界面的编辑器完全不知所措,直到掌握了它的核心操作逻辑才发现其精妙之处。
与常规编辑器不同,vi采用模式化设计:
- 普通模式(Normal mode):执行命令和导航
- 插入模式(Insert mode):实际输入文本
- 可视模式(Visual mode):选择文本块
- 命令行模式(Command-line mode):执行保存等操作
这种设计让双手无需离开键盘就能完成所有编辑工作。服务器维护、配置文件修改、日志查看等场景下,vi/vim往往是唯一可用的编辑器。下面我将从实际工作场景出发,分享最实用的操作技巧。
2. 基础导航与编辑
2.1 启动与模式切换
启动vim只需在终端输入:
bash复制vim 文件名
初次使用时最容易困惑的是模式切换:
- 按
i进入插入模式(左下角显示-- INSERT --) - 按
Esc返回普通模式 - 普通模式下按
:进入命令行模式
提示:如果不确定当前模式,连续按两次
Esc必定能回到普通模式
2.2 高效移动光标
普通模式下这些移动命令最常用:
code复制h 左移
j 下移
k 上移
l 右移
w 跳到下一个单词开头
b 跳到上一个单词开头
0 跳到行首
$ 跳到行尾
gg 跳到文件开头
G 跳到文件末尾
记忆技巧:h/j/k/l对应方向键左/下/上/右,w(word)和b(back)与单词相关,$类似正则表达式表示行尾。
2.3 文本编辑基础操作
普通模式下这些命令组合能完成大部分编辑:
code复制x 删除当前字符
dd 删除当前行
yy 复制当前行
p 粘贴
u 撤销
Ctrl+r 重做
实际案例:要删除第3-5行并粘贴到第10行后:
- 移动到第3行(输入
3G) - 输入
3dd删除3行 - 移动到第10行
- 按
p粘贴
3. 高效编辑技巧
3.1 搜索与替换
快速定位内容:
code复制/关键词 正向搜索
?关键词 反向搜索
n 跳转到下一个匹配
N 跳转到上一个匹配
全局替换语法(命令行模式):
vim复制:%s/旧文本/新文本/g
注意:不加
g只替换每行第一个匹配项。添加c参数可确认每个替换(:%s/旧/新/gc)
3.2 多文件编辑
同时打开多个文件:
bash复制vim 文件1 文件2
在vim内切换文件:
code复制:bn 下一个文件
:bp 上一个文件
:ls 查看文件列表
分屏操作(实用技巧):
code复制:sp 水平分割窗口
:vsp 垂直分割窗口
Ctrl+w w 切换窗口
3.3 宏录制
复杂重复操作可用宏自动化:
- 普通模式下按
q加寄存器名开始录制(如qa) - 执行系列操作
- 按
q结束录制 - 按
@a执行宏
案例:给每行添加引号
qa开始录制^i"Esc$i"Escj(行首插入",行尾插入",跳到下一行)q结束100@a执行100次
4. 实用配置与插件
4.1 基础配置
创建~/.vimrc文件添加常用设置:
vim复制set number " 显示行号
set tabstop=4 " Tab显示为4空格
set expandtab " 将Tab转为空格
syntax on " 语法高亮
set hlsearch " 高亮搜索结果
4.2 必备插件管理
推荐使用vim-plug管理插件:
- 安装vim-plug:
bash复制curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
- 在.vimrc中添加插件:
vim复制call plug#begin('~/.vim/plugged')
Plug 'preservim/nerdtree' " 文件树
Plug 'vim-airline/vim-airline' " 状态栏美化
Plug 'tpope/vim-commentary' " 快速注释
call plug#end()
- 重启vim执行
:PlugInstall
4.3 工作流优化
我的日常开发配置:
vim复制" 快速保存
nnoremap <C-s> :w<CR>
" 快速退出
nnoremap <C-q> :q<CR>
" NERDTree快捷键
map <C-n> :NERDTreeToggle<CR>
" 自动补全括号
inoremap ( ()<Left>
inoremap [ []<Left>
5. 常见问题解决
5.1 恢复交换文件
异常退出时vim会生成.swp文件,重新打开时会出现恢复提示:
code复制E325: ATTENTION
Found a swap file...
选择:
- (R)ecover:从交换文件恢复
- (D)elete:删除交换文件
- (Q)uit:退出
- (A)bort:中止
5.2 编码问题处理
遇到乱码时可尝试:
vim复制:set fileencoding=utf-8
:set fileformat=unix
查看当前编码:
vim复制:set fileencoding?
5.3 性能优化技巧
当文件过大导致卡顿时:
vim复制:syntax off " 关闭语法高亮
:set nocursorline " 关闭光标行高亮
:set lazyredraw " 延迟重绘
6. 进阶学习路径
掌握基础后建议逐步学习:
- 正则表达式在vim中的应用
- vim脚本编写自定义功能
- 与tmux等终端工具配合使用
- 特定语言的vim插件(如vim-go)
我个人的练习方法是:
- 每天用vim完成所有文本编辑
- 遇到重复操作时思考如何用宏或命令优化
- 定期整理.vimrc中的配置
刚开始可能会觉得操作繁琐,但坚持两周后就会发现效率质的飞跃。现在即使在有GUI的环境下,我仍习惯用vim进行代码编写,因为它的编辑效率确实无可替代。