vi工作方式 命令状态:键盘输入解释为命令 vi一启动就进入命令方式,键盘输入解释为命令 一般按键无回显 以冒号可以引入ex命令和查找命令 编辑命令 i a 等,可以从命令状态转到文本状态
正文插入 命令 i 命令 a 命令 o 命令 O 在当前字符前插入正文段,直至按Esc键(insert) 在当前字符后插入正文段,直至按Esc键(append) 命令 o 在当前行后插入正文段,直至按Esc键(open) 命令 O 在当前行前插入正文段,直至按Esc键(open)
光标单字符移动 单字符移动(四个字母键盘上相邻的按键) 命令前加一整数,表示这个命令连续执行多少遍 h 光标左移一列 j 光标下移一行 k 光标上移一行 l 光标右移一列 有的终端可以直接使用键盘上的方向键代替这四个字母 命令前加一整数,表示这个命令连续执行多少遍 5h 光标左移5列 6j 光标下移6行 23k 光标上移23行 10l 光标右移10列 注意:在vi命令状态下的按键命令没有回显
翻页 命令 注意 Ctrl-b 向后翻页(Backward) Ctrl-f 向前翻页(Forward) Ctrl-u 向上翻半页(Up) Ctrl-d 向下翻半页(Down) 注意 vi把文件尾方向定义为向前,文件头方向定义为向后 有的键盘用PgDn键代替Ctrl-f,用PgUp键代替Ctrl-b 也可以使用下面的命令 6Ctrl-f 向前翻6页 15Ctrl-b 向后翻15页
光标行内快速移动 行尾行首 移动一个单词 wb与WB区别:对“单词”分界符的定义不同 将光标移至当前行首 ^ 将光标移至当前行尾 $ 将光标移至当前行首 ^ 将光标移至当前行尾 $ 移动一个单词 移到右一个单词 w W 移到左一个单词 b B 也可以使用6w 3W 5b 10B命令 wb与WB区别:对“单词”分界符的定义不同 wb命令:非字母,数字,下划线之外的字符 WB命令:仅以空白符(空格/制表符/回车)
光标移动到指定行 移到指定的行 在描述行号时可以使用 括号配对 % :476 将光标定位于第476行 :1 将光标定位于第1行(文件首) :1 将光标定位于第1行(文件首) :$ 将光标定位于文件尾 :$-10将光标定位于文件倒数第10行 在描述行号时可以使用 圆点(.)代表当前行号, $ 代表最后一行的行号 括号配对 % 把光标移到一个花括号(或圆括号,或方括号)上,按%键,则光标自动定位到与它配对的那一个括号
删除命令和剪贴板 注:被删除的内容进入剪贴版 删除字符 删除行 删除块 复制到剪贴板yank(不删除,只拷贝到剪贴板) 删除当前字符的命令 x 命令5x删除从当前光标开始的5个字符 删除行 删除当前行的命令 dd 命令3dd删除从当前行开始的3行 删除块 删除到配对括号命令:将光标定位在括号上 d% 复制到剪贴板yank(不删除,只拷贝到剪贴板) yy与y% paste取出剪贴板中内容 p
字符替换 替换光标处字符 r 替换若干字符 R ra命令将当前光标处字符替换为a 将当前光标处开始的三个字符依次替换为abc,则需要按命令rarbrc 替换若干字符 R 例:命令Rabcdef,然后按Esc键 该命令把从当前光标开始的字符依次替换为abcdef,用Esc来结束多字符替换命令
取消和重复 取消上一次的编辑操作(undo) u 重复上一次的编辑操作 . 如:误删了一段正文,用u命令可撤销删除 如:把文件中的所有abc字符串替换成xyz字符串, 用u命令可撤销替换 重复上一次的编辑操作 . 按圆点键,可以重复上一次的编辑操作 例如:按3dd命令删除了三行,然后按圆点键就再删除三行,接着连续按圆点键,每按一次删三行
文件操作命令 存盘退出 存盘不退出 不存盘退出 读入文件xyz.c插入到当前行之下 写文件,把第50行至文件尾的内容写到文件file1中 ZZ :wq<CR> 存盘不退出 :w<CR> 不存盘退出 :q!<CR> 读入文件xyz.c插入到当前行之下 :r xyz.c<CR> 写文件,把第50行至文件尾的内容写到文件file1中 :50,$w file1<CR> :50,$w! file1<CR> 强制覆盖
块操作 删除,并拷贝到剪贴板 不删除,拷贝到剪贴板 复制 移动 :10,50d<CR> 删除第10-50行 :10,50y<CR> 复制 :5,10co56<CR>复制第5-10行到第56行之下 移动 :8,34m78<CR>移动第8-34行到第78行之下
行合并、刷屏和状态显示 两行合并(Join) J 刷新屏幕显示(load) Ctrl-l 状态显示 Ctrl-g 当前行下面的行合并到当前行 在屏幕最下面一行列出正在编辑的文件的名字,总行数,当前行号,文件是否被修改过等信息
模式查找 用“正则表达式”来描述一个字符串模式 查找命令 继续查找命令 格式 /pattern 例: /[0-9][0-9]* 例: /[0-9][0-9]* 继续查找命令 n 向下查找下一个next N 向上查找下一个 循环式搜索
模式替换(1) 替换命令 (substitution) 格式 :n1,n2s/pattern/string/g 例 :1,50s/abc/xyz/ :1,50s/abc/xyz/g :50,80s/^// 第50-75行右移4列 :50,80s/^// 第50-75行左移4列 :1,$s/ *$// 消除尾部多余的空格 :1,$s/a[i]/b[j]/g 不能把a[i]替换为b[j] :1,$/a*b/x+y/g
模式替换(2) 替换字符串中字符&代表被模式所匹配的那部分 例 设文件当前只含有2行,每行为一个整数,内容为 例 设文件当前只含有2行,每行为一个整数,内容为 5 6 10 执行命令 :1,$s/[0-9][0-9]*/192.168.24.& host&/ 192.168.24.5 host5 192.168.24.6 host6 192.168.24.10 host10
模式替换中的转义符 尤其是编辑C语言源程序时需要 将a[i]*b[j]替换为x[k]*y[n]的命令 :1,$s/a\[i]\*b\[j]/x[k]*y[n]/g 将buf.len/1000替为buffer.size/1024的命令 :1,$s/buf\.len\/1000/buffer.size\/1024/g 模式串和替换字符串中的斜线前加转义符\以区别于替换命令格式中所必须的斜线 将*pointer替换为&record :1,$s/\*pointer/\&record/g
更灵活的替换(1) 模式描述中增加\(和\) 例 替换字符串中的 \0 \1 \2 …… 在正则表达式中圆括号,仍然代表它自身 在正则表达式中出现的\(和\)不影响匹配操作 例 [a-zA-Z_][a-zA-Z0-9_]*->number \([a-zA-Z_][a-zA-Z0-9_]*\)->number 替换字符串中的 \0 \1 \2 ……
更灵活的替换(2) 将“变量名->number”替换为“变量名->num” 将日期格式“月-日-年”改为“年.月.日”, :1,$s/\([a-zA-Z_][a-zA-Z0-9_]*\)->number/\1->num/g 将日期格式“月-日-年”改为“年.月.日”, 比如:将 04-26-1997替换为1997.04.26使用命令: :1,$s/\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]*\)/\3.\1.\2/g 替换字符串中的&可以用\0代替 :1,$s/[0-9][0-9]*/192.168.24.& host&/ 也可以用 :1,$s/[0-9][0-9]*/192.168.24.\0 host\0/