一星期入门Vim
前言
都说使用了Vim后,编程体验倍感丝滑,无奈起步坡度确实有点陡,总让人望而却步。
我之前尝试过Vim两次以上,每次都都因为搞不清其各种模式、各种按键命令,而用起来总磕磕绊绊,每次坚持不超过一个下午就放弃。
但是每次逛一些技术社区,总看到各路大神不经意地说一句Vim,又总觉得如此强大之物,不去一番体验,实在遗憾,心里又痒痒。
结合当前的状况:
- 每个IDE的快捷键总是Ctrl、Alt、Shift加其他键组合,按键频率左右手分配不均,使用多了总感觉小拇指有些发通
- 无法离开鼠标,无法形成流畅的工作流,每次编码正起劲,但是要做点调整,双手不得不停下来,右手离开键盘,去握住鼠标,看着光标移动,最后点一下,深感到非常不适的割裂感
以下则是我觉得必须体验一番Vim的主要理由:
- 听说Vim本身编辑器非常灵活,各种强大功能都可以定制出来。
- 另外使用Vim插件+现代编辑器,可以使用Vim键盘流操作无缝切换到各种现在编辑器,不会Vim的,换一个编辑器就得重新记其快捷键,这样看来Vim虽然前期体验可能较为痛苦,但是学会了可能一劳永逸,综合起来,用来记住快捷键的时间应该是比非使用Vim的要少的
- Vim的键盘流不仅可以在编辑器上使用,基于其理念开发出的各种插件,还可以在浏览器、命令行等地方使用,大多数情况基本能抛弃鼠标,这对于钟爱键盘操作的我来说实在诱惑巨大
于是,我决定再一次出发,还好这次终于坚持下来了,记录一下本次经历。
首先我改用Google搜索学习资源,然后发现一些很好玩和有用的东西,比如有些网站把学习Vim做成一个游戏,让你在游戏中使用Vim的命令操作,这篇 博客 列举出学习Vim的一些好网站。
最后我选择 Vim Genius 这个网站作为学习阵地,它把Vim常用的几个命令分成几个关卡,让你一个个地去学,每学一个关卡后都让你用键盘按着要求输入所学的命令,每个命令都会重复几次,确保你能够记住,并且不能跳过和不能任意选择后面的关卡。
我的学习方法是这样的:
- 先使用Vim Genius学习一个关卡并完成关卡的练习,然后把学到的命令记录下来
- 边学边记录命令的一些规律,其实Vim的键位设置是有规律的,找出其中的规律,可以帮助我们快速记住,并且能举一反三。如大写表示对整行或者反方向操作,两个重复小写表示对整行操作等
- 不要急于求成,不要一天就刷完Vim Genius,我想如果不扎实地做上面的练习并且做记录,那刷新了估计也马上就忘了,因此我每天只刷两个关卡左右,每天早晚饭之后刷一次,这样总共7个关卡,用三四天就刷完了
- 刷完了Vim Genius以后就实战了,我使用
idea+ideavim插件
作为实战阵地,首先,开始用要求不要高,先学会了最基本的操作,能够会增删改查、复制粘贴就可以,不要把Vim看做拯救你的神,而是先把Vim当做一个普通的编辑器来使用 - 学会了基本的操作后,遇到还不顺手的地方再查相关的命令即可,慢慢地进步
使用以上方法,先在Vim Genius上刷三四天的基本命令,然后再咬着牙坚持实战三四天,一个星期结束,此时使用Vim,至少能够达到像用Windows记事本的效率了,算是基本入门了,后面再慢慢学高级特性就快多了。
回头再看看Vim已经不再是一座不知从哪开始的高山,而是平滑的坡里隐隐看到有一条小道可从中穿过
最后,奉上我记录的命令和总结的规律,有误的欢迎指出。
- 注:使用
-
号作为释义和命令的分隔符
规律
- 大写表示对整行或者反方向操作
- 两个重复小写表示对整行操作
- 数量放在命令单位前面完成批量操作:单独的每个命令可以完成的事,可以称为该命令的命令单位,如w的单位为一个单词,dd的单位为一行,则可以在命令前加数量,使之批量操作,如3w、2dd,d2w,其中d2w,数量2后面为w,则表示操作单位为w(单词),操作为d,因此表示删除2个单词
- 选择单词:从光标位置选择到单词末尾,并非从单词首字符开始选择
- ^表示行首字符,$表示行尾字符
- l表示向后(last),h表示向前(head)
- w表示保存(write)和单词(word)
- x表示关闭、剪切
- w表示保存、单词
- g表示跳转
- c表示更改
- p表示粘贴(paste)
- d表示剪切、删除(delete)
- r表示替换(replace)
- e表示编辑(edit)或末尾(end)
vim文档特殊按键标记(key-notation)
<CR>
:确定键<C-大小写字符>
:ctrl+对应字符
模式
- 回正常模式(Normal Mode)-Esc
- 入命令行模式(Command-Line Mode)-:
- 入替换模式(Replace Mode)-R,相当于普通编辑下按Insert键
- 入可视模式(Visual Mode)-v,打开此模式便于选择
- 入可视模式并选择光标下的单词-vw
- 入可视模式选择光标下的单词并删除-vwd或vwx
文件
- 闭文件-:q
- 闭文件但不保存-:q!
- 存文件-:w
- 闭文件并保存-:x或:wq或:ZZ
- 存文件为play.rb-:w play.rb
- 入文件hat.rb-:r hat.rb
输入
- 光标前输入-i
- 行首输入-I
- 光标后输入-a
- 行尾后输入-A
- 下方添加新行-o
- 上方添加新行-O
跳转
- 下左右-kjhl
- 到下一个单词的首字符-w
- 后跳到第3个单词前-3w
- 前跳到单词首字符-b
- 后跳到单词尾字符-e
- 后跳到第3个单词后-3e
- 到上一个单词尾字符-ge
- 到当前行的最后一个字符-$
- 到当前行的第一个字符-^
- 到行首-0
- 到第50行-50G或:50
- 到最后一行行首-G
- 到第一行行首-gg
- 到匹配的闭合括号-%
- 到上一次光标位置-ctrl+o
- 到下一次光标位置-ctrl+i
- 翻一屏(forward)-ctrl+f
- 翻一屏(back)-ctrl+b
- 翻半屏(down)-ctrl+d
- 翻半屏(up)-ctrl+u
- 下滚动(extra)-ctrl+e
- 上滚动-ctrl+y
- 当前光标位置垂直居中-zs
撤销重做
- 销-u
- 行撤销-U
- 做-ctrl+r
查找
- 下查找“waldo”-/waldo
- 上查找“carmen”-?carmen
- 到下一个查找结果-n
- 到上一个查找结果-N
- 置查找忽略大小写-:set ic或者:set ignorecase
- 置查找区分大小写-:set noic或者:set noignorecase
更改替换
- 改光标下的字符-r
- 改单词-cw,即删除从光标处到单词结尾并进入编辑模式
- 后更改3个单词-c3w
- 后更改3个字符-c3l或3s
- 前更改3个字符-c3h
- 改到行尾-C或c$
- 当前行用good替换bad-:%s/bad/good
- 整个文件用bye题号hi-:%s/hi/bye/g
- 整个文件用y替换x并出现更改提示-:%s/x/y/gc,会高亮所有可被替换的位置,并需要一个个选择是否确认替换
剪切
- 后剪切3个字符-3x或d3l
- 前剪切3个字符-3X或d3h
- 后剪切2个单词-d2w
- 视模式下剪切选中内容-d
- 切到行尾-D或d&
- 切整行-dd
- 切两行-2dd
复制粘贴
- 制单词-yw
- 入可视模式选择单词并复制-vwy
- 制整行-yy
- 制到行首-y0
- 制到行尾-y$
- 贴到光标后-p
- 贴到光标前-P
寄存器
- 用方式:"寄存器名+操作命令
- 看帮助-:help register
- 看所有寄存器内容-:reg
- 名(默认)寄存器-"",存放最近一次内容
- 字寄存器-"0"9,存放最近29次内容
- 名寄存器-"a~"z,可以通过名称选择把内容存入指定寄存器
- 择和拖拽(系统)寄存器-"*、"+、"~,连接系统粘贴板
- 制单词到a寄存器-"ayw
- 贴a寄存器的内容-"ap
- 贴系统粘贴板的内容-"+p
- 命令行模式粘贴默认寄存器的内容-ctrl+r+"
- 命令行模式粘贴系统粘贴板的内容-ctrl+r+*
代码
- 改、剪切、复制包围光标的配对字符之间的内容-ci+配对字符的前字符
- 改、剪切、复制包围光标的配对字符之间的内容(包括配对字符)-ca+配对字符的前字符
- 行向左、右缩进-3<<、3>>
- 图模式下向左、右缩进选中的行-<、>
其他
- 用shell运行命令ls-:!ls
- 开新文件sun.rb-:e sun.rb
- 看命令w帮助-:help w
- 常模型下反转光标下字符大小写-~
- 视模式下转换为大写-U,转换为小写-u
- 置光标上下至少有5行可见-:set scrolloff=5,可用于设置光标一直垂直居中