Vi编辑器存在命令、编辑、末行三种模式(模式的分类不尽相同,仅此以本人理解的叙述);
$ vi filename # 打开或新建文件,并将光标置于首行行首
$ vi +n filename # 点开文件,置光标与文件第n行行首
$ vi + filename # 打开文件,置光标于文件尾行行首
$ vi -r filename # 在上次正用vi编辑时发生系统崩溃,恢复filename
$ vi +/pattern filename # 打开文件光标置于第一个与pattern匹配行行首
$ vi a b c # 同时打开a、b、c三个文件
$
命令模式(一般模式): 用户处于任何模式,都可以按 ESC 键进入命令模式;我们使用 “vi” 命令启动编辑器也是进入命令模式;该模式作为编辑模式与末行模式互相切换的桥梁,编辑模式与末行模式不能直接互相切换;该模式主要使用方向键位置进行文字的编辑,常用命令:
[移动光标]
$ ↑↓← → # 上下左右方向键移动光标 $ pagedown/pageup # 翻页上一页/下一页 $ 0(数字0)/$ # 光标移至所在行首/尾 $ G/nG/gg # 移动光标至文件最后一行/n行/第一行(相当于1G)行首 $ H/M/L # 光标移至屏幕内容顶部/中央/尾部 $ h/Backspace # 光标左移一个字符 $ l/space # 光标右移一个字符 $ k/Ctrl+p # 光标上移一行 $ j/Ctrl+n/Enter # 光标下移一行 $ n+ # 光标下移n行 $ n- # 光标上移n行 $ n$ # 光标移至第n行尾 $ (/) # 光标移至句首/尾 $ {/} # 光标移至段落开头/结尾 $ w/W # 光标右移一个字至字首 $ b/B # 光标左移一个字至字首 $ e/E # 光标右移一个字至字尾 $ :num # 光标跳转到指定行号num行首 $ Ctrl+u # 向文件首翻半屏 $ Ctrl+d # 向文件尾翻半屏 $ Ctrl+f # 向文件尾翻一屏 $ Ctrl+b # 向文件首翻一屏 $ nz # 将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部
[删除/复制/粘贴]
$ x/X # 删除一个字符[向后/前],相当于[del/Backspace键] $ dd/ndd # 删除当前行 / 删除当前行及其后n-1行 $ yy/nyy # 复制光标所在的那一行 / 复制光标所在行的向下n行 $ n,my # 赋值n到m行内容 $ yw # 复制光标所在位置之后的一个词 $ y$ # 复制光标所在位置到行尾 $ p/P(大写)# 粘贴复制的内容到光标所在行的下一行 / 上一行 $ u # 复原前一个操作、 $ ctrl + r # 重做上一个操作 $ ctrl + u # 删除输入方式下所输入的文本 $ [do|d$] # 删至行首/尾 $ [dw|ndw|ndW] # 删除光标处单词、开始及其后的n-1个字 $ 小数点"." # 重复前一个动作 $ J # 删除当前光标所在行行尾的换行符(拼接行) $ 剪切的实现 # dd删除行后,使用p粘贴至光标所在处即可
编辑模式(文本输入模式): 该模式是对文件进行编辑操作,进入该模式命令窗口底部显示”– INSERT –”标志; 命令模式切换到编辑模式方式:
[进入编辑模式并进行相应操作]
$ i/I # 在光标前 / 当前行首插入(insert) $ a/A # 在光标后 / 当前行尾追加(append) $ o/O # 光标所在行前/后插入一新行(open) $ r/R # 替换当前字符 / 替换当前字符及其后的字符,直至按ESC键(replace) $ :s/old/new # 光标跳到第一次出现old的地方用new来替换 $ :s/old/new/g # 一行命令替换所有old $ :n,ms/old/new/g # 替换行号n和m之间的所有old $ :%s/old/new/g # 替换整个文件中的所有old $ :%s/old/new/gc # 替换整个文件中的所有old,但每次出现时提示 $ s # 从当前光标位置处开始,以输入的文本替代指定数目的字符 $ S # 删除指定数目的行,并以所输入文本代替之
末行模式(指令列命令模式): 即可将光标移动到最下面一行,在该模式下,您可以搜索数据,而且读取,存盘,大量删除字符,离开vi,显示行号等操作
[保存/退出vi]
$ :w # 保存文件但不退出vi编辑器 $ :w filename # 将修改的文件另存为filename,不退出vi $ :w! # 强制保存,不退出vi $ :q # 退出vi,不保存修改 $ :q! # 强制退出vi,不保存修改 $ :wq # 保存并退出vi $ :x # 保存并退出 $ :wq! # 强制保存并退出vi $ ZZ # 保存并退出 $ :e! # 放弃所有修改,从上次保存文件处开始再次编辑 $ :set nu/nonu # 让vi编辑器显示 / 隐藏行号 $ :e filename # 打开文件filename进行编辑 $ :!command # 执行shell命令command $ :r!command # 将命令command的输出结果放到当前行 $ :ls # 查看vi打开的文件 $ :prev|n / N # 在打开的多个文件间切换(向上/下切换)
[搜索与特换]
$ [/|?pattern] # 从光标开始处向文件尾/首搜索pattern - 按'n'向下定位下一处匹配的关键字 - 按"N"向上定位下一处匹配的关键字 $ :s/p1/p2/g # 将当前行中所有p1均用p2替代 $ :n1,n2s/p1/p2/g[c] # 将第n1至n2行中所有p1均用p2替代(c表示每次替换需要用户确认) $ :g/p1/s//p2/g # 将文件中所有p1均用p2替换 $ :n1,n2 co n3 # 将n1行到n2行之间的内容拷贝到第n3行下 $ :n1,n2 m n3 # 将n1行到n2行之间的内容移至到第n3行下 $ :n1,n2 d # 将n1行到n2行之间的内容删除 # 将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1/n2,则表示将整个文件内容作为command的输入 $ :n1,n2 w!command