玩转VIM编辑器-导航移动
玩转VIM编辑器-导航移动
如果像前面所说的,只是通过h、j、k、l 来移动光标,在大量移动的过程中会发现比较耗费时间并且效率不高。这一节就主要通过一些快捷的导航移动方式来快速移动光标到达指定的位置。
数值参数
比如准备向右移动4个字符,就可以使用4l,相当于llll。
滚动整页或半页
| 导航键 | 描述 |
| CTRL+F | 向下滚动整页 |
| CTRL+B | 向上滚动整页 |
| CTRL+D | 向下滚动半页 |
| CTRL+U | 向上滚动半页 |
| CTRL+E | 向下滚动一行 |
| CTRL+Y | 向上滚动一行 |
字的导航
| 导航键 | 描述 |
| w | 移动到下一个word的开始处 |
| W | 移动到下一个WORD的开始处 |
| e | 移动到当前word的末尾 |
| E | 移动到当前WORD的末尾 |
| b | 移动到前一个word的开始处 |
| B | 移动到前一个WORD的开始处 |
word和WORD的区别
word由一系列的字符、数字和下划线构成,而WORD是由非空白符组成的字符串,有空格分开。例如image[0].x = 192.15,那么这个有很多的word组成,而只有三个WORD组成,分别为:image[0].x、=和192.15。
一行中的几个光标特殊位置
| 导航键 | 描述 |
| 0 | 跳转至当前行的开始 |
| $ | 跳转至当前行的结束 |
| ^ | 跳转至当前行开始的第一个非空字符 |
| g_ | 跳转至当前行最后一个非空的字符 |
段落、章节、语句的跳转
| 导航键 | 描述 |
| { | 移动至当前段落的开始 |
| } | 移动至下一段落的开始 |
| [[ | 移动至当前章节的开始 |
| ]] | 移动至下一章节的开始 |
| ( | 移动至当前语句的开始 |
| ) | 移动至下一语句的开始 |
好好体会段落、章节和语句的含义。其中段落比较使用,可以从一个子函数中来回的跳转。章节:大跳转。语句:空白行分割。
屏幕导航
| 导航键 | 描述 |
| H | 移到屏幕顶端的行-home |
| M | 移到屏幕中央的行-middle |
| L | 移到屏幕底端的行-last |
| nH | 移到屏幕顶端往下的第n行 |
| nL | 移到屏幕底端网上的第n行 |
使用当前行重绘屏幕
| 导航键 | 描述 |
| z然后ENTER | 将光标行移到屏幕顶端并滚动屏幕 |
| z. | 将光标行移到屏幕中心并滚动屏幕 |
| z- | 将光标行移到屏幕底端并滚动屏幕 |
| 200z然后ENTER | 会把第200行移到屏幕顶端 |
快速跳转至文件首尾
| 导航键 | 描述 |
| :0 | 跳转至文件头-方法1 |
| gg | 跳转至文件头-方法2 |
| 1G | 跳转至文件头-方法3 |
| :$ | 跳转至文件尾-方法1 |
| G | 跳转至文件尾-方法2 |
跳转至文件的第N个字符、N%
| 导航键 | 描述 |
| 50% | 跳转至文件的50%处,即文件中间 |
| 75% | 跳转至文件的75%处,即3/4处 |
| 100l | 跳转至从当前位置开始计算的第100个字符 |
| 100<space> | 跳转至从当前字符开始计算的第100个空格处,与上述100l含义相同 |
| :goto 25 | 移动至从文件开始处的第25个字符 |
| 25 | | 移动到当前行的第25个字符 |
显示当前行数
| 命令 | 描述 |
| :set number :set nu | 显示行数 |
| :set nonumber :set nonu | 不显示行数 |
| :set numberwidth=10 | 行数显示默认宽度为4个字符,我们可以通过该命令来设为10个字符。 |
跳转至特定行
| 导航键 | 描述 |
| :50 | 跳转至50行-方法1 |
| 50gg | 跳转至50行-方法2 |
| 50G | 跳转至50行-方法3 |
源码导航
下面的几个对与经常写程序源码的或者写shell脚本的系统管理员比较有用。
| 导航键 | 描述 |
| % | 跳转至匹配对,可以是()、{}或者[] |
| [( | 跳转至前一个没有匹配的( |
| [) | 跳转至前一个没有匹配的) |
| [{ | 跳转至前一个没有匹配的{ |
| [} | 跳转至前一个没有匹配的} |
在插入状态移动光标
在常规状态下,我们可以通过w和W来在word中移动光标,但是一旦进入了插入模式,就不能使用这两个导航键了,但是我们也不需要退出插入模式,然后在使用w导航,我们可以使用SHIFT+方向键来快速移动。
使用CTRL+O和CTRL+L跳转
Vim会保存我们在其中的所有导航操作到一个列表,我们可以使用:jumps来查看该列表,同时可以使用下述导航键来进行跳转。
| CTRL+O | |
| CTRL+L | 跳转至后一个记录点 |
| 5CTRL+O | 跳转至当前记录点的前5个 |
| 5CTRL+L | 跳转至当前记录点的后5个 |
在很长的一行中导航
我们知道一般终端的每一行都会有个字数限制,如果一行的字符数超过了这个限制,就会自动跳转到下一行,比如实际的一行可能你看起来是5、6行的样子,那么这个时候你如果使用j、k那么就有种跳转了N行的假象。在这种情况下,如果在视觉情况下,跳转到下一行(其实是同一行),使用下述导航键。
| 导航键 | 描述 |
| gj | 视觉中的下一行 |
| gk | 视觉中的上一行 |
| g^ | 当前视觉行的行首 |
| g$ | 当前视觉行的行尾 |
| gm | 当前视觉行的中间 |
Vim命令行导航
在我们使用vim打开文件的时候,就可以按照自己的需要跳转到指定的位置。
| 命令行 | 描述 |
| vim +143 <filename> | 打开文件filename,并跳转到143行 |
| vim +/search-term <filename> | 打开文件filename,并跳转到从文件头开始的第一个符合条件的位置 |
| vim +?search-term <filename> | 打开文件filename,并跳转到从文件尾开始的第一个符合条件的位置 |
| vim –t TAG | 跳转到一个特定的TAG |
使用标记创建本地书签
有两种书签,本地书签和全局书签,区别在于本地使用小写字母,全局使用大写字母。
| 书签命令 | 描述 |
| ma | 在光标位置创建书签a |
| `a | 跳转到书签a的精确位置 |
| ‘a | 跳转到书签a所在行的行首 |
创建全局书签
将ma改为mA就可以创建全局书签A。
这个主要用在当我们打开多个文件的时候,创建全局书签可以方便的在各个文件中跳转。
显示所有的书签
可以使用命令:marks来显示所有的书签。我们会发现不过什么时候打开所有书签,都会有’, ”,[ ,]和.。这几个都是默认的书签,有特殊的含义。
| 默认书签 | 描述 |
| `” | 退出前最后编辑的位置 |
| `[ | 上次修改或者复制的第一个字符 |
| `] | 上次修改或者复制的最后一个字符 |
| `< | 上次visual区域的第一行 |
| `> | 上次visual区域的最后一行 |
| `. | 最后一次修改的位置 |
| `^ | 最后一次插入模式停止的位置 |
还可以使用:marks a来显示所有关于书签a的详细信息。
使用ctags来有效地在源码中跳转
1. 当然使用之前,需要先行安装ctags包;
2. 在源码文件夹中,使用ctags *.c来生成一个文件名为tags的信息tags文件;
3. 然后vim main.c 后,输入:ta main就可以直接跳转到mian定义处,
4. 也可以使用CTRL+]来跳转到函数的定义处,使用它CTRL+T返回到原文件;
5. 还可以使用它:ta *然后按tab来便利需要查询的函数;
| Vim命令 | 描述 |
| :ts | 显示所有的tag表 |
| :tn | 跳转到列表中的下一个tag |
| :tp | 跳转到列表中的前一个tag |
| :tf | 跳转到列表中的第一个tag |
| :tl | 跳转到列表中的最后一个tag |
把vim变为很有魅力的源码浏览器
安装taglish插件,详细信息可以参考安装taglish文章。
例如打开文件vim main.c,然后输入:TlistOpen就可以列出所有的tag信息;
对特定的函数或变量回车,就可以看到更详细的信息;
当然,tag窗口也是一个vim session,我们可以通过跳转到下一个session的方法,回到tag窗口。
Vi移动命令的复习
| 移动 | 命令 |
| 往前滚动一整屏 | ^F |
| 往后滚动一整屏 | ^B |
| 往前滚动半屏 | ^D |
| 往后滚动半屏 | ^U |
| 往前滚动一行 | ^E |
| 往后滚动一行 | ^Y |
| 将当前行移到屏幕顶端并滚动屏幕 | z ENTER |
| 将当前行移到屏幕中心并滚动屏幕 | z . |
| 将当前行移到屏幕底端并滚动屏幕 | z - |
| 重画屏幕 | ^L |
| 移到home位置(屏幕的顶端) | H |
| 移到屏幕中间那一行 | M |
| 移到屏幕的底端 | L |
| 移到下一行的第一个字符 | ENTER |
| 移到下一行的第一个字符 | + |
| 移到上一行的第一个字符 | - |
| 移到当前行的第一个非空格字符 | ^ |
| 移到当前行的第n个字符 | n| |
| 移到单词的结尾 | e |
| 移到单词的结尾,忽略标点符号 | E |
| 移到当前句子的开头 | ( |
| 移到下一个句子的开头 | ) |
| 移到当前这一段的开头 | { |
| 移到下一段的开头 | } |
| 移到当前这一节的开头 | [[ |
| 移到下一节的开头 | ]] |
| 往前搜索模式 | /pattern |
| 往后搜索模式 | ?pattern |
| 往同一个方向重复搜索 | n |
| 往相反方向重复搜索 | N |
| 往前重复搜索 | / |
| 往后重复搜索 | ? |
| 搜索当前行中下一个出现x的位置 | fx |
| 搜索当前行中上一个出现x的位置 | Fx |
| 搜索当前行中下一个出现x的位置的前一个字符 | tx |
| 搜索当前行中上一个出现x的位置的后一个字符 | Tx |
| 重复上一个搜索命令,方向相同 | ; |
| 重复上一个搜索命令,方向相反 | , |
| 转至第n行 | nG |
| 转至文件结尾 | G |
| 回到上一个记号或上下文 | `` |
| 回到包含上一个记号的行的开头处 | ‘’ |
| 显示当前的行号,不是移动命令 | ^G |

浙公网安备 33010602011771号