摘自:《UNIX用户手册P230》
启动vi会话
命令 vi file vi –r file vi –R file vi –n file vi + file vi file file2 file3 ... vi +/string file 含义 编辑file 编辑多次修改后最后保存的file文件版本 以只读模式来编辑file文件 编辑file文件,并将光标置于第n行 编辑file文件,并将光标置于最后一行 编辑file1到file3文件,保存file1中的修改后,输入:n命令转入file2的编辑 编辑文件file,并将光标置于第一个包含string的行
光标控制命令
命令 h或Ctrl+h j或Ctrl+j或Ctrl+h k或Ctrl+p l或空格 G nG G$ 1G gg w W b B L M H e E ( ) { } 0(零)或|(反斜杠这个键的上档键) n|(反斜杠这个键的上档键) ^ $ +或Enter
光标移动 向左移一个字符 向下移一行 向上移一行 向右移一个字符 移到文件的最后一行 移到文件的第n行 移到文件的最后一个字符 移到文件的第一行 移到到这个文件的第一行,相当于1G 移到下一个字的开头 移到下一个字的开头,忽略标点符号 移到前一个字的开头 移到前一个字的开头,忽略标点符号 移到屏幕的最后一行 移到屏幕的中间一行 移到屏幕的第一行 移到下一个字的结尾 移到下一个字的结尾,忽略标点符号 移到句子的开头 移到句子的结尾 移到段落的开头 移到下一个段落的开头 移到当前行的第一列 移到当前行的第n列 移到当前行的第一个非空字符 移到当前行的最后一个字符 移到下一行的第一个字符
-(减号键上面的下档键,直按)
移到前一行的第一个非空字符 在vi中添加文本
命令 a A i I o(小写字母) O :r file :nr file Esc(即escape) ^v char 在当前行尾插入文本 在光标前插入文本 在当前行前插入文本 在当前行的下方插入新行 在当前行的上边插入新行 读入文件file的内容,并插在当前行后 读入文件file内容,并插在第n行后 回到命令模式 插入时忽略char的特殊意义,这是为了插入特殊字符 插入动作 在光标后插入文本 在vi中删除文本
命令 x nx X nX dw ndw d1G dG dd ndd db ndb :n,md d或d$ d0(数字0) dcursor_command Ctrl+w
删除操作 删除光标处的字符,可以在x前加上需要删除的字符数目 从当前光标处往后删除n个字符 删除光标前的字符,可以在X前加上需要删除的字符数目 从当前光标处往前删除n个字符 删至下一个字的开头 从当前光标处往后删除n个字 删除光标所在到第一行的所有数据 删除光标所在到最后一行的所有数据 删除整行 从当前行开始往后删除n行 删除光标前面的字 从当前行开始往前删除n行 从第m行开始删除n行 从光标处删至行尾 删除从光标所在处到该行的最前面一个字符 删除至光标命令处,如dG将从当前行删除至文件的末尾 当插入时,删除前面的字 Ctrl+h或backspace 当插入时,删除前面的字符
修改vi的文本
命令(在每个命令的前面加上一个数字表示该命令重复的次数) Rchar Rtext Escape Atext Escape A或cctext Escape Cwtext Escape Ctext Escape CG Escape CCursor_cmd text Escape
在vi中查找与替换 在vi中有许多查找和替换的功能,下表总结了vi中一些常用的查找与替换的功能。
替换操作 用char替换当前字符 用text替换当前字符直到按下了Escape键 用text代替当前字符 用text代替整行 将当前字改为text 将当前行余下的改为text 修改至文件的末尾 从当前位置处到光标命令位置都改为text vi中的查找与替换
命令 /text ?text n N ftext Ftext ttest Ttext :set ic :set noic :s/oldtext/newtext :m,ns/oldtext/newtext & :g/text1/s/text2/text3 :g/text/command :v/text/command 查找与替换操作 在文件中向前查找text 在文件中向后查找text 在同一方向重复查找 在相反方向重复查找 在当前行向前查找text 在当前行向后查找text 在当前行向前查找text,并将光标定位在text的第一个字符 在当前行向后查找text,并将光标定位在text的第一个字符 查找时忽略大小写 查找时对大小写敏感 用newtext代替oldtext 从第m行到第n行用newtext替换oldtext 重复最后的:s命令 查找包含text1的行,用text3替换text2 在所有包含text的行运行command命令 在所有不包含text的行运行command
例子:
可以使用:g和:v来执行一些高级查找。 使用下面的命令,可以找到和显示文件中所有包含white的行: :g/while/p (该命令中的/p是ex编辑器的打印命令。) 使用下面的命令,可以找到并删除文件中所有包含white的行: :/g/while/d 也可以在指定的一些行中进行查找。 下面的命令就是从第10行到第20行之间查找所有包含while的行,并打印出它们的行号: :10,20g/while/nu 命令:g是在所有包含需要查找的文本的行上运行一个命令,而命令:v是在所有不包含指定文本的行上运行一个命令。与前面的三个在所有包含while的行上执行一个命令一样,下面的三个命令是在所有不包含while的行上执行一个命令: :v/while/p :v/while/d :10,20v/while/nu 第一个命令是打印所有不包含while的行,第二个命令删除所有不包含while的行,第三个命令是打印从第10行到第20行中所有不包含while的行。
在vi中拷贝文本
命令 yy nyy y1G yG y0(数字0) y$ p(小写) P(大写) “(a-z)nyy “(a-z)ndd “(a-z)p “(a-z)P 拷贝操作 将当前行的内容放入撤消缓冲区 将n行的内容放入撤消缓冲区 复制光标所在行到第一行的所有数据 复制光标所在行到最后一行的所有数据 复制光标所在的那个字符到该行行首的所有数据 复制光标所在的那个字符一该行行尾的所有数据 将撤消缓冲区的文本放入光标后 将撤消缓冲区的文本放入光标前 拷贝n行放入名字为圆括号内的有名缓冲区,省略n表示当前行 删除n行放入名字为圆括号内的有名缓冲区,省略n表示当前行 将名字为圆括号内的有名缓冲区的内容放入当前行后 将名字为圆括号内的胡名缓冲区的内容放入当前行前
在vi中撤消与重复
命令 u U .(半角句号) ,(半角逗号)
撤消操作 撤消最后一次修改 撤消当前行的所有修改 重复最后一次修改 以相反的方向重复前面的f、F、t或T查找
命令 ;(分号) “np n N 重复前面的f、F、t或T查找命令 取回最后第n次的删除(缓冲区中存有一定次数的删除内容,一般为9) 重复前面的/或?查找命令 以相反的方向重复前面的/或?查找命令 保存文本和退出vi
命令 :w :w file :wq或ZZ或:x :q! :e! 保存和/或退出操作 保存文件但不退出vi 将修改保存在file中但不退出vi 保存文件并退出vi 不保存文件,退出vi 放弃所有的修改,从上次保存的盘中的文件开始再编辑 vi中的选项
vi中有很多选项,可以设置或清除。如果要设置一个选项,须要健入:set option,如果要清除一个选项,则要健入:set nooption 选项 :set all :set nooption :set nu :set showmode :set noic :set list :set ts=8 :set window=n 关闭option选项 每行前打印行号 显示是输入模式还是替换模式 查找时忽略大小写 显示制表符(^|)和行尾符号($) 为文本输入设置tab值 设置文本窗口显示n行 作用 打印所有选项(也即显示所有的选项) vi中的状态
在vi中,可以使用一些简单的命令来获取许多有用的状态信息,可以使用如表中的命令来显示当前行的行号、文件中的行数、文件名和其他的状态信息。 选项 :.= := Ctrl+g :l(字母l) 打印当前行的行号 打印文件中的行数 显示文件名、当前行的行号、文件的总行数和文件位置的百分比 使用字母“l”来显示许多的特殊字符,如制表符和换行符 作用
在文本中进行段落定位和放置标记 可以将文本定义成许多段落,这样可以在段落间来回移动,同样可以用字符来标记文本,然后在标记间来回移动。
vi中的定位与标记
选项 { [[ ]] m(a-z) ‘(a-z)
作用 在第一列插入{来定义一个段落 回到段落的开头处 向前移到下一个段落的开头处 用一个字母标记当前位置,如用mz标记z 移动光标到指定的标记,如用’z移动z 在vi中链接行
可以使用下表的命令来连接一行或者多行 选项 J nJ
光标旋转与调整屏幕 可以使用下表的命令,以多种方法来将光标放在文件的任何地方和调整屏幕。
作用 将下一行连接到当前行的末尾 连接后面的n行 光标布置与调整屏幕
选项 H(即shift+h) nH(即n+shift+h) M(即shift+m) L(即shift+l) nL(即n+shift+l) Ctrl+e Ctrl+y Ctrl+u Ctrl+d Ctrl+b Ctrl+f Ctrl+l(字母l) z加Enter nz加Enter z. nz. z- nz-
作用 移动光标到屏幕的顶行 移动光标到屏幕顶行下的第n行 移动光标到屏幕的中间 移动光标到屏幕的库底行 移动光标到屏幕的底行上的第n行 将屏幕上滚一行 将屏幕下滚一行 将屏幕上滚半页 将屏幕下滚半页 将屏幕上滚一页 将屏幕下滚一页 重绘屏幕(相当于刷新吧) 将当前行置为屏幕的顶行 将当前行下的第n行置为屏幕的顶行 将当前行置为屏幕的 将当前行上的第n行置为屏幕的 将当前行置为屏幕的底行 将当前行上的第n行置为屏幕的底行
shell转义字符
可以通过使用shell转义命令,不退出vi来运行UNIX命令,做这事情就像用:sh命令启动一个shell一样简单,在编辑的谁的上运行一个命令。
vi的shell转义命令 选项 :!command :!! :r!command :w!command :cd directory :sh :so file 作用 执行shell的command命令,如:!ls 执行前一个shell命令 将command命令的输出读入并插入,如:r!ls先执行ls,然后读入内容 将当前已编辑文件作为command命令的标准输入来执行command命令,如:w!grep all 改变当前目录到directory 启动一个shell,使用Ctrl+d返回vi 在shell程序file中读入和执行命令 一个使用:w的例子是将wisdom文件作为grep命令的标准输入,来查找所有包含all的行,如下所示: :w ! grep all
Think of the small as by a series of small acts.
你可以使用:so命令在一个文件中读主和执行命令。当在vi下执行下面的命令时,系统将会在file_with_commands文件中运行命令: :so file_with_commands
该文件包含下面两个命令: :set nu :g/all/p
当我们运行前面的:so命令时,通过:set nu命令将显示行数,并打印出下面的包含all的行。 Think of the small as by a series of small acts.
宏与缩写
并不局限于只运行单个的vi命令,可以定义一个vi命令的字符串,再定义一个与该字符串相关的键,这样可以通过该键来调用字符串。当为你的宏定义一个键时,不能使用下面的键:K V g q * =和功能键。也有一些控制键不能使用,所有一般不使用控制键。下表显示了宏和缩写。
vi的宏与缩写
选项 :map key command_seq :map
作用 定义一个键来运行command_seq,如:map e ea,无论什么时候使用e移到一个字的末尾来追加文本 在状态行显示所有定义的宏
:umap key 删除key键的宏 定义一个缩写,使得当插入string1时,用string2替换string1。当要插入文本时,键入string1,然后按Escape键,系统就插入了string2 显示所有缩写 改变当前工作目录到directory 取消string的缩写,避免使用控制键和符号,还要使用字符K V g q v * =和功能键 :ab string1 string2 :ab :cd directory :una string 一个使用map命令的例子是,当你移到末尾时,会自动添加文本,如下面的map命令所示:
:map e ea
该命令将ea映像为e。当使用e移到下一个字的末尾时,通过a进入插入模式,这样就立即可以在字的末尾追加新的文本了。
也可以使用ab来缩写一个长的序列。例如,可以使用下面的命令将system administration缩写为sa:
:ab sa system adminitration
现在进化论什么时候插入文本,键入sa,然后按下Escape键来完成system administration的插入。sa就是system administration的缩写。
缩进文本
可以使用多种不同的方法来缩进文本,下表列出了一些常用的缩进文本的命令。
在vi中缩进文本
选项 Ctrl+i或tab :set ai :set sw=n n<< n>> 作用 当插入文本时,插入移位宽度,移位宽度事先被定义好的 打开自动缩进 设置移位宽度为n个字符 使n行都向左移一个移位宽度 使n行都向右移一个移位宽度,如3>>,将接下来的三行每行都向右移一个移位宽度 当在调整移位宽度之前,可能想使用:set all命令来查看一下已经设置的移位宽度为几个字符。缺省情况下,通常为8个字符。使用下面的命令将移位宽度设置为16个字符: :set sw=16
使用下面的命令,你可以使接下来的三行每行都向右移16个字符: 3>>
接下来的三行每行都向右移16个字符
Shell过滤器
可以从正在编辑的文件向某个命令发送一些信息,然后用该命令的输出来替换原来文本。
vi的shell过滤器
选项 作用 将当前位置到光标命令(cursor_command)位置的文本发送给shell命令command。例如,使用!}grep admin命令,将当前位置到段尾的所有文本发送给grep命令,然后执行grep命令来查找admin字,并用它的输出替换存在的文本
!cursor_command command