笑话/vim 操作命令大全
曾经使用了两年多的Vim80D4D,PY3F5YRvo8手册也翻过一遍grEdhzeoa5c。22qXWlR9P虽然现在不怎么用vim了bGCPFo89d6d,Yzp5KPFX8Uj曾经的笔记还是贴出来j5nnZ818jh291d,4v8VsTBTP与喜欢vim的朋友分享31LWUot3。iySgIQJ1162b2 1. 关于Vim vim是我最喜欢的编辑器MD74ISyP,8Qj0R1NrJTpEee也是Linux下第二强大的编辑器h4z29ECq3Mm。5ka2047n75U 虽然emacs是公认的世界第一xw365Yb7Zh78V,Xw2E8LI我认为使用emacs并没有使用vi进行编辑来得高效SoW0Mr0hVX。yApurJxB 如果是初学vi7P9Bhm8566,0dn59PgwQ9f0运行一下vimtutor是个聪明的决定L906LKTeS5U2。6xOr88R3 (如果你的系统环境不是中文m9Qtajfs9eRYc9,7v6Vdh3t而你想使用中文的vimtutorM61X6125rd1XC2,jeofEGGl3就运行vimtutor zh) 1.1 Vim的几种模式 正常模式CDNCSy4b9:iqHzQfvEeUS可以使用快捷键命令0LTgYS,WA8OriM9v9b8或按:输入命令行r6m5tCR。xDq5tIcP9L5j44 插入模式6qFs2ZM756:lqvLUNr可以输入文本kTm3WWu9nT,QEBfYkaRRIw2在正常模式下xvwbm2,9kEyy3EJ86Wk按iA5oOFL27F、z0Q5n08208gq79as9ebkzfJZs、1ia6Lo等都可以进入插入模式1L4VlGMS4sS0w。DNDxmizt 可视模式K01so4Sr7:8skBv正常模式下按v可以进入可视模式l0HYNnsv8i6,f9hWyeYD 在可视模式下O36ofr1Id,3j7obSEE42H移动光标可以选择文本r6cWDD90。t12SE7F6Rt按V进入可视行模式v4Y3mwI,4eoy7AkIj681 总是整行整行的选中191gFKQBV657Nj。SoZg5ctrl+v进入可视块模式dKkO5MYBRGM。UddKG8ZH 替换模式Nv7g4wYF:2U9r90qaHvj2JV正常模式下J4N9hF98,KRmztxec3Zo按R进入Mfke860N40。0aie4LzAN0X 2. 启动Vim vim -c cmd file: 在打开文件前b9eZ77H6AE,o459xt先执行指定的命令5W178w0us0VwXF;GJ7tDy9qKzqae vim -r file: 恢复上次异常退出的文件37Lz2Ld3HDG0s8;0KN6ULc83L vim -R file: 以只读的方式打开文件tuoob,XvZxh8Xc但可以强制保存w513B;cR7lnCMZRsCKB vim -M file: 以只读的方式打开文件bu47p,fF93xKuH038Lkr不可以强制保存NLT530;xmm6tmnvD51616 vim -y num file: 将编辑窗口的大小设为num行E38t3im;zX398 vim + file: 从文件的末尾开始SmGgre02u;5rIP0 vim +num file: 从第num行开始L4D4Pub;997h1fIRlLboG vim +/string file: 打开fileJHSj51,la744Fr0VTG63并将光标停留在第一个找到的string上T3HPRJt5T。9UlB5 vim –remote file: 用已有的vim进程打开指定的文件G936Tk2。fES99SSE0 如果你不想启用多个vim会话nCQc43MbZhR,zJ1jK这个很有用x063Nop。s9S008mq0i5V但要注意XosDLU,J5hEoBgC9 如果你用vim4D96SJ7263fZD,kFt80Qnfi7pyNU会寻找名叫VIM的服务器Lff5zWHC;E98lI137sQ42L0如果你已经有一个gvim在运行了RqO55O4B,dC0D775 你可以用gvim –remote file在已有的gvim中打开文件6r016G3nhM3nc。278W6BXSK18ppL 3. 文档操作 :e file –关闭当前编辑的文件dQ119,lTJwBDK并开启新的文件6D61Hyn。h734E40O 如果对当前文件的修改未保存757fMKR5gBuvl,a73Exy0osvi会警告w73C45o87p14。s9W77mewSyFPW :e! file –放弃对当前文件的修改hw0oimKU,2lqMI3B5ti编辑新的文件582jVY。wu09c :e+file – 开始新的文件Zbo5glziX6XZ9,W0T1o696XcytT并从文件尾开始编辑003Tfr0。lG3aZsp :e+n file – 开始新的文件3znPNiz0fp,lZJA345Ls并从第n行开始编辑7SaBJKDKw。VUaGT0 :enew –编译一个未命名的新文档P5N8t7pqfd。WFO4NO3xKBA3J(CTRL-W n) :e – 重新加载当前文档p57N86。CZ1AfEPf1zga :e! – 重新加载当前文档k00eEMxw,7JKp5008lqA并丢弃已做的改动46bqvE6wx。Jra5Xoe9Wu :e#或ctrl+^ – 回到刚才编辑的文件iE4cui9cJV8T,AACqqM很实用Ga0sN5eX7siCm。kvCEde :f或ctrl+g – 显示文档名08hqaAN7n6MznR,6W8KNIE750Kg4是否修改mJPHi,AhEl5LsU5SM9和光标位置NfC5j7o5。2V0S4DQBILb71 :f filename – 改变编辑的文件名7CC16v7Yk,0u32JD95kr这时再保存相当于另存为T0Qn5X7EIWvs。D5oryFOMg gf – 打开以光标所在字符串为文件名的文件knRuB。Ry4T8kx21J6 :w – 保存修改fgKc5u7FIFWuB。77dXVL06fCxQ :n14KRrHQJp6n5J6T,X0666htTn2w filename – 选择性保存从某n1行到另n2行的内容p3bZ5bFI8。40MgY2 :wq – 保存并退出7T98fN。k4mtO ZZ – 保存并退出4W89S9H32589。wc8Qkc2uIPj9y :x – 保存并退出47vrqc2o7。BM241oZWrSIT1 :q[uit] ——退出当前窗口l3rs0wjfo3C。480FG598R76Y35(CTRL-W q或CTRL-W CTRL-Q) :saveas newfilename – 另存为 :browse e – 会打开一个文件浏览器让你选择要编辑的文件2v3Tg215Uq75oh。r80mi9 如果是终端中h96V6D7Y3CxJO3,OhHYT3则会打开netrw的文件浏览窗口T0jacOVadz;E8YVkc24G 如果是gvim077o62Ay9Y,YB2vyrqGqWx8y则会打开一个图形界面的浏览窗口x8Ug8。T19G9AUC 实际上:browse后可以跟任何编辑文档的命令2Je68RX,57Go4bGZE4AIK如sp等acq0rkk0W1nFF。xIUvb3Lx 用browse打开的起始目录可以由browsedir来设置42guk3E73F:f0R99 :set browsedir=last – 用上次访问过的目录(默认)DGU8Nx;Sz1yGq :set browsedir=buffer – 用当前文件所在目录Uq8lqJ2KzFQLm;9GIG821mtUaC :set browsedir=current – 用当前工作目录Z2hgRwrf3;w7Z2s :Sex – 水平分割一个窗口s2l6VfIbTKMQP,L5oU8OP8BSe6浏览文件系统W8i38F7h65l8Kb;ATbB23Ydo3w :Vex – 垂直分割一个窗口F2t54,CKbjN浏览文件系统d0vi6I;DyhgxWe 4. 光标的移动 4.1 基本移动 以下移动都是在normal模式下pNOu2。I0DCGx5 h或退格: 左移一个字符Xo2UguDT;8bkY3ia9KB l或空格: 右移一个字符VvBPOvG;v1b2f5y4g5l4N j: 下移一行eZfyu91J;egZ34ob3S7O k: 上移一行hHZ405O5f77;tftuan5698WB gj: 移动到一段内的下一行e0GR61dv;0ILS12kIJbQDo gk: 移动到一段内的上一行Pi3jPX;55g6xc +或Enter: 把光标移至下一行第一个非空白字符jpgAPTGZ。IIwW5Whefx7f8R -: 把光标移至上一行第一个非空白字符A57N0sf。781E4i w: 前移一个单词oGS7Y8zKQ6jyY,9mbPgVl光标停在下一个单词开头n89qEsymf;3epA78tbo7tYt W: 移动下一个单词开头C1ym0d5GYfl2sq,MFf4whh1W但忽略一些标点lzGTae9F;Z1c839omr0B e: 前移一个单词nv4bLN7,8FaTlQ光标停在下一个单词末尾Bq6afA99zGg6f;iywcY9G30 E: 移动到下一个单词末尾0iSwpRO,xMbe5DLsG9C如果词尾有标点BMD6y1zmD,3nbyRmMJsF则移动到标点Ui3OWAx;q00eCPy3pYWvR b: 后移一个单词FdV22,5rdVzpN光标停在上一个单词开头y2Y81;715j29sOJ2 B: 移动到上一个单词开头7RuI0n2,582K30960Lam忽略一些标点6K84V4;l9W0hi3Hmc0 ge: 后移一个单词nHo6l27AeH0MWx,w42x5光标停在上一个单词末尾bxvc0Q3OC2vOE1;2w5iuBEs86 gE: 同 ge j15e1j3,65L0XKkV不过‘单词’包含单词相邻的标点inVUgkWajb。RQ4WN3 (: 前移1句0PG98Aw。fflX8f2l03D ): 后移1句Yh4E267c61LNy。60Tiw91kQ1CP2L {: 前移1段P0E0y37d8wB。z9qV6X }: 后移1段waXtyL。U9yEA65 fc: 把光标移到同一行的下一个c字符处 Fc: 把光标移到同一行的上一个c字符处 tc: 把光标移到同一行的下一个c字符前 Tc: 把光标移到同一行的上一个c字符后 ;: 配合f & t使用c94R67632Yz,lhHfvy3k20Yni重复一次 dQTPeeXgl,cOB0O: 配合f & t使用2AAh8l4WoVZ,o1Gbgiyoz59反向重复一次 上面的操作都可以配合n使用41b2w3Xrr0,pd1bK16Ifbr12R比如在正常模式(下面会讲到)下输入3h1kGQ5Iq7R,N5LrIdG 则光标向左移动3个字符P76cs797tWU3wl。7ngGG523O02lH 0: 移动到行首gH03S54546。SnTMblEs g0: 移到光标所在屏幕行行首ZmgAhz。sS4p27zD6 ^: 移动到本行第一个非空白字符96738d3GF9b1SX。a0Kbe65gA g^: 同 ^ h7QB5,urM4QVXQ但是移动到当前屏幕行第一个非空字符处yW3FtU1EJs9E。t6i2BY : 移动光标所在屏幕行行尾qg384x7e。zy7AfwFv2U5P n|: 把光标移到递n列上FClSmX。0mP25 nG: 到文件第n行cgKtn81Ve4。e852n2r6v34Mf8 :n 移动到第n行Fgv25i64dh。Zd8vmaLK2b :$ 移动到最后一行EYj2O4uv。e8c5beS30a H: 把光标移到屏幕最顶端一行Ecs2qXP。W2tTgx8sj8 M: 把光标移到屏幕中间一行XFNdgN3l5。TcgQQX L: 把光标移到屏幕最底端一行dGyvVa。kZ6kO gg: 到文件头部2kl6xLYuE。MQi24w7qxOMR G: 到文件尾部0W3Bx2tBUUGurS。ku2jKR5u9 4.2 翻屏 ctrl+f: 下翻一屏SYKMnt503kUJ4。7lWjDyZbV0hi ctrl+b: 上翻一屏m4LG97NEsI。V33u8ZBia9 ctrl+d: 下翻半屏19788J1Q6Q。8Wm01H8ks5t ctrl+u: 上翻半屏0c44uJ3。46q3B ctrl+e: 向下滚动一行1hPpkTYzuu27。99S26 ctrl+y: 向上滚动一行9V4LAKZ。AvnE120 n%: 到文件n%的位置Oo0I5q。i8uOfq61Mdy zz: 将当前行移动到屏幕中央9ML3GZ9。UhX1998 zt: 将当前行移动到屏幕顶端s3du8E98。S31LFnhPPQL7 zb: 将当前行移动到屏幕底端Oz3xc72T。WKr2t4u 4.3 标记 使用标记可以快速移动fTw42tsh。c13BNsvC到达标记后0V2w8yi7vNK2s,27hrc54w3So9y可以用Ctrl+o返回原来的位置nXTr7Geu8QPwI7。A489I2cEA Ctrl+o和Ctrl+i 很像浏览器上的 后退 和 前进 d13P8oA。r8vW044iGyU7 m{a-z}: 标记光标所在位置PFU7wwf4hFLy,99cL4x局部标记h84jRPVO,uej670C3Iz只用于当前文件2r820。2yzn2c5 m{A-Z}: 标记光标所在位置RGfjJ,9dLlDav7IEk全局标记7x1SXp。iI3un标记之后938l2DK4LZ1sj,nC315q退出VimL9tI8K24D04u6,Q32Pu2fF666 重新启动EY5n52ar7,40OQ6标记仍然有效U3707N。us8rOU `{a-z}: 移动到标记位置5829OyQt8。O5f2Bo7 ‘{a-z}: 移动到标记行的行首sxAfEn18003a。A6UN27hLZG0JI `{0-9}cUKd6W:7MJ4b8y36cB4U回到上[2-10]次关闭vim时最后离开的位置2YCryaUWQt。564SOHail “: 移动到上次编辑的位置IcQ4OdPE4。4UB1c6ND7rCIj”也可以f1e5D7I9BjYm,eMU472JvC9不过“精确到列9A6L7Sfqil7,emezhxx而”精确到行 A9TBWL0u1l。JEepB如果想跳转到更老的位置L6H2CbIUY,X9feH5可以按C-o1V3uhP5QXl370,Ghc9x跳转到更新的位置用C-in9WF4i2UK。icq415 `”: 移动到上次离开的地方sbMV68JSPUrI。d19dtB2xel `.: 移动到最后改动的地方1s0o79xf。4T0R314541 :marks 显示所有标记uSKPNK9l0L67。79G4EMGH148c32 :delmarks a b – 删除标记a和bjUf4F1。kBB35ad46riu :delmarks a-c – 删除标记a1MLW6E、jSW3l79878b和cWb1Y9La9S2f。M8WYnx4P2 :delmarks a c-f – 删除标记atO41329、2ca3Kc7U05R2v、o6ge4dVQSq4tMj、Kjbb048GnbJQ1VeCqAsO、M5Ne24GfLneX8u。VsVHvmR96DW :delmarks! – 删除当前缓冲区的所有标记52T1Ved。i0kcDg :help mark-motions 查看更多关于mark的知识WwT71ueAy。1aIQJCOb 5. 插入文本 5.1 基本插入 i: 在光标前插入gTuG07z7n;57u9ji1mg一个小技巧0liSi0X7751uC:zj1FhUwL0qO按86ZgZ5JgzF19H,jkZg6opkrJZX2z再按is7wPHj2TYJxam,ddML34k8进入插入模式6qaLWEiwHHq,Syzz7u6jz29输入=s5kxGr,CS8SfniAvG0Li 按esc进入命令模式ctmjf9D43DG,UaJ6RxWwrtBQf就会出现8个=1G3rIG6wh9。SUlEb4L49GiR8 这在插入分割线时非常有用23p3479Ak1rL,gS7U7t9B0Tbhr1如30i+就插入了36个+组成的分割线qwsqsF20G94J。P37736PX I: 在当前行第一个非空字符前插入a8Xb15W5qsy;S9Tms6gc gI: 在当前行第一列插入1bX28Z8nH;0WwP86pPpN a: 在光标后插入4Nt6zew5eGJ52;R9adwu8H5WJ A: 在当前行最后插入J1KU80vbWk;XZ049j5hN o: 在下面新建一行插入D2r70r7k;q1kHHVF3uSFa5c O: 在上面新建一行插入qyK062X1U2gKy;1Qo60IhlNBx :r filename在当前位置插入另一个文件的内容DwkOZj。l864Vl6nNQ8lu :[n]r filename在第n行插入另一个文件的内容Tf2xo。A4Vf2DpX :r !date 在光标处插入当前日期与时间0ioq1p。0d0KQMNs同理71TO8B0n0lrj4L,zKIAR08ah:r !command可以将其它shell命令的输出插入当前文档sKHyt4f。xL2DxwAz0 5.2 改写插入 c[n]w: 改写光标后1(n)个词r2nLgl。B7lGJ c[n]l: 改写光标后n个字母v6P6Hq74B。D68bU3cV3G56 c[n]h: 改写光标前n个字母J3HE3PI。P2HHYTBl [n]cc: 修改当前[n]行07JPY5vF0Td0w6。Pa0VxHuP43 [n]s: 以输入的文本替代光标之后1(n)个字符KOCpNc6X2v9Nks,FMoXVV89cu相当于c[n]l3B52d6G1J4。XokYP1S [n]S: 删除指定数目的行hp7Q8r6,53Olr5b8j并以所输入文本代替之jR8RIU。tw7IAL3 注意jgAn2e53,y269IS类似cnwh5WyA461Tf,irIiMk34dnw7YW7xrJ,KwOruLynw的形式同样可以写为ncwNIMtMz5L,oubP9Ski28pA7SndwI821ge233ZbGe7,qhCOVv0BXXpFmnyw4Sbt3NJeu5。do8lfdxJo81 6. 剪切复制和寄存器 6.1 剪切和复制RL13V2、KbhCrc粘贴 [n]x: 剪切光标右边n个字符Tq753Rq52B2fLu,aQ0i3Z相当于d[n]lCfhPP4Q9x0。jZ86N60y [n]X: 剪切光标左边n个字符e3NgU5,8mK8Nitg6Z85q相当于d[n]huh6xIP3。7OYu4QW7d6S y: 复制在可视模式下选中的文本ZpcGp1Jfh0g。1p5kOiKizJ yy or Y: 复制整行文本l1YVr。00X51evBwa48 y[n]w: 复制一(n)个词O3AWa7YCXpzT。H8kb07qGYj9QFm y[n]l: 复制光标右边1(n)个字符o4RTM88760s。65UBpq9 y[n]h: 复制光标左边1(n)个字符4d1J8pmcFLe。3a59RsVbA yor D: 删除(剪切)当前位置到行尾的内容h1Ag749iq0s7EX。zcuUw13d4modU d[n]w: 删除(剪切)1(n)个单词 d[n]l: 删除(剪切)光标右边1(n)个字符6J3FglnKt54Cy。Zd42J9cwXMsg5b d[n]h: 删除(剪切)光标左边1(n)个字符WKEoqeytBQRGc4。GS19k0BkwP3 d0: 删除(剪切)当前位置到行首的内容 [n] dd: 删除(剪切)1(n)行PJcsjkVf5Rcj。2Lv27gZ3c38jW6 :mcij5dTTB8ZAZ5,3ArUtnd 剪切m行到n行的内容aElEax4jXbK。28FP2 d1G或dgg: 剪切光标以上的所有行laA3JeU。3GOsT73p dG: 剪切光标以下的所有行6uxbM98Oie。MZ922z0muQAe4 daw和dasWJ18wB4dx07:0Eybm7eF剪切一个词和剪切一个句子8816Q2u5834Cs4,N5l8p3a3n0IW即使光标不在词首和句首也没关系kPD8XmsajIKO。giadMmBNkCc5U d/f62z2CFUm4M:ceq6kbQ这是一个比较高级的组合命令20mr6X,3gT30898QhUM2它将删除当前位置 到下一个f之间的内容TXq52k。8w95X96 p: 在光标之后粘贴7f9TOho128Yp5。5D4uJB7R1A P: 在光标之前粘贴70D28K21s。8nY8r6c 6.2 文本对象 awHh8KL:9tc01一个词 as9p2UM8n:Nn1koA6edxtL一句b0FomAH。17NBI ap2HQSBK:y44Od68eRZv33一段v7aZ3B。0hT67vNjkZjzI ab1h2KDo:niDdh2Uum一块(包含在圆括号中的)g8K2Rr4pQ1HE。2auZ25 yFA6qZw,S00WM7A dFM1QubucXB4U01,dd361iHkY cf8cIibpv,VmEo3br5I13h2 v都可以跟文本对象dhi45xtr80T。PFUJp4oHn 6.3 寄存器 a-zK04g4g1:L9FFvw2vo8v都可以用作寄存器名g807g9lgvw5m3。rPWWFi”ayy把当前行的内容放入a寄存器obY06zzL。8Z00k6 A-ZLCoMPR8:32bjpn6T8V用大写字母索引寄存器JfTqst2,iuKt0apS7I132可以在寄存器中追加内容4a13U00yV2。69f4sO54 如”Ayy把当前行的内容追加到a寄存器中r3Rca7o13TFuS0。8H636 :reg 显示所有寄存器的内容4eV6QI。TvWoed5U “”cd1JW:u65i8JD1hG5v6不加寄存器索引时0P2U12v,1oeWnCP默认使用的寄存器dptJl4s78。07i6G “*DOfRZHD48uu:bB01cP当前选择缓冲区gS6K0C9q6,53t68FP03XtXB”*yy把当前行的内容放入当前选择缓冲区n2bFPxy3kAX06。Pe7UM “+a90oOW2h46410:pR4yGwdAOh系统剪贴板V3v1SwWN109LQ。XRVgIE”+yy把当前行的内容放入系统剪贴板NhWi40。Q06X3W 7. 查找与替换 7.1 查找 /something: 在后面的文本中查找somethingo0O6C0。1kOij48SpH5 ?something: 在前面的文本中查找somethingr484r3CR60741W。Hu49FN3wCyHM /pattern/+number: 将光标停在包含pattern的行后面第number行上0dFT6r。nQ60I /pattern/-number: 将光标停在包含pattern的行前面第number行上PqBp7gi。QMXX7GD n: 向后查找下一个JZ3rJj62c。E6T2d0FU6VG9h5 N: 向前查找下一个24SCX55t2iZ68F。us3a6o90kANb5 可以用grep或vimgrep查找一个模式都在哪些地方出现过822hJ0,A3hIgM2 其中:grep是调用外部的grep程序JSoq6Am1l4,i5Q2r7kx而:vimgrep是vim自己的查找算法m7397K4sqEVnn。166s6uAc40 用法为HL45M9o80e01y:RWc19N5 :vim[grep]/pattern/[g] [j] files g的含义是如果一个模式在一行中多次出现08a5S,pY0oDIi3Z则这一行也在结果中多次出现lyc29Cg。8ltHk j的含义是grep结束后nsu4Or79,31j8K结果停在第j项c76At,Li6fV0C7v默认是停在第一项T36whrtaaB1。Ecu5MIcKU vimgrep前面可以加数字限定搜索结果的上限3A2xuuR39cT,i8kJKGEZ如 :1vim/pattern/ % 只查找那个模式在本文件中的第一个出现VjUL3Q。rn1BI27wkB2KE 其实vimgrep在读纯文本电子书时特别有用i5WyA,vGn520D9p5t3O可以生成导航的目录AMP6Zr4jk9gW。kjheFqUFSHMc7 比如电子书中每一节的标题形式为PTST9bSK8vobHb:VQSzgu0Ci4n. xxxxX1mEYI。o8n26你就可以这样PZ99ZHr1LqJD2:5T4i65 :vim/^d{1ss5143401FJH,Xs2p9v8evws}./ % 然后用:cw或:copen查看结果Mb3SD0V,BOgj6U4可以用C-w H把quickfix窗口移到左侧Nf2058tn2JT76d,zwyOtVDk9M6PDK 就更像个目录了18IT211。e1v489ND 7.2 替换 :s/old/new - 用new替换当前行第一个old3h7qiQYxHUpH。mrd1621V5wM :s/old/new/g - 用new替换当前行所有的old73JLf。23233NZi2Q :n1adEtTf7,koe1z8kV5n2s/old/new/g - 用new替换文件n1行到n2行所有的oldDbyCU。Pc1oax66D0 :%s/old/new/g - 用new替换文件中所有的oldV9B5rVv。TZ8UYcFC25uM2 :%s/^/xxx/g - 在每一行的行首插入xxxF7aroaWVN6z,AH2dp2oy4l7Cr^表示行首F4XVLOJglged。pyu0W :%s/表示行尾eAALL4Wk08hv7。by4XE36 所有替换命令末尾加上cdu29rr,qauXPz每个替换都将需要用户确认o124Vo。zr2ol2gz0 如41ynRPy4s:pQMeApm92w541Q%s/old/new/gcBV30w5iK,Kl0j065y加上i则忽略大小写(ignore)2IXN07fl1b5Q4。e61K86M20 还有一种比替换更灵活的方式9J0GMP,42GCcx它是匹配到某个模式后执行某种命令mHf9k706Xj,fb2f0PIX 语法为 :[range]g/pattern/command 例如 :%g/^ xyz/normal ddL71g5u4n0Pi。bh5X2OdypCeLXM 表示对于以一个空格和xyz开头的行执行normal模式下的dd命令5Jn0AqW3gaf5。oDH3N9KFec3l 关于range的规定为4x58Rr4ZU:28zt2UR 如果不指定rangeOdVFvgserD,TbhQP3Clf5IO1l则表示当前行j2I1Pwz7qo955。j9Sa6ctoI9A5xD mOE0jdP,g3iv29ln: 从m行到n行5dA96f3fET9Pn4。rDtRR99PosD 0: 最开始一行(可能是这样)wu8Dg。KPol1cR $: 最后一行 .: 当前行 %: 所有行 7.3 正则表达式 高级的查找替换就要用到正则表达式0201lS57QtEkR。c6Z2c5o6 \d: 表示十进制数(我猜的) \s: 表示空格 \S: 非空字符 \a: 英文字母 \|: 表示 或 \.: 表示. {m45TCPNh6,pv981v6an}: 表示m到n个字符5f8Kc3y。8i1A3w3R这要和 \s与\a等连用nyL1EPXF3Q9RS4,QJSq32fJ9如 \a\{mHJhrFb7UO9,Pt1dBJ9qUn} 表示m 到n个英文字母mPG1t5R70964。Niu8p7za0 {mJ99fd,qaj2Fy}: 表示m到无限多个字符91Xctwlwwi。75ZaL **: 当前目录下的所有子目录83nyjxS7。Qf42a6rHY :help pattern得到更多帮助78SL57EX。218Ak9A 8. 排版 8.1 基本排版 << 向左缩进一个shiftwidth >> 向右缩进一个shiftwidth :ce(nter) 本行文字居中 :le(ft) 本行文字靠左 :ri(ght) 本行文字靠右 gq 对选中的文字重排E5E5tfW,0BbhTZ98E37yq即对过长的文字进行断行 gqq 重排当前行 gqnq 重排n行 gqap 重排当前段 gqnap 重排n段 gqnj 重排当前行和下面n行 gqQ 重排当前段对文章末尾 J 拼接当前行和下一行 gJ 同 J uMXz720F2fg8ce,3GehFHmk153不过合并后不留空格Ab8DBI2。6tI7w0uGv 8.2 拼写检查 :set spell-开启拼写检查功能 :set nospell-关闭拼写检查功能 ]s-移到下一个拼写错误的单词 [s-作用与上一命令类似gAecB9,tj9008YQU3wm但它是从相反方向进行搜索 z=-显示一个有关拼写错误单词的列表2hIvb9b63HF,E57m0y36BQQ可从中选择 zg-告诉拼写检查器该单词是拼写正确的 zw-与上一命令相反Ss8mis0T9ut,bKMAbXx告诉拼写检查器该单词是拼写错误的 8.3 统计字数 g ^g可以统计文档字符数6QrM69,Sp8O6wN行数4j8CP1。33lat 将光标放在最后一个字符上02j7fBbXX,S5iBE用字符数减去行数可以粗略统计中文文档的字数12526vlDE。zF3MVaTxH85TCq 以上对 Mac 或 Unix 的文件格式适用3GyJ5e。2yEN8KSQD8lMLv 如果是 Windows 文件格式(即换行符有两个字节)bT92hOgWF3grP,6VhmH0a9FG3P字数的统计方法为oa36a9gpU6fU:1b2HS 字符数 - 行数 * 2hF13c0TvJKJZ。yml9ZQ 9. 编辑多个文件 9.1 一次编辑多个文件 我们可以一次打开多个文件42WNKzj6t3,eFDc98如 vi a.txt b.txt c.txtDvw4oUvY35D IEJeyUzR6 使用:next(:n)编辑下一个文件Lj7Tmfy8V6u。hcUu396Dp4 :2n 编辑下2个文件Adngy2QXMiggUE。9xh2lTHmTP 使用:previous或:N编辑上一个文件as1bpd2z。SXwA5tG1XU02 使用:wnext012yL7QKhEin,3ZEz5fG4保存当前文件wDX16l44DlRI4,iPC74WCHhE4QG并编辑下一个文件Ssos81dR。SUXu4Mj3dB 使用:wpreviousw5BZM4IC,bTUjRmY8U保存当前文件4ZP1J79EY38,Q1au33718v并编辑上一个文件CJ9UCi8KJ8a。ysfc4M28 使用:args 显示文件列表wK7ul7。mZYAhZ4H :n filenames或:args filenames 指定新的文件列表pmLzbEhHI。2IIYIlVQ vi -o filenames 在水平分割的多个窗口中编辑多个文件ZxF2ogg9。lcu62s vi -O filenames 在垂直分割的多个窗口中编辑多个文件uWV4y35kM4e8N6。Tr94W7 9.2 多标签编辑 vim -p files: 打开多个文件BO4ttp6,55Hv4lU6lT9oV每个文件占用一个标签页zl115。5fYlYqQT5C :tabeu6w6N35,F6yqOFxmv94 tabnew – 如果加文件名w31yhytE3XN,y313L就在新的标签中打开这个文件X0245qM3tKO87K,15uaj1S26gCH2l 否则打开一个空缓冲区8wBGsK4yTn。AbdLk ^w gf – 在新的标签页里打开光标下路径指定的文件Qozsor2but05z。tXRa9393dHle :tabn – 切换到下一个标签XTE3s0GJwNeL。9Q9jxQdControl + PageDownu0j21,h7jHyoSlhu也可以o9Wy5iyM67851。eU0poa1 :tabp – 切换到上一个标签HUyju6zWk。Wa2303Control + PageUp2oZlrh33284,ZqGB12VOPz8Dy4也可以Kha6lGd。5xRYw [n] gt – 切换到下一个标签EJP8NK3D0K5。D85q1jws如果前面加了 n OrMG6S0l,rJB3XIQl384S5 就切换到第n个标签73cTrgg4L。I91owq0O0T第一个标签的序号就是1XG6mrV352CtbR。neV51vO3eWP :tab split – 将当前缓冲区的内容在新页签中打开uX57OwDxKXJIo。9Bl32kk5H :tabc[lose] – 关闭当前的标签页191W72。J0oJ2Yr5mWb :tabo[nly] – 关闭其它的标签页a0XF9Y9tGI1HXD。YB9Ayx2P9XQ4 :tabs – 列出所有的标签页和它们包含的窗口f3E6245T212pH。wti90c0Q3uUH4E :tabm[ove] [N] – 移动标签页Ue604,Zv4fyIllefHv移动到第N个标签页之后JYWGqqnw53。Jpwdrv0I023 如 tabm 0 当前标签页8qgI61P5,1gd6Wahi就会变成第一个标签页0711Z5nrmctgm0。U9G9tIdY3S7Ra 9.3 缓冲区 :buffers或:ls或:files 显示缓冲区列表3E3uhLY。52PMz6AZ ctrl+^OV61D:t9j7NKtH在最近两个缓冲区间切换mO7764。RB1G50x :bn – 下一个缓冲区3eKi6PDS5。1J3Urr :bp – 上一个缓冲区jC2uIAgJy6。6WXU8If :bl – 最后一个缓冲区NJo24KBt。YM09aAI5m25W0 :b[n]或:[n]b – 切换到第n个缓冲区132dh3b2n。lf9V4MJp9Pb :nbw(ipeout) – 彻底删除第n个缓冲区gEgIFZ。DdD3BS29lX26a :nbd(elete) – 删除第n个缓冲区f8T0fJ,KNCQKh866JAaz6并未真正删除650Hb9B,sYaEa6还在unlisted列表中5gTrZ6oeai3。g7z8rrn :ba[ll] – 把所有的缓冲区在当前页中打开z60CNc86W787,9rNul每个缓冲区占一个窗口4c87koa2S6。MuG412q1V2m8d 10. 分屏编辑 vim -o file1 file2:水平分割窗口uijGg94KT238,tzl4ugdrWlZy同时打开file1和file2 vim -O file1 file2:垂直分割窗口udE6g504MU,6UnNcK36fX同时打开file1和file2 10.1 水平分割 :split(:sp) – 把当前窗水平分割成两个窗口z27U7。iqwd5HxGfY5A1(CTRL-W s 或 CTRL-W CTRL-S) 注意如果在终端下x82Xb091X7Lh0i,Ke1bF00s48LcsCTRL-S可能会冻结终端fz9ljETi893,mJSpfjW请按CTRL-Q继续oVj0vF47。dcZQY3g :split filename – 水平分割窗口43tKc4C,AVsJIKt9Llp并在新窗口中显示另一个文件gaL87O。uMStqw7Aext :nsplit(:nsp) – 水平分割出一个n行高的窗口zgmv1kG。6HxUgW0iD :[N]new – 水平分割出一个N行高的窗口OaWCM6q0J,V6qphb7yS2Bh4并编辑一个新文件vFk19TG。3RvOH0NL1ykSfY (CTRL-W n或 CTRL-W CTRL-N) ctrl+w f –水平分割出一个窗口2Kr01055l,33p13l5并在新窗口打开名称为光标所在词的文件 Tl9JFo392BE。ZEyk7I C-w C-^ – 水平分割一个窗口hZBBBj0rv8fW,Yp6Q2h3Hb8plQ打开刚才编辑的文件kmfYrb。EJP0BBlS9g6VHK 10.2 垂直分割 :vsplit(:vsp) – 把当前窗口分割成水平分布的两个窗口1L4Lz5。2RI2v (CTRL-W v或CTRL CTRL-V) :[N]vne[w] – 垂直分割出一个新窗口lNtmXot3To。xNJ67gJAFsIZ :vertical 水平分割的命令sX5jp5G50:i4fo4sY2 相应的垂直分割mNNd2aTdewa。y378gt81jpheAI 10.3 关闭子窗口 :qall – 关闭所有窗口1O22kJAq4T9i,H79y6fV退出vimDcG442oW6。Qi38L4izk33p :wall – 保存所有修改过的窗口8hk3f。LW3fFE9jG8cuY0 :only – 只保留当前窗口5gupWb7,t8Y50ahmfX125关闭其它窗口Oz6vwikOrgUHU6。OZcAM895xw(CTRL-W o) :close – 关闭当前窗口5WhdPuJrn,nv6U42Xl4wwCTRL-W c能实现同样的功能UfKBnaZ。2BPeCsirj (象 :q :x同样工作 ) 10.4 调整窗口大小 ctrl+w + –当前窗口增高一行00bbMYe3Q。go5j6s12X9也可以用n增高n行9PGnRuxhIZ。BRAQL87Y37O ctrl+w - –当前窗口减小一行6xn3Eo71。yBnU95b8GCk也可以用n减小n行0aEqJ4CGLuQA11。otYQ2ykYPlb8 ctrl+w _ –当前窗口扩展到尽可能的大u0Cyjr36NC。taqoDY61也可以用n设定行数i0UJf0y。5y3S67OUs234 :resize n – 当前窗口n行高u4E13。ir9Ivg0i9 ctrl+w = – 所有窗口同样高度XXTajwnzTqI2ug。T10SnG n ctrl+w _ – 当前窗口的高度设定为n行rD69e1B53h。ch1oc0w0A9q6 ctrl+w < –当前窗口减少一列Pl9u0t71RZZHi。26S0M5sWCM也可以用n减少n列SS7E0j。lf311y6Na ctrl+w > –当前窗口增宽一列Dw8C0。9ZqfiTImjF2B08也可以用n增宽n列e3UOYD2Xj。F8zQh0m23Q6aBw ctrl+w | –当前窗口尽可能的宽7AaZr。zLy2a4也可以用n设定列数2966TPfkun。i0VRbbwweBU 10.5 切换和移动窗口 如果支持鼠标eX0xY,nG6GY2q339cFq切换和调整子窗口的大小就简单了X2Ygp1XD。FPQxQSJ7536f ctrl+w ctrl+w: 切换到下一个窗口iBbX4R1。3sY2RrQ7或者是ctrl+w wvYvGm。Z04U4CmkswI1t0 ctrl+w p: 切换到前一个窗口0Hc56。Mn6tze3 ctrl+w h(lzh38K15FSzW,fXV72W3jD0tCt1oPw,6od8a266Fk):切换到左(右TF1qnoyC,H4NwMz8s下E7h2qwg8grG0,xKM3qWOOFq3上)的窗口K7vnyOhI0B9。ht88J8081s ctrl+w t(b):切换到最上(下)面的窗口j7aSx84c83nho。5ts9H8qaM
ctrl+w H(L907hkt8,G7wQst7y1LpKTmIfcZMZriq,UYtTbH5BKZqJ): 将当前窗口移动到最左(右SOBwnBg4TQVOl、5gVS824egFCi上993AD6yl3、29keEboNOrG06e下)面x64VClyQ7On。TDjq9y6k12XZk ctrl+w r3UQ8m1IAxl:Bfev5xC旋转窗口的位置XxBe0ECzryN。bpavh95wu7uF6 ctrl+w T: 将当前的窗口移动到新的标签页上jAqIERTk。5tRJ6f 11. 快速编辑 11.1 改变大小写 ~: 反转光标所在字符的大小写hES1xk191X8Ba。5gUqG576OPP6 可视模式下的U或uve6dZXZV3:ff1Jz8pUQ4eF把选中的文本变为大写或小写E5vrTN2N343O3。ZjN1t6tyKIonpo gu(U)接范围(如$r05R8uBbxZVR0,BShWpQ4Vh或G)kuRQ0R,h7iybyj可以把从光标当前位置到指定位置之间字母全部 转换成小写或大写g3QedXd4A。82zn8EVOjP1如ggguG8531q,l57O1Y396LsF3就是把开头到最后一行之间的字母全部变为小 写Nl73Hp6Y924M8l。9feDZuUOn5H再如gu5jvE63if45,9899QI7C7LCuF把当前行和下面四行全部变成小写6HS66。e3hIlmccU0Wa11 11.2 替换(normal模式) r: 替换光标处的字符X6CRPw3D8,8f5D7同样支持汉字JO1XbhXym。95PC4an1xmE R: 进入替换模式n5GR9Sfk,Lhej092fNF5A按esc回到正常模式lPKrs7uZO5。0yCbNl 11.3 撤消与重做(normal模式) [n] u: 取消一(n)个改动bQ5m0L。LToQ8r2z0A8UY :undo 5 – 撤销5个改变z7r16G3Lq1J。7g10ToXo :undolist – 你的撤销历史jR81aM。8jKf97 ctrl + r: 重做最后的改动ybM40o3A296。P73JV3qJ7 U: 取消当前行中所有的改动G1Jc9。Se8JV8pyVSel :earlier 4m – 回到4分钟前 :later 55s – 前进55秒 11.4 宏 . –重复上一个编辑动作 qaWWSwE0tW6b4Q:Dn9ya8开始录制宏a(键盘操作记录) qYO3L6xJ:6RlBBCC停止录制 @atQ0Ed0N05fn98H:3S60ZOYyF14播放宏a 12. 编辑特殊文件 12.1 文件加解密 vim -x file: 开始编辑一个加密的文件71l90HnFx5。M3I9Lu2Pzqe0Z9 :X – 为当前文件设置密码p25w3l2wi。8i9SV1 :set key= – 去除文件的密码yqv3mXjIa48pk。LmIODhCu2q 这里是 滇狐总结的比较高级的vi技巧YZ94JNOgnb。7mAY2T98LnR 12.2 文件的编码 :e ++enc=utf8 filename99q4G6708xb,0cHqutO4pz 让vim用utf-8的编码打开这个文件29U3ME4bcI6RJ。5YnGx1XX1t0 :w ++enc=gbk5A6056i,YD2GJt不管当前文件什么编码22juR4sL,BPd48zIBvy9O把它转存成gbk编码wQc67n7。al80p9 :set fenc或:set fileencoding1J6JC,cWN0Dl9g9W6查看当前文件的编码7yVt7S7B93P43。KL8J8L4gIL2n 在vimrc中添加set fileencoding=ucs-bom623LP7P48H8Y,2A05rEaAD0qgzutf-8dYvv53OJt5IQAY,h4EpjF5Qcp936xo2U1h709,0LpM8H4wvim会根据要打开的文件选择合适的编码umw7RSa022ZIzG。il333kGU13k 注意S9n0la238MtY64:kB2tTD798hVe编码之间不要留空格34o6xW4vle。9683857 cp936对应于gbk编码iZmd5xV。1WeDZuZui8f ucs-bom对应于windows下的文件格式GJJw0JUp43v。VE3C354SYgRnwg 让vim 正确处理文件格式和文件编码98Gb0M9,LS7w3k2248Q7有赖于 ~/.vimrc的正确配置 12.3 文件格式 大致有三种文件格式keSHcEOUaL575G:0t60yIAO53unixn9Y80kL90x91,9Rqm4j dosNb91UB0j,Cav3cNq5k mac. 三种格式的区别主要在于回车键的编码6J3999p3L:i2W9L4dos 下是回车加换行rVYmlo38R8V466,FT712AW43X1e5unix 下只有 换行符r8C95yD3,govR6mac 下只有回车符50n48。Ea1zwr :e ++ff=dos filenameVRAXGE6jLbph4,qWT6CTM 让vim用dos格式打开这个文件9X9DmfM。PCu4xM8Z78PB :w ++ff=mac filenameWfRFrf1T51,1LNqsfe3k8Z0Dz 以mac格式存储这个文件508Vrc。752Xlihq :set ff649j6161,5sZGd显示当前文件的格式ItK650X7。OcX6BZW6Dtf 在vimrc中添加set fileformats=unix1GpgiLa5y65,031Or6dos2RFD1Oq981,8katK7ZpH42macmy6bNtZ7I5,46uk3让vim自动识别文件格式I5icrPc。9rnCxS5LAe1107 13. 编程辅助 13.1 一些按键 gd: 跳转到局部变量的定义处hwMGFSSxYcku7;FViA3 gD: 跳转到全局变量的定义处38Vh34H3a9Q8JU,N77m37D9YhyF从当前文件开头开始搜索QT35o6e;wA3w3gm8yCIL g;: 上一个修改过的地方009Qzem2sTVVw;GL3F69e1 gQNUSG,6s99IAUZR9GnB4: 下一个修改过的地方crMXw9;P5s4g6p [[: 跳转到上一个函数块开始5i7PEbQv7,77UvM需要有单独一行的{y5dci3li2KHd。14n81UeTG5 ]]: 跳转到下一个函数块开始csb8ARMJ9HL0v,to1240E需要有单独一行的{Nkl798U。4EE215uVHZqy []: 跳转到上一个函数块结束GMYaOs2vnnSDm0,26B3NU1H4需要有单独一行的}l1Qvc3FwD。W96b6Blu0 ][: 跳转到下一个函数块结束hG5x40gsrc,Ls8l95需要有单独一行的}wGtg40CGFlkq2b。r8Vjz3yRtZ2xW [{: 跳转到当前块开始处ca92D1KjK;dK8HtTh6 ]}: 跳转到当前块结束处d9vQ1;5GLvMbftkHG09 [/: 跳转到当前注释块开始处44NWR6Ygyy0AU;jqCAdx ]/: 跳转到当前注释块结束处7S5w0862up260;Wx0G8TI5 %: 不仅能移动到匹配的()48vQs7ASMF1,K39rTg6f1G{}或[]上p4Dgu4jeD1SSO,T70bQ3cm9而且能在#if059sU2B,w26vl5RxG#elsef6e84jkigeC3,E191Q5nzA #endif之间跳跃i98sUpCMH9TEc。7wlZQ2dQZMML 下面的括号匹配对编程很实用的9413YJ4W5JtP。zrTVr0l88wZ ci’0OX9T224v4Ru,2x4jkH di’96bds1p0490,LO42G yi’2WMM8H:7rUZk7dTbe49Wn修改Lgvbm、OW3kny剪切或复制’之间的内容R81B7L76A。AvPz4KZV ca’i1D4Ojl2vj,4DK0GS6o08i7hA da’mN76mFU231fJEt,QA9Hs55 ya’g32zI9x:0k97Q27EI99修改0zW4Mg26hzV476、35paXOKNZ剪切或复制’之间的内容VR0UQK76E1C7,ww1ku3Z8包含’3aivt8p。5d31H4fZ ci”2kmf7Mp5,vTaA045 di”85Wb1K98m54z1,Fu8uF37Qt8HUgp yi”o2l9r8:3RH0b9EfvWnG8A修改3eUb5aY、pja6ejy8Mx剪切或复制”之间的内容UnB99。xHK53oS4 ca”9ffI8,N8oC7yKMGoJ5ZI da”Os128VrwtI,d8XT0zCh6IQ ya”iH5uUFg5fZ:my12MzFg87Fh修改oBHny7kU、ygyd2剪切或复制”之间的内容R5tv8CkbQnW,7Hk6i8v包含”Xfmnd03hwj。OWDhF5 ci(H33OeTCoq7,1JIS44ufnu73hS di(1A2G1WII4mO38,t4R1fg yi(9nM3w:k4Z29831PUU9Q修改e2zFcV4ZXM、0cpk2Bx5P剪切或复制()之间的内容H4Q8Mf6e。85XBYojpodzm ca(3nD9ti,10r0OjKd da(MS7SN5,oQOrg ya(exsm8:mdV69vdJZdC修改pmPk97TaU、A8lFy09G剪切或复制()之间的内容J728gzgn7834e,O6j7Rjv包含()9IAHs14X9LBm。0lTnmn2BVwd1I ci[C5V3XZ5aH6Ofi3,HgnBRh1K7e di[z1d85qHa81F8,8k5mIR yi[8OYbRNyUuy5l4y:e387dFy修改cmxudv、C699kQ3v0d5p7x剪切或复制[]之间的内容Kwy7cwH54NhK3h。y15W3 ca[1GaXQCvw1BCX31,i95pJQz da[k1kpCXKxMYjFs,t3Uw11Mv4d5Iq ya[N7r5C5P3dK7c:63g3TO7i修改6tMg0r0A1、Pal9a8剪切或复制[]之间的内容DVLfk8JJ,KrA060W包含[]rT5nY5。YK0KP0 ci{UCqtKgNP3M,cjh2wJGMo63i di{Yi7NaG6,0YRvhn0jE yi{A9FhrGQU9E:F42QBW6yvw修改kKaNg773j、78N1gY剪切或复制{}之间的内容pU94lroQCma。TOopoyH8cy ca{9pkO5ktoU0,Z4PIB da{m9RC70c8,Elb2nud6 ya{EvzQglqPRN14i:8a4wc0H90k6修改ttHc4Mj、7O7Xy4s5bzX6F剪切或复制{}之间的内容84BLFEs81,v7b8Byj9tYf322包含{}YPCYGvaMvVTmC。qV5A2y4TCyx0U ci<4r64B18EVikfar,W5PUe di之间的内容2H4z43StDc5。96oI7i ca之间的内容w0BR8E9SBf,Pw2Ma1a8包含<>500T5。TdlT9 13.2 ctags ctags -R: 生成tag文件8Lvr8,37Gd9c1x5463c3-R表示也为子目录中的文件生成tags :set tags=path/tags – 告诉ctags使用哪个tag文件 :tag xyz – 跳到xyz的定义处98BYhw201,Pq9DEJ2R或者将光标放在xyz上按C-]zy3nak,2c310返回用C-t :stag xyz – 用分割的窗口显示xyz的定义54Pr5tZ8eHg4,ac0b8B48OOcm或者C-w ]SG0au5eRS2jJi0,5KmmT 如果用C-w n ]N4MZG0VN144UO,emE95DB0KLB52q就会打开一个n行高的窗口 :ptag xyz – 在预览窗口中打开xyz的定义XXvH2u3jEFJQ6,2Kw7ach7ihP2el热键是C-w }LWS1IH3J2n。71l1uz2I2WK0F :pclose – 关闭预览窗口gcB4R2E5B14rmu。zeRi7MROElxN热键是C-w zhLqTa0。zFwe0v3S5gcN :pedit abc.h – 在预览窗口中编辑abc.h :psearch abc – 搜索当前文件和当前文件include的文件4P5MVa2C5A,fMSbte4R显示包含abc的行J4OD0es9Xr4516。9ec19i8GotU 有时一个tag可能有多个匹配T53gZ8Pvd2d,u27Xpil4qnX如函数重载9G5L7H8eke2cI9,1s91RN5jFK一个函数名就会有多个匹配S6SRuHlN。2042r3 这种情况会先跳转到第一个匹配处47ohPBe。ADl2y4T :[n]tnext – 下一[n]个匹配7kbt314KMnb1U1。3o4n7p1GKaFnK1 :[n]tprev – 上一[n]个匹配7s1iLS1ai80U。TuwGDo92PZ7 :tfirst – 第一个匹配 :tlast – 最后一个匹配 :tselect tagname – 打开选择列表 tab键补齐 :tag xyz – 补齐以xyz开头的tag名7xW6L3VB,PuSmO8wq5n继续按tab键4x21Bbpxr8Tu4R,87u50j0zqMD6x会显示其他的l4Jj8L0x3rJPB。baBIO4eNjS7P39 :tag /xyz – 会用名字中含有xyz的tag名补全w6ItoA027C。IbrtAEvIQXLD00 13.3 cscope cscope -Rbq: 生成cscope.out文件 :cs add /path/to/cscope.out /your/work/dir :cs find c func – 查找func在哪些地方被调用 :cw – 打开quickfix窗口查看结果 13.4 gtags Gtags综合了ctags和cscope的功能V1627hAXp0K5。t02q8153k 使用Gtags之前529Bt57th9x,C50HmpTm2E你需要安装GNU Gtags3IYeg6R。euOGgm 然后在工程目录运行 gtags uWSXsz9。k76TX :Gtags funcname 定位到 funcname 的定义处M3abV5EH。Vy5s1R3981n :Gtags -r funcname 查询 funcname被引用的地方oqLOQoO29。7J5EJ2KX :Gtags -s symbol 定位 symbol 出现的地方THINtY9ca5V。z05NaEbTBhh42Q :Gtags -g string Goto string 出现的地方bHmW2Mn3HQbJwl。l4m7B0jg :Gtags -gi string 忽略大小写trS8E83RSrSH。d0Uq4NCc9b4z :Gtags -f filename 显示 filename 中的函数列表97VfZT34gky。e3pO739s 你可以用 :Gtags -f % 显示当前文件0aOeUYrC7OO。lB6KmHMGs :Gtags -P pattern 显示路径中包含特定模式的文件7ErX9X1Vo。635Bas1G7eDY 如 :Gtags -P .h$ 显示所有头文件8Gh9tDx,D1FUUXTvq :Gtags -P /vm/ 显示vm目录下的文件ZFPn41122G3U。vwF30 13.5 编译 vim提供了:make来编译程序uc64I1u6W,i87jdG6cd默认调用的是maketo3O37lL,oxf6h28 如果你当前目录下有makefileMQIdc8J2G8,6Kf53pW7KN简单地:make即可C46YA2pvA1Q。BnSOgBJOQ 如果你没有make程序DE788,Qtq4NrAxU1p你可以通过配置makeprg选项来更改make调用的程序4T6bgmWke。Kaje1 如果你只有一个abc.Java文件g7RWVQ,ad8wOy31你可以这样设置5O5kwGVK:75K149Z2y3VOF set makeprg=javac\ abc.javaJi0KSgH7U N32YItYpd7r 然后:make即可VNkY3。8FqP7584916qv如果程序有错K0hZPfp,4dzM9f可以通过quickfix窗口查看错误kxj5MY5PjO3i56。4ezw9 不过如果要正确定位错误3I9X86,Fx7QCxAxdqx05h需要设置好errorformatytacBeC48R5,d6dNQo8YC58D让vim识别错误信息se5tFV749p。qHJQdK2vx 如67m14pQgNG:09S95 :setl efm=%A%f:%l:\ %my8afby,Dkb9tEr%-Z%p^08ljDK1PpL4r3,Tu1j8jW1SS0B%-C%.%#32lBzpfh2lg5Ys hO2E9sfNBg %f表示文件名wi5bjwr,2v99i%l表示行号RAG39a,u5jg50Fix89r3B %m表示错误信息731uk,S9P6J7HM其它的还不能理解7vKYB09m2e。GPTtHZ 请参考 :help errorformatchl03Bi6V037mC。BM29Pv56uzOf 13.6 快速修改窗口 其实是quickfix插件提供的功能3Igeo1z1pot,I47c4rIwz 对编译调试程序非常有用 :) :copen – 打开快速修改窗口U6mfRQfu。wWQ2d20IM3p :cclose – 关闭快速修改窗口9Lq1bsru。kYvlU4T5OO9 快速修改窗口在make程序时非常有用47F4s6077x3,euDXr2o8291hz当make之后cF52p:4oYl5J5zKB3h :cl – 在快速修改窗口中列出错误JB93n4kN14JgIC。K35Z9oUu4jb :cn – 定位到下一个错误nIxNR4y。09a19 :cp – 定位到上一个错误sipA9TX6ul。S2lwbYAjZUG :cr – 定位到第一个错误Hthqgb9G1c。82OU5w44 13.7 自动补全 C-x C-s – 拼写建议9jziu。Z3bg069XE8Ui C-x C-v – 补全vim选项和命令Pr7bX1cS9C6ncP。er2tY3pF C-x C-l – 整行补全Fvle59。uQhb43B84gK1 C-x C-f – 自动补全文件路径9Wr88Uc。iVqD01N6QcU弹出菜单后h6Ih2lj20Mp,7T6w8按C-f循环选择laX5v97m2j1,7HuDIa当然也可以按 C-n和C-pH8R8I3fcI2f。TxFzNqZf367MF C-x C-p 和C-x C-n – 用文档中出现过的单词补全当前的词J5z89FZla8IN。fCw803ogLP 直接按C-p和C-n也可以wj3U2WBaq5U。oX00a48 C-x C-o – 编程时可以补全关键字和函数名啊O5sE2W0F。PJMyP C-x C-i – 根据头文件内关键字补全K2Ysn。RQTc2 C-x C-d – 补全宏定义vL9m56eA。iqSEh4Ys7NjB C-x C-n – 按缓冲区中出现过的关键字补全ro40PthB。dwJRK 直接按C-n或C-p即可dyo0JtZZ9。LB51BGR9oHU 当弹出补全菜单后1GO784059f:7H9rksiexxi27C C-p 向前切换成员m774S;7H27z3H23J C-n 向后切换成员KE9Tm;5j70l1Q C-e 退出下拉菜单1J8Qg7705X4bE,fr2KMfc3K1gEr并退回到原来录入的文字rVtFzV9V;dgjemTY25 C-y 退出下拉菜单9EB0Vooj,Sb3qnp并接受当前选项PQEC0。NxyaRK5TIE658 13.8 多行缩进缩出 正常模式下evd3ySolPBWv3F,3i44CB5uB3oRMh按两下>;光标所在行会缩进SmjJLC。Z3Ea8Y2Rd7a 如果先按了n2t6E6r,Aa25j01x再按两下>;FhKTfz4twy,Z4TSV6NiIu光标以下的n行会缩进wFo0K2C3Gxg5。Mh6GXK4O 对应的Y1dM0GHcuwnz0l,UidU12qt4NS按两下<;lcZp7P,2854nmj光标所在行会缩出OnP1ARB7QeOnZR。it1T8X43bUx 如果在编辑代码文件9dHS3GVTDoQop,Y6rKMI2U可以用=进行调整9b0nVkMT8Fp。yjK8VNsukBT7 在可视模式下Tl79b,HAokz选择要调整的代码块m6WJ51aFUl,1RXt7v64r4按=8Gk3EHn6J,yjZmJ04870TK代码会按书写规则缩排好Yx35s62VvTH。9HwP74V5i7d5el 或者n =v5c7I27R3,I2NZDZDp调整n行代码的缩排u051HYxGdW8VRe。61ZV514F510s3w 13.9 折叠 zf – 创建折叠的命令h56oP6Vg,nG45J9可以在一个可视区域上使用该命令81VGn2;QC2dxYta9 zd – 删除当前行的折叠O8Ek4RyS;bbmtB2U zD – 删除当前行的折叠EZRGLa342;z0es5 zfap – 折叠光标所在的段0yG05aKMTKBk3p;1HC614PeH zo – 打开折叠的文本3jChYcP5;h1vB604suf zc – 收起折叠9DH4sgP1AR111H;Hevq8OF za – 打开/关闭当前折叠soNlIIO5aJ6Q;C964Hh3Sad zr – 打开嵌套的折行ELuT8oJsCOFCJ;3LvE3 zm – 收起嵌套的折行Hw4ecziJHZr;WgnVCnmU2YUga zR (zO) – 打开所有折行u2BtN;BwxXlf5 zM (zC) – 收起所有折行dzDK0a2s1k;9xtXzeS9 zj – 跳到下一个折叠处C4a5rFtMv;cGE72RRz0a9 zk – 跳到上一个折叠处7wzn3;K52gh6 zi – enable/disable fold; 14. 命令行 normal模式下按:进入命令行模式 14.1 命令行模式下的快捷键8l7egNOo:0ZmE0qkqo6q 上下方向键G7wNc48:o596NoA5上一条或者下一条命令YO2s1。437nSBO4hpJD如果已经输入了部分命令hm786uh,sa84cAe5则找上一 条或者下一条匹配的命令Q5jfUxsh2mlz。9wCV0 左右方向键9P8hx2:0276pq左/右移一个字符T3b0e58p2FD2。oJjOfq24u51U3Z C-w2SN3zG8q29R6C:Va1hmAeSHo 向前删除一个单词TIIdfq03v。1zrAm23cIBb63 C-hY2RtQuz062:n3L2M9b115JeE 向前删除一个字符n3u2n,421V2zf19等同于Backspace0okoc6。k8FL98tV5F9n3a C-ur49PJ6NXXMgeU:URH32QM3mQmnW3 从当前位置移动到命令行开头8115td6wS。g7NoD3IKp40na C-b36i5N3osS7U1f:K8140iZZ 移动到命令行开头L851D6gkzxQ。Oa6O9T5C64c5 C-eKa8O96:GkU48G1 移动到命令行末尾3gtZhG5t56G。yvFXh Shift-Left27zzjIo54O8Wv:C16eb359mS 左移一个单词P4a89UH1LF。7HJ5HnXQ Shift-Right5rItj:748xFPYX 右移一个单词x75OH9Y。V4CuW @716aDKa597HS:c09Rm5XBOcmZKg 重复上一次的冒号命令1C90L40F86P。bribIqut qluSIntFG1IF2zR:MpVNaveq042hLz 正常模式下sEVVDd1bboL17g,R2CFghTve6q然后按’:’orxSjHqnECMh,577aQgvxx打开命令行历史缓冲区bUj42SHVJ,NPL7E 可以像编辑文件一样编辑命令J18144DtPg。OXM5K35 q/和q? 可以打开查找历史记录5814X6uId1。855w0uDJy7Q662 14.2 执行外部命令 :! cmd 执行外部命令0D0RAkNC7。K5JT3w :!! 执行上一次的外部命令mlkhCY。3bw9HnJh9p9x :sh 调用shell1hng10OJkCfm5,n1n9k用exit返回vim8WMvdr7753u。guPXPj :r !cmd 将命令的返回结果插入文件当前位置c82E2y1M。vjJ5Wp3 :mU6ab3m0,Axm3NJnw !cmd 将文件的m行到n行之间的内容做为命令输入执行命令735mOLDO。469Z1X 15. 其它 15.1 工作目录 :pwd 显示vim的工作目录TJ479zn9z06。112mmuPgZjy9 :cd path 改变vim的工作目录wF6Dv。9baU9CCQK :set autochdir 可以让vim 根据编辑的文件自动切换工作目录Ren5GS。3qm6I 15.2 一些快捷键(收集中) K: 打开光标所在词的manpageGGEMkc6nT。tUunqY8t1kLT54 *: 向下搜索光标所在词9bq2sdL。f9A3skz44 g*: 同上RhdpikfE6HB2f,oHRY3OHr22Rs8但部分符合即可0QbaC9。r0p976hQ9om #: 向上搜索光标所在词lbxk13s4BXhI。M61438hnS52 g#: 同上S6Qfl5OB,oMPcvDCc8A5V8但部分符合即可hg9Gzk。Irdw51aX g C-g: 统计全文或统计部分的字数8gNsO。66B3ZlH2k3 15.3 在线帮助 :h(elp)或F1 打开总的帮助PU2X71Bn7GV。1Fy3O6pnen :help user-manual 打开用户手册6Z1co。GS85yx1LV68l 命令帮助的格式为rorERA:FjLsr6PE6f第一行指明怎么使用那个命令2sskGV7Du9;zLBT4v47WIV 然后是缩进的一段解释这个命令的作用0j4a5Dz3,yVJDU然后是进一步的信息5ANcKvV。M93I6dfsT :helptags somepath 为somepath中的文档生成索引50x4cVpA1X5。yEfa0q :helpgrep 可以搜索整个帮助文档cL0a4M7yp4A9xR,604K5QY225iN7匹配的列表显示在quickfix窗口中N24GS。oF160M20c Ctrl+] 跳转到tag主题60Kn964a030hn,vd73n73oCtrl+t 跳回Y78Ca。YeI8Bad5QXAQ5 :ver 显示版本信息xCws7hoF。430l1G37E9D 15.4 一些小功能 简单计算器: 在插入模式下32E3X26kO5kw,B8RSP2Ht696jh输入C-r =E5i6Giuvv,su586B然后输入表达式27B4H,m98V0l3就能在 光标处得到计算结果