在日常的终端操作里,敲下冒号 (:) 之后进入的那一行,往往被新人误认为是“命令行”,实际上它是 vi 的底行模式(Last line mode),专门用来接受编辑器级指令。底行模式并不直接编辑文本,而是提供文件保存、退出、搜索、宏定义等元操作的入口。
底行模式只能在 命令模式(即普通的光标移动状态)下通过敲击 : 键激活。此时屏幕最底部出现 : 提示符,光标随即切换到 单行命令缓冲区,用户输入完毕后敲回车,vi 会解析并执行相应指令,然后自动回到命令模式。
:w 保存当前缓冲区,等价于 “write”。:q 退出编辑器,如果文件未修改则直接退出。:wq 保存并退出,最常用的“一举两得”。:q! 强制退出,放弃未保存的改动。:/pattern 向下搜索 pattern,配合 n、N 可循环定位。:set nu 在左侧显示行号,调试脚本时尤为便利。:!cmd 在 vi 环境中直接调用外部 shell 命令,例如 :!date。假设你正编辑系统的 /etc/hosts,不小心把一行关键的 127.0.0.1 localhost 删除了。切回命令模式,敲 : 进入底行,输入 :e /etc/hosts 重新加载文件,然后 :set nu 打开行号,定位到第 42 行,紧接着 :42s/^/127.0.0.1 localhost 完成替换,最后 :wq 保存退出。整个过程只用了三次底行交互,却解决了潜在的网络故障。
值得注意的是,底行模式本身不区分大小写,但大多数指令遵循小写约定;而在脚本化批量编辑时,常配合 ex 或 vim -es 的非交互模式,实现“无屏幕”自动化。
参与讨论
:set nu这个真好用,写脚本不带它浑身难受
那如果按了:但是输错命令能撤回吗?
底行模式敲冒号进去,一直以为是命令行hhh
之前误删配置文件全靠:e重新加载救回来,一模一样
:!cmd还能这么玩?学到了(不是)
这玩意儿看着简单,新手根本不知道冒号是入口