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