1. 项目概述:为什么在Ubuntu时代,我们依然要谈Vi?
如果你刚接触Ubuntu或者任何Linux发行版,打开终端,想编辑一个配置文件,比如网络设置或者SSH密钥,你很可能会遇到一个叫vi或vim的编辑器。它的界面可能让你瞬间愣住:没有菜单,没有鼠标指针,甚至一开始连打字都打不了。你可能会想,这都什么年代了,图形界面的编辑器那么多,为什么还要用这个看起来“古老”的东西?这正是我想和你聊的起点。
Vi编辑器,诞生于1976年,它的直系后代Vim(Vi IMproved)至今仍是程序员和系统管理员手中最锋利的武器之一。在Ubuntu服务器环境、通过SSH远程连接、或者在任何只有命令行界面的场景下,Vi/Vim几乎是唯一可靠且高效的文本编辑选择。它不依赖图形界面,启动速度极快,资源占用极小,更重要的是,一旦你掌握了它的操作逻辑,编辑文本的效率会呈指数级提升。这就像手动挡汽车,一开始上手难,但熟练后,人车合一的感觉是自动挡无法比拟的。理解Vi的基本操作,不是怀旧,而是掌握一项在Linux世界里生存和高效工作的核心技能。无论你是运维工程师、后端开发者,还是仅仅想更深入地管理自己的Ubuntu系统,这篇文章都将带你从“一脸懵”到“基本够用”,让你在面对vi时不再发怵。
2. Vi编辑器核心概念与模式解析
要驾驭Vi,首先必须理解它最独特也最让新手困惑的设计哲学:模式编辑。这与我们熟悉的记事本、VS Code等“无模式”编辑器有本质区别。
2.1 理解Vi的三种基本模式
Vi的操作围绕三种核心模式展开,就像汽车有不同的档位(P档、D档、R档),每种模式下的键盘输入代表完全不同的含义。
普通模式 (Normal Mode):这是Vi启动后的默认模式,也是命令的“指挥中心”。在这个模式下,你不能直接输入文本,键盘上的每个字母、数字、符号都变成了编辑命令。例如,按
j是向下移动一行,按x是删除光标下的字符,按dd是删除整行。许多新手卡住的第一步就是试图在普通模式下打字,却发现打出来的都是乱码或执行了奇怪的操作。记住,普通模式是用于导航和执行命令的。插入模式 (Insert Mode):这个模式才和我们熟悉的编辑器行为一致。在此模式下,你可以自由地输入、删除文本。从普通模式进入插入模式有多种方式,最常用的是按
i(在光标前插入)或a(在光标后插入)。进入插入模式后,屏幕底部通常会显示-- INSERT --的提示。编辑完成后,你需要按Esc键退回到普通模式,才能执行保存、退出等操作。命令行模式 (Command-line Mode):在普通模式下,输入冒号
:即可进入此模式。此时光标会跳转到屏幕底部,等待你输入扩展命令。这是你执行文件操作(保存、退出)、搜索替换、设置编辑器选项的地方。例如,输入:wq并回车表示保存并退出。
注意:模式切换是Vi操作的基础。一个常见的操作流是:启动Vi(普通模式) -> 按
i进入插入模式 -> 编辑文本 -> 按Esc退回普通模式 -> 输入:wq进入命令行模式执行保存退出。务必时刻清楚自己处于哪种模式,这是避免操作混乱的关键。
2.2 Vi与Vim:你用的到底是哪一个?
在Ubuntu中,当你输入vi命令时,你很可能实际启动的是vim。这是因为Ubuntu通过一个叫vim-tiny或vim.basic的包,将vi命令符号链接到了vim。你可以通过终端命令ls -l $(which vi)来验证,通常会看到类似/usr/bin/vi -> /etc/alternatives/vi -> /usr/bin/vim.tiny的链接。
Vim是Vi的增强版,它完全兼容Vi的所有命令,并增加了语法高亮、多级撤销、多窗口、插件系统等大量现代功能。对于初学者,可以暂时将两者视为等同。但如果你发现你的vi不支持方向键或语法高亮,可以安装完整版的Vim:sudo apt update && sudo apt install vim。安装后,vi命令会指向功能更全的Vim。
3. 从启动到退出:Vi完整工作流实操
让我们从一个完整的编辑会话开始,串联起最基本的命令。假设我们要编辑一个名为test.txt的新文件。
3.1 启动与文件操作
在终端中,输入vi test.txt。如果文件已存在,Vi会打开它;如果不存在,Vi会创建一个以该文件名命名的新缓冲区,只有在保存时才会真正创建文件。
启动后,你处于普通模式。屏幕可能会显示文件内容(如果存在),或者是一片空白,底部显示文件名和状态(如"test.txt" [新文件])。
核心文件操作命令(在命令行模式下输入):
:w:保存文件。如果是新文件,需要指定文件名,如:w test.txt。:q:退出Vi。如果文件有未保存的修改,Vi会拒绝退出并报错。:q!:强制退出,丢弃所有未保存的修改。这是一个“后悔药”命令,慎用但关键时刻能救命。:wq或:x:保存并退出。这是最常用的结束编辑的方式。:w [新文件名]:将当前内容另存为一个新文件。:e [文件名]:在当前Vi会话中打开另一个文件进行编辑。
3.2 基础导航与文本插入
在普通模式下,你不能用鼠标点击定位,必须依靠键盘。
基础光标移动(普通模式下):
h:左移j:下移k:上移l:右移 (这四个键在键盘上相邻,是Vi设计的精髓之一)0(数字零):移动到行首。$:移动到行尾。gg:移动到文件第一行。G:移动到文件最后一行。[行号]G:移动到指定行,例如50G跳到第50行。
进入插入模式(从普通模式触发):
i:在光标前插入。a:在光标后插入。I(大写i):在当前行首插入。A:在当前行尾插入。o:在当前行下方新建一行并进入插入模式。O(大写o):在当前行上方新建一行并进入插入模式。
实操示例:
- 打开
vi test.txt。 - 按
i进入插入模式,输入 “Hello, World!”。 - 按
Esc退回普通模式。 - 按
o,会在下一行新建空行并进入插入模式,输入第二行文字。 - 再次按
Esc退回普通模式。 - 输入
:wq保存并退出。
4. 文本编辑核心命令详解
掌握了移动和插入,下一步就是高效的删除、复制、粘贴和修改。这些操作都在普通模式下完成,并且可以和数字结合,实现批量操作。
4.1 删除、复制与粘贴
删除操作:
x:删除光标下的单个字符。dw:删除从光标位置到一个单词结尾(包括空格)。d$或D:删除从光标位置到行尾。dd:删除整行。这是最常用的删除命令之一。[数字]dd:删除从当前行开始的指定行数。例如3dd删除当前行及后续两行,共三行。
复制(在Vi中称为“拉取”,yank)与粘贴:
yy:复制当前整行。[数字]yy:复制从当前行开始的指定行数。yw:复制从光标位置到单词结尾。p(小写):将复制或删除的内容粘贴到光标后(行内容粘贴到下一行)。P(大写):将内容粘贴到光标前(行内容粘贴到上一行)。
实操心得:Vi的删除命令(如
dd,dw)实际上是把内容剪贴到了匿名寄存器。所以,你刚删除(dd)一行后,可以立刻移动光标到别处,按p把它粘贴出来,实现剪切移动的效果。这是Vi高效编辑的一个典型体现。
4.2 撤销、重做与查找替换
撤销与重做:
u:撤销上一次操作。可以连续按u进行多次撤销。Ctrl + r:重做,即撤销刚才的撤销操作。
查找:
/关键词:在普通模式下,输入/后跟要查找的字符串,按回车。Vi会高亮所有匹配项。n:查找下一个匹配项。N:查找上一个匹配项。
替换(在命令行模式下):这是Vi非常强大的功能。
:s/旧文本/新文本:替换当前行中第一个匹配的“旧文本”为“新文本”。:s/旧文本/新文本/g:替换当前行中所有匹配的“旧文本”。:%s/旧文本/新文本/g:替换整个文件中所有匹配的“旧文本”。%代表整个文件范围。:%s/旧文本/新文本/gc:替换整个文件中的所有匹配项,但每次替换前请求确认。这是最安全的方式,Vi会提示y/n/a/q/l(是/否/全部/退出/替换当前并停止)供你选择。
示例:将文件中所有的“foo”替换为“bar”,并逐一确认:
:%s/foo/bar/gc5. 高效编辑进阶技巧与配置
当你熟悉了基本命令后,一些进阶技巧能让你如虎添翼。
5.1 组合命令与数字前缀
Vi命令的强大之处在于可组合性和可重复性。
- 命令 + 动作:
d(删除)、c(修改)、y(复制)等命令可以后接一个动作指令。d2w:删除两个单词。c$:删除从光标到行尾的内容并进入插入模式(相当于清空行尾重写)。yG:复制从当前行到文件末尾的所有内容。
- 数字前缀:几乎所有命令都可以用数字修饰。
5j:向下移动5行。10dd:删除10行。3p:将粘贴的内容重复粘贴3次。
5.2 可视模式与块操作
可视模式允许你像在图形界面一样,用键盘“选中”文本块。
v(小写):进入字符可视模式,以字符为单位选择。V(大写):进入行可视模式,以整行为单位选择。Ctrl+v:进入块可视模式(列模式),可以选中一个矩形文本块,这在编辑表格或代码时特别有用。
进入可视模式并选中文本后,你可以按d删除、y复制,然后移动光标到目的地按p粘贴。
5.3 基础Vim配置(~/.vimrc)
为了让Vim更好用,可以创建用户配置文件~/.vimrc。以下是一些对新手极其友好的配置:
" 开启语法高亮 syntax on " 显示行号 set number " 高亮显示当前行 set cursorline " 将Tab键和缩进设置为4个空格(对开发者很重要) set tabstop=4 set shiftwidth=4 set expandtab " 在输入括号时光标会短暂跳转到匹配的括号处 set showmatch " 搜索时实时高亮匹配结果 set incsearch set hlsearch " 退格键可以删除缩进、行首、插入前的字符 set backspace=indent,eol,start你可以用Vi本身来编辑这个文件:vi ~/.vimrc,将上述内容粘贴进去,然后:wq保存。下次启动Vim时就会生效。
6. 常见问题与排错实录
在实际操作中,你一定会遇到下面这些问题。别担心,它们都有标准的“逃生通道”。
6.1 模式混乱与“卡住”怎么办?
症状:屏幕乱码,输入无反应,或者感觉命令不对。诊断与解决:
- 首先,连续按几次
Esc键。这能确保你100%回到普通模式。这是解决大多数Vi诡异问题的第一步。 - 如果你不确定在什么模式,按
Esc后,再输入一个简单的移动命令,比如j或h,看光标是否能移动。如果能,说明已回到普通模式。
6.2 如何退出Vi?(尤其是修改后)
这是最经典的新手问题。记住这个决策流程:
- 想保存并退出:
Esc(确保普通模式) ->:wq-> 回车。 - 想放弃所有修改并强制退出:
Esc->:q!-> 回车。 - 如果文件只读,但你想保存修改(需要权限):
Esc->:w !sudo tee %-> 输入密码 ->:q!。这是一个进阶技巧,意思是用sudo权限将当前缓冲区内容写入文件。
6.3 误操作了如何恢复?
- 小范围误删/误改:立即按
u撤销。 - 大范围误操作:如果你执行了一个错误的替换命令(如
:%s/foo/bar/g),立即按u可以撤销整个替换操作。 - 粘贴后格式错乱:有时粘贴代码会缩进混乱。可以在粘贴前先设置粘贴模式:
:set paste,粘贴完成后再:set nopaste关闭。更现代的做法是在~/.vimrc中设置,让Vim自动处理。
6.4 常见错误提示与含义
E37: No write since last change (add ! to override)- 原因:文件已被修改,但你想用
:q退出。 - 解决:用
:wq保存退出,或用:q!放弃修改强制退出。
- 原因:文件已被修改,但你想用
E212: Can‘t open file for writing- 原因:没有文件写入权限(如编辑
/etc/下的系统文件)。 - 解决:用
sudo vi filename以管理员权限打开文件。
- 原因:没有文件写入权限(如编辑
E325: ATTENTION- 原因:发现交换文件(
.swp文件),意味着上次编辑可能异常退出(如终端崩溃)。 - 解决:Vi会给出选项:(R)ecover恢复,(D)elete it删除交换文件,(Q)uit退出,(A)bort中止。通常,如果你想恢复上次的内容选
R,如果确定不需要则选D删除交换文件后正常编辑。
- 原因:发现交换文件(
我个人在实际操作中的体会是,学习Vi就像学习一门乐器或一门新的运动,初期必然有肌肉记忆的痛苦期。最好的方法不是死记硬背所有命令,而是每天用Vi去做一件小事,比如写个简单的待办列表、修改一个配置文件。从i、Esc、:wq这个最小循环开始,遇到需求(比如想删除一行)再去查命令(dd)。几周之后,这些操作就会变成你的本能反应,你会发现命令行下的文本编辑变得前所未有的流畅和高效。最后分享一个小技巧:在终端里输入vimtutor并回车,这是Vim自带的一个交互式教程,花30分钟跟着做一遍,比读任何文章都管用。