vi编辑器有两种状态:

  • 命令状态:键盘输入解释为命令
    • vi 一启动就进入命令行模式
    • 以冒号可以引入行编辑的命令和查找命令
    • 编辑命令i(insert, 当前字符前),a(append,当前字符后),可以从命令状态转到文本状态
  • 文本状态
    • 键盘输入解释为输入的文本
    • 可以输入多行
    • 有回显
    • 按Esc键,返回到命令状态

常见命令

光标移动

命令 描述
h 左移1列
j 下移1行
k 上移1行
l 右移1列
数值n+h,j,k,l 对应操作执行n次
ctrl+b 向后翻页
ctrl+f 向前翻页
^ 将光标移至行首
$ 将光标移至行尾
w 右移1个单词
b 左移1个单词
:476 移动至476行
:1 移动首行
:$ 移动至文件末尾

编辑

命令 描述
x 删除当前字符
dd 删除行
u 取消上一次编辑
. 重复上一次编辑操作
:n1,n2d 删除第n1-n2行
:1,.d 删除首行至当前行
:.,$d 删除当前行至文件尾
:10,50y 拷贝10-50行至剪贴板(yank)
p 粘贴剪贴板信息
ra 将当前光标处字符替换为a

保存

命令 描述
:wq 写入并保存
:w 写入不退出
:q! 不存盘退出

块操作

命令 描述
:5,10co56 复制第5-10行至56行之下
:8,34m78 移动8-34行至第78行之下
J 当前行和下面行合并至当前行
ctrl + l 刷新屏幕显示
ctrl+g 状态显示

查找与替换

命令 描述
/pattern 查找匹配该模式的项
n 向下查找下一个
N 向上查找下一个
:n1,n2s/pattern/string/g 替换成string

几个问题

死机

  • 现象:vi 编辑结束后执行存盘操作,果导致屏幕 卡死,输入任何信息都不在有显示
  • 原因: 编辑结束后按下 Ctrl-S,因为 WindowsWindows 编辑器一般设置 Ctrl-S热键的动作为Save ,但Linux 却进入流量控制状态。
  • 解决方法: 按下Ctrl-Q键后流量控制解除

意外中止问题

  • 现象: vi编辑结束后存盘,程序意外中止成果丢失文件内容未发生变化

  • 原因: vi存盘命令Shift-ZZ,误操作为Ctrl-ZZ,而Ctrl-Z按键导致当前运行进程被挂起 (suspend ),暂停运行(但进程尚在,处于stopped状态)

  • 解决方式: 调用bash的作业管理机制,恢复运行被stopped的进程

    • jobs 列表当前被Stopped的进程有哪些

    • fg %1 将1号作业恢复到前台运行

    • %1 将1号作业恢复到前台运行

屏幕显示乱码问题

  • 现象: cat /bin/bash 或head -n 1 /bin/bash 导致屏幕乱码,键盘输入也只能看到画表用的框框符
  • 原因:/bin/bash /bin/bash /bin/bash文件不是本,这些二进制内容逐字节送到终端,凑巧一个序列被理解 终端,凑巧一个序列被理解 终端,凑巧一个序列被理解 为一个转义序列,执行动作:修改了终端字符集
  • 解决方式:断开连接,重新连接,注意不要把非文本信息在终端输出

文本文件格式问题

  • 现象: Linux下的文本件在 Windows用notepad打开,所有内容粘在一行内
  • 原因: Linux和Windows的文本文件的存储格式不同, windows行尾为回车和换行\r\n,linux为\n
  • 解决方式: 在linux完成格式转化后再用windows处理
    • dos2unix/unix2dos, todos/frodos

中文编码配置问题

  • 现象: 从windows迁来的文件,只有在显示中文字符时是乱码。Linux本身的正常显示
  • 原因: 中文GBK与UTF8不兼容
    • 7比特 ASCII码,字节高位为0,后面7位是英文ASCII码
    • gbk , 两个字节表示一个汉字,字节的高位为1以区分ASCII码
  • 解决方式:

    • 检查系统设置: export LANG=en_US.UTF-8

    • iconv:中文字符编码的转化: iconv -f gbk -t utf8