[vim ] 学习vim的心法与攻略

楼主: dryman (dryman)   2010-01-21 14:52:25
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的文法
之后应该不会用这么囉唆的语句来举例了吧@ @|||
楼主: dryman (dryman)   2009-01-21 14:52:00
生平第一篇1000批币文XD
作者: awkman (欧克面)   2010-01-21 15:09:00
谢谢分享~最近正在尝试用vim 一直改不掉用backspace删字..真的要练到每个删除动作都回到normal mode 用指令去删吗@@?
作者: fuha (丰原灌C哥)   2010-01-21 15:48:00
不得不推~
楼主: dryman (dryman)   2010-01-21 17:01:00
在insert mode除了backspace可用^-h^-h删一个字符,^-w删一个字
作者: untitled (Causality)   2010-01-21 17:02:00
"c" 或许可以用 change
楼主: dryman (dryman)   2010-01-21 17:03:00
change不赖^ ^ 修一下文章~
作者: LINGZ (肥兔小钦)   2010-01-21 18:00:00
motion指的是移动(移动光标),action指的是动作(内容改变).
作者: ethan5422   2010-01-21 19:19:00
推一下这篇
作者: icycandle (两栖作战太空鼠)   2010-01-21 20:44:00
也太清晰了 XD
作者: freedomxu   2010-01-21 22:26:00
其实有装vim的话,在命令提示字符或shell prompt执行vimtutor,就会有一些简单的教学哦。
作者: maxwellee (maxwell)   2010-01-21 22:27:00
推 很有心的解析
楼主: dryman (dryman)   2010-01-21 23:06:00
:h 其实理解完大概的概念,剩下很多都还是要读help我发现我在这篇中完全没有题到离开vim该怎么做orz勘误5b 是向左五个字:p
作者: Ice9 (又到了属于我的季节)   2010-01-29 14:08:00
原来 y 是 yank。谢啦!不过,yank 文义感觉比较像 cut 不是?
作者: Aibnarsien (艾伯那先)   2010-01-29 15:39:00
vim推XD!
作者: PandaMax   2010-04-22 16:02:00
请问 有没有可以让光标到该航最后一个字的右边呀因为$只会到最后一个字 进入插入模式就会在左边加字可是我希望的是在最后一个字的后面加字的话要怎么办呢?
作者: cyutdt (DT)   2010-05-13 15:02:00
请在该行任意地方输入大写"A"
作者: michael520   2010-09-04 14:40:00
good ~
作者: ckclark (大资佬)   2010-10-20 18:58:00
ctrl+o可以暂时变成normal mode这个我最近才知道可是习惯都养成了 好难改
作者: pcchou (pcchou)   2010-11-23 16:28:00
推…
作者: hoootony (Luffy)   2010-12-04 15:48:00
好文 值得学习
作者: oftisa (oo)   2010-03-11 05:33:00
请问跳到第一行及最后一行要用什么指令VI的字是以空格来画分的吧!所以移动几个字复制几个字之类的指令根本不能用在中文上当然大部分人是拿来写程式的,不过用在LaTeX的话还是要编辑中文文章吧。不知道有没有办法解决中文的问题?
作者: wtfbt (57moneyboom)   2010-02-28 00:37:00
没再跟你用鼠标的啦就这点,屌打一堆fancy 的编辑器。
楼主: dryman (dryman)   2009-01-21 22:52:00
生平第一篇1000批币文XD
作者: awkman (欧克面)   2010-01-21 23:09:00
谢谢分享~最近正在尝试用vim 一直改不掉用backspace删字..真的要练到每个删除动作都回到normal mode 用指令去删吗@@?
作者: fuha (丰原灌C哥)   2010-01-21 23:48:00
不得不推~
楼主: dryman (dryman)   2010-01-22 01:01:00
在insert mode除了backspace可用^-h^-h删一个字符,^-w删一个字
作者: untitled (Causality)   2010-01-22 01:02:00
"c" 或许可以用 change
楼主: dryman (dryman)   2010-01-22 01:03:00
change不赖^ ^ 修一下文章~
作者: LINGZ (肥兔小钦)   2010-01-22 02:00:00
motion指的是移动(移动光标),action指的是动作(内容改变).
作者: ethan5422   2010-01-22 03:19:00
推一下这篇
作者: icycandle (两栖作战太空鼠)   2010-01-22 04:44:00
也太清晰了 XD
作者: freedomxu   2010-01-22 06:26:00
其实有装vim的话,在命令提示字符或shell prompt执行vimtutor,就会有一些简单的教学哦。
作者: maxwellee (maxwell)   2010-01-22 06:27:00
推 很有心的解析
楼主: dryman (dryman)   2010-01-22 07:06:00
:h 其实理解完大概的概念,剩下很多都还是要读help我发现我在这篇中完全没有题到离开vim该怎么做orz勘误5b 是向左五个字:p
作者: Ice9 (又到了属于我的季节)   2010-01-29 22:08:00
原来 y 是 yank。谢啦!不过,yank 文义感觉比较像 cut 不是?
作者: Aibnarsien (艾伯那先)   2010-01-29 23:39:00
vim推XD!
作者: wtfbt (57moneyboom)   2010-02-28 08:37:00
没再跟你用鼠标的啦就这点,屌打一堆fancy 的编辑器。
作者: oftisa (oo)   2010-03-11 13:33:00
请问跳到第一行及最后一行要用什么指令VI的字是以空格来画分的吧!所以移动几个字复制几个字之类的指令根本不能用在中文上当然大部分人是拿来写程式的,不过用在LaTeX的话还是要编辑中文文章吧。不知道有没有办法解决中文的问题?找到了,第一行gg,最后一行G。要到第几行就在G前面加上数字,比如10G就跳到第10行
作者: PandaMax   2010-04-23 00:02:00
请问 有没有可以让光标到该航最后一个字的右边呀因为$只会到最后一个字 进入插入模式就会在左边加字可是我希望的是在最后一个字的后面加字的话要怎么办呢?
作者: yen980240 (颜君)   2010-04-28 20:37:00
推传教 我也是vi新手
作者: cyutdt (DT)   2010-05-13 23:02:00
请在该行任意地方输入大写"A"
作者: michael520   2010-09-04 22:40:00
good ~
作者: ckclark (大资佬)   2010-10-21 02:58:00
ctrl+o可以暂时变成normal mode这个我最近才知道可是习惯都养成了 好难改
作者: pcchou (pcchou)   2010-11-24 00:28:00
推…
作者: hoootony (Luffy)   2010-12-04 23:48:00
好文 值得学习
作者: yen980240 (颜君)   2010-04-28 12:37:00
推传教 我也是vi新手
作者: penguinlion (penguinboss)   2010-11-16 17:02:00
good

Links booklink

Contact Us: admin [ a t ] ucptt.com