作者dryman (dryman)
看板Editor
标题[vim ] 学习vim的心法与攻略
时间Thu Jan 21 14:52:25 2010
EDIT: 这里有个不错的连结可以当做初学参考
http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/
这篇文章是给刚开始接触vim的版友参考的
因为vim指令繁多,刚接触时会很难接受它的逻辑
好像要将许多字母的对应全部都记起来,才会发挥vim的威力(虽然这麽说也没错:p)
也看到很多新人会上网列印vim cheat sheat
可是记不清楚各式指令,最後还是把vim当作记事本使用...
因此呢,想分享一些能帮助学习vim的心法,还有帮助记忆指令的撇步
如果版友有更多锦囊密技,也请掏宝分享,让Editor版活络起来吧!
vim or vi like editor最大的特色,就是有多种模式 (mode)
这也是vi/vim被认为难学的理由之一
关於mode的设计,vgod大在blog上面有一篇深入讨论的文章:
http://blog.vgod.tw/2009/12/07/text-editing/
後来文字编辑器变得越来越复杂,快速键也大量增加,这时在有限的空间内
分配快速键的位置并且让使用者容易学习又不容易忘记就成了一件困难的事
。现代的一般编辑器,包括很多写程式用的IDE,大量使用各种混合Ctrl、
Shift、Alt的快速键,这种快速键设计哲学是把每一个功能对应到一组复合
键上。理所当然的,功能越多,快速键就越多越难记。
...
vi的这种设计避免了快速键的组合爆炸(想想看如果把各种组合都对应到一
个ctrl-alt快速键会有多少个..),并且让使用者能完全使用键盘来精确、
快速的编辑一个文件,一旦熟悉这种操作後,手都不用离开键盘,不管是写
程式或是写文章都有了一种人机合一的流畅感,心中想到哪里游标就能精确
移动到哪里,不管多复杂的文字操作都能快速解决,心中的爽快感其实是难
以用笔墨形容的。
vim本身有11种模式,限於篇幅就先锁定在normal and insert mode吧
一般进到vim时,会是在normal mode底下
大部分的复制、剪贴、滚动、移动游标、跳跃到书签、录制巨集
等"动作"都是在这个mode下完成的
要进入文字编辑模式,得按
i
切回normal mode可以用
esc或是
^-[(ctrl-[的意思)
在normal mode底下,我暂时先将最常用的指令分成三类
action: insert, yank, delete, paste... (惯例中我们将复制称作yank而非copy)
number: repeat action/motion
motion: cursor motion
其中最有特色的就是repeat number的部份
几乎所有的指令都可以用number来重复(除了insert mode中的指令)
从数字着手我觉得会更容易感受到vim 的"文法"
比如说:
5b 向左移动5个单字 (移动单位和移动指令是合并的)
5^f 滚动5页
6yy 复制6段 (变成复合句了)
d% 剪下这个括号内的所有内容
以上的动作都只需要花两三个字元就可以做到
由於vi/vim有相当多的指令可以做各种动作
像是在
单字间移动、段落、单字内、括号批配、页首/尾、档首/尾、行首/尾
等等
熟悉的动作指令越多,越能做出滑鼠无法做到的快速移动
同时可以跟
action指令结合(
action,
motion在中文都通称动作,真难翻...)
让编修文字变得更有效率!
了解vim的文法,就可以来记忆一下几个常用的motion
k w (a word)
b (back a word)
e (end of a word)
h l ^ (head of indent line)
0 (head of line)
j $ (end of line)
hjkl是上下左右,如果要追求高速的文字输入效率
使用home row的效果会比使用上下左右高 (不知道home row是什麽请自己去查)
因此现在你可以操作看看vim指令了!
5k 向上五行
5w 向右五个字(游标在字首)
5e 向右五个字(游标在字尾)
$ 直接跳到行尾,重复次数无意义XD
剩下的请自己排列组合XD
然後来看几个最常用的action指令:
d{motion} delete 删除(所有的删除都是剪下,会进入剪贴簿)
y{motion} yank 复制
c{motion} change 删除并进入insert mode(可翻作删修)
p paste 贴上
注:{motion}可以是复合的动作指令,如5w
注:paste因为和其他几个指令性质有点不太相同,所以用不同的标色
我认为最核心的指令就是d,y,c,其他类似他们的指令都只是变形而已
现在可以将d,y,c跟其他的指令做组合:
d5w 删五个字(到字首)
c^ 删修到行首
不过如果每个动作都要跟其他动作指令做结合,就太慢了
所以就出现了几种变形:
D 删到行尾
C 删修到行尾
dd 删除整行
cc 删修整行
yy 复制整行
Y 这也是复制整行...其实我比较希望是复制到行尾 ~"~
(顺便问下版友,action到行首有没有d^外更方便的按法啊?)
在这些motion前面可以加number,如:
5yy 复制五行
5cc 删除五行再进入insert mode
另外有时候会需要以字元为单位的编辑,所以还有几个小变形:
s substitude 删修一个字元
x x 删除一个字元
r replace 删修一个字元再回到normal mode
R replace mode 取代模式
跟行单位的指令类似,在前面也可以加number:
5s 删掉五个字元再进入insert mode
5x 删五个字元
5r 将五个字元都换成新输入的一个字元
R 每个输入字元都会取代现在游标所在位置的字元
2R 取代的字会重复一次
看到这边会不会有点头昏眼花了呢XD
整理一下所有的指令:
k w (a word)
b (back a word)
e (end of a word)
h l ^ (head of indent line)
0 (head of line)
j $ (end of line)
删除 复制 删修 取代
d y c r
D Y C R (mode)
dd yy cc 贴上
x s p
切换mode
i (normal to insert)
R (normal to replace)
esc or
^-[ (back to normal)
其实没有很多吧XD
这篇文章篇幅看起来很长,是为了要让新进读者能理解vim的文法
之後应该不会用这麽罗唆的语句来举例了吧@ @|||
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.136.185.152
1F:→ dryman:生平第一篇1000批币文XD 01/21 14:52
2F:推 awkman:谢谢分享~最近正在尝试用vim 一直改不掉用backspace删字.. 01/21 15:09
3F:→ awkman:真的要练到每个删除动作都回到normal mode 用指令去删吗@@? 01/21 15:11
4F:推 fuha:不得不推~ 01/21 15:48
5F:→ dryman:在insert mode除了backspace可用^-h 01/21 17:01
6F:→ dryman:^-h删一个字元,^-w删一个字 01/21 17:01
7F:推 untitled:"c" 或许可以用 change 01/21 17:02
8F:→ dryman:change不赖^ ^ 修一下文章~ 01/21 17:03
※ 编辑: dryman 来自: 140.112.30.84 (01/21 17:04)
9F:推 LINGZ:motion指的是移动(移动游标),action指的是动作(内容改变). 01/21 18:00
10F:推 ethan5422:推一下这篇 01/21 19:19
11F:推 icycandle:也太清晰了 XD 01/21 20:44
12F:推 freedomxu:其实有装vim的话,在命令提示字元或shell prompt执行 01/21 22:26
13F:→ freedomxu:vimtutor,就会有一些简单的教学哦。 01/21 22:27
14F:推 maxwellee:推 很有心的解析 01/21 22:27
15F:→ dryman: :h 其实理解完大概的概念,剩下很多都还是要读help 01/21 23:06
16F:→ dryman:我发现我在这篇中完全没有题到离开vim该怎麽做orz 01/21 23:11
※ 编辑: dryman 来自: 220.136.190.64 (01/24 11:52)
17F:→ dryman:勘误5b 是向左五个字:p 01/24 11:53
18F:→ Ice9:原来 y 是 yank。谢啦!不过,yank 文义感觉比较像 cut 不是? 01/29 14:08
19F:推 Aibnarsien:vim推XD! 01/29 15:39
20F:推 PandaMax:请问 有没有可以让游标到该航最後一个字的右边呀 04/22 16:02
21F:→ PandaMax:因为$只会到最後一个字 进入插入模式就会在左边加字 04/22 16:04
22F:→ PandaMax:可是我希望的是在最後一个字的後面加字的话要怎麽办呢? 04/22 16:04
23F:→ cyutdt:请在该行任意地方输入大写"A" 05/13 15:02
※ 编辑: dryman 来自: 220.136.190.223 (09/07 21:07)
24F:推 ckclark:ctrl+o可以暂时变成normal mode这个我最近才知道 10/20 18:58
25F:→ ckclark:可是习惯都养成了 好难改 10/20 18:58
26F:推 michael520:good ~ 09/04 14:40
27F:推 pcchou: 推… 11/23 16:28
28F:推 hoootony: 好文 值得学习 12/04 15:48
29F:推 oftisa: 请问跳到第一行及最後一行要用什麽指令 03/11 05:33
30F:推 oftisa: VI的字是以空格来画分的吧!所以移动几个字 03/11 06:31
31F:→ oftisa: 复制几个字之类的指令根本不能用在中文上 03/11 06:31
32F:→ oftisa: 当然大部分人是拿来写程式的,不过用在LaTeX的话 03/11 06:32
33F:→ oftisa: 还是要编辑中文文章吧。不知道有没有办法解决中文的问题? 03/11 06:32
34F:推 oftisa: 找到了,第一行gg,最後一行G。要到第几行就在G前面加上 03/13 00:52
35F:→ oftisa: 数字,比如10G就跳到第10行 03/13 00:53
36F:推 wtfbt: 没再跟你用滑鼠的啦 02/28 00:37
37F:→ wtfbt: 就这点,屌打一堆fancy 的编辑器。 02/28 00:39
38F:推 yen980240: 推传教 我也是vi新手 04/28 12:37
39F:推 penguinlion: good 11/16 17:02