如何在vi中优雅地使用ex

记得刚开始用vi的时候,只会用:wq或者:q来退出,后来又学会了ZZ,今天上班路上没事做,又把 Learning the Vi & VimIntroducing the ex Editor 过了一遍,又发现了一个退出命令-:x,其实很早以前这些内容都看过,但是由于使用惯性,渐渐地会把一些平时不太用到的命令给遗忘了,其实一个防止遗忘的好办法就是认真总结一下,方便以后查阅。

其实当我们在命令模式下按下冒号后,就已经进入ex编辑模式了,也就是说退出时使用的命令wq q x其实都是ex的命令。vi的行编辑都也都是通过ex完成的。

那么问题来了,如何在vi中优雅地使用ex呢?

ex是一个行编辑器(Line Editor),所以必须要把需要操作的行号范围传给它。

行操作命令

全称 缩写
delete d
move m
copy co
copy t

多行操作

用一段python脚本生成一个多行的文件,并且把行号都标记出来。

for i in range(1, 1000):
    print ‘this is line #‘, i 

把脚本文件保存成producer.py文件,然后执行脚本

python producer.py >> practice

生成了一个新文件practice

可以通过 :set nu:set nonu 来控制左侧行号的显示。



先执行一个简单的删除多行的操作:

:3,18d

删除第3行到第18行。



其他命令功能类似,移动多行

:10,20m2

把第10行到第20行的内容移动到第2行下面。



还有拷贝多行

:23,29co100

或者

:23,29t100

多行操作就这么简单 - 行号+命令

行符号

ex当然也没忘记为我们提供一些特定的符号来表示特定的行。

符号 代表行
. 当前行
$ 最后一行
% 所有行

用法举例

  • :.,$d 删除当前行以及当前行下面的所有行
  • :20,.m$ 把20行到当前行的内容移动到最后一行的下面,也就是文件末尾
  • :%d 删除所有行
  • :%$ 把所有行复制到文件末尾

行号也支持加减运算

  • :.,.+20d 删除当前行以及后面的20行,一共21行
  • :226,$m-2
  • :.,+20# #用来添加行号
  • :-,+t0 当前行的上一行到当前行的下一行(共三行)

Search Patterns

  • :/pattern/d
  • :/pattern/+d
  • :/pattern1/,/pattern2/d
  • :.,/pattern/m23

Global Searches

  • :g/pattern
  • :g/pattern/p
  • :g!/pattern/nu
  • :60,124g/pattern/p

Combing ex Commands

  • 1,3d | s/thier/their/
  • 1,5 m 10 | g/pattern/nu
时间: 2024-08-07 06:41:20

如何在vi中优雅地使用ex的相关文章

如何在Word中优雅的插入Latex线性公式

写论文的小伙伴应该都有过这样的感受!普通二次公式的手动插入如果说是尚可忍受的话,那么做人工智能学习和物理研究的小伙伴在插入二项式定理和傅立叶公式的时候,如果是手动输入....我想不必多说了,下面我就来介绍下,如果配合Mathpix在word中优雅的输入基于Latex的线性公式. LaTeX 作为一款「史诗级」文章排版编译器,一直都有着优秀.高效的排版体验和简洁.一致的排版效果.但是 LaTeX 相对复杂的语法使用,让我们很多时候都需要花费大量时间在查阅 LaTeX 的参考文档上,才能得到我们想要

如何在Vuejs中优雅使用Javascript各种插件

在日常开发中,为了敏捷开发或者更快满足业务需求,不得不使使用js第三方库或者插件. 如何在Vue项目中引入javascript第三方库 全局变量 将 JavaScript 第三方库 添加到项目中,最简单的办法是通过将其附加到 window 对象上,以使其成为全局变量. 如何引入: window._ = require('lodash'); 如何使用: export default { created() { console.log(_.isEmpty() ? 'Lodash everywhere

如何在vi中设置tab的长度

在使用vi写python时(其实,不管用什么写python程序时,都要注意),首先要将Tab键的长度设为4,因为使用python编程时,我们是通过缩进来实现作用域的,所以要统一Tab键的长度.具体方法如下: 在每个用户的主目录下,都有一个 vi的配置文件".vimrc"或".exrc",没有的可以新建一个.用户可以编辑它,使这些设置在每次启动 vi 时,都有效.例如,加入如下设置行:set tabstop=4 设置tab键为4个空格set nu 显示行号set no

如何在 Swift 中优雅地处理 JSON

阅读目录 在Swift中使用JSON的问题 开始 基础用法 枚举(Enumeration) 下标(Subscripts) 打印 调试与错误处理 后记 因为Swift对于类型有非常严格的控制,它在处理JSON时是挺麻烦的,因为它天生就是隐式类型.SwiftyJSON是一个能帮助我们在Swift中使用JSON的开源类库.开始之前,让我们先看一下在Swift中处理JSON是多么痛苦. 在Swift中使用JSON的问题 以Twitter API为例.使用Swift,从tweet中取得一个用户的“name

如何在 Go 中优雅关闭子进程

有时我们会遇到这样的需求,在一个主进程中启动另外一个进程,而在 Go 中可以使用 exec 包的 Cmd 来轻松实现这类需求,例如代码: package main import ( "fmt" "log" "os" "os/exec" "os/signal" ) func main() { cmd := exec.Cmd{ Path: "nc", Args: []string{"

如何在mysql中优雅的解决精确到毫秒的问题?

刚刚搞定,不需要两个字段了.mysql5.6.4以后的版本,支持定义time(3)或者timestamp(6)这样的字段,然后使用 current_timestamp(6) 即可以为该字段赋值带有毫秒或微秒值的时间数据了! 发布于 2015-08-27 我也在研究这个问题.似乎都是两个字段来实现. http://www.zhihu.com/question/20859370 一般搜到的都是用两个字段实现,这是知乎上的说5.6.4之后的可以. 其实也可以用字符串存,而且到毫秒的时间字符串可以做主键

如何在react-native 中优雅的使用 redux

首先说下我对redux 的理解吧,第一印象很重要就像妹纸一样. 一句话来说他就是一个 js 的应用状态容器. 说长点就是当你的应用足够复杂,交互足够多的时候,你不方便管理你的 state, 那么交给 redux 吧,他是一个单向数据流,高效且清晰. 那么什么时候使用 redux呢,有一句话叫当你没有想到redux 的时候,那么你真的可能并不需要它. 下面就简单说下一些基本的概念. Action:中文意思,动作,没错,在 redux 里也是这么个意思,指用户的一个动作,放在 native 里就是

如何在NodeJS项目中优雅的使用ES6

如何在NodeJS项目中优雅的使用ES6 NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加上参数:--harmony.但是,即使如此node也还是没有支持全部的ES6特性.所以这个时候就需要用到Babel了. 现在开始Babel 在开始使用Babel之前,假设 1. 你已经安装了nodejs,并且已经熟悉了Js. 2. 你也可以使用npm安装各种依赖包. 3. 而且你也对ES6(后来改为

如何在Linux中显示和设置主机名

原文链接 随着连接到网络的计算机数量越来越多,每一台计算机都需要有一个属性来区别于其它计算机.和现实世界中的人一样,计算机也有一个叫做hostname(主机名)的属性. 什么是hostname 从它的操作手册来看,hostname是用来显示系统的DNS名字以及为了显示和设置它的主机名或者NIS域名名字.所以hostname依赖于DNS(Domain Name System域名系统)或者NIS(Network Information System网络信息系统). 怎么显示hostname host