面试翻车现场

去年校招,有个同学技术面表现不错,代码能力扎实。最后我问了个问题:"你在服务器上需要快速改一行代码,没有图形界面,你怎么办?"

他说:"用nano。"

我说:"如果服务器没装nano呢?"

他说:"那就……装一个?"

我说:"服务器上已经有vim了,你用不用?"

他说:"不太会。"

其实不需要精通vim,但基本的打开文件、编辑、保存退出,这些操作你得会。SSH到机器人上改个配置文件、修个bug,vim是最常见的选择。不会的话,你连最基本的操作都做不了。

Vim的三种模式

Vim最让人困惑的就是模式。刚打开vim,你处于普通模式(Normal Mode)。在这个模式下,你敲的字母不是输入文字,而是命令。

按i进入插入模式(Insert Mode),这时候才能正常打字。按Esc回到普通模式。

还有命令行模式,在普通模式下按:进入,可以输入保存、退出等命令。

三种模式的切换:

普通模式 → 按 i → 插入模式 插入模式 → 按 Esc → 普通模式 普通模式 → 按 : → 命令行模式 命令行模式 → 按 Enter → 普通模式

新手最常犯的错误:在普通模式下打字,发现屏幕上一堆乱码。因为你把命令当文字输入了。按Esc确保回到普通模式,再按u撤销刚才的误操作。

基本操作:打开、编辑、保存

vim filename.cpp     # 打开文件(不存在会创建)

进入后:

  1. 按i进入插入模式,开始编辑
  2. 编辑完按Esc回到普通模式
  3. 输入:wq保存并退出(write + quit)
  4. 输入:q!不保存强制退出
  5. 输入:w只保存不退出

这几个命令记住,你就能应付最基本的编辑需求了。

光标移动

在普通模式下,移动光标不需要鼠标:

h ← 左移 j ↓ 下移 k ↑ 上移 l → 右移

为什么要用hjkl而不是方向键?因为Vim设计年代键盘没有方向键,而且hjkl的位置让你的手不用离开主键盘区。当然,方向键也能用,只是效率低一些。

更快的移动方式:

w 跳到下一个单词开头 b 跳到上一个单词开头 0 跳到行首 $ 跳到行尾 gg 跳到文件开头 G 跳到文件末尾 42G 跳到第42行

面试的时候,如果让你用vim改代码,知道gg和G能省很多时间。

删除和复制

普通模式下的删除:

x 删除当前字符 dd 删除当前行 3dd 删除当前及下面两行(共3行) dG 从当前行删除到文件末尾

复制和粘贴:

yy 复制当前行 3yy 复制当前及下面两行 p 粘贴到光标下方 P 粘贴到光标上方

还有个实用的操作:d加移动命令。比如dw删除一个单词,d$删除从光标到行尾,dG删除到文件末尾。c命令类似,但删除后自动进入插入模式:cw改一个单词,cc改整行。

可视模式

除了普通模式和插入模式,还有一个可视模式(Visual Mode),用来选择文本。

按v进入字符可视模式,移动光标选择文字。按V进入行模式,整行选择。按Ctrl+v进入块模式,可以选一个矩形区域。

块模式特别有用。比如你想在10行代码前面都加个//注释,把光标移到第一行,按Ctrl+v,向下移动10行,再按I(大写i),输入// ,按Esc。所有选中行前面都会加上注释。

选完之后按d删除,按y复制,按c修改——和普通模式一样。

查找和替换

在普通模式下按/然后输入关键词,向后搜索:

/robot # 搜索"robot" n # 跳到下一个匹配 N # 跳到上一个匹配

按?向前搜索。

替换命令在命令行模式下:

:%s/old/new/g          # 全文替换old为new
:%s/old/new/gc         # 全文替换,每个都确认
:10,20s/old/new/g      # 只替换第10到20行

这个在改代码的时候特别有用。比如你要把项目里所有的RobotNode改成RobotNodeV2,打开文件后一条替换命令搞定。

和机器人开发的关系

SSH到机器人上调试,经常需要快速改配置文件。比如改ROS2的launch文件里的参数、改udev规则、改网络配置。这些操作用vim最快——不需要把文件下载到本地、改完再传回去。

另一个场景是看日志。用vim打开一个大日志文件,按G跳到末尾看最新的输出,按/ERROR搜索错误信息。比cat整个文件高效得多。

还有crash排查。机器人程序core dump了,你用gdb加载core文件,需要查看崩溃位置的源码。这时候vim +行号 文件名可以直接跳到那一行:

vim +142 main.cpp    # 打开文件并跳到第142行

Vim的基础配置

Vim默认配置很简陋。创建一个~/.vimrc文件:

set number           " 显示行号
set relativenumber   " 相对行号
set cursorline       " 高亮当前行
set syntax on        " 语法高亮
set tabstop 4        " Tab宽度4空格
set shiftwidth 4     " 缩进宽度4
set expandtab        " Tab转空格
set hlsearch         " 搜索高亮
set incsearch        " 实时搜索
set encoding=utf-8   " UTF-8编码
set fileformat=unix  " Unix换行符

这个配置能解决大部分基本需求。把fileformat=unix加上很重要——Windows换行符(\r\n)在Linux上会导致脚本执行失败,这个坑在面试中也有人踩过。

面试常见考点

"vim和nano有什么区别?"——vim功能强大但学习曲线陡,nano简单直观但功能有限。服务器运维和开发一般用vim,偶尔改个简单文件用nano也行。

"vim怎么撤销和重做?"——普通模式下u撤销,Ctrl+r重做。这个和大多数软件的Ctrl+z不一样,面试有人答错过。

"vim怎么处理大文件?"——vim打开大文件会慢,因为它要加载整个文件。可以用vim -u NONE跳过配置加速,或者用less只看不动。如果非要编辑,split或vsplit分屏操作可以避免反复滚动。

"如何在vim中同时编辑多个文件?"——用:split水平分屏,:vsplit垂直分屏,Ctrl+w加方向键在窗口间切换。这个在下一篇会详细讲。

Vim vs nano vs emacs:怎么选

很多新手纠结到底学哪个编辑器。简单说:nano适合偶尔改一行配置,上手零门槛,但功能有限。vim适合日常开发,学习曲线陡但一旦掌握效率很高。emacs功能最强大,但学习成本也最高,而且不是所有服务器都装了。

在机器人开发领域,vim是最实用的选择。原因很简单:几乎所有Linux发行版都预装了vim,SSH到任何机器上都能用。而且vim的模态编辑理念影响了很多工具——VS Code的Vim插件、JetBrains的Vim emulation,都是基于同一套键位。

一个实战建议:把vimtutor跑完之后,强迫自己用vim完成接下来一周的所有文件编辑。包括改配置文件、写代码、看日志。一开始会很慢,但一周后你会发现速度已经超过了鼠标操作。坚持两周,基本操作就会形成肌肉记忆。

Vim在实际开发中的应用

很多工程师觉得Vim学习曲线陡峭,但在服务器环境下编辑配置文件时,Vim几乎是唯一选择。一个实用的学习路径是:先掌握基本的i/o/ESC/:wq/:q!,再学搜索替换:%s/old/new/g,然后学多文件编辑:sp/:vsp。不需要成为Vim大师,能改个配置文件就够了。面试时说日常用VS Code但服务器上会用Vim,这就够了。

给你的建议

不需要精通vim,但基本的操作必须熟练。我的建议是花一个下午,跟着vimtutor练一遍。这是vim自带的教程,在终端输入vimtutor就能开始,大概30分钟就能过完。

日常开发中,遇到小修改就用vim。不要每次都打开VS Code——SSH到机器人上改个参数,vim三十秒搞定,VS Code要等半天加载。

面试的时候,有些公司会让你在终端里写代码(特别是一些做嵌入式或机器人的公司)。会vim至少不会让你卡在这个环节。你不需要用它写整个项目,但能快速改几行代码、查看文件,这就够了。

很多人学vim学不下去,是因为想一次掌握所有命令。别这样。先记住i/Esc/:wq这三个,能打开能改能保存就行。剩下的用到的时候再查,慢慢就熟了。


上一篇:第85篇 Linux网络配置——IP/DNS/防火墙和机器人联网调试

下一篇预告:第87篇 Vim进阶——多文件编辑、宏录制和效率提升技巧

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐