基于GitHub开源Vim学习项目learn-vim

1. 为什么需要了解Vim语法

像是我们学习一门外语,我们需要了解它的语法、它的词汇并不断地练习。对于Vim而言,它的语法就是它命令的设计逻辑,词汇就是它的各种快捷键。通过学习其语法,能够让我们通过其规律来进行Vim操作,而不是靠记忆快捷键表来学习。

2. 什么是Vim的语法

Vim的语法:

动词 + 名词
动词 + 量词 + 名词

其中动词指代的以下的键:

y    yank(复制)
d   delete(删除)
c   change 删除文本,将删除的文本存到寄存器中,进入插入模式

根据 :h operator可以看到,一共有16种operator,但一般只用以上的三种操作符即可。

名词指代的以下的键:

h    左
j   下
k   上
l   右
w   向前移动到下一个单词的开头
}   跳转到下一个段落
$   跳转到当前行的末尾

3. Vim语法的应用

3.1 实例

let mut a = "123";

对于上述的Rust代码,我们可以结合上述的的语法规则完成下面的操作:

  1. 复制当前光标位置到行尾的所有文本
  2. 删除当前位置到下一个单词的开头
  3. 修改当前位置到这个段落的结尾

根据我们上述的语法规则 动词+名词 。可以使用以下的快捷键进行操作:

  1. 复制+行尾 -> y$
  2. 删除+单词开头 -> dw
  3. 修改+段落 -> c}

当然根据我们上述的语法规则 动词+量词+名词 。也可以使用以下的快捷键进行以下的操作:

  1. 向左拷贝2个字符:y2h
  2. 删除后两个单词:d2w
  3. 修改后面两行:c2j

有一种特殊的语法规则 2*动词,比如:dd,yy,cc用来执行删除,复制或者修改整个行。这种语法规则是用来表示进行行级操作。

3.2 更多名称(文本对象Text Objects)

上述的语法只能快捷地编辑一些简易的情况。但难以方便地解决比较复杂的情况,比如如何删除括号中的所有内容?如何删除引号内的内容?

文本通常是结构化的,特别是在代码中,文本经常被放置在小括号、中括号和引号当中。Vim提供了一种处理这种结构化的文本对象的方法:

文本对象可以被操作符operations使用,这里有两类文本对象:

i + object  内部文本对象
a + object  外部文本对象

内部文本对象外部文本对象区别在于,内部文本对象选中的部分不包含包围文本对象的空白或括号等,而外部文本对象则包含这些对象。如果你的光标位于一对括号内不,例如(hello vim)中:

  • 删除括号内部的内容但保留括号:di(
  • 删除括号以及内部的内容:da(

让我们看一些别的例子,假设你有这样一段Rust的函数,你的光标停留在"Hello"中的"H"上:

fn hello() -> bool {println!("Hello Vim");true
}
  • 删除整个"Hello Vim":di(
  • 删除整个函数(被{}包含):di{
  • 删除"Hello"这个词:diw

让我们来看最后一个例子。假设你有这样一些html的标签的文本:

<div><h1>Header1</h1><p>Paragraph1</p><p>Paragraph2</p>
</div>

如果你的光标位于"Header1"文本上:

  • 删除"Header1":dit
  • 删除<h1>Header1</h1>dat

如果你的光标在"div"文本上:

  • 删除h1和所有p标签的行:dit
  • 删除所有文本:dat
  • 删除"div":di<

下面列举一些常用的文本对象:

w     一个单词
p     一个段落
s     一个句子
(或)  一对()
{或}  一对{}
[或]  一对[]
<或>  一对<>
t     XML标签
"     一对""
'     一对''
`     一对``

可以通过 :h text-objects 了解更多

4. Vim语法的结合性

结合性意味着有很多可以组合起来完成更复杂命令的普通命令,就像是在编程中通过一些简单的抽象建立更复杂的抽象,在Vim中你可以通过简单的命令的组合执行更复杂的命令。Vim语法正是Vim中命令的可结合性的体现。

4.1 Vim与外部程序结合性

Vim的结合性强大之处体现在它和外部程序的可结合性。Vim的过滤操作符!可以用外部程序过滤我们的文本。

假设你有下面这段混乱的文本并且你想把它用tab格式化的更好看的一些:

Id|Name|Cuteness
01|Puppy|Very
02|Kitten|Ok
03|Bunny|Ok

这件事情通过Vim命令不太容易完成,但是你可以通过终端提供的命令column很快的完成它,当你的光标位于"Id"上时,运行!}column -t -s "|",你的文本就变得整齐了许多:

Id  Name    Cuteness
01  Puppy   Very
02  Kitten  Ok
03  Bunny   Ok

让我们分解一下上面那条命令,动词是!(过滤操作符),名词是}(到下一个段落)。过滤操作符!接受终端命令作为另一个参数,因此我把column -t -s "|"传给它。我不想详细描述column是如何工作的,但是总之它格式化了文本。

这就是Vim的结合性的强大之处。知道的动词 操作符、名词 动作,终端命令越多,组建复杂操作的能力成倍增长。

这种具有结合性的行为也正符合Unix的哲学:一个命令做好一件事动作只需要做一件事:前往X。操作符只需要做一件事:完成Y。通过结合一个操作符和一个动作,你就获得了YX:在X上完成Y

甚至,动作操作符都是可拓展的,你可以自己创造动作操作符去丰富你的Vim工具箱,Vim-textobj-user插件允许你创建自己的文本对象,同时包含有一系列定义好的文本对象。

Vim教程1 Vim的语法相关推荐

  1. 《呆呆大虾原创VIM教程-基础篇》文 and《Vim-从入门到进阶》图

    目录 将CapsLock 键 改为 ESC键 原创Vim教程-01前言 原创Vim教程-02小试牛刀 原创Vim教程-03帮助(辅助) 原创Vim教程-04移动 对区域进行选择(图) Vim教程-05 ...

  2. Vim教程2 在文件中的移动

    基于开源的Vim学习教程learn-vim 1. 字符导航 在Vim中最基本的移动单元是上下左右移动一个字符. h 左 j 下 k 上 l 右 当然也可以通过键盘的方向键进行移动. 为什么Vim用这几 ...

  3. vim教程:vimtutor

    目录 一.第一讲 1.移动光标 2.VIM的进入和退出 3.文本编辑之删除 4.文本编辑之插入 5.文本编辑之添加 6.编辑文件 7.第一讲小结 二.第二讲 1.删除类命令 2.更多删除类命令 3.关 ...

  4. Linux系统里让vim支持markdown格式的语法高亮

    Markdown是深受程序员喜爱的一个文件格式. 然而Linux里默认的vim设置,并不支持markdown格式的语法高亮显示. 下面就来介绍如何设置使得markdown格式的文件在vim里也能享有语 ...

  5. 【Liunx】Linux vi/vim 教程

    所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正 ...

  6. Linux vi/vim教程

    文章转自:http://www.runoob.com/linux/linux-vim.html 版权归原作者! 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存 ...

  7. Linux入门教程——VI/VIM 编辑器

    前言 本文小新为大家带来 Linux入门教程--VI/VIM 编辑器 相关知识,具体内容包括VI/VIM是什么,VIM的三种工作模式介绍,包括:一般模式,编辑模式,指令模式,以及模式间转换等进行详尽介 ...

  8. VIM 教程文档的学习

    原文:http://vimcdoc.sourceforge.net/ 文章目录 词移动 移动到一个指定的字符 括号匹配 移动指定行 滚屏 搜索 简答的查找模式 匹配特殊字符 标记 其它 操作符 可视模 ...

  9. linux下vi与vim区别以及vim的使用-------vim编辑时脚本高光显示语法

    vi与vim vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对 ...

最新文章

  1. 浅谈Web中前后端模板引擎的使用
  2. 模板引擎--handlebars
  3. 一个案例、6个步骤全程详解A/B测试,看这篇就够了!
  4. Android中的PopUpWindow
  5. c语言关键字识别程序,c语言-以关键字搜索程序
  6. 2017黑客大预言:病毒传播无需文件,无人机可能成为炸弹
  7. Atitit BLE 协议栈 艾提拉总结 目录 1. ——关于BLE的一些基本概念——
  8. 浅谈SSD应用和发展趋势
  9. HFSS阵列天线设计与仿真3
  10. 遗传算法应用于XGBoost的调参过程
  11. win10计算机的数字小键盘,如何设置Win10开机默认开启数字小键盘?
  12. 软件工程(二)——过程模型
  13. 屏蔽广告效果好的手机浏览器,这3款你一定不要错过
  14. java周总结1113_流总结_序列化_xml_html
  15. 机智云AIoT开发平台,让物联网产品开发和运营有迹可循
  16. linux查询进程号是否存在启动脚本,Shell实现判断进程是否存在并重新启动脚本分享...
  17. 如何在命令行快速获取公网动态 IP 地址
  18. UI设计要学习哪些软件
  19. 怎样修改MindMapper中的线条
  20. matlab 对曲线积分,matlab计算曲线积分并画出积分曲线

热门文章

  1. 应用复杂程度极高 公安大数据向新技术招手
  2. 盘古开源:“大内存”时代即将到来,颠覆性的存储模式
  3. Windows 10的中文用户名怎么改成英文?
  4. 联发科4G全网通MT6735通讯模块方案,MT6735核心板资料
  5. iOS马甲包遇到问题怎么过审,App Store
  6. 「一文讲透」快消行业营销数字化转型
  7. android语音信箱功能,语音信箱的功能有哪些?
  8. Java学习顺序流程和学习方法
  9. 调研发现:外企最关注员工心理健康,私企对财务健康投资最大,国企更关注员工职业和社会健康 | 美通社头条...
  10. 打造高效的跑腿配送系统,分享源码与经验