《学习vi和vim编辑器》读书笔记——vi进阶篇
第五章 ex编辑器概述
vi中的底行模式实际上是ex编辑器的命令
ex命令不能用空格间隔,也不能用空格结尾
z指令
d | 删除行 |
m | 移动行 |
co | 复制行 |
t | 复制行 |
行号
:3,18d | 删除3-18行 |
:3,18m23 | 把3-18行移动到23行之后 |
:3,18co23 | 将3-18行复制到23行之后 |
:set number或者set nu | 显示行号 |
:set nonumber或者set nonu | 取消显示行号 |
:1,10# | 临时显示1-10行行号 |
:= | 列出文件总行数 |
:.= | 列出当前行号 |
:/pattern/= | 列出pattern第一次出现的行号 |
行寻址
. | 当前行 |
$ | 最后一行 |
% | 每一行 或者1,$ |
举例 | |
:.,$d | 删除当前行到文件末尾 |
:20,.m$ | 将第20行到当前行的文本移动到文件末尾 |
:%d | 删除文件中所有文本 |
:%t$ | 将所有文本复制到文件末尾 |
+-用在数字前面 | 表示加上减去后面的数字 省略数字表示1 |
举例 | |
:.,.+20d | 删除当前行到20行之后的文本 |
:226,$m.-2 | 将226行到文件末尾的文本移动到当前行的2行之前 |
:.,+20# | 显示当前行向下20行之间的行号 |
:-,+t0 | 复制3行(前一行到下一行的文本)放置到文件开头 |
搜索模式
:/pattern/d | 删除下一个包含pattern的行 |
:/pattern/+d | 删除下一个包含pattern的行的下一行 |
:/pattern1/,/pattern2/d | 从第一个包含pattern1的行开始,删除到第一个包含pattrn2的行 |
:.,/pattern/m23 | 从当前行到第一个包含pattern行之间的文本放到23行之后 |
重新定义当前行
:100;+5 p | 显示第100行 到向下5行 的文本;用于将当前行定义为;之前的行号 |
:/pattern/;+10 p | 显示第一个出现pattern的行到向下10行的文本 |
全局搜索
g | 让搜索并显示所有包含这个模式的行 |
举例 | |
:g/pattern | 搜索文件中出现pattern的行,并打印光标移动到最后一次出现的地方 |
:g/pattern/p | 作用同上 |
:g/pattern/nu | 作用同上,包括行号 |
:60,124g/pattern/p | 在60-124行之间搜索 |
ex命令合并
多个ex命令之间可以是用|进行间隔,新的命令是在新的行地址基础上操作的。
保存与离开文件
:w | 保存文件,将缓冲区内容覆盖写入文件 |
:q | 离开文件 |
:wq | 保存并离开文件 |
:x | 保存并离开文件 |
:w! | 强行写入,用于只读模式 |
:q! | 强行离开文件,不保存 |
更改缓冲区名称
:w newfilename | 另存为newfilename文件 |
:230,$w newfile | 将230行到文件末尾的文本另存为newfile文件 |
:30,$w >>newfile | 将30到文件末尾的文本追加保存到newfile文件的末尾 |
读取另一个文件中的数据
:read filename | 把filename中的所有文本插入到光标所在位置的下一行 |
:r filename | 同上 |
举例 | |
:r /home/data | 将/home/data文件插入到当前行下面 |
:185r /home/data | 将/home/data文件插入到当前行下面 |
:$r /home/data | 将/home/data文件插入到文件末尾 |
:0r /home/data | 将/home/data文件插入到文件开头 |
:/pattern/r /home/data | 将/home/data文件插入到第一个pattern的行之后 |
编辑多个文件
用v打开多个文件
vi file1 file2
首先打开的是file1,使用指令:n可以切换到下一个文件,指令:N可以切换到上一个文件
使用参数列表
:args 或者 :ar | 显示当前打开的多个文件列表 |
:rewind 或者 :rew | 返回到列表中的第一个文件中 |
调用新文件
:e newfile | 打开另一个文件 |
:e # | 切换到之前打开的文件 |
:r # | 将之前切换的文件内容复制到当前文件中 |
:e! | 恢复当前文件的上一次保存版本 |
:w %.new | 另存为文件名为 当前文件名.new |
在vi中切换文件
Ctrll+^ 功能相当于:e #
文件之间编辑
将文件1的文本复制到文件2中
2个文件之间是共享缓冲区的,前提是需要使用:e file2命令打开文件
文件拖拽:10,20ya a 将文本复制到缓冲区a中,
:e file2 打开文件2
:pu a 将缓冲区a中的文本放在下一行
第六章 全局替换
全局替换使用的命令
:g 全局 :s 替换
:s/old/new/ | 将当前行第一个old 替换成new |
:s/old/new/g | 将当前行的所有old替换成new |
:50,100s/old/new/g | 将50-100行之间的所有old替换成new |
:1,$s/old/new/g:%s/old/new/g | 将整个文件中的old替换成new |
确认替换
:1,30s/old/new/gc | 在每次之前vi会询问用户是否进行替换, 输入y将会确认替换,n江蕙取消当前替换进入下一个匹配项 |
/oldword cwnewword n n . | 不适用替换命令,而是在搜索命令中逐个替换 n会继续下一个搜搜索 .会继续下一个执行动作 |
上下文相关的替换
:g/pattern/s/old/new/g | 将文件中包含pattern正则的行中的old替换成new old缺省是pattern |
搜索表达式中的元字符
. | 1个任何单一字符 |
* | 0-任意多个个任何字符 |
^ | 以后接的字符开头 |
$ | 以前接的字符结尾 |
\ | 转义 |
[] | 匹配方括号内的任何一个字符 特殊: [A-Z]任意大写字母 [0-9]任意数字 |
\(\) | 将匹配的保存到缓冲区,供9个缓冲区 缓存区通过\1\2调用缓冲区中的文本 :$s/\(That\)or\(This\)/\2or\1 将文本中的ThatorThis替换成ThisorThat |
\< | 匹配以 开头的 |
\> | 匹配以 结尾的 |
~ | 匹配上一次搜索时的正则,仅用于/搜索,不能用于替换命令 |
在替换字符串中的元字符
\n | 利用\(\)存储的第n个模式中的文本 |
\ | 转义 |
& | 搜索模式中匹配出来的完成文本 |
~ | 最后一次匹配替换的文本 |
\u \l | 将之后的第一个字符变为大写 将之后的第一个字符变为小写 |
\U或者\e\L或者\E | 将之后的所以字符变为大写 将之后的所以字符变为小写 |
其他
:& | 重复上一个替换 |
:~ | 重复上一个替换 不过搜索表达式是上一次搜索命令中的正则 |
setedcompatible | vi会记住上一次替换的标志 g全局 c 需要确认 |
范例
:%s/\/home\/tim/\/home\/linda/g | 将/home/tim替换为/home/linda 同 :%s:/home/tim://home/linda:g |
:1,10s/\./;/g | 将1-10行的所有.替换为; |
:%s/[Hh]elp/\U&/g | 将所有的Help或者help替换成HELP |
:%s/*//g | 将1个或多个空格替换为1个空格 |
:%s/[:.]*//g | 将:或者.之后的1个或多个空格替换为2个空格 |
:g/^$/d | 删除所有空白行 |
:g/^*$/g | 删除所有空白行和只包含空格的行 |
:%s/^*\(.*\)/\1/ | 删除每一行开头的所有空白 |
:%s/^/>/ | 在每一行的开头加上>加上2个空格 |
:.,+5/$/./ | 为后续5行的结尾加上. |
:%s/\(.*\)-\(.*\)/\2-\1/ | 逆转所有连字符-连接的单词的前后位置 |
:%s/.*/\U$/ 或者 :%s/./\U&/g | 将文本中每一个字符替换成大写的 |
:g/.*/mo0 或者 :g/^/mo0 | 将文件中所有行逆转 |
:g!/^[0-9]/m$ 或者 :g/[^0-9]/m$ | 将所有不是以数字开头的行移动到文件末尾 |
:%s/^[1-9][0-9]*.[1-9][0-9]*// | 将所有小标题删除 小标题指1.12.10等 |
:%s/\(For)\(tran\)/\U\1\2(acronymof\U\1|emula\U\2\Eslation) | 将Fortran替换成 FORTRAN(acronymofFORmulaTRANslation) |
第七章 高级编辑方法
自定义vi
.exrc文件用于配置vi的属性
vi每次启动的时候,会读取主目录下的.exrc文件,,接着执行当前目录下的.exrc文件
任何存储在环境环境变量EXINIT中的命令都会在vi打开的时候执行,优先于.exrc文件
:set命令
vi属性分为2种,一种是开关型的,一种是接受参数型的
:set option | 打开option项 |
:set nooption | 关闭option项 |
:set option=value | 将option选项的值置为value |
:set all | 查看所有选项 |
:set option? | 查看当前option选项的状态 |
一些有用的选项:
:set wrapmargin=10 | 指定有边界 |
noignorecase | 搜索区分大小写 |
wrapscan | 回到文件开头继续搜索 |
magic | 模式匹配时辨认通配符 |
autoindent | 在插入模式下,对每行按与上行同样的标准进行缩进,与shiftwidth选项结合使用 |
showmatch | 在vi中输入),}时,光标会暂时的回到相匹配的(,{ (如果没有相匹配的就发出错误信息的铃声),编程时很有用 |
tabstop | 指定tab缩进的字符数目 |
shiftwidth | 反向制表符中的空格数目 |
number | 显示行号 |
list | 把制表符显示为^I ,用$标示行尾(使用list分辨尾部的字符是tab还是空格) |
autowrite | :n和:!之前会自动写入文件 |
执行Unix命令
:!commond | 在vi中执行Unix命令 |
:sh | 创建一个shell,返回vi按Crtel+D |
相关推荐
lerdor 2020-10-14
老甘的可读区 2020-07-09
老甘的可读区 2020-06-07
linzb 2020-05-12
linzb 2020-09-22
HeronLinuxampARM 2020-09-14
CoderMannul 2020-09-07
lerdor 2020-08-31
ZZBAIFFA 2020-08-31
yonggeno 2020-08-18
yhuihon 2020-08-17
涅磐 2020-08-11
yhuihon 2020-08-09
zhangxl0 2020-07-28
yhuihon 2020-07-26
想个标题偏头痛 2020-07-19
老甘的可读区 2020-07-18