本文是在学习《使用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. android自动化(appium)

    目录 一.Appium环境搭建 1.下载nodejs,并安装 2.下载appium,并安装 3.安装python.安装pip.安装appium 4.安装java的jdk 5.安装andriod的sdk ...

  2. 啊上班的二号i将诶

    http://www.huihui.cn/share/8112372 http://www.huihui.cn/share/8112363 http://www.huihui.cn/share/811 ...

  3. Swift 自定义炫酷下拉刷新效果

    先来看下效果 下拉刷新 其实下拉刷新没大家想得那么难.本文已第二个为例子.给大家讲解下下拉刷新的做法(完整代码后面会放上) 首先,先搞一个single View Application .然后进Mai ...

  4. ceph增加osd流程

    假如需要新增一个主机名:osd4 ip:192.168.0.110的OSD1.在osd4创建挂载目录及放置配置文件的目录 ssh 192.168.0.110 (这里是从mon主机ssh到osd4主机) ...

  5. js 验证手机号 以及身份证正则表达式

    手机号:① /^1(3[0-9]{9}|5[0-35-9][0-9]{8}|7[07][0-9]{8}|8[25-9][0-9]{8})$/ ② /^1(3\d|5[0-35-9]|7[07]|8[2 ...

  6. SB中使用Autolayout设置到父视图的间距为0

    发现打上钩的话在plus以下的屏幕上控件的实际x会是-4但是在plus上是0, 所以要设置一致的到视图的左右都未0 必须把Constrain to margins钩去掉!

  7. SparkContext主构造函数代码提取

    这是阅读sparkContext类的代码做的一个笔记.阅读这个类的时候,主要的任务就是搞清楚sparkContext是怎么构造的,java.C#的class的初始化都是放在一个方法中的,而scala的 ...

  8. js 中的cookie

    根据智能社31cookie基础与应用总结, cookie的特性: 1.同一个网站,共用一套cookie,实际上是根据域名来区分的. 如t.sina.com.cn ,和weibo.com这两个都是新浪微 ...

  9. iOS 开发设计常用软件及工具整理

    1, xCode 2, AppCode 3, Skech 原型设计软件 4, Hype 动画设计工具 5, fontawsome 免费图表 6, Prepo icon, images.catlog 生 ...

  10. 树莓派变成一个Web服务器: nginx + php + sqlite

    将树莓派变成一个Web服务器,通过访问网页,就可以控制树莓派,比如:查看摄像头\开灯等等. 一想到Linux Web服务器,我们首先想到的是,Apache + MySql + Php. 树莓派可以安装 ...