Vim入门教程

    xiaoxiao2021-04-14  54

    出处:http://blog.jobbole.com/86132/

    Vim即语言

    Vim最成功的闪光点莫过于一旦你开始使用它,它就会让你欲罢不能。Vim就像语言一样,拥有名词、动词、副词等属性。

    虽然我的这种说法从技术层面可能并不准确,但是却能帮助你更好地理解vim的工作机制。重申一次,本教程的目的不是为了取代其他教程或帮助手册——而是为了帮助你理解其他这些文档晦涩难懂的部分。

    动词

    所谓动词指的是我们执行的动作,这些动作可以施加在名词之上。可以看看下面几个常见的动作:

    d: 删除 c: 修改 y: 拖拉(拷贝) v: 可视化选择 (V for line vs. character)
    修饰语

    定语用在名词之前,表明以哪种方式来执行动作。几个例子:

    i: 内部 a: 周围 NUM: 数字 (e.g.: 1, 2, 10) t: 查找到指定字符,并跳转到这个字符的前面 f: 查找到指定字符,并跳转到字符所处的位置 /: 查找字符串 (literal or regex)
    名词

    在英语中,名词用来表示你所操作的对象。它们都是客体。在vim中也是这样。下面列出vim中的名词:

    w: 单词 s: 句子 ): 句子 (另一种操作方式) p: 段落 }: 段落 (另一种操作方式) t: 标签 ( HTML/XML) b: 块 (编程语言)
    Nouns as motion

    同样,你也可以将名词视为移动动作,这意味着你可以用名词表示在文本的跳转范围。我们可以在“移动”章节中看到例子说明。

    使用vim语言来组成语句(命令)

    好了,现在我们有句子的不同组成部分,该怎样将这几部分组成完整的句子呢?就像英语一样,凭感觉将动词、修饰语和名词组合起来。

    对于下面这些符号,根据颜色的不同来区分句子的不同组成部分:

    删除两个单词

    d2w

    修改所在的句子(删除当前句子并进入插入模式)

    cis

    拷贝当前所在的段落

    yip

    修改当前光标所在位置到下一个括号之间的文本内容

    ct<

    记住,这里的“目标”是尖括号,除此之外还可以是任意字符。从语法上来说,使用单个字母”t”来表示这个向前查找的“目标”,这样我就可以使用“dt.”表示删除当前位置到下一个句号之间的内容,”yt;”表示拷贝当前位置到下一个分号之间的内容。

    看起来多漂亮!当编辑文本时采用这样的思维方式可以使得操作更加优雅,符合我们的直觉思维,而且就像其他语言一样,熟能生巧。

    具体操作

    现在,在了解这些基本操作后,让我们结合具体操作来更进一步学习。

    处理文件

    一些对文件的基本操作。

    Vi file :使用vim打开要编辑的文件 :w :保存修改 :q! : 退出vim,后面加感叹号表示不保存修改强制退出 :wq: 保存修改并退出 :saveas ~/some/path/: 将文件保存到其他位置

    【注意:相比较:wq 我更喜欢使用ZZ,因为我觉得不需要输入冒号我觉得会快一点。也可以使用:x】

    ZZ: 同:wq
    查找文本

    对于任意一款编辑器,查找文本都是最基本需求。Vim拥有很强大的文本搜索功能,这一节将着重讨论vim的文本搜索。

    搜索字符串

    Vim中最基本也是最强大的搜索方式是”/”命令,在窗口最底端输入你需要查找的字符串并回车就可以了。

    查找include字符串 /include<CR>

    查找结果如下所示,所以匹配结果都被高亮显示:

    搜索完成后,输入”n”依次向下查找,或者”N”向上查找。如果想要逆向查找字符串也可以使用”?”来代替”/”.

    跳转到指定字符

    Vim有一招特别酷,不管你在哪儿,都能查找特定字符并直接跳转过去。比如说,我正在编辑HTML文件,

    向前查找并直接跳转到<字符

    f<

    向前查找并跳转到<的前一个字符

    t<

    你可以这么理解,第一种找出目标(f),直接定位到查找对象;第二种到达目标(t),向着目标对象前进,定位到目标的前面。

    比较怪异的一点是,可以将它们作为命令中的名词。就比如刚才我在编辑这句时:

    修改到下一个”<”之间的内容

    ct<

    对任意字符都可以这么做,比如说,句号,尖括号,圆括号,普通字母等等。这样你就可以查找文本并跳转,或者你知道具体位置并直接跳转。

    【注意:当你搜索指定字符时,可以使用分号跳转到下一处——不管是t搜索还是f搜索。逗号可以用来反向跳转到上一处。】

    搜索总结
    /{string}: 搜索字符串 t : 跳转到某一字符前 F : 跳转到某一字符处 *:搜索当前光标位置单词的其他实例 n : 搜索完成后,跳转到下一个匹配实例 N :搜索完成后,跳转到上一条匹配实例 ; : 跳转到指定字符时,使用分号跳转到下一实例 , :跳转到指定字符时,使用逗号跳转到上一实例
    游走于文本中

    提高编辑效率至关重要的一点是:在文本内的自由移动跳转。对vim来说,充分利用我们上文所说的vim语言的基本准则,就可以既简单又优雅地做到。首先,介绍基础概念。

    基本移动动作

    我们从键盘中间排开始介绍。受过训练的打字员一般都习惯将右手指放在jkl;这几个键上,就让我们从这里开始使用vim。

    j : 向下移动一行 k :向上移动一行 h :向左移动一个字符 l :向右移动一个字符

    刚开始可能使用得不太习惯,不过只需几分钟的练习之后,就会习惯成自然,你甚至会想要在word文档里面也这样用(顺便说一下,word文档不支持)。

    总结起来就是:右手食指和中指用来上移下移,右手食指和无名指用来左移右移。

    行内移动

    你可以在当前行内自由的移动。

    0: 移动到行首 $: 移动到行末 ^: 移动到行首非空字符 t”: 跳转到下一个引号前 f”: 跳转到下一个引号处 【注意: 逗号和分号会重复之前的t和f跳转】

    按单词移动

    除了按行和字符移动外,还可以按单词移动:

    w: 先前移动一个单词 b: 向后移动一个单词 e: 移动到当前单词末尾

    当使用大写字母时,vim会忽略掉单词间的分隔符,这样原本被分隔符隔开的多个单词会因此被视为一个大单词。

    W: 向前移动一个大单词 B: 向后移动一个大单词

    这种大写命令的优势在我们实际工作中会频繁地碰到。

    按句子或段落移动
    ):向前移动一条句子 }: 向前移动一个段落
    在屏幕间移动
    H:向上移动一屏 M:移动到屏幕中间 L:移动到屏幕底端 gg: 移动到文件顶端 G:移动到文件结尾 ^U: 向上移动半屏 ^D: 向下移动半屏 ^F: 下一页 ^B: 上一页
    来回跳转

    在普通模式下,可以在两点间来回跳转,这在实际操作中非常有用。

    Ctrl-i: 跳转到之前所在的位置 Ctrl-o: 跳回你实际的位置

    其他动作
    :$line_numberH: 移动到指定行号 M: 移动到屏幕中间 L: 移动到屏幕底端 ^E: 向上滚动一行 ^Y: 向下滚动一行 ^U: 向上移动半屏 ^D: 向下移动半屏 ^F: 向下移动一页 ^B: 向上移动一页
    现在将所以移动动作总结到一起:
    移动命令总结
    j: move down one line k: move up one line h: move left one character l: move right one character 0: move to the beginning of the line $: move to the end of the line w: move forward one word b: move back one word e: move to the end of your word ): move forward one sentence }: move forward one paragraph :line_number: move to a given line number H: move to the top of the screen M: move to the middle of the screen L: move to the bottom of the screen ^E: scroll up one line ^Y: scroll down one line gg: go to the top of the file G: go to the bottom of the file ^U: move up half a page ^D: move down half a page ^F: move down a page ^B: move up a page Ctrl-i: jump to your previous navigation location Ctrl-o: jump back to where you were

    【注意:前面说过我将CAPSLOCK键映射到Ctrl,所有这些基于Ctrl的命令,我都可以用CASLOCK来代替】

    修改文本

    好了,了解一堆在文本中移动的命令后,我们可以开始学习对文本的修改了。需要记住这一点:这些移动命令会一直陪伴着我们——它们是vim语言的一部分(它们是上文提到的修饰语)。

    Understanding modes

    首先我们要弄清楚模式的概念。刚开始说到模式可能有点违反我们的直觉,不过一旦习惯之后就会使用得非常的自然。很多vim指南都从介绍模式开始,不过我发现如果直接从模式开始有点不好理解,从普通模式与插入模式之间的切换入手会好一点。

    从普通模式开始。对新手来说vim最让人郁闷一点莫过于打开文档却不能直接编辑。其实,你也可以输入一些个东西,不过如果你真这么做的话你的文档可能会变得一团糟。 普通模式也叫命令行模式,因为通常在这个模式下输入vim命令。这些命令可以是移动、删除或者其他操作,之后进入插入模式。 插入模式下可以直接对文件进行修改,有很多种方式可以从普通模式切换到插入模式。不过不用担心,虽然方式多样,只要多加练习就可以熟练使用了。 可视化模式下可以选择文本。这个模式看起来与普通模式非常像,不过这个模式下移动操作会改变高亮选择的区域。你可以逐行选择也可以逐字符选择,不管哪种选择模式下,移动操作都会高亮选择更多的文本内容。 选中之后,可视化模式的优势就体现出来了,我们可以对选中的全部文本做操作,大大提高了效率。 Ex模式下,光标处于屏幕最下方,冒号后可以输入命令。具体内容在后面做介绍。现在只需要知道在这种模式下可以运行一些命令行任务就可以了。 除了上面介绍的模式外vim还有一些其他的模式,不过本教程不做介绍因为它们不是首要任务。

    记住vim语言

    现在让我们一起回忆vim语言: 动词、修饰符、名词。假设我们从普通模式开始,现在想要切换到插入模式下修改文本。

    动词可以实现这种切换,并且有好几种选择。我们可以修改(c),插入(i),或者追加(a),还有其他变种。

    基础修改/插入命令

    让我们从这几个可选命令开始。

    i : 从当前光标位置之前插入 a : 从当前光标位置之后插入 I :从当前行开始位置插入 A :从当前行行末插入 o : 在当前行下新增一行,并从新行插入 O :在当前行上新增一行,并从新行插入 r : 替换当前光标所在字符 R :替换当前光标的字符,并一直向后替换(替换模式) cm:修改文本,其中m表示移动的动作,比如,一个单词,一句或者一个段落。 C :修改当前所在行 ct?: 修改问号前的这条问句内容 s:替换当前字符 S: 替换整行
    修改句子
    cis
    移动到行首并进入插入模式
    I
    在当前光标位置之后进入插入模式
    a

    从上面例子可知,有多种方式可以进入插入模式输入文本。还有一些简写来执行多条操作,比如说删除并进入删除模式。

    删除从光标所在位置开始到行末的所有内容,并进入插入模式
    C
    删除当前行并进入插入模式
    S
    修改大小写

    可以通过波浪符来变更大小写。就像你猜想的那种方式工作:不管你光标所在字符还是可视模式下选择的文本都可以。

    格式化文本

    Vim还可以快速格式化文本,比如格式化一整段文本,使用下面这个命令就可以很容易实现:

    格式化当前段落
    gq ap

    gp根据预设的文本宽度testwidth以及参数指定的文本范围来工作,这意味着对于你指定的任意范围的文本,gp都可以自动校准宽度,使得文档看起来干净又整洁。

    【注意: ap表示文本对象”整个段落”的覆盖范围】

    删除文本

    在了解怎样修改文本后,接下来看看怎样直接删除文本。可能你已经知道了,跟前面差不多——只不过实现的动作不同罢了。

    基本删除命令
    x: 删除当前光标的字符 X:删除当前光标的前一个字符 dm: 根据定义的m来确定删除范围,一个单词或者一句话或者一个段落。 dd: 删除当前行 dt. : 删除当前位置到下一个句号之间的所有内容 D: 删除当前光标位置到本行末的所有内容(对比上面的C,D不会进入插入模式) J: 将上下两行合并(删除两行之间的换行符)

    足够简单吧?

    撤销与重做

    如果一个编辑器连撤销和重做的功能都没有,你肯定不会用它。vim就像我们前面注意到的那样,尽其所能让我们更顺手地操作,撤销与重做也不例外。

    u: 撤销上一个动作 Ctrl-r: 重做上一个动作

    【注意:记得将CAPSLOCK键映射为Ctrl,这样你才能更方便快速的使用组合键。】

    这两个动作都可以重复操作,你可以一直撤销啊撤销回到最初保存点,也可以一直重做啊重做到撤销前的状态。

    重复动作

    Vim所有命令中最强大的那个莫过于点命令,听起来有点奇怪是不是?解释一下,通过“.”这个小点可以让你做一些很棒的事情——重复之前你的任何一个操作。

    使用“.”来重复上一次操作

    你所做的许多操作可能都有重复的价值。比如进入插入模式添加一些文本内容。你只需执行一次,然后一直执行点命令来重复就可以了。请看下面的例子。

    删除一个单词

    dw

    紧接着执行,再删除5个单词

    5.

    多么给力! 如果结合可视化模式,发挥的能力更让你大开眼界。

    复制与粘贴

    快速拷贝与粘贴文本同样也是文本编辑器的必备功能,vim当然也是这方面的高手。

    【注意:除了点命令外,&也是一种强大的重复命令,用于重复ex模式下的上一条命令(还记得ex模式吗?)】

    拷贝文本

    Vim的拷贝与大家预期的方式可能略有不同。拷贝命令不是大家料想的c。不知你还记不记得,上文提到c表示“修改”,已经被占用了。Vim用拉取来表示拷贝,简写为y。

    y: 拷贝选中内容 yy: 拷贝当前行

    记住,这种拷贝动作与你熟悉的那种拷贝并无不同——你只是在目的处复制了一份而已。

    剪切文本

    剪切很简单:跟删除操作差不多。所以呢,剪切实质上就是将删除的内容挪到缓冲区,然后将这段删除的内容再粘贴就可以了。

    粘贴文本

    粘贴跟我们想的一样——使用p命令。所以呢,如果你执行dd命令删除了一行,你可以用p粘贴回去。

    有一点要记住:粘贴的起始位置从你当前光标位置之后开始,根据你拷贝的内容,你要么粘贴字符或单词,要么粘贴行或列。如果想撤销粘贴,使用通用撤销命令“u”就可以了。

    拷贝复制命令总结
    从当前行拷贝到下一个命令(名词)拷贝当前行的快捷键在当前光标所在行下一行黏贴拷贝或者删除的内容在当前光标所在行前一行黏贴拷贝或者删除的内容

    交换两行的位置

    ddp

    使用这条命令可以很快速的交换两行的位置。第一部分删除你所在的行,第二部分将它粘贴回之前所在位置的下面。(ps:文章中用的是above,但是实际上拷贝回下方位置)

    拼写检查

    如果没有拼写检查的话,感觉会很糟糕,还好vim这方面做得很好。当然我们需要先在配置文件中配置拼写检查选项。

    在~/.vimrc的某个位置中添加

    找出拼写错误

    如果在配置文件中设置了拼写检查的选项,那么拼错的单词会自动添加下划线。你也可以手动输入:

    set spell和:set nospell来启用或禁用。

    不管怎么说,一旦开启了拼写检查,如果存在拼写错误的话,你就可以使用以下命令来跳转:

    跳转到下一处拼写错误

    ]s

    跳转到上一处拼写错误

    [s

    若光标处是错误单词,给出修改建议

    z=

    将识别的错误单词标记正确

    zg

    将vim视为正确的单词标记为错误单词

    zw

    我习惯在~/.vimrc中添加一些拼写相关的简写命令。首先就是让修正拼写错误的命令变得简单:

    将拼写修正标记为f

    在某些情况下,比如说我需要创造性的拼写一些单词时,我会使用下面的命令来取消拼写检查。想要重新打开拼写检查只要再执行一次这个命令就可以了。

    Toggle spelling visuals with <leader>s nnoremap <leader>s :set spell!
    替换

    Vim的另一个强大的功能是替换。命令分为三部分,首先指定将要被替换的字符串,之后是替换的新字符串,最后指定替换范围。

    基本设置为:%s

    将每行的foo替换为bar

    :%s /foo/bar/g

    将当前行中的foo替换为bar

    :s /foo/bar/g

    【注意: 两个命令的不同之处在于,单行替换s前少了%】

    还有许多其他的选项,不过这些是最基本的。

    PS: 前面&命令重复此类操作(:进入ex模式后执行的命令)

    进阶

    太棒了。我们已经讨论了大部分文本编辑器的基本功能,以及在vim中如何使用这些功能。现在可以进行高级vim的任务了——请注意,我说的高级进阶是对初学者而言,不是Kana这样的大神级人物。

    重复操作

    在稍早之前我们讨论了“.”点命令的重复功能。有些命令适合使用点命令来重复,有些则不适合,区分这两种命令很重要。

    通常,如果你想要使用“.”(或者如Drew Neil称之为点命令)实现命令重复,说明你想用点命令缓存的命令来做比较细致的操作。

    比如说你要向若干行行末添加一些内容,但是添加的前提是被添加的行包含指定的字符串。你可以使用如下方式来实现:

    搜索字符串

    /delinquent

    现在,只要你按下“n”键都会跳转到下一个搜索到的实例。那么,从第一个匹配实例开始,我们给它追加文本。

    在行末添加文本

    A[DO NOT PAY] [Esc]

    好,这条命令执行完成了。不过接下来还有12个地方需要你来做。点命令允许我们简单地重复执行上一条命令,而且我们还需要保存搜索结果,可以将这两条命令结合起来。

    跳转到下一个匹配实例并向行末添加文本

    n.

    注意,这种方式将动作与缓存的命令结合起来,所以我们能按照预期地那样跳转并执行命令。

    文本对象

    文本对象很特殊。这些文本对象的存在使得你可以操作(动词)更加复杂的对象(名词)。比起选中某个单词并删除、跳转到句首并删除句子等简单操作来说,不管你在何种文本对象的区域内,你都可以对它们执行这些操作。

    说是说不清,实践出真知嘛,我们可以看几个例子。

    单词文本对象

    首先来看基于单词的对象

    iw : 单词内 aw :单词周围

    这些都是目标(名词),所以我们可以对它们做一些操作,比如说删除、修改等等。

    删除单词(包括单词周围的空格)

    daw

    【注意: 对象内部与对象周围这两者之间的区别在于单词旁边是否有空格】

    句子文本对象
    is: 句子内部 as: 句子周围

    句子对象的工作原理与单词对象是一致的,想象一下,你敲了一大段句子,敲了一半后悔了想要删掉。你就可以简单的使用下面这条命令,而不用回到句子开头来申明删除整行。

    修改整条句子

    cis

    这条命令杀伤力还是挺大的,它会删除整条句子并进入插入模式等待你输入新的内容。

    更多对象类型

    还有许多其他的对象类型,我只简单的来介绍一下。

    段落 : ip 和ap 单引号 : i’和a’ 双引号: i”和 a”

    当我编辑代码或者HTML文件时,时常会用到这些命令。关键是如果这些对象文本存在问题,你甚至并不需要处于这些对象内部就可以操作它们;如果光标当前位置在双引号外面(经测试,跟双引号处于同一行并在双引号前面),只需要输入ci”就可以删除双引号内部的所有内容,并将你挪到双引号中间进入插入模式等待你的输入。简直不要太酷。

    对其他类型的某些对象同样适用,比如说各种括号(圆括号、尖括号、大括号)和标签(html)。

    比如说编辑HTML链接时,URL地址一般在双引号之间,链接文本在标签中定义;通过vim这两条命令可以很方便地修改:ci”(修改URL)和cit(修改链接文本)。

    文本对象总结

    下面列出常见的文本对象:

    单词: iw 和 aw 句子: is 和 as 段落: ip 和 ap 单引号: i’ 和 a’ 双引号: i” 和 a” 反勾号 : i· 和 a 圆括号: i( 和 a( 方括号: i[ 和a[ 大括号: i{ 和a{ 标签: it 和at

    总的来说,我使用最多的是单词,双引号和标签。

    进入可视化模式

    Vim的有许多迷人之处吸引着我们,不过它们相比较可视化模式的技能来说,还是太弱了。

    也许可视化模式的最强大之处在于:我们前面学到的所有的一切命令,通过结合可视化模式使用,能力都会大有提升。这是由于在可视化模式下选中的高亮文本,可以全部作为命令的操作对象。

    首先,学会进入可视化模式并选择文本。通过“v”进入可视化模式,有三种选择。

    基于字符选中: v基于行选中: V段落选中: Ctrl-v
    在容器内部选中文本

    有时候你会处于一段文本中,两头被,.({[之类的符号所包围。你可以使用下面的命令来选中这部分的内容:

    选中圆括号中的内容

    vi(

    选中中括号之间的内容

    vi[

    你还可以加数字限定选择的层数(比如说你处于嵌套层)

    选中两层大括号之间的所有内容

    v2i{

    【注意: 你也可以使用va来代替vi。请不要被这些迷惑。它们与我们所知的名词和动词没有什么不同】

    基于字符的可视化选择

    从基于字符的可视化开始介绍(从普通模式输入v进入可视化模式),在这种模式下你可以选中单个字符、多个字符、单词等等。相比较行选择模式来说,我比较少使用这种模式,不过只是相对而言,其实用的也还是挺多的。

    这里最主要的是要理解这一点: 处于可视化模式中,你的移动动作会修改被高亮选择的文本。这就意味着,w或)之类的动作也会起作用,它们可以扩展当前高亮选择的范围。之后,这部分高亮文本就可以作为命令执行的目标。

    基于行选择的可视化模式

    普通模式下输入V进入这种模式,之后我们会讨论在这种模式下的操作。

    基于列选择的可视化模式

    可视化模式中还可以垂直地选择文本,这对操作列数据来说很给力。

    可视化模式下对选中文本的执行动作

    对这些文本做什么操作都是你的自由,不过最普遍的操作是删除、拷贝和粘贴。想一下你平常用鼠标选中一片文本会做什么操作?

    进入可视化模式,选中两个以上单词并拷贝

    vwwy

    拷贝之后你可以在任何你希望的地方输入p来粘贴。

    或者你可以做一些基于行的操作。

    进入行选择模式,删除几行文本

    Vjjd

    你也可以使用文本对象,不过这种操作不太安全,最好别做。

    可视化模式下选中一整个段落

    vip

    可视化模式下选中一整段文本并粘贴到当前段落之下。

    vipyjjp

    不要因为命令很长而感到崩溃。要记住,这些命令跟我们平常说话是一样的。你可以没有任何困难地、很随意地念叨:

    我想去商店。

    这条命令也是一样的:

    拷贝这一段,下移两行,再粘贴。

    将可视化模式与重复结合

    可视化模式还有一个很神奇的地方,对于选中的文本,你可以通过点命令来执行之前缓存的命令。请看下面这个例子:

    foo bar thing other yetanother also

    如果想在每行前面都加个冒号,可以现在第一行foo之前添加,然后可视化模式下选择之下所有行,执行点命令就可以了。

    :foo :bar :thing :other :yetanother :also 1 2 3 4 5 6 :foo :bar :thing :other :yetanother :also 【注意:要想使用这个功能,必须要在配置文件中添加映射 vnoremap . :norm.】

    BAM!

    觉得这功能没有那么酷炫? 那就想象一下: 你有个六万行的文件,每行都与例子一样,需要追加个冒号。你会怎么做?

    对整个文件添加分号

    0i:j0vG.

    wut

    大大简化了我们的操作,大杀器一枚。步骤如下:

    走到第一行行首并插入一个冒号(0i:)走到下一行定位到行首位置(j0,注意之前是插入模式,需要先回到普通模式)选中当前行到文件末尾的内容(vG)给选中的内容添加冒号(.) 这样对六万行文件的操作就全部完成了。你甚至不需要去记一些乱七八糟的口诀——就像学骑单车会摔倒一样,摔着摔着你就会了。相信我。
    转载请注明原文地址: https://ju.6miu.com/read-670554.html

    最新回复(0)