本文是在学习《使用vi编辑器, Lamb & Robbins编著》时在evernote写的其中一章笔记,现在整理好,一方面温故而知新,一方面希望对大家能有些帮助。ex的命令在vim编程中都是非常常用的,熟练这些命令对于提高编程效率有很大的帮助。


主要内容:
1. 使用行号在文件中移动
2. 使用ex命令对文本块进行复制,移动和删除
3. 保存文件和部分文本
4. 操作多个文件(读入文本或命令,在文件间切换)

本文约定:
$ + 命令 表示在普通的bash的命令行下
:  + 命令 表示在vim的ex(命令)模式, 按"Ctrl" + ":" 进入

-----------------------------------------------------------------------------------------------------------------------------


我们知道vim有3种模式:普通模式,插入模式,ex(命令)模式。
ex并不是另一个编辑器,应该说vi是更一般更基本的ex行编辑器的可视模式,所以ex算是vi的底层行编辑器。由于一些ex命令可以节省大量的编辑时间,因此在使用vi时它们是非常有用的。这些命令的大部分都可以在不离开vi的情况下使用。

我们知道可以把文件看成一系列以编号的行。ex可以使你更灵活,更有选择地执行编辑命令。使用ex,可以容易地在文件之间移动,并以各种方式把文本从一个文件移动到另一个文件,还可以快速地对大于单个屏幕的文本块进行编辑。通过全局替换,可以在整个文件中使用给定的模式进行替换。等




在命令行中:
  $ ex  filename
可以看到有关文件总行数信息



ex命令由行地址(行号)和命令组成,它们都以回车键结束。

最基本的命令是用来打印(到屏幕)的p.
   : 2 p
 显示当前文件的第二行内容

如果要显示多行,可以指定行号范围:
   :2 , 10 p
显示2~10行的内容


没有行号的命令被认为作用于当前行。
假设当前光标在12行,输入命令
: s/hello/hehe
会把第12行的"hello"改为"hehe"




使用ex进行编辑


ex常用编辑命令:
d     (delete)   删除行
m   (move)    移动行
co  (copy)      复制行
t    复制行,和co同义

定义行的范围:
ex可以使用行号明确地定义一行或连续数行范围。使用明确数字的地址成为绝对行地址
使用行范围,可以行范围内的行进行命令操作,例如:
:3, 18 d              删除3~18行
:11, 15 m 23      把11~15行移动到23行下面。
:23, 29 co 100   复制23~29行并把它们粘贴到100行下面



:set nu
 
:set number
 显示行号
:set nonu  或:set nonumber 不显示行号

: =                   显示总行数
: . =               显示当前行号
: /pattern/=   显示地一个与模式pattern想匹配的行号



行地址符


.(点)  代表当前行
$           代表文件的最后一行;
%          代表文件的每一行,等同于1, $的组合
  
这些符号可以与绝对行地址组合使用,例如:
: . ,  $ d    删除从当前行到文件末尾
:20, . m $  把20~当前行的文本移动到文件末尾
:% d         删除文件中的所有行
:% t $        复制所有行并把它们粘贴到文件的尾部(成为连续的副本)


除了绝对行地址外,也可以指定一个相对当前行的地址。符号+和-就像数学运算符一样,当将其放置在数字前面时,这些符号就会加上或减去跟在它们后面的数值。例如:
:. , . + 20 d   
删除从当前行到当前行以下20行
:226 , $  m  .-2  
把226行到文件末尾的文本移动到当前行的上面两行的后面。
:. , +20 #     
显示从当前行下面20行的行号
事实上,由于当前行是假定的开始位置,因此在使用+或-时不需要输入圆点


如果在+或-后面没有数字,那么就等价于+1和-1

数字0代表文件的开头(等于0行)。

:-, + t 0  
复制三行(当前行,前一行,后一行),并粘贴到文件开头




搜索模式


ex定位行的另一种方法是使用搜索模式。例如:

:/pattern/ d     删除下一个包行模式pattern的行
:/pattern/+ d   删除下一个包行模式pattern的行的下一行(也i可使用+1来代替)
:/pattern1/,/pattern2/ d  删除第一个包行pattern1的行与第一个包行pattern2的行之间的所有行
:. , /pattern/ m 23    从当前行到第一个包行pattern的行之间的文本移动到23行后面。




重新定义当前行的位置


假设当前光标在第一行。
:100, +5 p
会发生错误, 因为这个命令等价于:100, 6p, 
而我们是希望显示100~105行, 为了达到这个目的,我们要把当前行为第一行变成当前行为100,然后+5.

ex提供了这个方法, 当使用“分号”代替“逗号”时,就会将第一个行地址当成“当前行”。
:100 ; +5 p   就会显示100~105行

分号也可以用于搜索模式的相对地址中,例如,显示下一个包行模式pattern的行和它下面的10行:
:/patter/ ; +10 p  



全局搜索


我们已经知道在vi中使用/(斜杆)来搜索文件中的字符模式。ex也有全局命令g, 可以让你搜索模式并显示找出的所有包含该模式的行。命令:g!的作用与:g相反,使用:g!(或它的同义词:v)可以搜索不包行该模式的行

可以对文件中的所有行使用全局命令,也可以使用行地址把全局搜索限定在指定的行或行范围内。


:g /pattern             寻找(移动到)模式pattern在文件中最后出现的位置
:g /pattern/ p         寻找并显示文件中所有包含模式pattern的行
:g!/pattern/nu       寻找并显示文件中所有不包行模式pattern的行,并显示这些行号  
:20, 40g/pattern/p  寻找并显示第20到40行之间所有包含模式pattern的行

  


组合ex命令


你不必一直输入冒号来开始新的ex命令。在ex中,竖直线(|)是命令的分割符,它允许用户把多个命令组合在同一个ex提示符下(与此类似的是分号分隔符UNIX shell提示符下的多个命令)。同时使用|时,要注意制定的行地址。如果一个命令影响到文件中行的顺序,那么下一个命令将使用新的行位置进行工作。例如:
:1 , 3d |  s/thier/their/ 
把第1行到第3行删除,然后在当前行(该行是调用ex提示符以前的第4行)进行替换

:1 , 5 m 10 | g/pattern/nu
把第1行到第5行移动到第10行后面,然后显示所有包含模式pattern的行。

注意,使用空格会使命令更容易阅读




保存和退出文件



:w   把缓冲区写(保存)到文件中但不退出,可以(和应该)在编辑会话期间使用:w来保护编辑操作以避免系统瘫痪或重大的编辑错误
:q    退出编辑器,返回系统提示符
:wq  写文件并退出编辑器,即使没有修改文件,写操作也会无条件的进行
:x 写文件并退出编辑器,只有修改了文件写操作才能进行

有时候vi编辑器会有警告,可以在命令后面加上感叹号来强制执行,忽略警告



 

保存部分文件到新文件中


有时候,希望把当前文件的一部分保存为一个新的单独文件。
:20 , $w  newfile   把第20行到文件末尾文本保存到新文件newfile中
:. , 500 w newfile   从当前行到500行文本保存到新文件newfile中





添加到现有文件中


可以使用重定向添加符(>>)和w把缓冲区的全部或部分内容添加到现有文件尾。
:30 , $w >> file 把30行到文件末尾添加到文件file的末尾




把文件复制到另一个文件中


有时想把系统中已有的文本或数据复制到正在编辑的文件中,在vi中可以使用ex命令读取另一个文件的内容:
:read  filename
或者使用缩写形式
:r  filename
这个命令会把filename文件的内容插入当前编辑文本的光标位置后面一行。
如果想指定其它行,只需要在read或r命令之前输入行号即可。
例如:
:10 r filename   将会把filename的文本输入到当前第10行后

如果文件在其他目录下,只需要加上路径即可。例如:
:r  /home/time/data    把/home/time目录下的data内容插入当前编辑文件

应用地址符组合或搜索模式可以更灵活:
:$r  /home/tim/data  把读取的文件内容加到当前编辑文件的末尾
:0r  /home/tim/data   把读取的文件内容加到文件开头位置
:/pattern/r  /home/tim/data  将读取的文件内容加到当前文件包行模式/pattern的行的后面




编辑多个文件


ex命令可以在多个文件之间切换。同时编辑多个文件的好处是速度快。在同一编辑会话中,在文件之间切换不仅能加速访问,而且还能保留已制定的缩写和命令序列,以及复制缓冲区,这样可以在文件之间复制文本。

1. 调用vi打开多个文件
在首次调用vi时,可以制定要编辑的多个文件,然后使用ex命令在文件之间进行切换。例如:
$ vi  file1  file2    首先编辑file1,完成第一个文件的编辑后,ex的:w命令写(保存)file1,:next 命令(缩写:n)调用下一个文件(file2)

2. 使用参数列表
除了使用:n移动到下一个文件。还有其他参数可以使用
:args命令(缩写:ar)列出在所有编辑的文件,当前文件使用方括号括起来。
:rewind(缩写:rew)  把当前文件设置为上一个编辑的文件
:last(缩写:la)       把当前文件设置为最后一个文件

3. 调用新文件
你不必在编辑会话的开始就调用多个文件,可以使用ex的:e命令在任何时候切换到另一个文件。如果想在vi中编辑另一个文件,那么首先需要保存当前文件(:w),然后给出命令:
:e  filename
使用这个命令切换到新文件filename时,vi把之前的文件名记为#, 当前文件名记为%,使用这两个文件可以迅速切换
:e #  切换到上一个文件中
:r  #  把上一个文件的内容粘贴到当前文件中
:e! #  放弃当前文件编辑,并返回上一个文件中

:e #的快捷键:
由于切换到前面的文件会经常发生,因此不必在ex命令行下进行这种操作。
可以使用快捷键Ctrl + ^来使用,和:e #效果相同。



vim的ex模式用法的更多相关文章

  1. 好压(HaoZip)的命令行模式用法介绍

    好压压缩软件,又叫“2345好压”,是一款国产的优秀压缩软件,目前是免费的,据官网介绍,该软件永久免费.官网地址:http://haozip.2345.com/ 本文主要对该软件的命令行模式用法进行介 ...

  2. 无意发现vim里插入模式可以借助Alt键输入一些特殊字符

    无意发现vim里插入模式可以借助Alt键输入一些特殊字符.如: Alt+w: ÷ Alt+:: » Alt+f  :  æ Alt+ . :  ® Alt+ ? :  ¯...

  3. vi/vim 三种模式的操作

    来源:http://www.runoob.com/linux/linux-vim.html ps:刚刚进入vi/vim 是命令模式 一.命令模式 i 切换到输入模式,以输入字符. x 删除当前光标所在 ...

  4. Linux常用基本命令:三剑客命令之-awk模式用法(1)

    再次回顾一下,awk基本语法格式: awk [options] 'Pattern {Action}' file1 file2 ··· 之前的文章有讲过两种Pattern(BEGIN, END),本文, ...

  5. vim 的编辑模式 命令模式

    1.vim的编辑模式    进入编辑模式 按键: a  i  o a: 表示在光标当前的,后面开始插入,写数据 i : 则表示 前面 . o : 表面在光标当前的,下一行开始写入数据. O : 大写的 ...

  6. 【vim】插入模式与常用编辑操作

    vim不像很多编辑器那样一启动便可以直接编辑文本,需要在普通模式按下i, a等键才会进入插入模式进行文本编辑. 如何进入插入模式 以下的命令都会让vim从普通模式切换到插入模式,但命令执行后的字符插入 ...

  7. 关闭QtCreator的vim风格编辑模式

    今天不小心点到了键盘的快捷键Alt+V,使QtCreator进入了vim风格编辑模式,导致快捷键拷贝粘贴都不正常,找了下资料才发现是这个问题.具体操作如下: 打开QtCreator去掉下列位置的勾选或 ...

  8. vim 列编辑模式

    vim 列编辑模式 标签: vim 视窗模式 列编辑模式 vim 列编辑模式 例子:给列批量添加前缀.后缀.修改字段 vim 列编辑模式 vim 有三种编辑模式,命令模式.输入模式.视窗模式,我们常用 ...

  9. vim的四大模式

    vim的四大模式 总结了下我经常使用的模式中的一些基本命令 正常模式 通过vim进入到界面, 首次即为正常模式 编辑模式 (i,a,o,s,I,A,S) i: 当前节点插入光标点 a: 下一个字母后插 ...

随机推荐

  1. Qt setStyleSheet 添加背景色/背景图片(取消背景色,读取本地文件作为背景色)

    容易搞定,mainWindow 是一个QWidget.// 设置背景色为蓝色mainWindow.setStyleSheet("background-color:blue;"); ...

  2. QT https post请求(QNetworkRequest要设置SSL证书,而SSL证书认证有三种,实测成功)

    以VS开发为例.因为https访问需要用到SSL认证,而QT默认是不支持SSL认证,所以在使用之前必须先做一些准备工作: 需要安装OpenSSL库: 1.首先打开http://slproweb.com ...

  3. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap

    背景 在上一篇博客中,我们提到CMGameScene,但是CMGameScene只是个框架,实际担任游戏逻辑的是CMGameMap类,这个博文就来了解下CMGameMap 头文件 class CMGa ...

  4. android面试题之二

    六.android 中的动画有哪几种,它们的特点和区别是什么 ? 逐帧动画和补间动画. 逐帧动画:是传统的动画播放方式,指定每一帧的内容和停留时间,然后顺序地播放排列好的图片,类似电影. 补间动画:给 ...

  5. 物流追踪 - -GPS和GPRS应用

    源码1: #include<stdio.h> #include<stdlib.h> #include<string.h> #include<termios.h ...

  6. 用 PS 调整服务器时间

    用 PS 调整服务器时间 Powershell 有一个命令用来调整计算机的时间, Set-Date -Adjust,但是,只能调整本地时间,不能调整远程的计算机时间. function AdjustD ...

  7. Windows Time服务无法启动 错误5拒绝访问

    接着上次写的文章 XP和Win7设置系统自动同步系统时间方法 本文就把故障出现的过程和解决方法一共写下来,希望大家可以看到本文在解决此项服务的思路.大家以后出现类似的问题和问题可以一样使用此类方法解决 ...

  8. 【Web】throw和throws的区别和用法。

    1.throws关键字通常被应用在声明方法时,用来指定可能抛出的异常.多个异常可以使用逗号隔开.当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象.如下面例子所示: public cl ...

  9. Best Component for Bitmap Image

    The best is to purchase ImageEn and use the latest version. Coz nothing compares to ImageEn.... But ...

  10. 基于visual Studio2013解决算法导论之023队列实现(基于数组)

     题目 基于数组的队列 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <time.h> #i ...