专栏首页liuchengxuVim 文本对象指南 (1)

Vim 文本对象指南 (1)

本文还是介绍一些基本内容, 关于插件使用, 可以查看完整配置 space-vim.


如果想要在 Vim 里拥有高效编辑的能力, 必然要掌握超过单个字符编辑的能力, 不然就可能出现像之前看到过的一个笑话 :

在你刚开始使用 Vim 的时候做过什么令你 “难忘” 的事情? 答: 使用 j 跳转到 5000 行 :).

也就是说, 要掌握词 (word), 句子 (sentense), 段落 (paragraph) 级别的编辑能力. 在 Vim 里, 这样的概念叫做 文本对象 (text objects) . 详见 Vim 的 help :h text-objects. 另外, 这些概念对于只是对英文表现比较好, 因为英文可以按照空格划分词, 但是中文并不可以.

本文的内容实际很多来自 Vim 的 help. 如果开始知道不懂的时候去查看 Vim 的 help, 基本上也就真正知道如何学习 Vim 了.

对于普通文本文件和常见程序语言结构, Vim 都提供了文本对象. 你可以通过 Vim script 定义新的文本对象.

一个编辑命令的结构

在 Vim 中, 编辑命令 (editing commands) 有着如下的结构:

<number> <operator> <text object or motion>

<数字> <操作符> <文本对象或移动命令>

number: 数字用于在文本对象或移动操作上进行多次执行, 比如说, 向后 3 个单词, 向前 2 个段落. 数字是可选的, 可以出现命令(command) 的前面,也可以放在命令的后面.

If the motion includes a count and the operator also had a count before it, the two counts are multiplied. For example: "2d3w" deletes six words.

如果是 motion 和下面所提到的 operator 都有数字修饰, 那么效果是两个数字相乘. 比如, 2d3w 是删除 6 个单词.

operator: 操作符, 比如, change, delete (删除), yank (复制). 操作符也是可选的. 但是如果没有操作符的话, 那么就只剩一个移动命令, 而非一个编辑命令了.

:h operator, Vim 默认提供的 operator 有:

operator

text object 或者 motion 可以是一个文本对象, 比如, 一个单词, 一个句子, 一个段落, 或者是一个移动, 比如, 向下移动一行, 向后翻一页, 到一行末尾.

:h text-objects :

text-objects

:h motion :

motion

一个编辑命令(editing command) 等于一个操作符加上一个文本对象或者移动, 比如, 删除一个单词, 改变一个句子, 复制一个段落.

an editing command = an operator + a text object/motion

普通文本对象

Vim 为普通文本文件提供了三种类型的文本对象: 词(word), 句子(sentence), 段落(paragraph).

  • aw - a word (包含在周围的空格)
  • iw - inner word (包括周围的空格)
Lorem ipsum dolor sit amet...

daw

Lorem dolor sit amet...

a 开头的文本对象包含周围的空格, 以 i 开头的文本对象不包含. 这个原则对所有的文本对象都适用.

w 看起来与 aw 效果差不多. 区别在于光标位置. 比如, 如果用 dw 来删除一个词, 光标必须在词的开头. 如果在除了开头的其他位置使用 dw, 只能删除部分单词. 但是, daw 允许光标在一个词的任何位置删除整个单词.

w & aw

如果你已经懂得了 word 的 w 与 aw 的区别, 下面句子与段落就已经掌握了, 道理是一样的, 只是将 w 换成了 s 与 p.

句子

  • as -- a sentence
  • is -- inner sentence
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt
ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

cis

 Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris
nisi ut aliquip ex ea commodo consequat.

注意, "inner" 文本对象不包含尾部的空格.

段落

  • ap -- a paragraph
  • ip -- inner paragraph
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis 
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.

dap

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.

移动命令 vs. 文本对象命令

  • 一个使用移动的命令, 比如, cw, 是从光标处开始生效.
  • 一个使用文本对象的命令, 比如, ciw, 如果光标在何处, Vim 都将在整个文本对象上生效.

是一个移动命令还是一个文本对象命令, 区别在于是否有 a (around) 或者 i (inner) 这样的限制. 对于每个类型的文本对象都是如此. 尽管使用文本对象的方式需要多输入一个字符, 但是这可以节省你的时间将光标移动到 "正确" 的位置.

参考: [1] Vim Text Objects: The Definitive Guide

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 如何使用 Vim 的 help

    实际上,无论是 Vim 的基础知识还是进阶知识,大都可以从 help 中找到指引。但是我想很多人并没有意识到这一点,或者并没有重视这一点。RTFM (read ...

    用户1558438
  • 用 Go 构建一个区块链 -- Part 3: 持久化和命令行接口

    翻译的系列文章我已经放到了 GitHub 上:blockchain-tutorial,后续如有更新都会在 GitHub 上,可能就不在这里同步了。如果想直接运行...

    用户1558438
  • Shell 中的中括号用法总结

    需要注意的是 [ 与 ] 与操作数之间一定要有一个空格,否则会报错。比如下面这样就会报错:

    用户1558438
  • Python 命令行之旅:深入argparse (一)

    在第一篇“初探 argparse”的文章中,我们初步掌握了使用 argparse 的四部曲,对它有了一个基本的体感。但是它具体支持哪些类型的参数?这些参数该如何...

    Python猫
  • C#移动跨平台开发(2)Xamarin移动跨平台解决方案是如何工作的?

    概述   上一篇 C#移动跨平台开发(1)环境准备发布之后不久,无独有偶,微软宣布了开放.NET框架源代码并且会为Windows、Mac和Linux开发一个核心...

    用户1153966
  • 搜狐图文匹配算法大赛_方案分享

    参加这次比赛的初衷是作为机器学习课程的大作业,这两天写了课程报告,所以将报告内容修改了一下进行分享。 我所在的团队(“中国国家跳水队”,排名如队名,一度严重跳水...

    机器学习AI算法工程
  • Boost容器中的重载运算符

    Qt君
  • Python2运行时查看线程信息

    kongxx
  • 按键精灵——文本读写操作

    之前有提到计划写一个文本读写的专题,但提笔的时候发现独立一篇出来不太合适,但是不独立出来篇幅又有点过长。最后写完才发现:原来隐含的知识点挺多的,自己都有点惊到了...

    Ed_Frey
  • 搭建容器监控

    访问Grafana,通过ip+3000端口的方式访问,默认账户密码(admin/admin)。

    分母为零

扫码关注云+社区

领取腾讯云代金券