☰
Linux终端编辑器nano、vi和Vim:从入门到实战对比
2026/10/1 3:29:11 网站建设 项目流程

1. 三个终端编辑器:nano、Vi 和 Vim,到底该学哪个

先说个很多新手都经历过的场景:好不容易通过 SSH 登上一台 Linux 服务器,想改一下 Nginx 的配置文件,输入vi /etc/nginx/nginx.conf,文件是打开了,但敲键盘没反应,想退出不知道怎么退,最终只能直接关闭终端窗口。这不是你笨,而是没有人告诉过你这套编辑器的基本逻辑。

在 Linux 世界里,nano、Vi、Vim 这三个名字会反复出现在各种教程里,它们都是终端界面下的文本编辑器,但设计思路和使用难度完全不同。简单说:nano 是一个面向新手的“傻瓜级”编辑器,打开就能用,底部直接显示快捷键;vi 是 1976 年诞生、几乎所有 Unix/Linux 系统都内置的经典编辑器;Vim 则是 vi 的增强版,可以把它理解成“vi Pro”,加入了语法高亮、多级撤销、插件系统等现代功能,也是目前绝大多数开发者、运维工程师实际使用最多的那个。

有人可能会问:现在有 VS Code、有 Sublime Text,还有必要学终端编辑器吗?答案是:非常有必要。Linux 服务器通常没有图形界面,所有配置文件的修改都依赖终端编辑器;而且很多容器镜像里只装了最小系统,可能没有 nano、没有 Vim,但一定有 vi。学会这些编辑器,尤其是 vi/Vim,是你能在命令行环境下独立存活的基本功。

这篇文章适合的场景包括:刚接触 Linux 想搞懂三种编辑器的区别、在服务器上改配置不知道怎么保存退出、看教程时被:wq和ZZ搞懵、以及想系统掌握 Vim 基础操作的读者。我会把每个命令背后的逻辑讲清楚,而不是只给你一串快捷键表,这样才能真正记住、会用。

在往下读之前,建议你先打开终端执行一下下面几条命令,确认自己系统里都装了哪些编辑器:

which nano vi vim ls -l /usr/bin/vi

which会显示可执行文件的位置,如果某个编辑器没安装,这里不会有输出。第二条命令是为了看vi是不是一个指向vim的软链接,很多发行版为了兼容性会把vi指向vim,这会直接影响你的操作体验,后面会详细说。

2. nano:上手成本最低的编辑器

2.1 文件的打开、编辑与保存退出

nano 的设计哲学和 vi/Vim 完全不同。vi 把“编辑模式”和“命令模式”分开,你需要记住按什么键进入编辑状态;而 nano 不管你用什么模式,打开就能直接打字。

nano /tmp/test.txt

回车之后你会发现,整个界面就是一个全屏编辑区域,底部两行固定显示着常用操作的快捷键提示。这个设计对新手极其友好,你不需要背任何东西,看提示就能完成基本操作。

  • Ctrl + O:保存文件,会询问文件名,回车确认
  • Ctrl + X:退出编辑器
  • Ctrl + K:剪切当前行
  • Ctrl + U:粘贴,也可以用来取消上一次剪切操作
  • Ctrl + W:查找文本
  • Ctrl + \:替换文本
  • Ctrl + G:查看完整帮助

如果你只是临时改一个配置文件,比如修改一下主机名、或者改一下 crontab 任务,nano 往往比 Vim 更高效,因为它几乎没有学习曲线。保存退出的组合就是Ctrl + O再回车,然后Ctrl + X,整个过程几秒钟。

实际操作中有一个细节要提醒:在 nano 里Ctrl + X之后再按y或n选择是否保存,最后回车确认文件名。如果你刚才已经用Ctrl + O保存过,这里直接按n退出就行,不会丢失内容。

2.2 从基本操作到常用技巧

nano 有几个快捷键在平时编辑中非常实用,但因为界面底部没有显示完整,很多人不知道:

  • Alt + U:撤销上一步操作(不同发行版的 nano 版本可能略有差异,新版是Alt + U,老版本可能是Alt + U或Ctrl + _配合操作)
  • Alt + E:重做
  • Alt + A:开始标记选择区域,然后配合方向键选中文本,用Alt + 6复制,用Ctrl + K剪切
  • Alt + G:跳转到指定行,报错排查时特别有用,比如 Nginx 提示第 45 行配置有误,直接跳过去改

使用nano -l /tmp/test.txt打开文件可以显示行号。如果你希望每次打开 nano 都默认显示行号,可以在配置文件里加一行set linenumbers。

nano 还支持同时打开多个文件进行切换,用nano file1.txt file2.txt打开,然后按Alt + >和Alt + <在文件之间切换。这个功能适合快速对比两个配置文件,但说实话,真正要对比文件时用 vimdiff 或者 diff 命令更专业,后面会讲。

2.3 nano 的个性化配置与语法高亮

nano 的配置文件位于两个位置:系统级配置/etc/nanorc,用户级配置~/.nanorc。后者优先于前者,如果你想调整 nano 的默认行为,通常只需要创建或编辑~/.nanorc文件即可。

举个实际的例子。默认情况下 nano 会开启自动换行,长行文本会自动折行到下一行显示。这个行为在编辑配置文件时很烦人,因为你看到的每一行不一定是文件里的真实逻辑行。改成不自动换行,编辑起来更清爽:

set nowrap

再比如你习惯用 4 个空格代替 Tab 键,可以配置:

set tabsize 4 set tabstospaces

关于语法高亮,nano 其实一直都有这个能力。打开一个 Python 或 Shell 脚本,如果发现没有颜色,通常是语法定义文件没有被加载。系统一般会自带一组语法文件,放在/usr/share/nano/目录下,你只需要在配置文件里 include 进去:

include /usr/share/nano/*.nanorc

如果你的系统目录结构不一样,可以用find /usr/share -name "*.nanorc"找一下真实路径。配置完成后重新打开 nano,代码文件就会有高亮效果了。不过要说句实话,nano 的语法高亮只支持基础的关键字配色,跟 Vim 的完整高亮体系还有差距,所以如果你要长期在终端里写代码,最终还是得转到 Vim。

2.4 我的建议:什么场景下优先用 nano

我个人的习惯是:在服务器上做小改动时优先用 nano。比如说修改/etc/hosts、临时编辑一个 systemd service 文件、快速追加几行 cron 任务,这些场景 nana 足够,而且不会因为模式切换导致误操作。但对于稍微复杂一点的操作,比如大范围替换、多文件编辑、需要精细控制格式的代码文件,我就会用 Vim。

另外要提醒的是,nano 在部分最小化安装的 Linux 系统里可能没有预装。如果执行which nano没有结果,可以用包管理器安装,Debian/Ubuntu 系是apt install nano,CentOS/RHEL 系是yum install nano或dnf install nano。

3. Vi:所有 Linux 系统的共同语言

3.1 理解 Vi 有“模式”这件事

vi 是由 Bill Joy 在 1976 年为 BSD Unix 开发的编辑器,它的前身是 ex 行编辑器,所以保留了行编辑时代的一些习惯,最终形成了“模式”这一核心设计。很多人被 vi 劝退,就是因为不明白为什么打开文件后打字没有反应。

vi 的模式分成三种:

  • 命令模式(Normal Mode):启动 vi 后默认所在模式。此模式下你敲键盘不会输入文本,而是执行各种编辑命令,比如删除、复制、移动光标
  • 插入模式(Insert Mode):按i进入,此时可以正常输入文字,按Esc返回命令模式
  • 末行模式(Last Line Mode):在命令模式下按:进入,用于执行保存、退出、查找替换等命令

理解模式是掌握 vi 的第一步。本质上它做的是:让编辑操作不用频繁依赖快捷键组合,而是把“操作意图”直接映射为按键。比如删除一行,在命令模式按dd就能实现,而不需要像普通编辑器那样选中、删除、再确认。

我刚接触时也觉得很反直觉,但用久了才明白,一旦你熟悉了这种模式,手完全不需要离开键盘去点鼠标,效率是真的高。

3.2 进入、编辑、退出的核心流程

打开文件:

vi /path/to/file

进入后默认是命令模式。要开始打字,按i键进入插入模式,此时屏幕左下角会出现-- INSERT --的提示(有些发行版会显示-- 插入 --)。

编辑完成后,按Esc回到命令模式,然后输入:wq保存并退出。这套流程是每个 Linux 使用者必须刻进肌肉记忆的:

  • :w:保存文件
  • :q:退出编辑器
  • :wq:保存并退出
  • :q!:不保存强制退出

如果当前文件是只读的或者权限不够,保存时可能会提示readonly option is set,此时可以用:wq!强制保存退出,前提是你对文件有写权限。如果没有写权限,直接退出后用sudo vi重新打开,不要强行!,这在某些只读挂载的文件系统上并没有用,还可能造成误解。

很多新手会问:为什么我退不出去?大概率是你还在插入模式,Esc 按过了,但输入的命令被当成文本输进去了。解决办法是:先按Esc,然后按u撤销刚才的误输入,再重新输入:q!。

3.3 命令模式下必须掌握的移动与编辑命令

vi 的命令模式里,移动光标有几种方式:

  • 方向键移动:如果你的终端支持,方向键可以直接用。但在老式的 vi 或某些终端里方向键会变成 ABC 字符,所以最好也掌握 h(左)、j(下)、k(上)、l(右)
  • 0:跳到行首,$跳到行尾
  • w:按单词向后跳,b:按单词向前跳
  • gg:跳到文件第一行,G:跳到文件最后一行
  • Ctrl + f:向下翻页,Ctrl + b:向上翻页
  • :行号:跳转到指定行

删除操作:

  • x:删除光标所在字符
  • dw:删除一个单词
  • dd:删除当前行
  • d$:从光标处删除到行尾
  • ndd:删除从当前行开始的 n 行

复制粘贴:

  • yy:复制当前行
  • nyy:复制从当前行开始的 n 行
  • p:粘贴到光标下方或后面
  • P:粘贴到光标上方或前面

撤销重做:

  • u:撤销上一步操作
  • Ctrl + r:重做

这些操作看起来很多,但如果你只记住 10 个,就已经能覆盖日常 70% 的使用场景了。我个人建议优先掌握:i、Esc、dd、yy、p、u、/、:wq、:q!、G,这 10 个操作足够你处理服务器上绝大部分配置修改任务。

3.4 查找与替换的完整命令

在命令模式下按/开始查找:

/nginx

输入要找的文本后回车,光标会跳到第一个匹配位置,按n跳到下一个匹配,按N跳到上一个。查找是大小写敏感的,如果你希望忽略大小写,可以在查找命令后加\c,比如/nginx\c,或者在末行模式执行:set ignorecase临时开启。

替换操作是新手比较容易写错的地方,我用一张表来说明常用的替换语法:

命令作用说明
:s/old/new替换当前行第一个匹配只在当前行生效
:s/old/new/g替换当前行所有匹配g 表示全局
:%s/old/new/g替换全文件所有匹配% 表示整个文件
:%s/old/new/gc替换前逐处确认c 表示 confirm
:3,10s/old/new/g替换第 3 到第 10 行指定行范围

%这个符号在 vi 里有特殊含义,代表整个文件,使用频率很高。替换时如果文本中包含/,比如要替换的路径是/usr/bin,需要把分隔符换成其他符号,例如:%s#/usr/bin#/opt/bin#g,用#作为分隔符,这样免去了大量转义。

3.5 实战:用 vi 创建一个新用户

这个例子我在带新人时几乎每次都会用到,因为完整的操作链条能验证你对 vi 的掌握程度。假设现在需要创建一个用户ops,并且允许它使用 sudo 命令。

传统方式是用 useradd:

sudo useradd -m -s /bin/bash ops sudo passwd ops

但如果系统比较特殊,或者你想了解用户信息的底层存储机制,用 vi 直接查看和修改相关文件会更有感觉。

先查看现有的用户信息:

tail -5 /etc/passwd vi /etc/passwd

把光标移到文件末尾,按o在下方新建一行(这个操作等于在插入模式编辑),输入:

ops:x:1001:1001::/home/ops:/bin/bash

按Esc回到命令模式,输入:wq保存退出。但这里要注意,直接改/etc/passwd只是创建了用户的基本信息,用户密码在/etc/shadow里,还需要处理。如果只是练习,建议先执行useradd生成标准结构,再用 vi 去检查/etc/passwd、/etc/group、/etc/shadow这三个文件的对应关系,理解系统是怎么记录用户的。

要给你将来用 sudo,还需要执行sudo visudo,这个命令会打开 sudoers 配置文件(默认编辑器通常是 vi),在里面找到 root 那行,仿照添加:

ops ALL=(ALL:ALL) ALL

visudo在保存时会自动检查语法,如果写错了会提示,这是系统给我们的安全保护,一定不要绕过它直接去编辑/etc/sudoers。

4. Vim:真正把编辑器变成生产力的工具

4.1 Vim 比 Vi 强在哪里

Vim 是“Vi IMproved”的缩写,由 Bram Moolenaar 在 1991 年发布。它完全兼容 vi 的所有操作,同时增加了很多现代编辑器应有的能力。理解 Vim 和 Vi 的关系,可以类比成 iPhone 和诺基亚手机的关系——电话功能都在,但体验不在一个量级。

Vim 主要的增强包括:

  • 多级撤销,vi 只能撤销一步,Vim 可以无限撤销重做
  • 语法高亮,打开代码文件自动着色,阅读和排错效率高很多
  • 可视化模式,按v进入,可以用方向键选中文本块,然后执行删除、复制、缩进等操作
  • 窗口分屏,可以同时查看和编辑多个文件
  • 寄存器,可以保存多段文本,随时粘贴不同内容
  • 插件系统,从自动补全到文件树,都能扩展
  • 智能化缩进、代码折叠、宏录制等进阶功能

正因为有这些增强,Vim 才从“应急用的编辑器”变成了“能长期编程的 IDE 类工具”。

4.2 从零配置一个舒适的 .vimrc

Vim 的默认配置非常朴素,几乎没开任何增强选项。第一次打开 Vim 编辑代码时你会觉得它就是个高级 vi,因为连行号都没有。所以拿到 Vim 的第一件事,就是创建一个用户级配置文件~/.vimrc。这个文件里的配置会在 Vim 启动时自动加载,对当前用户全局生效。

下面这份配置是我在新环境上会优先写入的最小集,兼顾了可读性和日常使用体验:

set number " 显示行号 set relativenumber " 相对行号,方便跳转 syntax on " 开启语法高亮 set tabstop=4 " Tab 显示为 4 个空格宽度 set shiftwidth=4 " 自动缩进 4 个空格 set expandtab " 用空格代替 Tab set autoindent " 继承上一行缩进 set smartindent " 智能缩进 set hlsearch " 搜索结果高亮 set incsearch " 边输入边搜索 set ignorecase " 搜索忽略大小写 set nowrap " 默认不折行 set cursorline " 高亮当前行 set encoding=utf-8 " 文件编码 UTF-8 set history=1000 " 保存 1000 条命令历史

如果系统里的 Vim 不支持这些选项,可能是安装的是 vim-tiny 版,可以安装完整版:apt install vim或yum install vim-enhanced。

配置之后重启 Vim,或者直接在 Vim 里执行:source ~/.vimrc让配置立即生效。以后想调整配置,即使正在编辑文件,执行:source也不需要退出重开,这个命令在调试 Vim 配置时非常常用,省去反复开关文件的麻烦。

4.3 语法高亮与 set ft 的底层逻辑

当你第一次用 Vim 打开一个 Python 文件,发现代码变成了彩色的,这就是syntax on的效果。Vim 并不是靠文件后缀名硬判断语言类型的,而是内部有一套文件类型检测机制。你可以用:set ft查看当前文件的类型,比如 Python 文件会显示filetype=python。

如果 Vim 自动识别错了,或者你想强制某类文件使用另一种高亮规则,可以手动设置:

:set ft=python

这个命令会立即生效,语法高亮会切换成 Python 的规则。某些特殊场景下这个命令非常有用,比如你有一个扩展名.conf的文件,里面其实是 Nginx 配置,Vim 默认可能识别为空白类型,你可以在文件第一行写:

# vim: set ft=nginx:

或者直接在~/.vimrc里做映射:

autocmd BufRead,BufNewFile /etc/nginx/* set ft=nginx

这样以后打开/etc/nginx/目录下的所有文件,Vim 都会自动套用 nginx 的高亮规则。理解ft是理解 Vim 文件类型体系的一把钥匙,很多插件也是通过识别ft来决定是否加载的。

4.4 自动补全:从内置方案到插件方案

Vim 自带一套基础补全功能,不需要装任何插件就能用,只是大部分新手不知道。

在插入模式下,按Ctrl + n或Ctrl + p会自动弹出一个补全列表,候选词来自当前文件、打开的缓冲区以及字典文件。按下键选择,回车确认。这个功能对于补全变量名、函数名已经足够用。

如果你需要更智能的补全,比如 Python 的模块导入、函数签名提示,那就需要插件了。最常用的插件管理方式是 vim-plug。先安装它:

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

然后在~/.vimrc里声明插件:

call plug#begin('~/.vim/plugged') Plug 'neoclide/coc.nvim', {'branch': 'release'} call plug#end()

保存退出后,重新打开 Vim,执行:PlugInstall等待安装完成。coc.nvim 是一个基于 Node.js 的补全框架,安装后还需要在 Vim 里执行:CocInstall coc-python等语言支持包。需要提醒的是,coc.nvim 依赖 Node.js 环境,如果服务器是内网离线环境,这套方案就很麻烦。更轻量的替代方案是安装 YouCompleteMe,但它的编译过程更折腾。

我个人在服务器环境里的建议是:能用内置补全就用内置补全,Ctrl + n配合标签文件和字典已经能满足大部分配置文件编辑场景。不是每台服务器都需要被改造成 IDE,Vim 插件是用来提升效率的,不要为了折腾而折腾。

4.5 Vim 的安装与离线环境下的处理

绝大多数 Linux 发行版默认安装了最小版 Vim,但功能不完整。判断你装的是不是完整版,可以执行:

vim --version

查看输出里有没有+syntax、+python3、+clipboard这些特性标志,前面是-号的就没有开启。

如果确认需要安装完整版 Vim,在线环境下很简单:

# Debian/Ubuntu sudo apt update && sudo apt install vim # CentOS/RHEL sudo yum install vim-enhanced

对于内网隔离环境,可以在一台能上网的机器上使用apt download vim或者yumdownloader vim-enhanced把安装包下载下来,拷贝进去后用dpkg -i或rpm -ivh离线安装。如果依赖库缺失,可以先下载全部依赖包再统一安装,Debian 系可以用apt depends vim查看依赖列表。

还有一种方式是从 Vim 官网下载源码自行编译安装,适合需要特定编译选项的场景。编译步骤如下:

sudo apt install -y git make gcc libncurses5-dev libncursesw5-dev git clone https://github.com/vim/vim.git cd vim/src ./configure --enable-python3interp --with-features=huge make sudo make install

--with-features=huge可以编译一个特性最全的 Vim,--enable-python3interp让 Vim 支持 Python 3 接口,很多插件的运行都依赖这个特性。这里有一个选型经验:如果你只需要在服务器上改配置,系统自带的最小版 Vim 就够了;如果你是拿 Vim 当日常开发工具,建议用编译方式装一个特性全的版本,特别是笔记本电脑上用 Vim,体验差别巨大。

5. 实战演练:用编辑器完成一次真实的系统配置任务

5.1 场景一:修改 Nginx 配置并检查语法

假设要给 Nginx 添加一个新的 server 块,配置一个简单的反向代理。这个任务覆盖了 Vim 查找、复制、粘贴、插入和保存的完整链路。

# 备份原文件永远是第一步 sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak # 用 Vim 打开 sudo vim /etc/nginx/nginx.conf

打开文件后,执行/http查找 http 块的位置,按n跳到下一个匹配。在 http 块内找一个合适的 server 配置做参照,把光标移到那行上,按yy复制整行,然后移动到需要插入的位置按p粘贴。

接着做修改。把光标定位到 server_name 那行,按cw或者直接按i进入插入模式修改成实际域名,按Esc退出插入模式。如果新配置不是一个简单的复制,而是在一台新机器上从零添加,可以这样操作:

:set ft=nginx

先让语法高亮匹配 Nginx 的规则,然后按i进入插入模式,输入完整的 server 块内容。输入完成后按Esc,再按dd可以删除某行错误配置,按u可以撤销误操作。

保存前先做语法检查,不要直接:wq退出去发现 Nginx 起不来:

# 先在 Vim 内保存 :w # 然后在 Vim 末行模式执行外部命令,不需要退出 :!nginx -t

:!可以在 Vim 内执行任意 Shell 命令,nginx -t是 Nginx 自带的配置语法检查工具,返回syntax is ok之后再:wq退出,重启 Nginx:

sudo systemctl reload nginx

大多数配置文件服务都自带类似的验证命令,比如sshd -t、visudo -c,修改完先验证再退出,这是运维人员必须养成的习惯。

5.2 场景二:用 Vim 编辑 .bashrc 添加常用别名

为当前用户配置别名,让vi默认指向vim,再加几个高频命令的简写:

vim ~/.bashrc

在文件末尾用G跳到末尾,按o在最后新建一行,输入:

alias vi='vim' alias ll='ls -alF' alias la='ls -A' alias grep='grep --color=auto'

保存退出后,执行:

source ~/.bashrc

如果配置写错了,比如别名和已有命令冲突,终端会报错或者行为异常。排查时可以先用type ll看别名是否生效,再用alias命令查看所有当前别名。这里我踩过一次坑:给grep加--color=auto在交互式终端没问题,但在管道脚本里会影响输出格式,所以后来我改成了只在交互式 Shell 中定义,避免脚本执行时出现多余的转义序列。

5.3 场景三:用 vimdiff 对比两个文件的差异

改配置最怕改完不知道改了哪些地方,有时候改出问题想回滚,又不想直接拿备份文件覆盖。这时候 vimdiff 就派上了用场:

vimdiff /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

vimdiff 会用垂直分屏方式打开两个文件,左边是当前配置,右边是备份文件,差异部分会高亮显示。操作方式和普通 Vim 一样,但有几个专门命令:

  • ]c:跳到下一个差异处
  • [c:跳到上一个差异处
  • do:把差异从右侧文件复制到左侧文件
  • dp:把差异从左侧文件复制到右侧文件
  • :diffupdate:重新计算差异

对比完如果确认右侧备份是正确的,想把备份恢复成当前配置,可以在左侧文件里执行:w!强制保存,或者直接退出后用cp命令恢复。如果两侧差异上百处,直接在终端里看会眼花,这时候也可以先用:windo diffoff退出高亮,或者直接在 Vim 里用:split和:vertical split手动分屏查看。vimdiff 不仅适合配置对比,写代码时对比两个版本、查看合并冲突也非常好用,值得专门花时间熟悉。

6. 常见问题与排查技巧实录

6.1 编辑器问题速查表

把新手最容易踩的坑整理成一张速查表,建议直接收藏:

现象原因解决方案
Vim 里按方向键变成 A B C D终端进入兼容模式,或安装的是 vi 而不是 Vim:set nocompatible,或安装完整版 Vim
按 Ctrl+S 后终端完全卡住终端软件流控把输出暂停了(XOFF)按 Ctrl+Q 恢复输出
打开文件提示.swp已存在上次编辑异常退出,产生了交换文件用vim -r恢复数据,确认无误后删除.swp文件
保存时提示E212: Can't open file for writing当前用户没有文件写权限追加:w !sudo tee %用 sudo 写入
中文显示成乱码文件编码与终端编码不一致在配置里设置 UTF-8 编码,并调整终端字符集
输入:q报错No write since last change文件有改动但没有保存按:wq保存退出,或按:q!放弃修改
vi打开文件后方向键全是字母软链接指向的是老版 vi 或最小版 Vim安装 vim-enhanced / vim-nox,或直接使用/usr/bin/vim

6.2 误按 Ctrl+S 导致界面卡死的救法

这个问题在 Xshell、MobaXterm 这类终端软件里特别常见。Vim 界面看起来完全冻结,按键没有任何反应,很多人的第一反应是网络断了或者 SSH 卡住,其实只是因为终端软件的流控功能收到了Ctrl + S的字符,把输出暂时挂起。

处理方法很简单:按一下Ctrl + Q就能恢复。这个行为不是 Vim 的错误,也不是系统的 Bug,而是从串口时代继承下来的终端流控机制(XON/XOFF)。如果你根本不使用这个功能,可以在终端软件的设置里关闭“流控”选项,或者在~/.bashrc里加一行:

stty -ixon

-ixon表示禁用软件流控,之后Ctrl + S就只会当作普通按键传入终端,不会冻结界面了。

6.3 swap 交换文件产生的原理与清理

这是使用 Vim 时几乎必然会遇到的问题。如果 Vim 在编辑过程中遇到异常退出,比如 SSH 断开、系统重启、杀掉进程,磁盘上会留下一个交换文件,文件名是原文件名加.swp后缀。下次再用 Vim 打开同一个文件时,它会检测到这个交换文件的存在,并提示你:

Swap file ".nginx.conf.swp" already exists! [O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit

这里的选择逻辑是:如果刚才的内容很重要,先选R恢复数据,把之前的修改找回来。恢复之后可以用:w保存,再确认数据无误后,删除残留的交换文件:

rm /etc/nginx/.nginx.conf.swp

如果确认交换文件里没有需要的数据,可以直接选D删除。我见过有人一遇到这个提示就慌了,直接按q退出,结果改了半天没保存。记住:交换文件是你的救急机会,不要一上来就删。另外要养成的习惯是:编辑大型配置文件前先想一下会不会长时间挂机,如果会,考虑用 tmux 或 screen 保护会话,避免 SSH 断开导致异常退出。

6.4 文件权限不足时如何不退出强制写入

在 Vim 里编辑/etc/hosts、/etc/nginx/nginx.conf这些系统文件时,如果你忘了用sudo vim而直接用vim打开,编辑完保存时会遇到E212: Can't open file for writing错误。常规方案是退出后用sudo重新打开,但等于所有操作重来一遍。

实际上可以不退出 Vim,在末行模式执行:

:w !sudo tee %

这个命令的含义是:把当前缓冲区内容通过管道传给sudo tee命令,以 root 权限写入当前文件。%在 Vim 里代表当前文件名。执行后会要求你输入 sudo 密码,然后完成写入。这是一个非常实用的“后门”,我在忘了加 sudo 时经常用。需要注意,执行后 Vim 可能会提示文件已被修改,按一下回车回到正常状态即可,另外这个操作会改变文件的属主吗?不会,tee 写入时保留的是原文件的权限信息。但为了稳妥,写入后最好检查一下文件属主和权限是否正常。

6.5 中文乱码的根治思路

在 Linux 上改配置文件遇到中文乱码,大概率是编码不一致导致的。Vim 默认按encoding选项来解码文件,如果文件是 GBK 编码,而 Vim 按 UTF-8 解码,自然会乱。

在~/.vimrc里做三层编码设置,基本能覆盖绝大多数场景:

set encoding=utf-8 set termencoding=utf-8 set fileencodings=utf-8,gbk,gb2312,latin1

encoding是 Vim 内部使用的编码,termencoding是终端显示编码,fileencodings是 Vim 打开文件时自动检测的编码列表。配置之后,Vim 会按列表顺序尝试解码,UTF-8 不行就试 GBK,很大程度上避免乱码。如果你拿到一个现有文件已经是乱码,可以用:e ++enc=gbk强制按 GBK 重新加载。这个命令不会修改原文件,只会改变 Vim 显示文件的解码方式,非常安全。

解压后的文件名乱码是另一个常见问题,属于文件名编码问题,与 Vim 解码不完全一样,但思路类似。用unzip -O gbk或者convmv -f gbk -t utf-8可以转换文件名编码,避免解压后一堆乱码文件。碰到这类情况别急着砸键盘,先判断是哪一层编码出了问题。

6.6 怎么确认自己用的是 Vi 还是 Vim

很多发行版会把vi通过软链接默认指向vim,所以不是所有标注“vi”的命令都是老版 vi。判断方法:

vim --version | head -5

如果你执行vi --version也能输出相同的信息,说明系统里的 vi 就是 vim。如果提示找不到--version选项,则可能真的是老版 vi,此时应该安装 vim-enhanced 然后再继续。

这个区别很关键,因为 Vim 比 vi 多很多现代特性,比如方向键支持、语法高亮、撤销历史等。你在网上查到的很多命令在真正的 vi 里根本不生效,只有 Vim 才支持。所以如果你确认系统里只有老版 vi,建议先装 Vim,再学 Vim;如果隐患环境装不了,也要先明确“只能用 vi 能做什么”,再去操作,不要照搬教程里的 Vim 高级命令。

6.7 找不到编辑器或想换成别的编辑器

有时候执行vim提示command not found,这又是最小化系统的锅。在线环境下一句话解决:

sudo apt install -y vim # Debian/Ubuntu sudo yum install -y vim-enhanced # CentOS/RHEL

如果你只是想让某种文件默认用 nano 打开,不需要改全局编辑器,直接在 Vim 里临时调用 nano 是不行的。但可以用:!nano %在 Vim 里启动 nano 编辑当前文件,这有点像在编辑器里嵌套另一个编辑器,比较少见,但确实在极端情况下救过我:Vim 打不开某个特殊编码的文件时,先:q退出,改用 nano 撑一下。

7. 最后分享一点个人体会

很多人纠结该学 nano 还是 Vim,我的态度很简单:两个都要会,但定位不同。nano 是让你在 Linux 里“改个东西赶紧走”的快速方案,Vim 是让你长期在终端里“干活”的生产力工具,而 vi 是底线——哪怕系统再精简,它都在,能保命。

如果你现在刚开始学 Vim,我有一个建议:不要试图背完所有快捷键,那样压力太大。先学会i进入编辑、Esc回命令模式、:wq保存退出、dd删除行、u撤销,然后直接开始用。真正用起来以后,每遇到一个痛点,比如“怎么在文件里快速找到某个词”,再针对性学一个命令,这样积累起来的速度远比死记硬背快。

另外别忘了 Vim 自带入门教程——vimtutor。在终端输入vimtutor回车,它会用交互式的方式手把手带你操作。我第一次用的时候还有点半信半疑,花几个小时完全走完一遍之后,基础操作就基本不需要再看资料了。建议每个刚接触 Vim 的人,都把这份教程完整走一遍,比看十篇博客都有用。

最后再讲一个小技巧:如果你已经决定把 Vim 作为主力编辑器,直接把vi指向vim的软链接保留,再在~/.bashrc里加上export EDITOR=vim。因为很多程序的默认编辑器,比如 crontab 的crontab -e、Git 的git commit,都遵循环境变量EDITOR或VISUAL的设定,不设置的话,它们默认用 vi 打开的体验会比较素。配置好之后,所有依赖文本编辑的程序都会统一用 Vim,整个终端环境的体验会顺滑很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询