Vi使用命令集锦
一、vi基本命令
 
  1)光标命令
 
  左h 上j 下k 右l
 
  nG ——n为行数,该命令立即使光标跳到指定行;n为空,光标跳到文件最后一行。
 
  Ctrl+G——光标所在位置的行数和列数报告
 
  w,b——使光标向前或向后跳过一个单词
 
  2)编辑命令
 
  (n)dd 删除
 
  (n)yy 复制
 
  i 光标前插入
 
  a 当前字母后插入
 
  r 在当前光标处替换
 
  cw 替换光标所在处的单词(从光标开始处)
 
  dw 删除光标所在处的单词
 
  x 删除(右)
 
  X 删除(左)
 
  u 撤销
 
  . 重复上次操作
 
  o 插入新行
 
  J 合并两行
 
  A 行尾
 
  :.,3w /tmp/xx
 
  :r /tmp/xx
 
  3)查找命令
 
  f 查找
 
  / 查找
 
  4)复制粘贴命令
 
  (n)yy 拷贝n行到剪切板
 
  p 粘贴(后)
 
  P 粘贴(当前)
 
  二、vi选项设置
 
  vi是一个强大的编辑器,它不仅可以用来处理我们平时的文本工作,还可以用来写程序文件。在用vi进行程序编辑时,它可以实现语法加亮显示、自动缩进、括号匹配等编辑功能。为控制不同的编辑功能,vi 提供了很多内部选项。
 
  利用 :set 命令可以设置选项。基本语法为:
 
  : set option 设置选项 option
 
  常见的功能选项包括:
 
  autoindent 设置该选项,则正文自动缩进
 
  ignorecase 设置该选项,则忽略规则表达式中大小写字母的区别
 
  number 设置该选项,则显示正文行号
 
  ruler 设置该选项,则在屏幕底部显示光标所在行、列的位置
 
  tabstop 设置按 Tab 键跳过的空格数。例如:set tabstop=n,n默认值为8
 
  1)语法加亮显示
 
  : syntax on 该命令在vi中打开语法加亮显示的功能。这样以后在输入的字符中,vi就会自动的识别出关键字,字符串以及其他的一些语法元素,并以不同的颜色来显示出来。
 
  2)自动缩进
 
  在vi中自动缩进的选项一般有以下的几种:
 
  autoindent: 在这种缩进形式中,新增加的行和前一行有相同的缩进形式。
 
  smartindent: 在这种缩进模式中,每一行都和前一行有相同的缩进量,同时能够正确的识别出{和},当遇到右花括号(}),则取消了缩进形式。此外还增加了识别C语言关键字的功能。如果一行是以#开头的,那么这种格式将会被特殊对待而不采用缩进格式。这种缩进格式强于autoindent。
 
  cindent:这是C语言的缩进形式,采用这样的缩进方式的程序语言有:C,C++,Java等。当采用这种缩进格式时,vi就会自动的采用标准的C语言形式。这种缩进格式强于smartindent。
 
  可以用如下命令进行缩进形式的设置:
 
  :set autoindent(ai)
 
  :set smartindent(si)
 
  :set cindent(ci)
 
  3)显示行号
 
  set number(nu) 显示行号
 
  : set nonumber (nonu) 不显示行号
 
  在每个用户的目录下,都有一个vi的配置文件".vimrc"(没有的话可以自己创建)。用户可以编辑它,输入以上命令,使这些设置在每次vi时都有效。例如:在.vimrc文件中加入如下设置行:
 
  set nu #显示行号
 
  set nonu #不显示行号
 
  set ic #查找时不考虑大小写
 
  set noic #查找时考虑大小写
 
  set smartindent #自动缩进
 
  syntax on #语法加亮
 
 
1.6.1   vi 的工作模式
 
编辑模式: 用户可以利用一些预先定义的按键来移动光标、删除文字、复制或粘贴文字等。
l 是向右移动光标,相当于向右箭头键,
k 是向下移动光标,相当于向下箭头键。
 
当用户在编辑模式下键入 i, a, o 等命令之后,可进入插入模式;
键入 : 可进入命名模式。
在插入模式下,用户随后输入的,除 Esc 之外的任何字符均将被看成是插入到编辑缓冲区中的字符。按 Esc 之后,从插入模式切换到编辑模式。
在命令模式,Vi 将把光标挪到屏幕的最下方,并在第一个字符的位置显示一个 :(冒号)。这时,用户就可以键入一些命令。这些命令可用来保存文件、读取文件内容、执行 Shell 命令、设置 Vi 参数、以正则表达式的方式查找字符串或替换字符串等。
 
1.6.2   编辑模式
1. 移动光标要对正文内容进行修改,首先必须把光标移动到指定位置。移动光标的最简单的方式是按键盘的上、下、左、右箭头键。除了这种最原始的方法之外,用户还可以利用 vi 提供的众多字符组合键,在正文中移动光标,迅速到达指定的行或列,实现定位。例如:
kj、h、l 功能分别等同于上、下、左、右箭头键
Ctrl+b 在文件中向上移动一页(相当于 PageUp 键)
Ctrl+f 在文件中向下移动一页(相当于 PageDown 键)
H 将光标移到屏幕的最上行(Highest)
nH 将光标移到屏幕的第 n 行
2H 将光标移到屏幕的第 2 行
M 将光标移到屏幕的中间(Middle)
L 将光标移到屏幕的最下行(Lowest)
nL 将光标移到屏幕的倒数第 n 行
3L将光标移到屏幕的倒数第 3 行
w 在指定行内右移光标,到下一个字的开头
e 在指定行内右移光标,到一个字的末尾
b 在指定行内左移光标,到前一个字的开头
0 数字0,左移光标,到本行的开头
$ 右移光标,到本行的末尾
^ 移动光标,到本行的第一个非空字符
2. 替换和删除将光标定位于文件内指定位置后,可以用其他字符来替换光标所指向的字符,或从当前光标位置删除一个或多
个字符。例如:
rc c (可以是其它的何字符)替换光标所指向的当前字符
nrc c 替换光标所指向的前 n 个字符
5rc c 替换光标所指向的前 5 个字符
x 删除光标所指向的当前字符
nx 删除光标所指向的前 n 个字符
3x 删除光标所指向的前 3 个字符
dw 删除光标右侧的字
ndw 删除光标右侧的 n 个字
3dw 删除光标右侧的 3 个字
db 删除光标左侧的字
ndb 删除光标左侧的 n 个字
5db 删除光标左侧的 5 个字
dd 删除光标所在行,并去除空隙
ndd 删除 n 行内容,并去除空隙
3dd 删除 3 行内容,并去除空隙
3. 粘贴和复制从正文中删除的内容(如字符、字或行)并没有真正丢失,而是被剪切并复制到了一个内存缓冲区中。用户可
将其粘贴到正文中的指定位置。完成这一操作的命令是:
p 小写字母 p,将缓冲区的内容粘贴到光标的后面
P 大写字母 P,将缓冲区的内容粘贴到光标的前面
如果缓冲区的内容是字符或字,直接粘贴在光标的前面或后面;如果缓冲区的内容为整行正文,则粘贴在当前
光标所在行的上一行或下一行。
注意上述两个命令中字母的大小写。vi 编辑器经常以一对大、小写字母(如 p 和 P)来提供一对相似的功能
。通常,小写命令在光标的后面进行操作,大写命令在光标的前面进行操作。
有时需要复制一段正文到新位置,同时保留原有位置的内容。这种情况下,首先应当把指定内容复制(而不是
剪切)到内存缓冲区。完成这一操作的命令是:
yy 复制当前行到内存缓冲区
nyy 复制 n 行内容到内存缓冲区
5yy 复制 5 行内容到内存缓冲区
4. 搜索字符串和许多先进的编辑器一样,vi 提供了强大的字符串搜索功能。要查找文件中指定字或短语出现的位置,可以
vi 直接进行搜索,而不必以手工方式进行。搜索方法是:键入字符 / ,后面跟以要搜索的字符串,然后
按回车键。编辑程序执行正向搜索(即朝文件末尾方向),并在找到指定字符串后,将光标停到该字符串的
开头;键入 n 命令可以继续执行搜索,找出这一字符串下次出现的位置。用字符 ? 取代 / ,可以实现反向
搜索(朝文件开头方向)。例如:
/str1 正向搜索字符串 str1
n 继续搜索,找出 str1 字符串下次出现的位置
?str2 反向搜索字符串 str2
无论搜索方向如何,当到达文件末尾或开头时,搜索工作会循环到文件的另一端并继续执行。
5. 撤销和重复在编辑文档的过程中,为消除某个错误的编辑命令造成的后果,可以用撤消命令。另外,如果用户希望在新
的光标位置重复前面执行过的编辑命令,可用重复命令。
u 撤消前一条命令的结果
. 重复最后一条修改正文的命令
6. 文本选中vi 可进入到一种成为 Visual 的模式,在该模式下,用户可以用光标移动命令可视地选择文本,然后再执行其他编辑操作,例如删除、复制等。 v 字符选中命令 V 行选中命令
 
1.6.3   插入模式
 
1. 进入插入模式在编辑模式下正确定位光标之后,可用以下命令切换到插入模式:
i 在光标左侧输入正文
a 在光标右侧输入正文
o 在光标所在行的下一行增添新行
O 在光标所在行的上一行增添新行
I 在光标所在行的开头输入正文
A 在光标所在行的末尾输入正文
上面介绍了几种切换到插入模式的简单方法。另外还有一些命令,它们允许在进入插入模式之前首先删去一段
正文,从而实现正文的替换。这些命令包括:
s 用输入的正文替换光标所指向的字符
ns 用输入的正文替换光标右侧 n 个字符
cw 用输入的正文替换光标右侧的字
ncw 用输入的正文替换光标右侧的 n 个字
cb 用输入的正文替换光标左侧的字
ncb 用输入的正文替换光标左侧的 n 个字
cd 用输入的正文替换光标的所在行
ncd 用输入的正文替换光标下面的 n 行
c$ 用输入的正文替换从光标开始到本行末尾的所有字符
c0 用输入的正文替换从本行开头到光标的所有字符
2. 退出插入模式退出插入模式的方法是,按 ESC 键或组合键Ctrl+[ 。
#DEMO#1.6.4   命令模式在 vi 的命令模式下,可以使用复杂的命令。在编辑模式下键入“:”,光标就跳到屏幕最后一行,并在那里显示冒号,此时已进入命令模式。命令模式又称“末行模式”,用户输入的内容均显示在屏幕的最后一行,按回车键,vi 执行命令。1. 退出命令在编辑模式下可以用 ZZ 命令退出 vi 编辑程序,该命令保存对正文所作的修改,覆盖原始文件。如果只需要
退出编辑程序,而不打算保存编辑的内容,可用下面的命令:
: q 在未作修改的情况下退出
: q! 放弃所有修改,退出编辑程序
2. 行号与文件编辑中的每一行正文都有自己的行号,用下列命令可以移动光标到指定行:
: n 将光标移到第 n 行
命令模式下,可以规定命令操作的行号范围。数值用来指定绝对行号;字符“.”表示光标所在行的行号;字符
符“$”表示正文最后一行的行号;简单的表达式,例如“.+5”表示当前行往下的第 5 行。
:345 将光标移到第 345 行
:345w file 将第 345 行写入 file 文件
:3,5w file 将第 3 行至第 5 行写入 file 文件
:1,.w file 将第 1 行至当前行写入 file 文件
:.,$w file 将当前行至最后一行写入 file 文件
:.,.+5w file 从当前行开始将 6 行内容写入 file 文件
:1,$w file 将所有内容写入 file 文件,相当于 :w file 命令
在命令模式下,允许从文件中读取正文,或将正文写入文件。例如:
:w 将编辑的内容写入原始文件,用来保存编辑的中间结果
:wq 将编辑的内容写入原始文件并退出编辑程序(相当于 ZZ 命令)
:w file 将编辑的内容写入 file 文件,保持原有文件的内容不变
:a,bw file 将第 a 行至第 b 行的内容写入 file 文件
:r file 读取 file 文件的内容,插入当前光标所在行的后面
:e file 编辑新文件 file 代替原有内容
:f file 将当前文件重命名为 file
:f 打印当前文件名称和状态,如文件的行数、光标所在的行号等
3. 字符串搜索给出一个字符串,可以通过搜索该字符串到达指定行。如果希望进行正向搜索,将待搜索的字符串置于两个“
/”之间;如果希望反向搜索,则将字符串放在两个“?”之间。例如:
:/str/ 正向搜索,将光标移到下一个包含字符串 str 的行
:?str? 反向搜索,将光标移到上一个包含字符串 str 的行
:/str/w file 正向搜索,并将第一个包含字符串 str 的行写入 file 文件
:/str1/,/str2/w file 正向搜索,并将包含字符串 str1 的行至包含字符串 str2 的行写
file 文件
4. 正文替换利用 :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 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。
5. 删除正文在命令模式下,同样可以删除正文中的内容。例如:
:d 删除光标所在行
:3d 删除 3 行
:.,$d 删除当前行至正文的末尾
:/str1/,/str2/d 删除从字符串 str1 到 str2 的所有行
6. 恢复文件vi 在编辑某个文件时,会另外生成一个临时文件,这个文件的名称通常以 . 开头,并以 .swp 结尾。vi 在
正常退出时,该文件被删除,若意外退出,而没有保存文件的最新修改内容,则可以使用恢复命令:
:recover 恢复文件
也可以在启动 vi 时利用 -r 选项。
1.6.5   选项设置为控制不同的编辑功能,vi 提供了很多内部选项。利用 :set 命令可以设置选项。基本语法为:
:set option 设置选项 option
常见的功能选项包括:
autoindent 设置该选项,则正文自动缩进
ignorecase 设置该选项,则忽略规则表达式中大小写字母的区别
number 设置该选项,则显示正文行号
ruler 设置该选项,则在屏幕底部显示光标所在行、列的位置
tabstop 设置按 Tab 键跳过的空格数。例如 :set tabstop=n,n 默认值为 8
mk 将选项保存在当前目录的 .exrc 文件中
 

二、常见问题及应用技巧

---- 1.在一个新文件中读/etc/passwd中的内容,取出用户名部分。

---- vi file
---- :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd
---- :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分。
---- 您也可以在指定的行号后读入文件内容,例如使用命令“:3r /etc/passwd”从新文件的第3行开始读入 /etc/passwd的所有内容。
---- 我们还可以使用以下方法删掉文件中所有的空行及以#开始的注释行。
---- #cat squid.conf.default | grep -v '^$' | grep -v '^#'

---- 2.在打开一个文件编辑后才知道登录的用户对该文件没有写的权限,不能存盘,需要将所做修改存入临时文件。

---- vi file
---- :w /tmp/1 保存所做的所有修改,也可以将其中的某一部分修改保存到临时文件,例如仅仅把第20~59行之间的内容存盘成文件/tmp/1,我们可以键入如下命令。
---- vi file
---- :20,59w /tmp/1

---- 3.用VI编辑一个文件,但需要删除大段的内容。

---- 首先利用编辑命令“vi file”打开文件,然后将光标移到需要删除的行处按Ctrl+G显示行号,再到结尾处再按Ctrl+G,显示文件结尾的行号。
---- :23,1045d 假定2次得到的行号为23和1045,则把这期间的内容全删除,也可以在要删除的开始行和结束行中用ma、mb命令标记,然后利用“:'a,'bd”命令删除。

---- 4.在整个文件的各行或某几行的行首或行尾加一些字符串。

---- vi file
---- :3,$s/^/some string / 在文件的第一行至最后一行的行首插入“some string”。
---- :%s/$/some string/g 在整个文件每一行的行尾添加“some string”。
---- :%s/string1/string2/g 在整个文件中替换“string1”成“string2”。
---- :3,7s/string1/string2/ 仅替换文件中的第3行到第7行中的“string1”成“string2”。
---- 注意: 其中s为substitute,%表示所有行,g表示global。

---- 5.同时编辑2个文件,拷贝一个文件中的文本并粘贴到另一个文件中。

---- vi file1 file2
---- yy 在文件1的光标处拷贝所在行
---- :n 切换到文件2 (n=next)
---- p 在文件2的光标所在处粘贴所拷贝的行
---- :n 切换回文件1

---- 6.替换文件中的路径。

---- 使用命令“:%s#/usr/bin#/bin#g”可以把文件中所有路径/usr/bin换成/bin。也可以使用命令“:%s//usr/bin//bin/g”实现,其中“”是转义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。

:ab string strings
例如 ":ab usa United States of America" ,
当你在文见里插入 usa 时
United States of America 就蹦出来了
:g/^/m0
把文件内容反转
:map keys new_seq
定义你当前 键盘命令
:set [all]
vi or ex 的编辑状态
如 显示每行 :set nu
:X
然后系统会提示输入密码, 输入密码后存盘退出, 保存后就加密了
下次编辑时使用vi -x filename, 系统会提示你输入密码

在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,粘贴下来在光标处。

我常用到的单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S

:%s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串

将光标移到第n行,按下 mk
将光标移到第m行,按下 "ay'k
即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等

不好意思,补充一下,想粘贴到某处,直接将光标移到某地,按下 ‘ap 即可

删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置

删除命令操作
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d 4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /t e x t 删除从文本中出现“ t e x t”中所指定字样的位置,一直向前直到下一个该字样所出现的
位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符“c”的位置,一直向前直到下一个该字符所出现的位置(包括
该字符)之间的内容
d tc 删除当前行直到下一个字符“ c”所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G 删除直到工作缓存区开始的内容

修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容

替换命令操作
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符
下载

vi替换使用规则:
:g/s1/s/s2/s3/g
第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串

fx
往右移动到 x 字符上
Fx
往左移动到 x 字符上
tx
往右移动到 x 字符前
Tx
往左移动到 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次
,
逗号,配合 f 和 t 使用,反方向重复一次

建议谁把 :set all 出来的参数及其用法说明一下。注意注明UNIX平台,我发现几个平台下有些差异。

加密码我在8 上(bsh) 实验成功 所以大家最好还是加上 环境!!

vi 环境选项 Solaris ksh
noautoindent nomodelines noshowmode
autoprint nonumber noslowopen
noautowrite nonovice tabstop=8
nobeautify nooptimize taglength=0
directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
noedcompatible prompt tagstack
noerrorbells noreadonly term=vt100
noexrc redraw noterse
flash remap timeout
hardtabs=8 report=5 ttytype=vt100
noignorecase scroll=11 warn
nolisp sections=NHSHH HUuhsh+c window=23
nolist shell=/bin/ksh wrapscan
magic shiftwidth=8 wrapmargin=0
mesg noshowmatch nowriteany

For C-Shell:
setenv EXINIT "set nu"
For Bourne or Korn Shell:
EXINIT="set nu"; export EXINIT
For Korn Shell Only (alternate method):
typeset -x EXINIT="set nu"

在 .profile 里设置 vi 的环境选项 , 以上均测试过

怎么没有介绍标记的,做标记对那种大的程序文件阅读十分有帮助。
建议大家使用。

标记文本
  mchar   用字母char标记当前光标的位置
  `char   移至char所标记处
  'char   移至char标记所在行的开头处
  "     移至当前行上一次所在位置(在光标移动之后)――一个双引号
  ''    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号

.重复上一次修改!

大家都说了这么多了,我也来说两句
在当前屏幕中
H 跳到第一行
M 跳到中间一行
L 跳到最后一行

同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。其实就是一些文档写的 ^^
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,屏幕底部仍然显示目前vi的是刚才的文件。
(在HP-UX,Solaris,AIX上通过)

还是使用
:e#
切换比较好,呵呵

%s/^/要加的内容/g 要在文本后同样的字符加
%s/$/要加的内容/g vi的使用确实太多,大家多多总结交流!!!

追加到缓冲区
对于已经有内容的缓冲区,可以继续追加内容在其后面,例如:
"Ad4w 删除光标后4个字,并附加到缓冲区a
"Ay) 取样从光标到文件尾的内容,并附加到缓冲区a
"K3yy 取样从光标所在行起的3行内容,并附加到缓冲区k

注意:在追加缓冲区的命令中,原缓冲区的名字一定要大写,才能将内容追加进去,否则是覆盖原缓冲区的内容。追加内容在原缓冲区末尾另起一行。

清理掉DOS文本中的^M可以在:1,$s/^M//g,其中^M是CTRL+V, CTRL+M。


删除从当前行开始到最后一行的所有内容
:.,$d
在:命令行模式下,首先可以确定命令的范围
.表示当前行;数字表示行号,如1表示第一行,2表示第二行;$表示最后一行
范围用,分隔
然后用命令
d表示删除,y表示复制......大家都知道的

最后说一句,%表示全文
:%d
是删除全文

给“南非蜘蛛”补充一下,hehe
在:命令行模式下,首先可以确定命令的范围
.表示当前行;数字表示行号,如1表示第一行,2表示第二行;$表示最后一行
范围用,分隔
...


慎用:$d

:$d 只是删除最后一行嘛,用错了还不算最坏的结果,呵呵

请教aix,ksh下:
一行>=2048个字符时,无法显示,怎么办?


在vi中好像应该没有什么办法了,这是vi的Program Limits中的Maximum Line Length限制。试一试用UltraEdit读读看吧

有的环境不能用uedit
可以折行吗?

折行
:set wrapmargin=4

下面引用由bjchenxu在 2002/09/05 09:07am 发表的内容:
折行
:set wrapmargin=4


怎么解释?结果如何?

不行呀
A line cannot be longer than 2048 characters.

我的只能解决显示问题,如果说vi里不能存放这么多字符,就比较麻烦了
另外问一句,2048个字符已经够长了,为什么要放更多的,没准我们可以从源头上解决问题

老外的程序的log文件,有些行就这么长,以至于影响了后面行的显示;
more,pg等可以折行

我还是不会用:X加密,能不能说的详细一点,:X后,提示输入key:然后呢?mark what 后输入什么呢,下次如何在打开呢?more 可以正常看吗?
xiexie!

你使用的什么平台的UNIX呢?我从来没有见到mark what出现过啊
more是不能正常看的,用vi -x filename,然后输入密码就可以了

好像再另存不了不加密的了

用 :wq 或者 :wq! 另存

请高手指点迷精:vi中如何在每行的倒数第二个字符处插入一个字符??

把Tab全部换成回车,应该怎么作啊?
:1,$ s/ / /g
不行

^M (Ctrl+V+M)就是回车。

vi加密不同的unix可能不同.
俺在HP-UX下,用X加密的文件只输key(密钥).
vi -C 文件名,便会要求输入密钥,如正确,便打开了.

littletiger的意思是不是这样:
以HP-UX为例
1、加密
vi file
:X
(Are you sure?(y/n)[n]:)回答y
输入密码回车以后再保存,就加密成功了
2、解密
vi -C file 或者 vi -x file
在 Key: 后面输入密码进入file
:X
(Are you sure?(y/n)[n]:)回答y
直接回车以后再用 wq 或者 wq! 保存,就把file解密成功了

:set number
显示行号

:g/$/s// ABC/g
:g/^/s//def /g
在文本每行的头和尾添加字符串.

用vi进行coding时的使用技巧:
用ctags命令对当前目录下的c源程序扫描,生成tags文件
$ ctags *.c
这样,在vi里通过命令
:ta fun_name
就可以直接打开函数fun_name所在的文件,并将光标置于函数开头


:n,n1 d
n和n1都是行数, d是删除这些行 .表示当前的行。
: n
n是行数,直接转到n行。
: r 文件名
把文件添加到当前的文件中
:n,n1 w 文件名
把从n行到n1行写道另外一个文件中


查找:
在一个单词上用*,就向下查找此单词,#是向上
用/查找hello,就不会查找到hello_world(用此替换也很好用)

替换:
如有一文件,内容为:
aa
bb
cc
dd
用:%s/.*/printf("& is :%d ",&)/
文件内容为变为:
printf("aa is :%d ",aa)
printf("bb is :%d ",bb)
printf("cc is :%d ",cc)
printf("dd is :%d ",dd)
&为查找到的内容
用:~为重复上一次替换

用系统命令编辑:
如有一文件,内容为:
333
222
334
444
111
553
554
233
运行命令:%!sort 文件内容为:
111
222
233
333
334
444
553
554
用此方法可以使用许多系统命令进行编辑,大家可以灵活运用

其他特殊用法:
用q: 看一看有什么
用? 可以编辑你用过的命令
程序中在一个调用函数(如:printf)上用K,可以直接调出printf的帮助

ctrl+f向下翻页,ctrl+b向上翻页(对于telnet上去的时候比较有用)


1. vi中设置tab键的空格数:
:set ts=4
:set sw=4
将此两句话加到当前用户目录的文件.vimrc中,这样当前用户用vi的时候就会启动该设置

2.拷贝:
将第2行到第9行的字copy到第11行
:2,9 co 10
将第2行到第9行的字move到第11行
:2,9 m 10

3.设置行号:
:se nu
取消行号:
:se nonu

4.当前行与下一行换位置:ddp

5.当前字与后面的字换位置:xp


用vi替换文件中的字符串

  在vi界面下使用命令
  :%s#/usr/bin#/bin#g
  可以把文件中所有路径/usr/bin换成/bin。也可以使用命令:
  :%s/usr/bin/bin/g
  其中“”是转义字符,表明其后的“/”字符是具有实际意义的字符,不是分隔符。


请问 vi 中的删除缓冲区是怎么回事?

看到有一个资料说到:
“vi还有有编号的删除缓冲区。撤消命令只能恢复上一次的删除,当且仅当这个删除是最后一次操作。但是,vi可以把最近9次删除的内容都放入9个编号从1到9的缓冲区内。最近一次删除保存在缓冲区1,次近的在缓冲区2,依此类推。例如,"2p可以放置第二个删除缓冲区中的内容。”
但是我没有操作成功,请教各位。


既然是vi的问题,我义不容辞

准备文件test
1
2
3
4
5

将光标定位在5上,连按5次dd
然后键入
"5p
"4p
"3p
"2p
"1p
看看发生了什么

明白了?


要注意"

谢谢你们的解释!
再问,是否只有删除的整行可以保存在删除缓冲区中?比如删除的字符呢?

字符也可以,用整行只是为了让你好学
自己试试吧,找葫芦画瓢吧

wo 我照呢说得作的 可是恢复的是5个1 啊 怎么回事 (solaris8)

比如在一行中连按5次dw,会将5个词依次放入1~5的寄存器中吗?我没有试验成功,总提示寄存器为空。

[这个贴子最后由goodboy在 2002/08/22 09:29am 编辑]

bjchenxu,能否把VI使用高级技巧的方法给大家讲一讲呀:)
很多的,比如:怎么一个文件中的几行保存到另外一个文件中了,
或者把另外一个文件的插入到指定内容的行后面了或者我在vi中拷贝
A文件的某5行(Esc下5yy拷贝),然后再:e b文件,怎么把A文件的5行拷过来?
然后又怎么回到原先的A文件中?


高级技巧太多太多,建议大家找本版valentine斑竹要书看,呵呵
你说的几个问题我先回答一下:
1. 将一个文件中的几行保存到另外一个文件中了
1.1 $vi file1
1.2 :3,5 y a
1.3 :e file2
1.4 "ap

2. 将另外一个文件插入到指定内容的行后面
2.1 $vi file1
2.2 :/regularexpress/ r file2

3. 两个文件的切换和拷贝
3.1 $vi file1 file2
3.2 :3,5 y a
3.3 :e#
3.4 "ap
3.5 :e#

在vim里面查看man页面

在进入vim后按“:”号,输入
source $VIMRUNTIME/ftplugin/man.vim
然后再按“:”号,输入
nmap K :Man
然后在vim里面输入你要的命令,在这个命令上按K,就可以看到经vim处理过后的man页。

用vi在整个文件的各行或某几行的行首或行尾加一些字符串

  $vi file
  :3,$s/^/some string 在文件的第一行至最后一行的行首插入“some string”。
  :%s/$/some string/g 在整个文件每一行的行尾添加“some string”。
  :%s/string1/string2/g 在整个文件中替换“string1”成“string2”。
  :3,7s/string1/string2/ 仅替换文件中的第3行到第7行中的“string1”成“string2”。
  注意: 其中s为substitute,%表示所有行,g表示global。

用vi删除大段的内容

  首先利用编辑命令“vi file”打开文件, 然后将光标移到要删除的行处按Ctrl+G显示行
号,再到结尾处再按Ctrl+G,显示文件结尾的行号。
  例如:
  :23,1045d
  假定2次得到的行号为23和1045,则把这期间的内容全删除, 也可以在要删除的开始行和
结束行中用ma、mb命令标记,然后利用“:'a,'bd”命令删除。

用vi实现“另存为”功能
  $vi file
  :w /tmp/1
  保存所做的所有修改,也可以将其中的某一部分修改保存到临时文件。
  如果仅仅把第20~59行之间的内容存盘成文件/tmp/1,我们可以键入如下命令:
  :20,59w /tmp/1

用vi在一个新文件中读其他文件的内容
  $vi file
  :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd
  :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分。
  您也可以在指定的行号后读入文件内容,例如使用命令:
  :3r /etc/passwd
  从新文件的第3行开始读入 /etc/passwd的所有内容。
  我们还可以使用以下方法删掉文件中所有的空行及以#开始的注释行。
  $cat squid.conf.default | grep -v '^$' | grep -v '^#'

用vi拷贝一个文件中的文本并粘贴到另一个文件中
  $vi file1 file2
  然后在vi界面下:
  yy <-在文件1的光标处拷贝所在行
  :n <-切换到文件2 (n=next)
  p <-在文件2的光标所在处粘贴所拷贝的行
  :n <-切换回文件1

使用vim对被编辑文件加密
  在VIM当中要对所编辑的文件进行简单加密,可以在命令行模式下键入“:X”(无括号,
只有冒号和X)然后在提示“Enter the encrypt key”时输入口令字串就可以加密了。但是别
忘了要保存哦!保存的时候会发现在屏幕底部有“[crypted]”这样的字样。 下次打开该加密
文件会要求您输入口令字串,这个总该记得的吧?

设置vim自动显示行号
  在每个用户的主目录下,都有一个 vi 的配置文件".vimrc"或".exrc", 用户可以编辑它,
使这些设置在每次启动 vi 时,都有效。
  例如,加入如下设置行:
set nu 显示行号
set nonu 不显示行号
set ic 查找时不考虑大小写
set noic 查找时考虑大小写

在vi里搜索关键字

  当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里
可没有菜单-〉查找,不过没关系,你在命令模式下敲斜杆(/)这时在状态栏(也就是屏幕左下
角)就出现了 “/”然后输入你要查找的关键字敲回车就可以了。
  如果你要继续查找此关键字,敲字符n就可以继续查找了。值得注意的是“/”是向下查找,
而“?”是向上查找,而在键盘定义上“?”刚好是“/”的上档符。

用彩色的vi写程序

  修改$HOME中的.vimrc,把color值设为true
  把环境变量VIMRUNTIME设成vim的路径名
  例:/usr/share/vim
  在vi中键入
  :syntax on回车
  :so $VIMRUNTIME/syntax/java.vim回车(现在版本的vi支持无数程序语法色彩档,都在
syntax/下,看一眼吧:))
  如果不喜欢所用的xterm背景色,可以用xterm -bg LightBlue(或其他喜欢的颜色)启动,
或者修改.Xresouce的xterm background项。
  vi -o xxx.java xxxx.java

vi

例如:Esc键在vi中输入ctrl+v与Esc为^[
请问Delete键在vi中如何输入?

d
空一行

[Ctrl+V][Del]

输这个键有什么用啊

输不进去

我想在shll里自动telnet到另一台机器终止.profile(自动运行了程序)执行,好执行我在shll中的一些命令。

输不进去

这种情况是因为DEL在您的终端上被定义成某个中断键,中断是被操作系统优先处理的。
使用stty -a 可以显示出DEL被哪个中断所用。
以下是两种解决方法:
1。使用“stty 中断名 新的中断键”形式改变中断键设置,然后调用vi,再使用ctrl+V的方法。如:stty intr ^E;vi
2。使用一个shell脚本myvi:stty raw ;vi $*;stty -raw
调用myvi
还有一种变通的解决方法,DEL键的ascii码应该是^?,0x7f,

1.交换两个字符位置
xp
2.上下两行调换
ddp
3.把文件内容反转
:g/^/m0
7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了
由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态
19.
同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,
屏幕底部仍然显示目前vi的是刚才的文件。
(在HP-UX,Solaris,AIX上通过)
也可以使用:
:e#
进行切换
 
 
:!command 暂时退出vi并执行shell指令,执行完毕后再回到vi。
:sh 暂时退出vi到系统下,结束时按Ctrl + d则回到vi。