04.Vim 入门:从模式切换、文件保存到高效移动 04.Vim 入门从模式切换、文件保存到高效移动Vim 并不是“没有鼠标的记事本”而是一套以键盘命令为核心的文本编辑方式。初学者真正需要先掌握的不是几十个快捷键而是模式、命令结构和安全保存文件的方法。本文从第一次打开文件开始讲清 Vim 的工作模式、插入命令、保存退出、光标移动、交换文件及基础配置。一、Vim 是什么在 Linux 终端中编写 C 语言代码常见工具可以分成两类编辑器负责创建和修改源代码例如 Vim编译器负责把源代码转换成可执行程序例如 GCC。Vim 是 Vi Improved 的缩写可以理解为在经典vi编辑器基础上扩展而来的版本。它支持语法高亮、多级撤销、窗口拆分、补全、插件等功能同时保留了 Vi 最重要的“模式化编辑”思想。很多 Linux 系统都提供vi命令但它可能是精简版也可能是指向 Vim 的符号链接。可以分别查看vi--versionvim--versionUbuntu 中如果尚未安装 Vim可以执行sudoaptupdatesudoaptinstallvim安装完成后使用下面的命令确认版本vim--version|head二、打开、创建和定位文件1. 打开已有文件或创建新文件vimhelloworld.c如果helloworld.c已经存在Vim 会打开它如果文件不存在Vim 会打开一个以该名称命名的新缓冲区只有执行保存命令后新文件才真正写入磁盘。屏幕底部出现[New]或[新文件]时表示当前编辑的是尚未保存的新文件。不要把“Vim 已经显示了文件名”误认为文件已经创建成功。2. 打开后直接定位到指定行vim20 helloworld.c这条命令打开文件后把光标放到第 20 行。处理编译器报错时非常方便例如 GCC 提示错误位于main.c:37可以直接执行vim37 main.c也可以让光标直接定位到文件末尾vim helloworld.c还可以定位到第一个匹配指定内容的位置vim/main helloworld.c3. 只读打开文件查看重要配置而不希望误改时可以使用vim-R/etc/hosts-R表示只读模式。它主要用于防止误操作并不是文件权限控制如果确实拥有写权限仍可在 Vim 中强制写入因此编辑系统文件时依然要谨慎。三、先建立正确的“模式”概念普通编辑器中按下字母通常就是输入字母Vim 中同一个按键在不同模式下有不同含义。例如普通模式中的w表示向后移动一个单词插入模式中的w才会输入字符w。Vim 最常用的四种模式如下。模式主要用途常见进入方式常见离开方式普通模式 Normal移动、删除、复制、粘贴、执行编辑命令启动 Vim 后默认进入按Esc返回按i、v、:等进入其他模式插入模式 Insert像普通编辑器一样输入文字i、a、o、I、A、OEsc或Ctrl[可视模式 Visual选择字符、整行或矩形文本v、V、CtrlvEsc命令行模式 Command-line保存、退出、替换、设置选项在普通模式中按:、/或?执行后通常自动返回也可按Esc取消有些教程把普通模式称为“命令模式”把命令行模式称为“末行模式”。名称不同但关键是分清两件事普通模式中直接按dd、yy、G等按键保存退出等命令通常先按:命令出现在屏幕底部。当不知道自己处于什么状态时先按一两次Esc回到普通模式。这是学习 Vim 时最可靠的“复位动作”。四、完成第一次编辑打开一个 C 源文件vimhello.c此时处于普通模式按i进入插入模式然后输入#includestdio.hintmain(void){printf(Hello, world!\n);return0;}输入完成后按Esc返回普通模式再依次输入:wq最后按回车。w是 write表示保存q是 quit表示退出。回到终端后可以检查文件ls-lhello.ccathello.c整个流程可以记成vim 文件名 - i - 输入内容 - Esc - :wq - Enter如果只记住一套最小操作这一套就足以开始使用 Vim。五、六组常用插入命令在普通模式下插入命令决定“从哪里开始输入”。命令作用i在光标所在字符之前插入a在光标所在字符之后追加I在当前行第一个非空白字符之前插入A在当前行末尾追加o在当前行下方新建一行并进入插入模式O在当前行上方新建一行并进入插入模式例如光标位于下面一行的分号上return0;按I会跳到r前开始输入按A会跳到分号后开始输入按o会在下一行创建新行按O会在上一行创建新行。区分大小写非常重要。i和I、o和O是不同命令文档中的大写字母通常意味着按住Shift。六、保存、退出与重新加载这些命令都要在普通模式中先按:输入命令后再按回车。命令作用:w保存当前文件但不退出:q退出有未保存修改时会拒绝退出:wq保存并退出:x有修改时保存然后退出:q!放弃本次未保存修改并强制退出:w!尝试强制写入不能绕过操作系统权限:e!放弃未保存修改从磁盘重新读取当前文件1.:wq、:x和ZZ的区别三者都常用于离开 Vim:wq总是执行一次写入后退出:x只在内容变化时写入然后退出普通模式中的ZZ与:x类似不需要输入冒号和回车。普通模式中的ZQ等价于:q!会放弃修改并退出。由于它不会询问确认初学阶段不建议形成随手使用的习惯。2. 另存文件:w hello_backup.c这会把当前内容写入hello_backup.c但当前缓冲区通常仍然对应原文件。如果希望另存后继续编辑新文件名使用:saveas hello_backup.c3. 保存失败时先看原因常见提示包括E212: Cant open file for writing目录或文件没有写权限E45: readonly option is set当前缓冲区处于只读状态E37: No write since last change存在未保存修改Vim 拒绝执行退出或切换操作。不要一看到错误就使用感叹号。!只能跳过 Vim 自己的部分保护无法让普通用户突破 Linux 文件权限。先用:w确认报错再检查路径和权限更稳妥。七、普通模式中的基础移动1. 字符级移动命令作用h左移一个字符j下移一行k上移一行l右移一个字符方向键也能使用但h j k l不需要把手移出键盘主区后续还可以与数字和编辑命令组合。命令前可以加次数5j 向下移动 5 行 12l 向右移动 12 个字符2. 按单词移动命令作用w移到下一个单词的开头b移到当前或上一个单词的开头e移到当前或下一个单词的结尾ge移到上一个单词的结尾W、B、E按空白分隔的“大单词”移动小写命令会把标点视为分隔例如sumnum1num2中会经过多个位置大写命令主要把连续的非空白内容视为一个整体。代码中两组命令都很有用。3. 在一行内定位命令作用0移到物理行首^移到本行第一个非空白字符$移到行尾g_移到本行最后一个非空白字符f字符在本行向右找到该字符并落在字符上t字符在本行向右找到该字符并停在它前面;重复上一次f、t、F或T查找,反方向重复行内字符查找例如一行中有多个逗号输入f,可以移动到下一个逗号继续按;会依次跳到后面的逗号。4. 按行号和文件位置移动命令作用gg文件第一行G文件最后一行20G或20gg第 20 行:20第 20 行Ctrlg显示当前文件名、行号和文件位置当 GCC 给出main.c:20:5时先输入20G到第 20 行再在本行定位第 5 列通常比连续按方向键快得多。5. 翻页和屏幕内移动命令作用Ctrlf向下翻一页Ctrlb向上翻一页Ctrld向下翻半页Ctrlu向上翻半页H移到当前屏幕顶部附近M移到当前屏幕中部L移到当前屏幕底部附近zz把当前行滚动到屏幕中央zt把当前行滚动到屏幕顶部zb把当前行滚动到屏幕底部注意H、M、L移动光标zz、zt、zb主要调整屏幕显示位置。6. 按段落和成对符号移动Vim 通常把空行分隔的文本视为段落{移到上一段}移到下一段%在配对的()、[]、{}之间跳转。阅读 C 函数时把光标放到左花括号上按%可以快速找到对应的右花括号。这对排查括号层级错误非常实用。八、行号、语法高亮和缩进设置1. 临时显示行号:set number关闭行号:set nonumber相对行号会显示其他行与当前行的距离便于使用5j、8k等命令:set relativenumber同时显示当前绝对行号和其他行的相对行号:set number relativenumber2. 临时设置 C 代码缩进:set expandtab :set tabstop4 :set shiftwidth4 :set softtabstop4这些选项的含义是expandtab按 Tab 时插入空格tabstop4已有制表符显示为 4 列宽shiftwidth4自动缩进和、每次移动 4 列softtabstop4插入模式下 Tab 和退格按 4 列处理。3. 写入个人配置文件冒号命令只对当前 Vim 会话生效。希望每次启动都生效可以编辑~/.vimrcsyntax on filetype plugin indent on set number set cursorline set expandtab set tabstop4 set shiftwidth4 set softtabstop4 set backspaceindent,eol,start set incsearch set hlsearch set ignorecase set smartcase配置含义如下syntax on开启语法高亮filetype plugin indent on根据文件类型加载缩进规则cursorline突出显示当前行incsearch在输入搜索词时实时定位ignorecase默认忽略搜索大小写smartcase在搜索词包含大写字母时自动区分大小写。如果某一行配置报错可以使用下面的命令查看 Vim 实际读取了哪些配置文件:scriptnames九、交换文件是什么Vim 编辑文件时通常会创建交换文件名称类似.hello.c.swp它是隐藏文件用于崩溃恢复也用于提醒“同一文件可能正在被另一个 Vim 进程编辑”。如果 Vim 或终端异常退出再次打开原文件时可能看到E325: ATTENTION。遇到提示时不要直接按D删除先判断情况检查提示中的进程是否仍在运行确认是否有另一个终端正在编辑同一文件如果上次确实崩溃选择恢复或执行vim -r hello.c检查恢复内容保存到安全文件确认交换文件已经无用后再删除。一种稳妥的恢复方式是vim-rhello.c进入后先另存备份:w hello_recovered.c确认恢复内容无误并且不存在其他编辑进程后再处理旧交换文件。交换文件不是普通备份也不能替代 Git。十、查看帮助不必死记全部命令Vim 自带非常完整的帮助系统。在普通模式中输入:help查询具体命令:help i :help :w :help motion.txt :help usr_02.txt帮助窗口中的Ctrl]可以跟随光标下的链接Ctrlo可以跳回上一个位置:q关闭帮助窗口。系统还可能提供交互式入门教程vimtutor它会复制一份练习文本供当前用户操作不会修改系统文件。十一、初学者常见问题1. 按键后没有输入字母很可能仍处于普通模式。按i进入插入模式屏幕底部通常会显示-- INSERT --。2. 输入:q却无法退出当前文件有未保存修改。需要保留修改就使用:wq确认全部放弃才使用:q!。3. 终端突然像“卡住”一样不响应可能误按了Ctrls触发终端的软件流控制。按Ctrlq恢复输出。它与 Vim 的保存功能无关。4. 中文出现乱码或换行异常先查看编码和换行格式:set encoding? :set fileencoding? :set fileformat?Linux 通常使用 UTF-8 和 Unix 换行。如果文件来自 Windows可能显示fileformatdos。转换为 Unix 换行后需要重新保存:set fileformatunix :w5. 鼠标复制的内容无法用p粘贴普通模式中的p粘贴的是 Vim 寄存器内容不一定是系统剪贴板。终端粘贴、Vim 寄存器和系统剪贴板是三个相关但不完全相同的概念下一篇会详细说明。6. 误操作后不知道发生了什么先按Esc回到普通模式再按u撤销最近一次修改如果多撤销了一步按Ctrlr恢复撤销。不要在慌乱中连续输入随机命令。十二、第一阶段速查表目标命令打开文件vim 文件名打开并跳到第 20 行vim 20 文件名进入插入模式i行末追加A下方新建一行o返回普通模式Esc保存:w保存退出:wq或:x放弃修改退出:q!文件首行、末行gg、G行首、首个非空白、行尾0、^、$上下翻页Ctrlb、Ctrlf跳转配对括号%显示行号:set number撤销、恢复撤销u、Ctrlr十三、总结学习 Vim 的第一道门槛是模式而不是快捷键数量。只要先形成“按Esc回普通模式”的习惯并掌握i、:wq、:q!、h j k l、w b、0 ^ $、gg G等基础命令就可以安全地完成日常代码编辑。接下来真正提升效率的关键是理解 Vim 的“操作符 移动范围”语法。例如d表示删除w表示移动到下一个单词把它们组合为dw就能删除一个单词。下一篇将在此基础上系统讲解删除、修改、复制粘贴、寄存器、可视模式、查找替换、多行注释和多文件编辑。