1. vim的三种模式
模式可以理解为状态,不同的模式下适合处理不同的工作。vim有6种基本模式和5种派生模式,初学者只需要掌握后面三种模式即可,普通模式,编辑模式,命令行模式 。 普通模式 可以进行复制,删除,移动屏幕、光标,恢复、撤销等操作。有些人打开vim后敲代码,一阵忙碌之后发现似乎什么都没有打上去,或者根本跟自己想的不一样,因此变得畏惧这个编辑器,其实它只是并不处于编辑模式而已; 编辑模式 就是大部分编辑器的状态,可以书写程序。这个状态下vim的状态和通常的编辑器一样。 命令行模式 可以设置,替换,保存,退出等操作。 三种模式之间可以相互转化,打开vim后默认进入普通模式,普通模式和命令行模式可以认为是在相同的情况下状态,两者之间不需要进行转化,键入a、i、r、s、o(A、I、R、S、O)可以进入编辑模式,当然不同的字母有不同的效果(vim命令区分大小写)。编辑模式时按esc键转换到普通模式。
2. 插入文本
命令 作用 a 是append的缩写,变成编辑状态,在当前位置之后输入字符 A 在当前的行的末尾追加字符 i 是insert的缩写,从当前位置开始插入文字 I 从当前行的行首开始插入字符 s 删除当前字符并变成编辑状态 S 删除当前行并变成编辑状态 o 从当前行的下一行开始编辑 O 从当前行的上一行开始编辑
3. 移动光标
感觉学习vim最重要的是要先学会移动光标(普通模式),学会移动光标才会使这个编辑器听你的话。
3.1 最基本的当然是h、j、k、l
,分别可以将光标向左、下、上、右移动一个位置。
3.2 在一行内移动光标
命令 作用 0 将光标移动到行首 ^ 移动光标到行首第一个非空字符上去 $ 移动光标到行尾 f[字符] 将光标直接定位到指定的字符,该命令只可以让光标在当前行移动。移动光标到当前位置右侧出现的第一个指定字符 F[字符] 将光标直接定位到指定的字符,该命令只可以让光标在当前行移动。移动光标到当前位置左侧出现的第一个指定字符 t[字符] 将光标直接定位到指定的字符的前面一个字符,该命令只可以让光标在当前行移动。移动光标到当前位置右侧出现的第一个指定字符前面的一个字符 T[字符] 将光标直接定位到指定的字符的前面一个字符,该命令只可以让光标在当前行移动。移动光标到当前位置左侧出现的第一个指定字符后面的一个字符 ; 配合f、F、t、T使用,重复上一个命令 , 配合f、F、t、T使用,反方向重复上一个命令 n+<sapce>
向后移动n个字符
3.3. 以一个单词的步长来移动光标
命令 作用 w 光标向右移动一个单词,光标移动到右侧或者下一行单词的第一个字母上。W以空格来区分一个单词 b 与w相反,将光标向左移动一个单词。B以空格来区分一个单词 e 光标向右移动一个单词,并且光标定位到单词的最后一个字母上。E以空格来区分一个单词 ge 与e相反,需要连续输入两个字母g和e。将光标往左移动一个字符
3.4 以’行’为步长来移动光标
命令 作用 + 移动到下一行的行首 - 移动到上一行的行首 :[行号] 光标跳转到指定行号的行首 [行号]gg 光标跳转到指定行号的行首 [行号]G 光标跳转到指定行号的行首 G 光标跳转到最后一行的行首 Ctrl+e 编辑窗口中的文件内容整体上移一行。 Ctrl+y 编辑窗口中的文件内容整体下移一行。 H 将光标移动到屏幕最上面的一行 M 将光标移动到屏幕中间的一行 L 将光标移动到屏幕最下面的一行 Z+return 将当前行(光标所在的行)移动到屏幕的第一行 Z. 将当前行移动到屏幕的中央 Z- 将当前行移动到屏幕的底行
3.5 整屏移动
命令 作用 ctrl+f 屏幕向下翻一页(f=forword) ctrl+d 屏幕向下翻半页(d=down) ctrl+b 屏幕向上翻一页(b=bofor) ctrl+u 屏幕向上翻半页(u=up)
3.6 快速移动
命令 作用 ( 移动到上一个句子的开头 ) 移动到下一个句子的开头 { 移动到上一个段落的开头 } 移动到下一个段落的开头 % 跳转到与之匹配的括号处 `. 跳转到上一次修改的位置,重复使用该命令无效 g; 跳转到最近修改的位置,重复使用命令会一直逆向追寻修改的位置 ctrl-o 逆序追寻光标经过的位置 ctrl-i 顺序追寻光标经过的位置 :ju[mps] 打印出所有光标经过的位置
3.7 命令结合数字
大多数命令都可以在前面加上数字来重复操作的次数。比如3j 将光标向下移动三行,2fk 将光标移动到光标右侧的第二个k字母上面,3H将光标移动到屏幕的第三行行首等等。后面介绍到的复制和删除命令同样有相同的效果。学会了让光标随心所欲的跟随自己的意念变化可以大大加快你写代码的速度。
4. 复制、粘贴、剪切(删除)、替换
复制(copy),剪切(cut),粘贴(paste),在Vim中对应的是yank,delete和put。
4.1 复制(复制命令可以结合移动光标的命令一起使用)
命令 作用 yy 复制当前行 [数字]yy 复制当前行在内的下‘数字’行 y0 复制句子起始至光标处的内容 y^ 复制句子非空开头至光标处的内容 y$ 复制光标到句子末尾的内容 y[数字]G 复制指定的数字开始到当前行之间的所有行 yG 复制当前行到最后一行之间的所有行 yw 复制光标所在的位置到单词结尾的所有字符。y5w 除了复制当前的单词还会往后继续复制4个额外的单词,下面的命令相同 ye 同yw yb 复制光标所在的位置到单词开始之间的所有字符,不包括光标所在位置的字符 yge 复制上一个单词的最后一个字符到光标所在位置之间的所欲字符
4.2 粘贴
命令 作用 p 将内容粘贴到光标位置的后面,光标在新内容的末尾 P 将内容粘贴到光标位置的前面,光标在新内容的末尾 gp 同p,只是将光标移至新插入内容的后面 gP 同P,同样将光标移至新插入内容的后面 :[line]pu[t] 将内容粘贴到当前行的下一行 :[line]pu[t]! 将内容粘贴到当前行的上一行
4.3 删除
命令 作用 dd 删除当前行 [数字]dd 删除当前行在内的下‘数字’行 d0 删除句子起始至光标处的内容 d^ 删除句子非空开头至光标处的内容 d$ 删除光标到句子末尾的内容 d[数字]G 删除指定的数字开始到当前行之间的所有行 dG 删除当前行到最后一行之间的所有行 dw 删除光标所在的位置到单词结尾的所有字符。d5w 除了删除当前的单词还会往后继续删除4个额外的单词,下面的命令相同 de 同dw db 删除光标所在的位置到单词开始之间的所有字符,不包括光标所在位置的字符 dge 删除上一个单词的最后一个字符到光标所在位置之间的所欲字符 x 删除光标处的字符,前面可以加上数字用于重复几次删除操作 X 删除光标前面的字符,前面同样可以加上数字
vim有数量众多的寄存器来保存复制和删除的内容,寄存器可以分成9类,(通过命令:help registers来查看帮助文档)。通过在寄存器的名字前面加上一个双引号” 来选中相应的寄存器
无名寄存器(unnamed register):”” 命令 “y”,”d”, “c”, “s”, “x” 操作内容都会缓存在这里面(只存储最近一次的的内容,新命令即使指定其他的寄存器也会同时更新该寄存器) 数字寄存器(numbered register):”0 ~ “9 “0寄存器缓存最近一次复制的内容,若指定其它寄存器则不会更新该寄存器。 “1-“9缓存最近9次删除内容(类似一个FIFO的队列),刚刚删除的内存会存储到”1寄存器中,”1中的内容会转移到”2中,以此类推,”9中的内容会被丢弃。这里的删除操作必须删除一行以及以上的内容才有效,若不到一行会存储到”-寄存器中 行内删除寄存器(small delete register):”- 缓存删除不足一行的内容 命名寄存器(named register):”a ~ “z或”A - “Z 只有具体指定相应寄存器的名称的时候才可被使用。小写字母(如“a)和大写字母(如”A)为同一个寄存器,但是复制内容时,若使用小写字母来指定寄存器(如”zyw),寄存器中原来的内容会被覆盖掉,如果使用大写字母来指定寄存器(”Zyw),新的内容会追加到原来内容的后面(当’cpoptions’中的’>’标志置位时,追加内容之前后先增加一个‘-’) 只读寄存器(read-only register):”:, “., “%, “# 这些寄存器的内容为只读
寄存器 内容 “: 最近一次命令 “. 记录最近一次插入的文本 “% 保存当前文档的名称 “# 存储当前交替文件名
6. 表达式寄存器(expression register):”= 只读,用于执行表达式命令; 7. 选择及拖拽寄存器(selection and drop register):”*, “+, “~ “*,”+ 使用系统剪切板(clipboard),存取GUI选择文本,可用于与其它外部应用交互(需要安装vim的桌面版)。两者只有一个细微的差别 “~ stores the dropped text from the last drag’n’drop operation. 8. 黑洞寄存器(black hole register):”_ 使用该寄存器用于永久删除。使用该寄存器删除不影响其他寄存器的内容,且读该寄存器内容始终为空 9. 模式寄存器(last search pattern register):”/ 缓存最近的搜索模式。该寄存器不可以复制和删除
4.4 替换
命令 作用 r[字符] 将光标所在位置的字符替换为指定的字符 R[字符] 类似r,用于连续替换字符,按esc结束替换 cw 将输入的单词替换当前的单词,输入命令以后编辑器删除当前的单词(光标位置开始到单词结束)并进入编辑模式,键入需要的单词即可。cb、ce、cge等效果类似 cf[字符] 删除从当前位置开始到指定字符结束之间的所有字符并进入编辑状态。cF[字符]效果类似 s 删除光标处的文字并进入编辑状态 S 删除当前行并进入编辑状态 :[行号1],[行号2]s/string1/sring2/gc 将行号1到行号2之间的所有的string1替换成string2,命令中的g使得替换所有的string1,若不加g则只替换每一行出现的第一个string1。c会逐个询问你是否替换,不加 c直接替换完成所有符合要求的字符串 :g/string1/s/string2/string3 查找包含string1的行,并将改行的string3替换string2的内容
5. 查找字符串
命令 作用 /[string] 在光标当前位置之后查找指定的string ?[string] 在光标当前位置之前查找指定的string n 配合/和?使用,继续查找下一个string N 配合/和?使用,继续查找反方向的下一个string * 直接向下查找当前的单词 # 直接向上查找当前的单词 :g/string 查找string :g/string/command 在包含string的行运行command命令 :v/string/command 在不包含string的行运行command命令 :v/string1/s/string2/string3 将光标所在位置的字符替换为指定的字符 :nohl 查找到的字符不在高亮
6. 恢复、撤销
命令 作用 u 撤销上一次的操作 :u[ndo] 撤销上一次的操作 :u[ndo] {N} 撤销N次的操作(这里的次范围比较广) ctrl+r 恢复上一次操作
7. 多行编辑
vim还有一个块模式,可以用于同时注释掉多行代码 在普通模式在使用”ctrl+v”进入块模式,一定光标选中需要注释掉的行,然后按下”I”进入编辑模式,输入”//”或者”#”,然后按esc键即可注释选中的多行。
8. 多窗口编辑
命令 作用 :[N]sp[lit] 水平分割窗口,前面的N指定新窗口的高度,默认为原窗口的一半 :[N]vs[plit] 垂直分割窗口,前面的N指定新窗口的宽度,默认为原窗口的一半 :q[uit]! 不保存强制退出。如文件未改变,只使用:q即可退出 :clo[se]! 最后一个窗口不能使用close关闭,使用close只是暂时关闭窗口,其内容还在缓存中,只有使用q!、w!或x才能真能退出 :tabc 关闭当前窗口 :tabo 关闭所有窗口 :ctrl+w h/j/k/l 上下左右切换窗口,加上下左右键同样可以,还可以通过快速双击ctrl+w依次切换窗口 :ctrl+w ‘+’ 增加行数 :ctrl+w ‘-‘ 减少行数 :res(ize) num 当前窗口行数调整为num行 :res(ize) +num 当前窗口增加num行,+和num之间没有空格 :res(ize) -num 当前窗口减少num行 :vertical res(ize) num 指定当前窗口为num列 :vertical res(ize) +num 当前窗口增加num列 :vertical res(ize) -num 当前窗口减少num列 :f file 给窗口重命名
9. 其它命令
命令 作用 vim a b c vim打开多文件 :ls 显示当前buffer情况,当前所有打开的文件 :n 跳至下一个文件,也可以直接指定要跳的文件,如:n c,可以直接跳到c文件 :e filename 转到filename文件 nr finename 读入filename的内容,并插入到第n行之后 :Ex 开启目录浏览器,可以浏览当前目录下的所有文件,并可以选择 :Sex 水平分割当前窗口,并在一个窗口中开启目录浏览器 :shell 可以在不关闭vi的情况下切换到shell命令行 :exit 从shell回到vi . 重复上一次的修改命令 m(a~z) 用一个字母标记当前行 ‘(a~z) 跳转到标记的行 guw 光标处的单词变成小写,w可以换成其他的移动光标的操作 gUw 光标处的单词变成大写,w同样可以换成其他的移动光标的操作
10. 简单设置
在用户目录下面添加.vimrc文件可以设置vim。自己备份了一个大牛的配置文件.vimrc ,可以直接下载使用
命令 作用 :set nu[mber] vim显示行号 :set nonu[mber] vim不显示行号 :set autoindent 继承上一行的缩进方式 :set smartindent 为c程序设计的缩进 :set list 显示制表符和行尾符号 :set nolist 取消显示制表符和行尾符号 :set ic 查找是忽略大小写 :set noic 查找时区分大小写