vim学习

vim常用命令

  • (1)进入编辑插入模式
    a:跳到当前光标下一个,即在当前光标后面插入字符,(光标会从当前后退一个位置)
    A:在行末尾插入
    i:在当前光标前面插入字符
    I:在行首插入字符
    o:在下一行插入,即在当前行的下一行插入一个空白行开始新的插入
    O:在当前行的上一行插入一个空白行
    a,A,i,I等不会开始新的行,而oO都会开始一个新的行。
  • (2)在插入模式光标闪动时,都是在光标前面插入字符,每次按ESC退出插入模式,会自动退到前面一个字符,而不是在原来的位置处。

  • (3).表示重复上一条命令

  • (4)粘贴命令p是在当前光标后粘贴,P是在当前光标前粘贴,如果复制的时候是一行,则粘贴的时候,也会在当前行下面进行粘贴,而不会在当前字符后
    面粘贴。

  • (5)ddyy都是针对行
    d表示删除,y表示复制,命令格式是 起始 d(y) 终止,如果不写起始,则默认从当前位置,但是终止位置必须要指定。最后按回车键执行命令。

  • (6)数字+命令,表示连续执行命令几次

  • (7)在vim中光标所处的是当前位置,i是在光标前插入,a是在光标后插入,即光标处作为当前位置是一个分水岭,

  • (8)cw:也是进入插入模式,它是将当前位置至单词末尾处删除,然后进入插入模式,即是一种替换

  • (9)f{字符},是在一行内查找出现{}内字符,并将光标移动到该字符
    t{字符},也是在一行内查找出现{}的字符,但是它是将光标移动到该字符前面一个字符上面两个命令,如果想重复向下查找,则使用分号如果想重复向上查找,则使用逗号
    即行内查找使用ftt后面可能常跟一些符号,比如分号,小括号,这样就会掉到这些符号的前面,在行内使用重复命令,跳到下一个,不是用nN(它们用于正篇文章的查找,下一个),而是用逗号和分号。

  • (10)e是移动到下一个单词的结尾,当然这里的的单词指的是以字母、数字和下划线组成(就是程序变量),w是移动下一个单词的开头,b是向前找单词的开头,而w是向后找单词的开头,在找单词的开头方向上面,两者是相反的。
    EW是以空白符为分割的单词移动的。

  • (11)%:是括号匹配,先将光标移动到一个括号处,然后按%会跳到与它相匹配的括号处,再按一次,又会回来。

  • (12)*#: 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个),并且会将这些匹配的单词高亮,即它们都有两个效果:比如*,它会将光标跳到下一个匹配项上,并且所有出现该词的地方都被高亮,移动到下一个可用n,移动到上一个可用N。#的效果是将光标移动到上一个匹配的位置,并将所有出现该词的地方都高亮,但此时n是向上移动,N向下移动,即n是一种重复,而N是一种回退,它们根据命令的不同,方向也不同,不要认为n始终向下,N向上。可以这样记:因为在键盘中#*前,所以#是向上找,*向下找。*#查找与/pattern?pattern在查找某个关键字方面很类似,只是*#不用输入相应的单词,而是默认使用当前光标所在的单词,当然查找方面/?功能要强大些。

  • (13)vim中使用:h或(help) 命令,可以查看相应命令的帮助,退出帮助:q

  • (14)在vim中常用到这样的组合: operator(操作符)+ motion(命令),可以用:h operator:h motion,查看帮助。命令用在操作符的后面。
    操作符常常是一些删除或更改文本的操作,比如c(change 更改),d(delete 删除),y(yank,将字符复制到寄存器中,而不会改变原来的文本)~(交换大小写),g~(交换大小写),gu(变成小写),gU(变成大写),>(向右缩进),<(向左缩进)等。
    命令指的是一些移动光标的命令,比如w(移动到下一个单词的开头),b(移动到当前单词的开头,再继续按,会找到前面的单词,be是一种互逆操作,而不要认为eE是一种互逆,它们只是停止的位置不同),还有上下左右(hjkl)等光标移动,或者模式匹配,比如/the回车,即下一个出现the的地方,这也算移动,?the回车,即上一个出现the的地方,可以这样记忆:在键盘上?/都在一个键上,?在上,/在下,所以?是向上找,/是向下找,按nN来重复上一次命令,这两个按键也会将匹配的字符高亮。
    操作符和命令前都可以加上数字,最终的结果是两个数字相乘,比如2d3w最后删除的是6个单词。
    命令就是移动光标,前面加上操作符之后,该操作符所作用的范围是从当前字符到命令指定的光标之前,即会作用到光标之前的位置(这个描述也不正确)。
    动作也可以向后,比如db,就是从当前光标位置到单词的开头。

  • (15)c{motion}是根据后面motion指定的范围改变字符,并进入插入模式。
    cc:是删除整行
    C:是从当前光标处更改到行尾,等效于c$

  • (16)ssubstitute替代,它会先删除当前光标下的字符,然后进入插入模式,即等效于cl,即sx很类似,只是s最后进入插入模式,S即删除整行,等效于cc

  • (17)操作符在使用两个字母重叠,常常是作用于当前行,比如ddyycc

  • (18)D:是剪切从当前光标位置到行尾到剪贴板中,C:和D类似,但是它最后会进入到插入模式。而P不是拷贝从当前光标到行尾,而是拷贝整行。

  • (19)替换命令使用:s/命令(冒号别丢掉),格式为:[范围]s/[原字符串]/[新字符串]/[参数]
    :s/xxx/yyy/ 将当前行中的第一个xxx替换为yyy
    :s/xxx/yyy/g 将当前行中的所有xxx替换为yyy
    :s/xxx/yyy/gc 同上,但每次替换都会询问
    :%s/xxx/yyy/g 将整个文件中所有xxx替换为yyy
    %表示当前文件的所有行,如果不加%,则默认只有当前行,s前面可以指定范围,可以是某一行,或者是某一个范围,它会先查找匹配的串,然后再去做替换。如果后面不加g选项,则只会查找每行查找到第1个做替换,该行后面如果有,也不再做替换。

  • (20)可以用:g/命令 匹配字符串,并对每个匹配指向同一个操作,格式为:[范围]:g/[模式串]/[命令]
    比如:g/^#/d 删除所有以#打头的行
    :g/^$/d 删除所有空行

  • (21)W、E、B跳转方向都有w,e,b相同,只是它们分割单词的位置不同

  • (22)ctrl+n(下一个补全,next),ctrl+p(上一个补全)

  • (23)命令行模式,以冒号开始,命令行模式与插入模式类似,键盘上的大部分按键都只是简单输入一个字符,只不过在插入模式中,文本被输入到缓冲区,而在命令模式下,文本出现在命令行上。有些命令在插入模式和命令行模式中是可以通用的,比如ctrl+w(删除之上一个单词的开头),ctrl+u(删除至行首)

  • (24)命令模式中的范围,可以用行号、位置标记或是查找模式来指定范围的开始位置以及结束位置。命令中的数字,是指行号,用行号作为地址。也可以用行号来指定范围,比如1,6 即行号之间用逗号隔开,表示范围,点号.表示当前行,在范围里面,如果逗号中有的项没写,则默认到当前行(但是如果是用两个行号作为地址,如果是当前行,则最好加上.这样表达清晰,但是如果只想表示当前行,而不是用范围,则可以省略.,但是如果命令后要求有地址,则要加上地址,不能省略),或者行号不写,比如:p,则打印当前行,或者1,p则打印第1行到当前行。在命令行模式下,$表示最后一行,而不再是文件末尾,0表示虚拟行,位于文件第一行上方,%表示当前文件的所有行。
    命令模式一般用于一行或者多个连续行上面执行命令。

  • (25)选中一个区域之后,再按冒号,会变成:'<,'> 其中'<表示高亮选区首行的位置标记,'>表示高亮选区的最后一行。即在使用命令前,可以先使用可视模式选择好选取,然后按冒号,再使用命令模式。

  • (26)也可以对地址进行偏移,使用+n-n,如果n不写,默认是1

  • (27)把一行或者多行文档的一部分复制到另一部分,使用:copy,或者简写,:co,更常见的是用:t,这里t可以想成copy to,复制的时候,后面指定的地址,最后会复制到该地址下面,比如如果是.,则是复制到当前行下,如果是6,表示复制到第6行下面,在t之前如果不指定地址,则默认是当前行,如果想复制到开头不能用:t1,因为这样会复制到第1行下面,而应该用:t0,0是虚拟的,表示文件第1行上方。
    :t.表示复制当前行,然后粘贴到当前行下方,等效于yyp,两者的区别是yyp会使用寄存器,而:t.则不会,所以如果不想覆盖默认寄存器中的当前内容时,可以使用:t.,来复制行。
    使用:t不仅是复制,而且有粘贴功能,t之后要跟具体的地址,不能省略

  • (28)把一行或者多行移动到文档的其他地方使用:move命令,简写成:m,它与copy命令很类似

  • (29)如果想在连续行上执行一条普通模式命令,则要使用:normal 命令,将次命令与.命令结合使用,可以减少大量重复性任务,normal前可以指定范围,normal后指定要使用的普通命令,normal可以简写成norm,比如:‘<,'>norm .对选区执行.命令。:%normal A;对所有的行在末尾加上一个分号。在做修改时,会切换到插入模式,但是在修改完之后vim会自动返回到普通模式,在执行指定的普通模式命令之前,vim会先把光标移动到该行的起始处,因此在执行时,用不着担心光标的位置。比如:%normal i//会将所有的行注释掉。注意前面的范围和norm之间不用加空格,但是后面的命令要用空格与norm区分开。

  • (30).命令可以重复上一次的普通模式命令,但是如果想重复上次的ex命令,则要使用@:,注意是@在前,然后再按:,会自动执行上一次命令模式下的命令,但是也要注意,冒号:寄存器总是保存着最后执行的命令行命令。在运行过一次@:后,后面就可以用@@命令来重复它。如果想回退撤销,则使用ctrl+o

  • (31)如同在shell中一样,在命令行上也可以用tab键进行命令自动补全,每按一次tab会进行一个补全,如果不是想要的,再次按tab会换到下一个,不断的按tab,它会将整个列表遍历完之后,又回到刚开始未补全的那个命令,然后再按tab又会周而复始。如果补全是唯一的,即使再按tab也不会变化,如果想列出可以补全的列表,使用ctrl+d即可,比如输入:colorscheme ctrl+d,它会将所有可用的配色方案列出。
    如果输入了一个以文件夹路径为参数的命令,比如:edit(简写e),:write(简写w),那么如果按tab键会用当前目录中的目录或文件名进行补全(如果写的是另外的路径,则会以所写的路径下面的文件进行补全,如果不知道该文件夹下面有哪些文件,则可以在输入:edit之后,用ctrl+d列出其中有哪些文件,或者用:!ls先查看下当前目录下有哪些文件)

  • (32)即使是在命令行模式下,vim也知道光标处于何处以及哪个分割窗口处于活动状态。在vim命令行模式下,使用ctrl+r 然后再ctrl+w可以将光标下的单词复制到命令行中(比如作为参数),这样减少击键的次数。比如用在替换命令中,可以少输入一个替换的单词。

  • (33)选择单词之后,可以用gU变成大写,或者gu变成小写,g~反转大小写。

  • (34)gv重选上一次的文本范围

  • (35)列出当前缓冲区:ls,切换到下一个缓冲区:bn(bnext简写),切换到上一个:bp(bprev简写),:bf(bfirst简写)跳到列表开头,:bl(blast简写)跳到列表结尾。
    在用:ls查看当前缓冲区内的文件时,vim为为每个文件创建一个编号,可以用:b numbbuffer简写)可以跳到该编号的缓冲区中,也可以使用b 后面加文件名,这个文件名可以用tab进行补全。
    删除缓冲区可以用:bd(是bdelete的简写)N1 N2将编号为N1和N2的缓冲区删除,如果要删除连续的缓冲区用:N,M bd删除N到M的缓冲区。即如果是不连续删除,在编号是在后面,编号直接用空格分开,如果是删除连续的缓冲区,则编号在前面,之间使用逗号分开,逗号前是起始编号,逗号后是终止编号。

  • (36):w[rite]把缓冲区内容写入磁盘
    :e[dit]!把磁盘文件内容读入缓冲区(即回滚所做的修改),后面无需加文件名,即对当前窗口缓冲区内的内容摒弃。
    :qa[ll]!关闭所有窗口,摒弃修改而无需警告
    :wa[ll]!把所有改变的缓冲区写入磁盘
    的含义是无需警告检测,强制执行。

  • (37)切分窗口:<ctrl+w>s水平上下切分,<ctrl+w>v垂直左右切分
    如果先切分窗口,然后又执行:edit 文件名,则在新窗口中打开的是一个新缓冲区,上面这两步可以合成一步即:sp[lit]文件名,即水平切分窗口,然后新缓冲区是新打开的文件,:vsp[lit] 文件名,是垂直切分窗口,并在新缓冲区中打开新文件。
    窗口之间切换:使用<ctrl+w>后面加h,j,k,l可以进行上下左右移动,<ctrl+w>w可以在窗口之间循环切换
    关闭窗口:<ctrl+w>cc的含义是close)即关闭当前活动窗口。<ctrl+w>oo的含义是only)只保留当前活动窗口,关闭其他所有窗口。
    即切分、移动、关闭窗口都用<ctrl+w>后面加其他字母。

  • (38)新建标签页:tabe[edit] 文件名,如果省略了文件名则vim会创建一个标签页,里面包含一个空缓冲区。
    如果当前标签页中包含不止一个窗口,使用<ctrl+w>T即把当前窗口移动到一个新的标签页中。
    :tabc[lose]关闭当前标签页及其中的所有窗口
    :tabo[nly]只保留当前活动标签页,关闭所有其他标签页
    标签页的编号从1开始,可以用{N}gt在标签页间切换,有数字前缀,表明会跳转到指定的编号的标签页,如果省略了数字前缀,则会跳转到下一个标签页。gT命令功能与此相同,只是跳转的方向相反。

    Ex命令            普通模式命令
    :tabn[ext] {N}          {N}gt
    :tabn[ext]                gt
    :tabp[revious]            gT
    
  • (39)在shell、vim的插入模式、vim的命令行模式下,ctrl+w都是删除当前关闭前的一个单词,ctrl+u是删除当前光标至行首。

  • (40)在vim缓冲区中,使用:ls查看缓冲区时,%表示哪个缓冲区在当前窗口中可见,它后面一般有一个字符a,表示active#表示轮换文件,即当前缓冲区是从那个切换过来的,按Ctrl^可以在当前文件和轮换文件间快速切换,如果文件修改过则前面有一个+,如果缓冲区被隐藏,则前面会有字符h,表示hidden

  • (41)让所有窗口等宽等高用ctrl+w+=,让当前窗口高度最大化用ctrl+w+_(注意这里是下划线,不是减号)

  • (42)vim中位置自动标记,`` 跳转前位置