基本功

前面我们学会了插件管理器和如何实现语法高亮,相信大家已经从中体会到了vim插件的强大功能。现在,是时候回来补一补基本功了。

Vi有三种主要模式,正常模式,插入模式和可视化模式。正常我们推荐的方式是所有的移动命令只在正常模式下进行,只有在修改的时候再进入插入模式。

这个切换是如此频繁,所以Vi提供了很多快速切换模式的命令。Vim的难学之处之一就是命令太多。

模式切换的好处

如《Practical Vim》中第8条所说,正常模式和插入模式的切换,可以为撤销编辑带来方便。在没有模式切换的文本编辑器中,编辑器是很难确实您撤销一次是打算撤销一个字符,或者是一个单词还是更大的粒度。而在Vi中,这不是问题,在输入时进入插入状态,输入结束了就Esc退回正常模式。这一过程就构成了一次可撤销的动作。

基本移动命令

行内移动

  • h: 向左一个字符
  • l: 向右一个字符
  • 0: 移动到行首
  • ^: 移动到行首第一个非空的字符
  • $: 移动到行尾
  • g_: 移动到行尾第一个非空的字符
  • 列号|: 精确移动到列号

跨行移动

  • j: 向下一行
  • k: 向上一行

    也可以用emacs的C-n和C-p来上下翻。
  • G: 跳到第n行,默认跳到行尾。
  • gg: 跳到第1行
  • +: 到下一行的第一个字符
  • -: 到上一行的第一个字符
  • “:G跳转之后,跳回原来的行
  • ”: 功能同“,但是停在行首

vi还支持跳转的书签功能,使用m[a-z]命令,可以定义26个书签。

* m{书签名}: 定义书签

* `{书签名}:跳转到书签定义时的光标位置

* ‘{书签名}: 跳转到书签定义位置的行首

按单词移动

  • w: 按单词移动,标点符号也算一个单词
  • W: 按单词移动,标点符号算在单词内
  • e/E: 移动到单词结尾(大写忽略标点符号)
  • b/B: 按单词向前移动(大写忽略标点符号)

滚动一整屏

  • C-f 向前一屏
  • C-b 向后一屏
  • C-d : 向前半屏
  • C-u: 向后半屏
  • C-e: 屏幕上滚一行
  • C-y: 屏幕下滚一行

重新调整屏幕位置

  • z: 光标移至屏幕顶
  • z.: 光标移至屏幕中心并滚屏
  • z-: 光标移至屏幕底并滚屏

重绘屏幕

  • C-l: 重绘屏幕

在当前屏幕中移动

  • H: 移至屏幕第一行
  • M: 移至屏幕中间
  • L: 移至屏幕底部

切换进插入模式的命令

  • i: 在光标前插入字符
  • a:在光标后插入字符
  • A: 在一行的结尾处插入字符,相当于$a组合。
  • I: 在一行的开头插入字符,相当于^i组合。
  • o: 在光标的下一行新开一行进行插入,相当于A
  • O: 在光标的上一行新开一行进行插入,相当于ko
  • s: 删除光标处的字符再进行插入
  • S: 删除光标所在行再进行插入
  • r: 替换当前字符
  • R: 替换当前行的字符,可以提前Esc退出,相当于^c
  • c: 更新文本,就是先删除部分文本再插入
    • cw: 更新当前单词
    • c2b: 更新光标之前的两个单词
    • c$: 更新光标处到行尾
    • C: c$的简写
    • c0: 更新光标处到行首
    • cc: 更新行,跟S效果一样

Vi命令的一般形式

在继续学习更多命令之前,我们先看一下vi命令之所以强大的原因,因为vi的命令并不仅仅是简单的单独命令,而是可以进行组合。

vi命令的一般格式是:{命令}{次数}{文本移动命令} 或者 {次数}{命令}{文本移动命令}

上面学习的c命令就是很好的例子,比如c2b,c是命令,2是两次,b是后退

同样,对于用于删除的d命令,删除当前单词,就把cw换成dw就可以了。d是删除从光标到行尾。与C是c的别名一样,D是d$的别名。

复制命令y,也是同样的用法。

在vim中,文本移动命令被扩展成文本对象。

最常用的文本对象命令有:

* aw: a word,单词不计空格

* iw: inner word, 单词,计空格

* as: a sentence,一句

* is: inner sentence

* ap: a paragraph,一段

* ip: inner paragraph

* a” a’ a`: 一个字符串

粘贴

  • p/P: 命令用于粘贴用d命令或y命令剪切或复切的文本

切换大小写

  • ~: 切换大小写

重复和撤销

  • . : 重复上一条命令
  • u: 撤销上一条命令
  • U: 将一整行恢复到原来的状态

不退出插入模式进行编辑

Vi推荐主要工作时间都停留在正常模式,但是如果您非习惯于在编辑模式进行编辑,Vim也是提供在这个模式下工作的命令的。

比如,我们最经常发生的事情就是输错了字符要修改。

这时候我们有三大利器可以使用:

* C-h: 退格删除前一个字符

* C-w: 删除前一个单词

* C-u: 删除到行首

另外,我们还可以通过C-o + 正常模式的命令这种方式来节省切换的动作。

搜索

全文搜索

“/”用来进行向下搜索,”?”则是向上搜索。搜索下一个用n,上一个用N.

vi的强大之处在于,搜索的结果仍然可以跟其他命令结合,比如跟d结合删除。

行内搜索

除了全文搜索,行内搜索也是快速编辑的有效手段。以vi的风格,也是为我们提供了多种行内搜索的方法:

  • f{字符}:向后搜索字符
  • F{字符}:向前搜索字符
  • t{字符}:向后搜索字符,不过定位在该字符之前的字符上
  • T{字符}:向前搜索字符,定位在该字符之前的字符上
  • ;:重复上一次的搜索,方向相同
  • , : 重复上一次的搜索,方向相反

搜索仍然是可以跟操作命令结合,比如df{字符},删除到某字符为止的内容。

缓冲区

当我们使用d命令删除一段文本时,它们会被依次存入0-9号这10个缓冲区中。除了这10个自动缓冲区之外,vi还支持a-z一共26个命名的缓冲区。

我们使用双引号”用来指示对缓冲区的访问。比如:”2p,将2号缓冲区的内容粘贴到当前光标处。

不过,记住自动放到哪个缓冲区位置还是一件反人类的事情,更好的办法是,使用命名的缓冲区。vi提供了26个命令缓冲区,分别用a-z 26个字母表示。

从此我们的剪切、复制和粘贴的功能就更丰富了。比如”add,将当前行剪切放入a缓冲区。粘贴时使用”ap。再如:”b10yy,将当前开始的10行复制到b缓冲区。

vi作为一个功能过剩的编辑器,当然不只这么简单了。它还支持对于缓冲区的内容进行追加,方法很简单,使用缓冲区的大写字母名移,比如”Byy,将当前行追加到b缓冲区内容的末尾。

黑科技

针对文本中的数字进行运算

这个黑科技太好玩了,如果光标处是一个数字的话,可以通过C-a来对其进行+1操作,C-x进行-1.

如果要多加减几次,就先给个数字就好了。

这还不够黑科技,C-a和C-x还有搜索功能,如果当前光标不是一个数字,vim会先搜索到下一个数字,再对其进行操作。对于大量数字文本要操作的情况,实在是太方便了。

Vim技能修炼教程(4) - 基本功的更多相关文章

  1. Vim技能修炼教程(2) - 语法高亮速成

    语法高亮速成 我们继续在人间修行Vim技能之旅.上一次我们学习了如何通过vundle安装插件,这次我们迅速向写插件的方向挺进. 我们先学习一个最简单的语法高亮插件的写法. 语法高亮基本上是由三部分组成 ...

  2. Vim技能修炼教程(10) - 代码跳转

    程序员功能 前面我们用了5讲的篇幅来讲基本编辑的基本功:第4讲是基本操作,第5讲是操作符,第6讲行编辑ex命令,第7讲可视模式,第8讲多窗口,第9讲缓冲区和标签页. 从这一讲开始,我们从通用功能向程序 ...

  3. Vim技能修炼教程(8) - 多窗口

    多窗口 如果一个vim只能开一个窗口,那肯定是有点low.尤其是写代码的时候,打开多个文件是经常的需求. 速成教程 横着切成两个 :split 文件名 上下切换窗口 Ctrl-W加上上下键,可以实现上 ...

  4. Vim技能修炼教程(3) - 语法高亮进阶

    语法高亮进阶 首先我们复习一下上节学到的三个命令: * syntax match用于定义正则表达式和规则的对应 * highlight default定义配色方案 * highlight link将正 ...

  5. Vim技能修炼教程(1) - 使用vundle管理插件

    世界上有两个伟大的编辑器:一个是emacs,一个是vi.它们从诞生以来,一直在Unix/Linux世界得到最广泛的支持. 尽管过了几十年,在Windows平台上和跨平台上有层出不穷的后起之秀不断挑战它 ...

  6. Vim技能修炼教程(17) - 编译自己的Vim

    编译自己的Vim 前面我们已经对Vim有比较丰富的了解了.我们也知道Vim有很多编译时的选项,很多功能依赖于这些编译选项.其中最重要的就是脚本语言的支持,很多发行版本是不全的.为了支持我们所需要的功能 ...

  7. Vim技能修炼教程(16) - 浮点数计算函数

    浮点数计算函数 这一节的所有函数,只有在vim编译时支持了+float时才有效. 三角函数 sin() : sine正弦函数 cos() : cosine余弦函数 tan() : tangent正切函 ...

  8. Vim技能修炼教程(15) - 时间和日期相关函数

    Vimscript武器库 前面我们走马观花地将Vimscript的大致语法过了一遍.下面我们开始深入看一下Vimscript都给我们准备了哪些武器.如果只用这些武器就够了,那么就太好了,只用Vimsc ...

  9. Vim技能修炼教程(14) - 写个ex命令吧

    写个ex命令吧 我们第二节开始就写了语法高亮的插件.这一节,我们学习第二种插件的写法,就是写个我们自己的ex命令. 自定义ex命令的命令是:command,我们在~/.vim/下建立一个plugin目 ...

随机推荐

  1. android ramdisk

    android ramdisk 1.android文件系统的结构android源码编译后得到system.img,ramdisk.img,userdata.img映像文件.其中, ramdisk.im ...

  2. DVWA安装

    DVWA安装: 启动xampp下的apache中间件和mysql 将dvwa放到xampp下的htdocs目录下 在浏览器输入http://127.0.0.1/dvwa 即可使用啦! 还有owasp的 ...

  3. intellij 文件太大,无法code assistant

    添加 idea.max.intellisense.filesize=2500 在IDE_HOME\bin\idea.properties https://intellij-support.jetbra ...

  4. 无法读取服务器服务中的服务器队列性能数据。数据段的第一个四字节 (DWORD) 中包

    无法打开服务器服务性能对象.数据段的第一个四字节 (DWORD) 包含状态代码. 解决方法:修改注册表禁用PerfNet性能计数器. 具体方法:打开注册表,在HKEY_LOCAL_MACHINE\SY ...

  5. Docker 坑点记录

    1 关于 Docker Windows 文件夹问题 C:\Users Docker Machine tries to auto-share your /Users (OS X) or C:\Users ...

  6. python PIL/Pillow图像扩展、复制、粘贴处理

    http://blog.csdn.net/yuanyangsdo/article/details/60957685

  7. 什么是JSON?

    JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的符号标注. {} 双 ...

  8. Spring Cloud实战

    Spring Cloud实战(一)-Spring Cloud Config Server https://segmentfault.com/a/1190000006149891 https://seg ...

  9. js今日小结—Ajax、前端安全、GET&POST、闭包、HTTPS

    HTTPS HTTP+加密(SSL.TLS)+认证+完整性保护 = HTTPS: GET和POST的区别 get拉取数据,post传输数据 get请求能被浏览器主动缓存,post不会(除非手动) ge ...

  10. Android之UI--打造12种Dialog对话框

    最近有空,来把app中常用到的Dialog对话框写一篇博客,在app中很多地方都会用到Dialog对话框,今天小编我就给大家介绍Dialog对话框. 先看看效果图: 12种,可根据需求选择,上图可知, ...