原帖地址:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4155862&page=11#pid24300490
最近在学Vim实用技巧一书,整理了一份笔记。
《Vim实用技巧》一书确实是一本好书,让我从对vim的生疏不喜欢用转为对vim的着迷并有相见恨晚的感觉。vim功能强大的让人受不鸟,我觉得掌握vim的5成功力便能称为武林中的高手了,自测我目前掌握的有2成功力就已经很得心应手了!!vim的知识像是个无底洞,要想到熟练和精通的火候,我估计没个一年半载的修炼很难达到。所以就目前可以应付大多数编辑任务的情况下,我打算开始往下一步进行,学习一些重点有难度的命令,egrep以及正则表达式等。vim的学习也会在日常应用中进一步加深!以后的学习路线打算是:正则表达式->GNU 编译器的使用(GCC,GDB,makefile)->linux/unix编程->linux内核学习。——————————————————————————————————————————————————————————————————————————————vi编辑器学习笔记每个模式的所有命令列表,请参见:h index说明:形如<C-a>这样的标记代表CTRL+a1. 普通模式下操作:操作符+动作命令=操作(:help operator)(查看所有命令列表:help normal-index) #每个命令前均可指定一个数字[count], 不指定[count]的话,[count]默认值为1. ["x]c{motion} 删除{motion}指定的文本[到寄存器x中]并进入插入模式. (cc 删除[count]行[到寄存器x中]并进入插入模式)(change) ["x]C 删除光标到行尾的内容以及下面的[count-1]行[到寄存器x中],并进入插入模式.(C=c$) ["x]d{motion} [执行count次]删除{motion}指定的文本[到寄存器x中].(dd 删除[count]行[到寄存器x中])(delete) ["x]D 删除光标到行尾的内容[到寄存器x中]. (D=d$) ["x]y{motion} Yank {motion} text [into register x]. (yy Yank [count] lines [into register x]). ["x]Y 复制光标处到行尾的文本以及下面的[count-1]行[到寄存器x中]. (Y=y$) ["x]s 删除[count]个字符[到寄存器x中]并进入插入模式(s stands for Substitute). (s=cl) ["x]S 删除[count]行并进入插入模式.(S=cc) ["x]x 删除光标下以及后面的[count]个字符[到寄存器x中]. (x=dl) (xp 可实现两个字符的位置交换) ["x]X 删除光标前面的[count]个字符[到寄存器x中]. (X=dh) ["x]p 粘贴[寄存器x中的]文本到光标后面[count]次.(put) ["x]P 粘贴[寄存器x中的]文本到光标前面[count]次. r{char} 用{char}字符替换光标所在处的字符,如果指定[count]的话,则用{char}替换光标及其后面[count-1]个字符.(replace) g~{motion} 反转{motion}指定文本的大小写. (g~~或g~g~,反转当前行文本的大小写) gu{motion} 使{motion}指定的文本转为小写. (guu或gugu,使当前行的文本变为小写) gU{motion} 使{motion}指定的文本转为大写. (guu或gugu,使当前行的文本变为大写) >{motion} 对{motion}区域增加缩进(shiftwidth指定的单位). (>>对[count]行增加缩进) <{motion} 对{motion}区域减少缩进(shiftwidth指定的单位). (>>对[count]行减少缩进) ={motion} 对{motion}区域自动缩进. (==对[count]行进行自动缩进)2. 普通模式下的其他操作: J 连接[count]行成为1行(删除行尾的换行符) R 进入改写模式. 直到按ESC退出replace模式,输入的内容会被重复[count]次. u 撤销[count]次改变(undo) U 撤销对本行的修改 <C-r> 重做(redo) (与u相对) . 重复上一次操作,如插入、删除、修改操作。 #数字运算操作,适用与整数,如果是小数的话,会当做两个整数处理。 <C-a> 如果不指定[count],则对光标处(或者光标后面第一个)数字+1,否则+count <C-x> 如果不指定[count],则对光标处(或者光标后面第一个)数字-1,否则-count {num}<Enter> 光标下移num行3. {motion}:普通模式下移动光标命令 h,j,k,l 左,下,上,右(实际行) gh, gj, gk, gl 左下上右 (屏幕行) 0, ^, $ 行首,第一个非空白字符, 行尾(实际行) g0, g^, g$ 行首,第一个非空白字符,行尾(屏幕行) w 向前(右)移动一词(计标点),W 向前移动一词(不计标点) b 向后(左)移动一词(计标点),B 向后移动一词(不计标点) e 移到(下一个)单词的结尾, E 移到(下一个)串的结尾 ge 移到(上一个)单词的结尾,gE 移到(上一个)串的结尾 t{char} 向右查找直到遇到{char}字符前停下(不包含{char}字符) T{char} 向左查找直到遇到{char}字符前停下(不包含{char}字符) f{char} 从光标处开始向行尾查找{char}字符(在选择时包括char字符) F{char} 从光标前开始向行首查找{char}字符(在选择时包括char字符) ; 重复上次的字符查找命令(f/F命令) , 反向查找上次的字符查找命令(f/F命令)。 % 跳到匹配的括号处 * 查找光标下的单词,并跳到下一个匹配处,可按n或者N进行重复查找。 H 把光标移至编辑窗口顶部第一行的第一个非空白字符位置 M 把光标移至编辑窗口中间一行的第一个非空白字符位置 L 把光标移至编辑窗口底部最后一行的第一个非空白字符位置。 ( 把光标移至一个完整句子的句首位置 ) 把光标移至一个完整句子的句尾位置 { 把光标移至一个完整段落的段首位置 } 把光标移至一个完整段落的段尾位置 + 到下一行首字符 - 到上一行首字符 /正向查找,?反向查找,n查找下一个匹配,N查找上一个匹配。4. {motion}:文本对象(:help objects) i“, i), i}, i], i’, i>, i` 括号或者引号内部的对象(不好含括号或者引号) a”, a), a}… 包括括号或者引号的对象 it, at, XML标签对象 iw, iW, is, ip 单词、字串、句子、段落对象 aw, aW, as, ap i对应对象及一个空格(空行)5. 插入文本的常用方法(进入插入模式)(在结束插入时,插入的内容将重复[count]次) a 在光标后面插入文本. A 在当前行的尾部添加文本 i 在光标处插入文本.(如果想插入50个'-',则可以输入50i-<ESC>
I 在行首插入文本 o 在光标所在行的下面新建一行,等待输入文本 O 在光标所在行的上面新建一行,等待输入文本6. 插入模式:(:help Insert) (:help insert-index) <C-h> 删除前一个字符(同backspace) <C-w> 删除前一个单词 <C-u> 删至行首 以上命令,在Bash shell中或者Ex命令模式下也可以使用. ————— <Esc> 或 <C-[> 返回到普通模式 <C-o> 切换到插入-普通模式; 切换到此模式后,执行一条普通模式指令后,便再次返回到插入模式 ————— <C-r>{0-9a-z"%#*+:.-=} 把寄存器的内容粘贴到当前位置。 <C-r><C-p>{register} 按原意插入寄存器内的文本,并修正不必要的缩进。 <C-v>{code} 其中code为3位十进制数字,如<C-v>065输入A字符 <C-v>u{1234} 其中u后面跟4位16进制数字,用来输入unicode码 <C-v>{nondigit} 后面跟非数字字符,则按原意插入该字符 <C-k>{char1}{char2} 插入以二合字母{char1}{char2}表示的字符 <C-e> 插入光标下面(下一行)的字符 <C-y> 插入光标上面(上一行)的字符7. 常用Ex命令(获取Ex命令列表:help ex-cmd-index,获取某个命令的帮助,如:help :delete) #在Ex模式下,可以用<C-w>,<C-u>来删除,可以用<C-v>,<C-k>来输入,也可以用<C-r>{register}粘贴寄存中的内容 #range范围中的特殊字符:.当前行, $最后一行, %所有行(=1,$), '<,'>代表高亮选取, 0位于文件第一行上方 #range可以是一个数字代表一行,如1,也可以是一个范围,如 2,8 代表2到8行,可以使用特殊符号和偏移,例如.,.+4代表当前行以及下面4行。还可以使用模式指定地址范围。 #重复上次的Ex命令@: #在Ex模式下,<Tab>可以补全命令,也可以输入<C-d>显示可用的补全列表 #<C-w>输入光标下单词,<C-a>输入光标下的字串 :reg[isters] 显示寄存器的内容 :{num} 跳到第num行 :[range]d[elete] [x] 删除指定范围内的行[到寄存器x中] :[range]y[ank] [x] 复制指定范围的行[到寄存器x中] :[line]pu[t] [x] 在指定行后粘贴寄存器x中的内容 :[range]co[py] {address} 把指定范围内的行拷贝到{address}所指定的行之下(可以简写为:t) :[range]m[ove] {address} 把指定范围内的行移动到{address}所指定的行之下 :[range]j[oin] 连接指定范围内的行 :[range]norm[al] {commands} 对指定范围内的每一行执行普通模式命令{commands} :[range]s[ubstitute]/{pattern}/{string}/[flags] 把指定范围内出现{pattern}的地方替换为{string} :[range]g[lobal]/{pattern}/[cmd] 对指定范围内匹配{pattern}的所有行,在其上执行Ex命令{cmd}, (default cmd is ":p"
8. 寄存器(:help registers) #共有9类寄存器,包括 (1)"" 无名寄存器(类似于最后一个使用过的寄存器),d,c,s,x,y等命令都会使用无名寄存器,即使指定了其他寄存器("_除外)。 (2)"0-"9 10个数字命名寄存器 "0 每次一执行y命令,总是会保存内容到寄存器0,无论是否指定其他寄存器。 "1 除了指定其他寄存器或者删除修改的内容小于一行外,d和c命令将复制内容到寄存器1。(但是d与%()`/?nN{}组合除外). "2-"9 每一次发生删除或者修改动作,寄存器的内容就会发生移位,寄存器1的内容到寄存器2中,寄存器2的内容到寄存器3中,以此类推。 (3)"- the small delete register (delete命令操作小于一行时如果未指定其他寄存器,则会保存到此寄存器) (4)"a-"z和"A-"Z 26个字母命名的寄存器。仅在指定这些寄存器的时候才会使用,使用小写字母寄存器会覆盖原有内容,大写字母寄存器会附加到原有内容后面。 (5)":, "., "%, "# 4个只读寄存器 ": 上次执行的Ex命令 ". 最后插入的文本 "% 当前文件的文件名 "# contains the name of the alternate file. (6)"= 表达式寄存器,可再后面输入表达式,将会插入表达式的结果. (7)"*, "+, "~ Selection and drop registers (本人测试mac下无,也可能是方法不对) "* X11主剪切板,用鼠标中键操作 "+ X11主剪切板,用剪切、复制与粘贴命令操作 (8)"_ 黑洞寄存器,使用这个寄存器可以实现删除内容但不影响任何寄存器。 (9)"/ 上次的搜索模式9. 可视模式:在可视模式下,可通过{motion}移动光标进行选择。 v 面向字符的可视模式 V 面向行的可视模式 <C-v> 面向块的可视模式 gv 重选上次的高亮区域 <ESC> 或者 <C-[> 退出可视模式到普通模式 o 切换高亮选区的活动端。10. 滚屏操作(:help scrolling) zz 把当前行显示在窗口正中 <C-f> 向下移动一屏 [PageDown] <C-b> 向上移动一屏 [PageUp] <C-d> 向下移动半屏 <C-u> 向上移动半屏 <C-e> 下移[count]行 <C-y> 上移[count]行