vim 简单使用教程:四步进阶
Category(分类): Backend Status: 已读
原文:vim简单使用教程(博客园),内容译自《Learn Vim Progressively》,含陈皓(coolshell)注。 本文为整理版本,保留四级进阶结构与全部命令。
vim 的学习曲线相当大,如果一上来就看到一大堆命令分类,一定会失去兴趣。这篇教程的思路是:先幸存,再一点一点学习戏法。
学习 vim 的四个步骤:
- 存活
- 感觉良好
- 觉得更好、更强、更快
- 使用 VIM 的超能力
开始前的警告:
- 学习 vim 在开始时是痛苦的,需要时间,需要不断练习(就像学乐器一样);
- 不要期望 3 天内比别的编辑器更有效率——事实上你需要 2 周的苦练,而不是 3 天。
约定:Ctrl-λ 写作 <C-λ>;以 : 开始的命令需回车,如 :q 即 :q<enter>。
第一级:存活
- 安装 vim,启动;
- 什么也别干!先阅读——vim 启动后在 Normal 模式,按
i进入 Insert 模式即可输入文本(左下角显示--insert--),按ESC回到 Normal 模式。
让幸存的 5 个命令(练成下意识状态):
i→ Insert 模式,按ESC回到 Normal 模式x→ 删除当前光标所在的一个字符:wq→ 存盘 + 退出(:w存盘、:q退出)dd→ 删除当前行(并把删除的行存到剪贴板)p→ 粘贴剪贴板
推荐:
hjkl→ 强烈推荐用其移动光标(j就像下箭头),光标键也行:help <command>→ 显示相关命令的帮助
关键概念:一般编辑器里
Ctrl是功能键,按下后 C 就不再是 C;而在 vim 的 Normal 模式下,所有的键就是功能键。
第二级:感觉良好
(所有命令都在 Normal 模式使用;不确定在什么模式时狂按几次 ESC)
- 各种插入模式
a→ 在光标后插入o→ 在当前行后插入一个新行O→ 在当前行前插入一个新行cw→ 替换从光标所在位置到一个单词结尾的字符
- 简单的移动光标
0→ 到行头^→ 到本行第一个不是 blank 字符的位置$→ 到本行行尾g_→ 到本行最后一个不是 blank 字符的位置/pattern→ 搜索字符串(多个匹配按n到下一个)
- 拷贝/粘贴
P→ 粘贴(p在当前位置之后,P在之前)yy→ 拷贝当前行,相当于ddP
- Undo/Redo
u→ undo<C-r>→ redo
- 打开/保存/退出/切换文件
:e <path/to/file>→ 打开文件:w→ 存盘:saveas <path/to/file>→ 另存为:x、ZZ或:wq→ 保存并退出(:x仅在需要时保存):q!→ 退出不保存;:qa!→ 强行退出所有文件:bn/:bp→ 切换下一个/上一个编辑的文件
掌握到这里,你几乎可以干其它编辑器能干的所有事了。
第三级:更好、更强、更快
更好(重复)
.→(小数点)重复上一次命令N<command>→ 重复某个命令 N 次
示例:
2dd→ 删除 2 行3p→ 粘贴文本 3 次100idesu [ESC]→ 写下 100 个 "desu "(不是 100 个 desu 哦)3.→ 重复 3 次 "desu"(不是 300,vim 多聪明)
更强(光标移动)
NG→ 到第 N 行(也可用:N,如:137)gg→ 到第一行G→ 到最后一行- 按单词移动:
w→ 到下一个单词的开头;e→ 到下一个单词的结尾- 小写
w/e:单词由字母、数字、下划线组成(适合程序变量) - 大写
W/E:单词由 blank 字符分隔(适合程序语句)
最强光标移动(对程序员相当强大):
%→ 匹配括号移动,包括(、{、[(先把光标移到括号上)*/#→ 匹配光标所在单词,移动到下一个 / 上一个匹配
更快(命令连动)
很多命令可按 <start position><command><end position> 组合:
0y$→0先到行头,y开始拷贝,$拷贝到本行最后一个字符ye→ 从当前位置拷贝到本单词最后一个字符y2/foo→ 拷贝 2 个 "foo" 之间的字符串
可被连动的命令不止 y:d(删除)、v(可视化选择)、gU(变大写)、gu(变小写)等。
第四级:VIM 超能力
当前行上移动
fa→ 到下一个为 a 的字符处;3fa→ 当前行查找第三个出现的 at,→ 到逗号前的第一个字符F/T→ 与f/t一样,但方向相反dt"→ 删除所有内容直到遇到双引号"
区域选择 <action>a<object> / <action>i<object>
- action:
d(删除)、y(拷贝)、v(可视模式选择)等 - object:
w一个单词、W空格分隔的单词、s一个句子、p一个段落;或特别字符"、'、)、}、]
对字符串 (map (+) ("foo")),光标在第一个 o 上:
vi"→ 选择foova"→ 选择"foo"vi)→ 选择"foo"va)→ 选择("foo")v2i)→ 选择map (+) ("foo")v2a)→ 选择(map (+) ("foo"))
块操作 <C-v>
典型操作 0 <C-v> <C-d> I-- [ESC]:到行头 → 开始块操作 → 向下移动 → 插入 -- → 按 ESC 为每一行生效。
Windows 下的 vim 需用
<C-q>代替<C-v>(<C-v>是粘贴)。
自动提示 <C-n> / <C-p>
Insert 模式下输入一个词的开头,按 <C-p> 或 <C-n> 出现自动补齐。
宏录制 qa 操作序列 q、@a、@@
qa→ 把操作记录在寄存器a@a→ replay 录制的宏;@@→ replay 最新录制的宏
示例(一行只有 "1" 的文本):
qaYp<C-a>q:qa开始录制,Yp复制行,<C-a>增加 1,q停止录制@a→ 在 1 下面写下 2;@@→ 写下 3;100@@→ 创建新的 100 行,数据增加到 103
可视化选择后的操作
J→ 把所有行连接起来(变一行)</>→ 左右缩进=→ 自动缩进
在所有被选择的行后加东西:<C-v> 选中行 → $ 到行最后 → A 输入字符串 → 按 ESC。
分屏
:split/:vsplit→ 创建水平 / 垂直分屏<C-w><dir>→ dir 为hjkl或方向键,切换分屏<C-w>_(或<C-w>|)→ 最大化尺寸<C-w>+/<C-w>-→ 增加 / 减小尺寸
结语
走到这里,你已经是 vim 的 superstar 了。记住开头的警告:别指望 3 天速成,给自己 2 周。