CentOS 7 中需用 update-alternatives 切换 vi 默认指向 vim-enhanced,并设置 EDITOR 环境变量,才能全局生效;仅装包或加 alias 无法覆盖 systemd、cron 等非交互场景。

CentOS 7 默认的 vi 命令通常指向 vim-minimal,功能受限;真正想用完整版 vim-enhanced(支持语法高亮、鼠标、缩进等),不能只靠“装了 vim 就完事”,必须明确覆盖系统级默认行为。关键不是装什么,而是让哪些命令、在哪些上下文里调用的是你想要的 vim。
确认当前 vi 指向哪个二进制文件
直接看 vi 命令实际执行的是谁:
ls -l $(which vi)
常见输出是 /usr/bin/vi -> /etc/alternatives/vi,再查:
ls -l /etc/alternatives/vi
如果最终指向 /usr/bin/vim.basic 或 /usr/bin/vim.tiny,说明还没切换到增强版。别急着改配置,先确保目标存在。
- 运行
yum list installed | grep vim,确认vim-enhanced已安装(没装就先yum install -y vim-enhanced) -
vim-enhanced安装后会注册/usr/bin/vim和/usr/bin/vim-enhanced两个可执行文件 - 如果只装了
vim-minimal,vim命令本身可能都不存在
用 update-alternatives 切换系统级 vi 和 editor
这是最干净、符合 CentOS/RHEL 规范的方式,影响所有用户和系统命令(比如 systemctl edit、crontab -e):
update-alternatives --config vi
如果提示 “no alternatives for vi”,说明 vim-enhanced 还没注册进去。手动注册:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
update-alternatives --install /usr/bin/vi vi /usr/bin/vim-enhanced 50
再运行 update-alternatives --config vi,选择编号即可。同理处理 editor:
update-alternatives --install /usr/bin/editor editor /usr/bin/vim-enhanced 50<br>update-alternatives --config editor
-
50是优先级,比nano(默认 40)或vim.tiny(默认 10)高,能自动胜出 - 修改后,
vi、vim、editor命令全部指向vim-enhanced - 不需要改
/etc/profile或 alias —— 那种方式只对交互式 bash 有效,对脚本、systemd、cron 等无效
EDITOR 环境变量只影响部分命令
像 git commit、sudo -e、visudo 这类工具依赖 $EDITOR,但不走 vi 别名。所以还得补上:
对当前用户永久生效,在 ~/.bashrc 末尾加:
echo 'export EDITOR=/usr/bin/vim' >> ~/.bashrc<br>source ~/.bashrc
对 root 用户也建议同样操作(/root/.bashrc),否则 visudo 还可能打开 nano。
- 别写成
export EDITOR=vim—— 没有路径,shell 可能找不到,尤其在非交互式环境里 -
/usr/bin/vim是vim-enhanced包提供的符号链接,比硬写/usr/bin/vim-enhanced更稳妥 - 这个变量不影响
vi命令本身,只影响显式读取$EDITOR的程序
别碰 /etc/profile 里的 alias vi=vim
网上很多教程教你在 /etc/profile 里加 alias vi=vim,这做法在 CentOS 7 上有明显缺陷:
- 只对登录 shell 生效,
systemctl edit xxx这类 systemd 命令不读/etc/profile - 如果写错成
>而不是>>,会清空整个/etc/profile,导致所有用户登录失败 - alias 是 shell 特性,
vi被脚本调用时(如#!/bin/sh)根本不会展开 alias - 它掩盖了真正的替代机制,后续排查
vi行为时反而更难定位
真正要改系统级默认,就用 update-alternatives;要兼容特定工具,就设 EDITOR。两者配合,才覆盖所有场景。

















