vi commands

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三个文件
$ 
  1. 命令模式(一般模式): 用户处于任何模式,都可以按 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粘贴至光标所在处即可
    
  2. 编辑模式(文本输入模式): 该模式是对文件进行编辑操作,进入该模式命令窗口底部显示”– 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			# 删除指定数目的行,并以所输入文本代替之
    
  3. 末行模式(指令列命令模式): 即可将光标移动到最下面一行,在该模式下,您可以搜索数据,而且读取,存盘,大量删除字符,离开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