Vim实用技巧-移动

Vim实用技巧-移动

[TOC]

移动

上下左右移动

image-20190630121647978

如果你还习惯于在光标上去做一些事情,那么你需要在vimrc里面加上这几行

image-20190630121902441

这几行的作用是让光标什么都不做.

区分实际行和屏幕行

如果一行显示不下的话,vim会自动折行,但是这不意味着他就是两行了,自动折行后它还为一行的实际行,屏幕行为多行

比如下图展示了3行实际行和9行的屏幕行.

image-20190630122634747

我们如果想在实际行上移动,只需要在相应的位置上增加g即可如gj,gk等.

image-20190630122815572

基于单词移动

vim有两组正向和反向移动单词距离的命令,它可以让我们移动的更快.

image-20190630123704209

单词(word)和字串(WORD)的区别

字串个单词有两个不同的定义,

  • 单词: 数字字母下划线组成的,其他的都是分隔符.
  • 字串: 以空白为分隔符的.

因此我们要移动长一点的距离的话就得使用大写的移动W,B,EgE.

同样的我们可以和其他功能一起使用如删除一个字符cw

对字符进行查找

f{char}是vim中移动最快的方式之一.会在光标位置与当前行尾之间进行查找

并且我们可以使用;来重复改f命令,用,来回退f命令

f 和 t 的区别

f{chair},;以及,是查找命令集中的部分命令,下面给出了所有的命令.

image-20190630225534410

t是移动当当前行出现位置的前一个字符.

那么t的作用是什么呢?假如我们想删除一句话的在其之后的所有内容,我们可以用t来实现

image-20190630225749976

如果我们想在普通模式中使用查找的话,应该用f{char}当与dc一起使用的时候,更倾向于tT.

通过查找操作文本.

我们会经常使用到/来操作文本,并且我们可以配合v来执行文本的选择

比如说我们想删除一段话,可以使用v在要删除的开头进入修改模式,然后执行/ge查找到当前字符串上,再进行h移动到之前的字母,最后执行d进行删除

image-20190630230408794

同样的我们可以直接使用d来完成这一系列操作

image-20190630230439969

精确的对象选择区域

我们可以在可视模式下进行精确的文本选择比如:

image-20190630231010623

Vim的文本对象由两部分组成,第一个永远是i或者是a,我们一般会说,i开头的文本会选择分隔符内部的文本,以a开头会选择包括分隔符在内的整个文本,为了方便记忆,可以把i理解为inside,a理解为all

以下是Vim的选择文本对象.

image-20190630231440362

用文本对象执行操作

可视模式适用于介绍本文对象,因为可以很容易的看到发生的变化,但是在操作等待模式中选择文本对象才是真正强大的能力,.

文本对象并不是动作命令,我们不能用他们在文档中移动.但是,在有{motiong}的命令中我们都可以用作文本对象.

我们可以用c{motiong}命令进行讲解.然后切换到插入模式.

  • 比如说我们要删除一个""之间的单词,可以使用ci"

删除周边,修改内部

Vim的文本分对象分为两类,一种是符号文本对象i},it等,另一种是块对象比如单词,句子,段落等等

以下是文本对象的表示:

image-20190630232004168

iw的范围是当前单词的第一个到最后一个字符,aw的范围有所扩大,包括单词前面或者后面的饿一个空白字符.

一般aw用于d的操作,因为会删除多于的空白,而iw一般配合c使用,比如我们要修改一个单词等等

  • 在普通模式下使用命令,一般是用a开头的文本对象.

  • 进入插入模式的情况下一般使用i开头的对象.

设置标记,以便能够快速的回来

vim允许在当前的光标位置做标记,可以用m{a-zA-Z}表示,小写字母在缓冲区中可见,而大写字母在全局可见.

Vim提供了两种方式来跳转到已经标记的位置

  • '{mark}跳转到光标所在行,并且把光标放到第一个非空白字符上
  • {mark}`跳转到标记光标所在的位置.

tip:一般使用使用mmm`这样会很方便

Vim也会自带一些标记位置,方便我们来定位自己的位置

image-20190630233226073

在匹配括号间跳转

Vim提供了一个动作命令,让我们可以在开闭括号内跳转

%可以让我们在开闭括号之内跳转.只有这三种([{}])

我们来看一个例子

%w{London Berlin New\ York}改成普通的列表定义 ["London","Berlin", "New York"]

可以这样做

image-20190630233825721

我们先使用dt{删除掉{之前的东西,然后再用%跳到最后的位置,r]修改}再用` 跳回原来的位置,最后呢使用r{修改最后的[`

Vim在发布的时候也同时发布了一个叫matchit的插件,其增强了%命令,激活这个插件之后,%命令就可以在配对的关键字之间进行跳转了.如在HTML当中,开标签和闭标签之间进行跳转,在ruby中,在class/end.def/end以及if/end之间进行跳转.

怎么设置这个插件:在vimrc中配置

1
2
3
set nocompatible
filetype plugin on
runtime macros/matchit.vim

同时Tim Pope 写的surround.vim也很好,比如要给选中的文件加上分隔符,可以使用以下操作

image-20190630234520059

在文件之间进行跳转

之前讲的全是在一个文件中移动,跳转,Vim提供了一些命令,能让我们在不同的文件中进行跳转,我们把他们称之为”虫洞”,从而让我们快速从代码的第一部分跳转到另一部分.乍一看很容易迷失方向,不过Vim会一直记录我们的浏览位置.

遍历跳转的列表

​ Vim会记录跳转前后的位置,并提供留一些命令让我们能够原路返回.

首先介绍一个命令jumps

image-20190701014259349

此命令会让我们跳转到一个跳转列表当中,任何改变当前窗口中活动文件的命令都可以被称之为跳转命令.

Vim会把执行跳转命令之前和之后的光标位置记录到跳转列表当中.

  • 用:edit命令打开一个文件就可以用<C-o><C-i>命令在这个文件和新文件之间进行跳转

[count]G可以跳转到一行, 也叫跳转命令.(面向句子的或者段落的动作都叫跳转)

image-20190701013902987

遍历改变列表

Vim会记录一张改变列表用:changes命令即可查看此列表

image-20190701014218830

可以用g;g,进行快速的移动

vim会自动创建一些标记,.指向上一次修改的位置, 而^则记录上次退出插入模式的位置.它比上次修改的位置更具体,如果我们退出了插入模式,用gi就可以了

跳转到光标下的文件

如果我们能直接打开到一个文件名所指的文件,那么是不是很方便

比如我们有这样两句

1
2
require 'practical_vim/core'
require 'practical_vim/more'

我们移动到第一个文件名中,然后执行gf这里并不能跳转,我们需要告诉Vim完整路径和后缀.

指定文件的扩展名

suffixesadd选项允许我们指定一个或者多个扩展名,当Vimgf命令搜文件名时候,会尝试用这些扩展名,用鞋面的命令设置rb扩展名.

1
:set suffixesadd+=.rb

我们执行gf时候就可以跳转到相应的文件中了

我们再执行:ls看一看

image-20190701015027478

这时候我们执行<C-i>,<C-o>就会跳转到对应的位置当中了.

指定要搜索的目录

在这里我们的目录都是相对路径,到那时其他的库路径改怎么办?

这是path选项的用处,可以把它配置成一个一逗号为分隔的目录列表,当使用gf命令的时候,Vim会检查path目录的每个目录,看改目录中是否包含一个匹配光标下文本的文件名.

1
:set path?

例如:如果path能够包含ruby中全部的目录,就会非常有用.因为这样一来我们就用gf打开任何require所引用的额模块.这里可以用Tim Popebundler.vim 插件1,它会使用工程的 Gemfile 来自动生成 ‘path’ 设置。

<C-]>命令也类似,允许我们从函数调用的地方直接跳转到该函数定义的地方.

用全局位置标记文件间的跳转

全局位置是一种标签,让我们在文件间进行跳转.这种在我们分析完代码想跳转到一个文件的时候非常有用

m{letter}允许我们设置一个位置标记.大写字母是全局标记,设置好以后,能让我们快速的跳到标记所在的位置.

比如你要检查代码中所有fooBar()函数调用的地方,可以用

1
:vimgrep /fooBar/**

来进行查找fooBar的方法,如果代码里面有很多的foobar那么创建多个queckfix列表在列表中可以使用<C-i>或者<C-o>之间进行调准啊

谢谢您的鼓励~