vim使用技巧
移动光标
- 单行移动
| w | 移动光标到下一个单词开头 |
|---|---|
| W | 移动光标到下一个单词开头,长跳.比如/etc/letsencryt 被认为是一个单词 |
| e | 移动光标到下一个单词结尾 |
| E | 移动光标到下一个单词结尾,长跳 |
| b | 移动光标到上一个单词 |
| B | 移动光标到上一个单词,长跳 |
| nw | n代表数字,比如移动到下5个单词的头部,5w |
| ne | n代表数字,比如移动到下5个单词的尾部,5e |
- 行首行尾移动
| 0 | 数字0,表示移动到本行最开头,不管有没有缩进都跳到最开头,作用等用于Home键 |
|---|---|
| ^ | 移动光标到本行最开头的字符处 |
| $ | 移动到本行结尾处.作用等同于End键 |
- 屏幕中移动
| H | 移动光标到屏幕的首行.注意是当前屏幕窗口,而不是整个文件. |
|---|---|
| M | 移动光标到屏幕的中间一行. |
| L | 移动光标到屏幕的尾行. |
- 文件范围移动
| gg | 移动光标到文件首行.这个是移动到整个文件的第一行 |
|---|---|
| G | 移动光标到文件的最后一行. 这个是移动到整个文件的最后一行 |
| :n | 跳到第n行.比如跳到第5行,可以输入:5 |
| nG或ngg | 也是跳到n行,比如跳到第10行,输入10G,或者10gg |
| :n | n代表数字,比如移动到100行,输入:100 |
- 翻页
| ctrl+f | 向下翻页,等同于page down |
|---|---|
| ctrl+b | 向上翻页,等同于page up |
| ctrl+d | 向下翻半页 |
| ctrl+u | 向上翻半页 |
- 特殊移动技巧
| { | 跳到上一个空行 |
|---|---|
| } | 跳到下一个空行 |
| * | 将光标停留在某个单词上,按下*键,会搜索该单词,并跳到下一个这个单词处 |
| # | 将光标停留在某个单词上,按下#键,会搜索该单词,并跳到上一个这个单词处 |
| ‘’ | 两个单引号,移动光标到上一个标记处.比如跳转到他处后,输入此命令回到上一次光标停留的位置 |
| ‘. | 一个单引号一个点,移动光标到上一次的修改行 |
| `. | 一个倒引号一个点.移动光标到上一次的修改点 |
删除复制—结合光标
在vim中,y表示拷贝,d表示删除,p表示粘贴.其中拷贝和删除和光标移动命令可以结合使用
- 删除
| dw | w是移动到下一个单词开头.dw表示删除从当前光标到光标所在单词结尾的内容 |
|---|---|
| dW | 同上,不过是长删除, /etc/letsencrypt被认为是一个单词 |
| daw | 删除光标所在的单词,无论光标是停留在哪里.例如/etc/letsencrypt/.如果光标停留在letsencrypt中的t字母上,则会删除letsencrypt这个单词.如果是dw则只删除tsencrypt,保留le |
| daW | 同上,长删除 |
| d0 | 数字0,删除从当前光标到光标所在行首的内容 |
| d$或dD | 删除从当前光标到光标所在行尾的内容 |
- 复制
| yw | 同理,复制从光标所在字母到单词结尾的内容 |
|---|---|
| yW | 同上,长复制 |
| yaw/yaW | 同理,复制单词,无论光标停留在单词的哪个字母 |
| y0 | 拷贝从当前光标到光标所在行首的内容,如果该行缩进,那么连行首的空格也一起复制 |
| y^ | 拷贝从当前光标到光标所在行首的内容,如果该行缩进,不包括行首空格, |
| y$ | 拷贝从当前光标到光标所在行尾的内容 |
- 整行复制删除
| yy | 复制光标所在整行内容 |
|---|---|
| dd | 删除光标所在整行内容 |
| D | 删除从当前光标到光标所在行尾的内容 |
| J | 表示光标所在行和下一行合并 |
| :.,$d | 删除当前行到文件末尾, |
| dG | 删除当前行到文件末尾, |
| :/str1/,/str2/d | 删除从字符串str1到str2的所有行 |
删除复制—结合数字
| 5yy或者y5y | 拷贝光标以下5行,包含光标所在行本身 |
|---|---|
| :n1,n2y | n表示数字,例如:12,24y表示拷贝第12行到第24行的内容. |
| :n,y | n表示数字,例如:12,y表示拷贝第12行到光标所在行之间的内容. |
| :,ny | n表示数字,例如:,24y表示拷贝光标所在行到第24行之间的内容. |
| 5dd或者d5d | 删除光标以下5行,包含光标所在行本身 |
|---|---|
| :n1,n2d | n表示数字,例如:12,24d表示删除第12行到第24行的内容. |
| :n,d | n表示数字,例如:12,d表示删除第12行到光标所在行之间的内容. |
| :,nd | n表示数字,例如:,24d表示删除光标所在行到第24行之间的内容. |
| :nd | n表示数字,例如:3d表示删除3行.注意和上个命令区分 |
查找
| /xxx或者?xxx | 在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示向上查找.支持正则表达式.输入 n 查找下一个匹配处, 输入 N 反方向查找.注意查找字符串默认区分大小写 |
|---|---|
| *或者# | 光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的下(上)一个单词,同样,输入n查找下一个匹配,输入N反方向查找 |
| g*或者g# | 和上条相似,但是这个命令不完全匹配光标所在处的单词,而是匹配包含该单词的所有字符串 |
| gd | 查找与光标所在单词相匹配的单词, 并将光标停留在文档的非注释段中第一次出现这个单词的地方. 用于查找局部变量等 |
| % | 查找与光标所在处相匹配的反括号, 包括 () [] { } |
替换
一般结合s和g命令进行替换.一般格式为:
:%s/匹配模式/替换后的字符串/g.其中模式可以是正则表达式,以下是几个例子
| :s/aa/bb/g | 将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb.注意是光标所在行,不是全文件 |
|---|---|
| :%s/aa/bb/g | 将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb.文件全局生效 |
| :12,23s/aa/bb/g | 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb |
| :12,23s/^/#/ | 将从12行到23行的行首加入 # 字符 |
| :s/^/#/g | 全局所有行首插入#字符 |
还有一个方法可以批量在行首插入字符:
1.ctrl+v批量选中要插入的行
2.按大写字母I,输入要插入的字符
3.连续按两次ESC键
| :%s/\s+$// | 将所有行尾多余的空格删除.等同于”:%s= *$==” |
|---|---|
| :g/^\s*$/d | 将所有空行删除 |
| :g/^\/\//d | 将所有//开头的行整行删除.(不仅仅是删除//) |
s配合g一般用来做替换,g单独使用一般用来删除匹配的行
编辑
| cc | 删除当前行并进入编辑模式 |
|---|---|
| cw | 删除当前字,并进入编辑模式 |
| c$ | 擦除从当前位置至行末的内容,并进入编辑模式 |
| S | 删除光标所在行并进入编辑模式 |
| s | 删除当前字符并进入编辑模式 |
| u | 撤销 |
| ctrl+r | 撤销上一个撤销. |
| ~ | 将光标当前选中的字符切换大小写 |
| >> | 当前行右移一个tab |
| << | 当前行左移一个 tab |
| 5>> | 当前光标后5 行向右移动一个 tab. |
| :12,24> | 将12行到14行的数据都向右移动一个 tab |
| :12,24>> | 将12行到14行的数据都向右移动两个 tab |
| :w filename | 将当前文件所有内容写入新文件 |
| :5w filenmame | 将当前文件第5行内容写入新文件 |
| :1,10w filename | 将当前文件第1到第10行内容写入新文件 |
| :f filename | 将当前文件重命名为新文件 |
多文件编辑
| vim file1 file2 … | 同时打开多个文件进行编辑 | |
|---|---|---|
| :n\:N (等同于:next\:prev) | 进入下一个文件(上一个文件)编辑.这个命令要求先保存当前编辑文件 | |
| :n!\:N! | 不保存当前编辑文件,并且切换到下(上)文件编辑. | |
| :wn\wN | 保存当前编辑文件,并且切换到下(上)文件编辑 | |
| ctrl+^ | 在最近打开的2个文件之间快速切换 | |
| :e 文件名 | 指定对某个文件进行编辑 | |
| :sp [file] | 把当前文件或者指定文件水平分隔 | |
| :vsp [file] | 把当前文件或者指定文件垂直分隔 | |
| :q\:close | 关闭当前文件窗口 | |
| :only | 只保留当前文件窗口,关闭其他所有窗口 | |
| :[q\ | wq]all | 对所有窗口执行q或者wq操作 |
| :[q\ | wq]all! | 对所有窗口执行q!或者wq!操作 |
| :vertical all | 打开所有窗口,垂直打开 | |
| ctrl+w w | vim分隔了多个窗口后,光标循环定位到各个窗口中 | |
| ctrl+w h/i | vim分隔了多个窗口后,光标跳转到左边(右边)的窗口 | |
| ctrl+w j/k | vim分隔了多个窗口后,光标跳转到上边(下边)的窗口 | |
| ctrl+W = | 让所有vim分隔后的多个窗口高度保持一样 | |
| ctrl+W +/- | 增加/减少vim当前窗口高度 |
执行外部shell命令
| :! command | 这是比较常用的执行命令方式,比如 :!ls 显示当前目录下的文件.执行完命令后按回车返回vim编辑窗口 |
|---|---|
| :r! command | 比如:r!ls.和上面的命令类似,但是执行完的结果会保存在vim的缓存中,一直显示在当前vim编辑窗口 |
常用功能选项
在启动的时候vim会读取 /etc/vimrc 和 ~/.vimrc ( 全局设置的vimrc 和用户设置).下面这些常见的功能选项可以直接定义在vimrc文件里,也可以在vim编辑窗口中输入: set xxx执行.
常见的功能选项有:
| :set nu/:set nonu | 显示/取消行号.nu是number的缩写 |
|---|---|
| :set ic/set noic | 显示/忽略大小写.ic是ignorecace的缩写 |
| :set ai/set noai | 自动/不自动缩进.ai是aotuindent缩写 |
| :set hlsearch/:set nohlsearch | 显示/不显示高亮. |
| :syntax on / :syntax off | 语法高亮/关闭语法高亮 |
| set tabstop=4 | 设置tab键为4个空格 |
| set ruler | 在右下角显示光标位置的状态行 |
| set incsearch | 查询的时候非常方便.比如搜索book单词.输入/bo时,就已经自动开始查找. |
| set noswapfile | 不要交换文件 |
粘贴避免缩进
1.在粘贴之前,vim窗口中输入:set paste #vim就不会自动缩进,而是纯拷贝粘贴
2.在粘贴之后,vim窗口中输入:set nopaste #关闭paste
还有一种方法是,即使粘贴后代码格式变的非常慢,只要执行gg=G就能自动编排格式.