先说几个核心判断:vi是Unix-like系统的标配编辑器,这意味着无论你换到哪台机器,只要有终端,就能用它干活。相较那些需要额外安装的编辑器(比如pico),vi的优势在于“随身携带”。但它的学习曲线也确实存在,关键在于理解它的模式切换逻辑——别被“模式”这个词吓到,用顺手之后你会发现,这其实是效率的根源。
vi的两种命令模式
vi的界面操作围绕三种模式展开:Command(命令)模式,用于输入命令;Insert(插入)模式,用于文本输入;Visual(可视)模式,用于高亮选定正文。Command模式是vi或vim的默认模式,如果你身处其他模式,按ESC键就会回到这里。按完ESC再输入:,vi会在屏幕最下方等待命令输入。
文件的保存和退出
操作很简单,但组合得记牢:
:w保存;:w filename另存为;:wq!保存并退出;:wq! filename以filename为名保存后退出;:q!不保存强制退出;:x功能与:wq!相同。
光标移动
这是基本功,尤其是当你没有方向键可用的时候:
- j 向下移动一行;
- k 向上移动一行;
- h 向左移动一个字符;
- l 向右移动一个字符。
插入模式(文本的起点)
进入插入模式有多种方式,适应场景各有不同:
- i 在光标之前插入;
- a 在光标之后插入;
- I 在光标所在行的行首插入;
- A 在光标所在行的行末插入;
- o 在光标所在行的下方新建一行;
- O 在光标所在行的上方新建一行;
- s 删除光标后的一个字符后进入插入模式;
- S 删除光标所在的行后进入插入模式。
文本内容的删除操作
删除是高频操作,配合数字键能大幅提升效率:
- x 删除一个字符;
- #x 删除连续几个字符(例如3x);
- dw 删除一个单词;
- #dw 删除连续几个单词(例如3dw);
- dd 删除一行;
- #dd 删除多行(例如3dd删除当前行及下两行)。
恢复修改及恢复删除操作
- u 撤销上一次修改或删除。
查找
/SEARCH正向查找,按n跳至下一个匹配;?SEARCH反向查找,按Shift+n跳至下一个匹配。
替换
:s/SEARCH/REPLACE/g将当前行中所有SEARCH替换为REPLACE;:%s/SEARCH/REPLACE将全文中所有SEARCH替换为REPLACE;:#,#s/SEARCH/REPLACE/g在指定行范围内替换(#代表行号)。
0. 前言
大约三年前,我第一次接触Unix-like系统,当时用的是Mandrake,个人很偏爱pico——它给我的感觉很亲切,功能也足够强大。后来转用FreeBSD,才发现系统里没有pico,需要额外安装pine才行。装一下倒也无妨,直到有一天,我需要做大量的文本替换操作……这时pico就显得力不从心了。
于是我开始深入了解vi的正则表达式和命令体系。一个简单的操作模式切换,就能让繁琐的工作瞬间解决。更重要的是,vi是所有Unix-like系统预装的编辑器,无需额外安装,在不同系统上都能快速上手。
1. 概说
如果你之前从未接触过全屏幕编辑器,可能连一些简单的编辑操作都会遇到障碍——这种情况下,找一个熟悉vi的人带入门会快很多。vi是一个屏幕编辑器,几乎用去了屏幕的每一行来展示文件内容,只有最后一行留给你输入命令和显示信息。
你必须记住的关键点是:vi是一个模式型编辑器。输入文字和执行命令必须在正确的模式下进行。刚打开一个文件时,你处于命令模式(command mode)。有一些命令能帮你切换到输入模式(input mode),但回到命令模式的方法只有一个——按键盘左上角的ESC键。如果不确定当前处于哪种模式,就一直按ESC直到vi发出“哔”声,表明已回到命令模式。当你执行vi不允许的操作时(本地操作),它通常会发出警告“哔”声。
2. 简易操作
开始编辑一个文件很简单:
$ vi file_name <按enter键>
输入:set verbose mode可以让vi在你犯错时给出更多提示信息——对初学者来说,多些提示总比没有好。放心,离开vi后模式会自动恢复。
当你猛按ESC键时,屏幕最下方会显示“Already in command mode”,提醒你已在命令模式。
简易移动命令
- h 光标向左移动一个字符
- j 光标向下移动一行
- k 光标向上移动一行
- l 光标向右移动一个字符
- 方向键 上下左右通常也可以使用(但使用Windows内置telnet时方向键可能无效,所以记住hjkl还是有用的)。
简易搜寻命令
/text搜寻text字符串。例如/panda会查找“panda”。
模式切换
- a 在光标后新增文字
- i 在光标前新增文字
- o 在光标下方新增一行并进入输入模式
- O 在光标上方新增一行并进入输入模式
- ESC 回到命令模式
建议初学者先记住a和O即可——O看似不如o直观,但当你需要在文件最上方新增一行时,O真的非常方便。用久了,自然会在不知不觉中记住所有快捷键。
文字处理命令
复制:
- yy 复制光标所在行
- p 在光标下方粘贴复制的内容
删除:
- dd 删除光标所在行
- x 删除光标所在字符
储存:
:w以原文件名保存:w file_name另存为新文件
离开:
:q退出(若已编辑,vi会拒绝退出):q!强制退出
注意:所谓“一行”在屏幕上可能显示为多行(因为屏幕宽度有限),只要没有换行符号,就算一行。
4. 小结
以上只是vi的基础功能。掌握这些,你已经能进行简单的文本处理,可以逐渐摆脱pico之类的编辑器,转向vi的怀抱。用上一段时间,你就会慢慢体会到vi的强大之处。
0. 前言(进阶篇)
本篇着重介绍vi命令模式下可执行的命令。所有要输入的指令均以蓝色呈现。对于初学者来说,这部分可能稍显复杂。但经验表明,用久了你自然会记住某些指令——不用刻意去背,常用的会在不知不觉中刻进肌肉记忆(甚至可能出现“手指记住了,脑袋记不住”的情况)。
注: 表示按住Ctrl键再按A。部分命令大小写通用,这里均以小写为例。
1. 常用移动命令
- Ctrl+A 往下移动到当前单词下一次出现的位置
- Ctrl+B 光标向上移动一个屏幕
- Ctrl+D 光标向下移动数行(约12行)
- Ctrl+F 光标向下移动一个屏幕
- Ctrl+U 光标向上移动数行(约12行)
- $ 移动到行尾
- nG 移动到第n行(n为行数,未指定则跳到文件最后一行)
- L 移动到屏幕最下一行
- ^ 移动到该行第一个非空格字符
2. 常用档案命令
- Ctrl+G 显示档案信息——例如:
file_name: unmodified : line 1 of 380 [0%] - Ctrl+L 重画屏幕
- Ctrl+Z 暂停编辑,回到shell,执行
fg可返回编辑画面 - Ctrl+^ 切换到最近编辑的档案(配合
vi file_name file_name2可在两个文件间切换)
3. 常用编辑命令
输入:
- I 移动到行首第一个字符并开始接受输入
复制:
- Y 或 yy 复制该行到暂存区
删除:
- D 或 dd 删除光标当前位置到行尾的所有字符
- x 删除光标所在位置的一个字符
取代:
!shell命令以shell命令的执行结果替换光标所在行。例如!panda,会用“bash: panda: command not found”替换该行内容。- r 按r后接着按某字符,替换光标所在字符
- ~ 切换光标所在字符的大小写
重复:
- n 重复上一次搜寻(例如先执行
/BSD,再按n等同于再次执行/BSD)。若之前未搜寻,会显示“No previous search pattern.”
复原:
- U 恢复当前行到光标最初接触时的状态
- u 撤销前一个动作的效果
其它:
- : 执行ex命令
- J 将下一行与当前行合并
