VI命令

进入vi的命令

vi filename: 打开或新建文件,并将光标置于第一行首

vi +n filename: 打开文件,并将光标置于第n行首

vi + filename: 打开文件,并将光标置于最后一行首

vi +/pattern filename: 打开文件,并将光标置于第一个与pattern匹配的串处

vi -r filename: 在上次正用vi编辑时发生系统崩溃,恢复filename

vi filename....filename: 打开多个文件,依次进行编辑


[编辑]
移动光标类命令

h: 光标左移一个字符

l: 光标右移一个字符

space: 光标右移一个字符

Backspace: 光标左移一个字符

k或Ctrl+p: 光标上移一行

j或Ctrl+n: 光标下移一行

Enter: 光标下移一行

w或W : 光标右移一个字至字首

b或B : 光标左移一个字至字首

e或E : 光标右移一个字至字尾

): 光标移至句尾

(: 光标移至句首

}: 光标移至段落开头

{: 光标移至段落结尾

nG: 光标移至第n行首

n+: 光标下移n行

n-: 光标上移n行

n$: 光标移至第n行尾

H: 光标移至屏幕顶行

M: 光标移至屏幕中间行

L: 光标移至屏幕最后行

0: 光标移至当前行首

$: 光标移至当前行尾


[编辑]
屏幕翻滚类命令

Ctrl+u: 向文件首翻半屏

Ctrl+d: 向文件尾翻半屏

Ctrl+f: 向文件尾翻一屏

Ctrl+b: 向文件首翻一屏

nz: 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。


[编辑]
插入文本类命令

i: 在光标前

I: 在当前行首

a: 光标后

A: 在当前行尾

o: 在当前行之下新开一行

O: 在当前行之上新开一行

r: 替换当前字符

R: 替换当前字符及其后的字符,直至按ESC键

s: 从当前光标位置处开始,以输入的文本替代指定数目的字符

S: 删除指定数目的行,并以所输入文本代替之

ncw或nCW: 修改指定数目的字

nCC: 修改指定数目的行


[编辑]
删除命令

ndw或ndW: 删除光标处开始及其后的n-1个字

do: 删至行首

d$: 删至行尾

ndd: 删除当前行及其后n-1行

x或X: 删除一个字符,x删除光标后的,而X删除光标前的

Ctrl+u: 删除输入方式下所输入的文本


[编辑]
搜索及替换命令

/pattern: 从光标开始处向文件尾搜索pattern
?pattern: 从光标开始处向文件首搜索pattern
n: 在同一方向重复上一次搜索命令
N: 在反方向上重复上一次搜索命令
:s/p1/p2/g: 将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g: 将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g: 将文件中所有p1均用p2替换

[编辑]
选项设置

all: 列出所有选项设置情况

term: 设置终端类型

ignorance: 在搜索中忽略大小写

list: 显示制表位(Ctrl+I)和行尾标志($)

number: 显示行号

report: 显示由面向行的命令修改过的数目

terse: 显示简短的警告信息

warn: 在转到别的文件时若没保存当前文件则显示NO write信息

nomagic: 允许在搜索模式中,使用前面不带“/”的特殊字符

nowrapscan: 禁止vi在搜索到达文件两端时,又从另一端开始

mesg: 允许vi显示其他用户用write写到自己终端上的信息


[编辑]
最后行方式命令

:n1,n2 co n3: 将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d: 将 n1行到n2行之间的内容删除
:w: 保存当前文件
:e filename: 打开文件filename进行编辑
:x: 保存当前文件并退出
:q: 退出vi
:q!: 不保存文件并退出vi
:!command: 执行shell命令command
:n1,n2 w!command: 将文件中n1行至n2行的内容作为command的输入并执行之,
 若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command: 将命令command的输出结果放到当前行

[编辑]
寄存器操作

"?nyy: 将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字

"?nyw: 将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字

"?nyl: 将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字

"?p: 取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字

ndd: 将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中

搜索中进行替换
/which  #搜索which
cwthat  #替换成that
n       #重复搜索
.       #重复替换

一种类型的替换命令
g/pattern/s/old/new/g

第一个 g 表示是有选择的操作, pattern 指定选择行的模式, s 表示替换操作, old 是要替换的内容, new 是新内容, g 表示全局替换下面是一些例子:
#给第一到十行加上括弧
:1,10/.*/(&)/

其中的
 &    代表的是搜索模式
 ~    代表上一次替换命令中制定的替换文本
 /u   改成大写
 /l   改成小写
 /U或者/L和/e或者/E配合 将后面开始到被替换串结束或者到/e和/E为止的所有支付变成大写或者小写
 另外在vi中可以使用除了/,",和|之外的任何非字母表字符做替换命令的分隔符, 这在进行路径替换的时候非常的有用

下面时一些例子:
   #将That or this 换成 This or that
   :%s//(That/) or /(this/)//u/2 or /l/1/
   ---- 
   #将句尾的child换成children
   :%s/child/([ ,.;!:?]/)/children/1/g
   ----
   #将mgi/r/abox换成mgi/r/asquare
   :g/mg/([ira]/)box/s//mg//my/1square/g    <=>  :g/mg[ira]box/s/box/square/g
   ----
   #将多个空格换成一个空格
   :%s/  */ /g
   ----
   #使用空格替换句号或者冒号后面的一个或者多个空格
   :%s//([:.]/)  *//1 /g
   ----
   #删除所有空行
   :g/^$/d
   ----
   #删除所有的空白行和空行
   :g/^[     ][     ]*$/d
   ----
   #在每行的开始插入两个空白
   :%s/^/>  /
   ----
   #在接下来的6行末尾加入.
   :.,5/$/./
   ----
   #颠倒文件的行序
   :g/.*/m0O  <=> :g/^/m0O
   ----
   #寻找不是数字的开始行,并将其移到文件尾部
   :g!/^[0-9]/m$ <=> g/^[^0-9]/m$
   ----
   #将文件的第12到17行内容复制10词放到当前文件的尾部
   :1,10g/^/12,17t$
    ~~~~重复次数的作用
   ----
   #将chapter开始行下面的第二行的内容写道begin文件中
   :g/^chapter/.+2w>>begin
   ----
   :/^part2/,/^part3/g/^chapter/.+2w>>begin
   ----
   :/^part2/,/^part3/g/^chapter/.+2w>>begin|+t$

ex的命令
d 删除
m 移动
co 复制
t 复制行
p 打印
nu 显示行号
g 命令用于寻找匹配的行,然后执行相应的操作
v 反向寻找匹配的的行,然后执行相应的操作

ex中用;代替,做行分界符时会将;前面的行改变成当前行

选项设置
#设置tab宽度
:set tabstop=4

#设置缩进时移动的宽度
:set shiftwidth=4

#设置语法高亮模式
:set syntax=fvwm

#关闭备份
:set nobackup
:set nowritebackup

#建议按照如下的方式使用备份
:set backup
:set backupdir=/var/bak
:set backupext=.bak

#下面一些选项是一次听讲座的时候记录的, 具体什么意思没有记清楚, 但应该很有用的
:set nocp
:set su
:set his
:set cin
:set sm    #显示匹配的括号
:set ai    #自动缩进
:set cino=:ogotocsus
:set paste/nopaste
:set lbr
:set font=mb
:set cindent #打开c缩进模式


#打开语法高亮显示
:syntax on

#格式重排
=

建议的主题配置:
colo torte #图形模式
colo else  #字符模式

命令与键
为了防止ex对特殊键进行解释, vi中可以用C-v对其进行跳脱.如下所示:
[RETURN]      ^M
[ESC]         ^[
[BACKSPACE]   ^H
C-T           ^T
C-W           ^W
C-x           ^X
|             不能转义

map!用于在插入模式下强制映射, unmap!用于在插入模式下取消映射
映射一个功能键
:map #1 command #映射第一个功能键, 即F1
:map [C-v][Home] command #映射home键

od命令可以用来以8进制方式查看文件
@register 执行register中的文本作为命令
r命令可以用于读入文件或者将命令的输出读入当前的缓冲区
r file #读入文件
r! ls  #读入命令输出

增加和减少缩进级别在vi的自动缩进模式中,可以通过下面的命令更改缩进级别
C-T     增加一个缩进级别
C-D     减少一个缩进级别
^ ^D    光标移到开始,并保留缩进级别
0 ^D    光标移到开始,并重置缩进级别

可以通过下面的命令设置自动缩进模式
:set autoindent

<<和>>是进行缩进和反缩进的命令
>>     把行或者块右移8个空格
<<     把行或者块左移8个空格

显示控制字符
:set list   #临时的等价命令是l

启用括号匹配
:set showmatch #:set sm

-设置显示模式
:normal     #正常模式
:syntax     #语法高亮模式
:hex        #十六进制模式
:html       #html模式
:man        #man模式
:set binary #二进制模式
:set incsearch  #增量搜索模式
:set showmode   #可视模式

cindent 按照c的格式缩进
在vi中查看c源码的时候, 可以在#include "hell.h" 在双引号中间安gf就可以打开头文件, C-o(C-t)返回.
窗体分割命令
 [N] sp[lit] [position] [file]
 [N] new     [position] [file]
 [N] sv[iew] [position] [file]
 
缩写文本
#用myurl代表http:://localhost/
:ab myurl http:://localhost/
#取消缩写
:una myurl

使用ctags
:! ctags *.c      #建立tags文件
: tag name
^]                #查看tag定义

命令的选项:
-d
-g
-l                #指定语言
-m                #为结构的成员建立索引
-t                #为c的typedef建立索引
-T                #为C++的typedef建立索引


vi中在全文前植入行号的宏
:%s/^/^|/
:$
:let end=line(".")
:|
:let num=1
:while num<=end
:let line=getline(".")
:let line=substitude(line,$,num," ")
:call setline(".", line)
:+
:let num=num+1
:endwhile
 
插件
tip of the day
calendar
jad
sketch
其他
加密

:X #之后输入密码, :wq退出即可, 去掉密码只要在输入提示输入密码的时候输入回车即可

将dos文件转化为linux文件
:1,$s///g

在每行的行首/尾插入newstring
#行首
:g/^/s//newstring/g
:%s/^/newstring/g
行尾
:g/$/s//newstring/g
:%s/$/newstring/g


vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。

:s/vivian/sky/ 替换当前行第一个 vivian 为 sky

:s/vivian/sky/g 替换当前行所有 vivian 为 sky

:n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky

:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky

n 为数字,若 n 为 .,表示从当前行开始到最后一行

:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky

:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky

可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/

:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/

1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky

:s/vivian/sky/g 替换当前行所有 vivian 为 sky

2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky

:n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky

(n 为数字,若 n 为 .,表示从当前行开始到最后一行)

3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky

:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky

4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/

5. 删除文本中的^M

问题描述:对于换行,window下用回车换行(0A0D)来表示,Linux下是回车(0A)来表示。这样,将window上的文件拷到Unix上用时,总会有个^M.请写个用在unix下的过滤Windows文件的换行符(0D)的shell或c程序。

· 使用命令:cat filename1 | tr -d “^V^M” > newfile;

· 使用命令:sed -e “s/^V^M//” filename > outputfilename。需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。

· 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//。

· :%s/^M$//g

如果上述方法无用,则正确的解决办法是:

· tr -d "/r" < src >dest

· tr -d "/015" dest

· strings A>B

6. 其它

利用 :s 命令可以实现字符串的替换。具体的用法包括:

:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1

:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1

:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1

:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1

:g/str1/s//str2/g 功能同上

从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索

字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值