移动
基本移动
1、方向键:上下左右可以实现光标移动
2、vim特殊的移动方式
命令 | 光标动作 |
---|---|
h | 左移一列 |
l | 右移一列 |
j | 下移一行 |
k | 上移一行 |
基于单词移动
命令 | 光标动作 |
---|---|
w | 正向移动到下一单词的开头 |
b | 反向移动到当前单词/上一单词的开头 |
e | 正向移动到当前单词/下一单词的结尾 |
ge | 反向移动到上一单词的结尾 |
如下图:
* 注意 *:一个单词由字母、数字、下划线,或其他非空白字符的序列组成,单词间以空白字符分隔(参见:h word )。而字串的定义则更简单,它由非空白字符序列组成,字串间以空白字符分隔。
每个面向单词的动作命令,都有一个面向字串的命令与其对应,这当中包括W、B、E 和gE
so~”单词”和”字串”是对精度和速度的一种权衡—如果你想更快地移动的话,可以用面向字串的动作命令;而如果你想以更细的粒度移动的话,则可以用面向单词的动作命令。
对字符进行查找进行移动
Vim 的字符查找命令让我们可以在行内快速移动,并且它们能够在操作符待决模式下很好地工作。
在正常模式下:f{char} 命令是在 Vim 中移动的最快方式之一。它会在光标位置与当前行行尾之间查找指定的字符,如果找到了,就会把光标移到此字符上;如果未找到,则保持光标不动。
; 命令就可以重复该命令(向前跳),加快定位速度;
,命令就可以在跳过的历史中回退(往前跳),;命令的反操作。
命令 | 用途 |
---|---|
f{char} | 正向移动到下一个{char} 所在之处 |
F{char} | 反向移动到上一个{char} 所在之处 |
t{char} | 正向移动到下一个{char} 所在之处的前一个字符上 |
T{char} | 反向移动到上一个{char} 所在之处的后一个字符上 |
; | 重复上次的字符查找命令 |
, | 反转方向查找上次的字符查找命令 |
更强大的查找命令/ ;n、N对其进行前后移动
设置标记位移动
m{a-zA-Z} 命令会用选定的字母标记当前光标所在位置
*m* *mark* *Mark*
m{a-zA-Z} Set mark {a-zA-Z} at cursor position (does not move
the cursor,this is not a motion command).
*m'* *m`*
m' or m` Set the prevIoUs context mark. This can be jumped to
with the "''" or "``" command (does not move the
cursor,this is not a motion command).
*m[* *m]*
m[ or m] Set the |'[| or |']| mark. Useful when an operator is
to be simulated by multiple commands. (does not move
the cursor,this is not a motion command).
*:ma* *:mark* *E191*
:[range]ma[rk] {a-zA-Z'}
Set mark {a-zA-Z'} at last line number in [range],column 0. Default is cursor line.
{mark} 命令跳到位置标记所在行,并把光标置于该行第一个非空白字符上;而
{mark} 命令则把光标移动到设置此位置标记时光标所在之处,也就是说,它同时恢复行、列的位置,具体参见mark-motions
Jumping to a mark can be done in two ways:
1. With ` (backtick): The cursor is positioned at the specified location
and the motion is |exclusive|.
2. With ' (single quote): The cursor is positioned on the first non-blank
character in the line of the specified location and
the motion is linewise.
位置标记 | 跳转到 |
---|---|
“ | 当前文件中上次跳转动作之前的位置 |
`. | 上次修改的地方 |
`^ | 上次插入的地方 |
`[ | 上次修改或复制的起始位置 |
`] | 上次修改或复制的结束位置 |
`< | 上次高亮选区的起始位置 |
`> | 上次高亮选区的结束位置 |
匹配括号跳转
Vim 提供了一个动作命令,让我们可以在开、闭括号间跳转。在激活了 matchit.vim插件后,此命令也可以用于成对的 XML 标签,以及某些编程语言中的关键字上
% 命令允许我们在一组开、闭括号间跳转
:h %查看详细帮助
跳转
遍历跳转列表
:jumps
:jumps
jump line col file/text
91 7 4 kk.sh
90 1 0 ~/codeTmp/pdlapi-statisfaction/conf/service.properties
89 1 0 ~/codeTmp/pdlapi-statisfaction/conf/deploy.properties
88 1 0 ~/codeTmp/pdlapi-statisfaction/conf/db.ext.properties
87 38 0 ~/codeTmp/pdlapi-statisfaction/conf/db.ext.properties
……
任何改变当前窗口中活动文件的命令,都可以被称为跳转命令。Vim 会把执行跳转命令之前和之后的光标位置,记录到跳转列表中
命令 | 用途 |
---|---|
[count]G | 跳转到指定的行号 |
/pattern/?pattern/n/N | 跳转到下一个/上一个模式出现之处 |
% | 跳转到匹配的括号所在之处 |
(/) | 跳转到上一句/下一句的开头 |
{/} | 跳转到上一段/下一段的开头 |
H/M/L | 跳到屏幕最上方/正中间/最下方 |
gf | 跳转到光标下的文件名 |
跳转到光标下关键字的定义之处 | |
’{mark}/`{mark} | 跳转到一个位置标记 |
Vim 可以同时维护多份跳转列表。实际上,每个单独的窗口都拥有一份自己的跳转列表。
遍历改变列表
每当对文档做出修改后,Vim 都会记录当时光标所在的位置。遍历改变列表的方法很简单,并且这大概是跳到你要去的地方的最快方式。
Vim 会在编辑会话期间维护一张表,里面记载我们对每个缓冲区所做的修改,此表就是所谓的改变列表(:h changelist)
查看改变列表内容
:changes
change line col text
11 1 0 #!/bin/bash
10 2 3 #add
9 12 0 readonly cur_date="`date +%Y%m%d`"
8 11 0 #readonly cur_date="`date +%Y%m%d`"
7 19 12 echo "total Memory: $total_mem total cpu: $total_cpu"
6 20 0 o#add^[kdkdkdkdkdkdkdkdkdyypkui#^[kdkdkdkdkdkdkdkukrkrkrkrkrkrkrkrkrkrkrkrkdkdrM^[
5 23 0 for pid in `ps -ef | awk 'NR > 0 {print $2}'` ; do
4 29 0 o#add^[kdkdkdkdkdkdkdkdkdyypkui#^[kdkdkdkdkdkdkdkukrkrkrkrkrkrkrkrkrkrkrkrkdkdrM^[
3 23 0 for pid in `ps -ef | awk 'NR > 0 {print $2}'` ; do
2 23 0 for pid in `ps -ef | awk 'NR > 0 {print $2}'` ; do
1 23 0 for pid in `ps -ef | awk 'NR > 0 {print $2}'` ; do
>
Press ENTER or type command to continue
标记上次修改方位的位置标记
Vim 会自动创建一些位置标记,它们是对改变列表的一个有用补充。. 标记总是指向上次修改的位置,而
^ 标记则会记录上次退出插入模式时光标所在的位置
*'^* *`^*
'^ `^ To the position where the cursor was the last time
when Insert mode was stopped. This is used by the
|gi| command. Not set when the |:keepjumps| command
modifier was used. {not in Vi}
*'.* *`.*
'. `. To the position where the last change was made. The
position is at or near where the change started.
Sometimes a command is executed as several changes,then the position can be near the end of what the
command changed. For example when inserting a word,the position will be on the last character.
{not in Vi}
在大多数场景下,跳转到`. 的效果与使用g; 命令相同。不过位置标记只指向最后修改的位置,而改变列表中则保存了多组位置。我们可以多次按g; 命令,每次它都会把我们带到改变列表中较早的一个位置,而`. 则总是把我们带到改变列表的最后一项。
`^ 标记指向上次插入的位置,它比上次修改的位置更具体一点。如果我们先退出插入模式,接着又在文档中四处移动,然后,当我们又想快速回到退出的地方继续编辑时,用gi 命令就行了(:h gi )。此命令会用`^ 标记恢复光标位置,并切换到插入模式,这真是省时省力的好办法!
Vim 会为编辑会话中的每个单独缓冲区维护一个改变列表,而与之不同的是,每个窗口都会创建一个单独的跳转列表。
未完待续……