面对老板铁了心只允许使用 `vi` 来写代码,这确实是个不小的挑战,尤其对于习惯了现代 IDE 各种便利功能的朋友们来说。但别灰心,`vi` 本身就是一个极其强大且高效的工具,只不过它的学习曲线比较陡峭,需要花点心思去驯服。 今天我就来跟你唠唠,怎么在这种“硬核”环境下生存并做得出色。
理解“为什么”是第一步
在你开始研究各种 `vi` 高级技巧之前,不妨先揣摩一下老板为什么会有这个规定。
效率至上? `vi` 在处理纯文本和快速编辑方面,熟练掌握后效率惊人。老板可能认为你目前的编码方式效率不高,或者希望团队都养成一种高度精炼的编辑习惯。
系统环境限制? 有些嵌入式开发、服务器环境或者资源受限的场景,可能默认就只提供 `vi`,没有图形界面,也没有其他编辑器。
技术信仰? 也有可能老板就是个资深 `vi` 用户,觉得这是程序员的“基本功”,是一种情怀或者对“返璞归真”的追求。
统一工具链? 为了方便脚本自动化、配置管理等,统一使用 `vi` 也是一种可能的原因。
搞清楚这个原因,能帮助你更有针对性地去应对,甚至在某些方面“顺水推舟”地展示你的能力。
拥抱 `vi` 的核心哲学:模式切换
`vi` 的强大之处在于其 模式切换 的设计。这是理解和使用 `vi` 的基石,也是它和普通文本编辑器最大的不同。
正常模式 (Normal Mode): 这是 `vi` 的默认模式,你启动 `vi` 进入的就是这个模式。在这个模式下,你的键盘输入不会直接插入文本,而是被解释为命令。比如 `j` 移动光标向下,`k` 向上,`h` 向左,`l` 向右。这是 `vi` 的“指挥中心”。
核心操作:
`i`:进入插入模式 (Insert Mode),可以开始输入代码。
`a`:进入插入模式,在当前光标 之后 开始插入。
`o`:进入插入模式,在当前行 下方 新增一行并开始插入。
`O`:进入插入模式,在当前行 上方 新增一行并开始插入。
`x`:删除光标下的字符。
`dd`:删除当前行。
`yy`:复制当前行。
`p`:粘贴(复制或删除的内容)。
`u`:撤销上一步操作。
`Ctrl+r`:重做上一步撤销的操作。
`:`:进入命令行模式 (Commandline Mode),可以执行更复杂的命令。
插入模式 (Insert Mode): 在这个模式下,你的键盘输入就像在普通文本编辑器里一样,直接插入文本。
切换回正常模式: 按下 `Esc` 键。这是你最常用的切换方式。
可视模式 (Visual Mode): 用于选择文本块。
`v`:进入字符可视模式,移动光标会选择字符。
`V`:进入行可视模式,移动光标会选择整行。
`Ctrl+v`:进入块可视模式,可以用矩形块选择。
在可视模式下,你可以执行很多正常模式的命令,比如 `d` 删除选中的文本,`y` 复制选中的文本。
命令行模式 (Commandline Mode): 以 `:` 开头,用于执行更高级的命令,如保存、退出、搜索、替换等。
`:w`:保存文件。
`:q`:退出 `vi`。
`:wq`:保存并退出。
`:q!`:强制退出,不保存。
`:/pattern`:向前搜索 `pattern`。
`:?pattern`:向后搜索 `pattern`。
`:s/old/new/g`:在当前行替换所有 `old` 为 `new`。
`:%s/old/new/g`:在整个文件替换所有 `old` 为 `new`。
把 `vi` 打造成你的“瑞士军刀”:配置与插件
纯粹的 `vi` 可能显得有些简陋,但它可以通过 `.vimrc` 文件进行高度定制化,变成一个功能强大的 IDE。如果老板允许你配置 `vi`(通常是允许 `.vimrc` 的),那么恭喜你,你可以大大提升效率了!
你需要了解 `vi` 的配置文件是 `.vimrc`,通常放在你的用户主目录下 (`~/.vimrc`)。
基础配置(写在 `~/.vimrc` 里):
```vim
" 设置编码为 UTF8
set encoding=utf8
" 显示行号
set number
" 显示当前模式(方便知道是否在插入模式)
set showmode
" 语法高亮
syntax enable
" 自动缩进
set autoindent
set smartindent
" Tab 键的设置 (根据项目和语言习惯调整)
" set tabstop=4 " 一个 Tab 占几个空格
" set shiftwidth=4 " 自动缩进的空格数
" set expandtab " 将 Tab 键转换为空格
" 搜索设置
set incsearch " 增量搜索,输入即显示匹配
set hlsearch " 高亮显示搜索结果
" nnoremap / /C " 使用 Ctrl+f 进行全词匹配搜索(可选)
" 显示匹配的括号
set showmatch
" 括号匹配时闪烁一下
set matchtime=5
" 隐藏一些多余的菜单和提示
set noshowcmd
set novisualbell
" 启用鼠标支持(方便复制粘贴和光标定位,但有些vi老用户不喜欢)
" set mouse=a
" 自动换行(如果你觉得一行太长不好看)
" set wrap
" 自动保存(谨慎使用,可能导致数据丢失)
" set autowrite
" 恢复上次的编辑状态(可选)
" set undofile
" set undodir=~/.vim/undodir
" 更好的配色方案 (如果系统有的话,比如 desert)
" colorscheme desert
" 显示隐藏文件(如果你用的是vim而不是vi,且需要查看隐藏文件)
" :set listchars=eol:$,tab:>,space:·
" :set list
```
解释一下这些配置的意义:
`set number`: 这是最基础也是最重要的,让你知道自己在文件的哪一行,方便查阅错误信息。
`syntax enable`: 启用语法高亮,让代码更易读,区分关键字、变量、字符串等。
`autoindent` / `smartindent`: 自动处理缩进,大大减少了手动调整缩进的工作量。
`tabstop` / `shiftwidth` / `expandtab`: 这是配置代码风格的关键。不同的编程语言和项目有不同的缩进要求(Tab 还是空格,多少个空格)。你需要了解你所负责项目的具体要求,然后在这里设置好。
`incsearch` / `hlsearch`: 让你搜索时更直观,输入一个字符就能看到匹配项,而且所有匹配项都会高亮显示。
`showmatch` / `matchtime`: 对于 C、Java 等语言写括号匹配的代码非常有用。
`mouse=a`: 如果老板不强制禁止鼠标,这可以让你在某些操作上更方便,比如快速复制粘贴一段代码。但如果老板是纯键盘党,就别开启这个。
进阶技巧与效率提升
掌握了基础和配置后,你可以开始学习一些能让你“飞起来”的 `vi` 技巧了:
1. 宏 (Macros):
录制宏:在正常模式下,按下 `q` 加上一个字母(例如 `qa`),就进入了宏录制状态,之后的所有操作都会被记录到 `a` 这个宏里。
播放宏:按下 `@` 加上你之前录制的宏的字母(例如 `@a`)。
多次播放宏:按下 `@@` 会重复上一次执行的宏操作。
用途: 自动化重复性任务,比如给每一行加上双引号,或者修改相似的变量名。你可以录制一次手动操作,然后用宏来批量执行。
2. 文本对象 (Text Objects):
`iw`:inner word (内部单词,不包含空格)
`aw`:a word (一个单词,包含空格)
`i"`:inner double quote (双引号内的内容)
`a"`:a double quote (包含双引号自身的内容)
`i(` / `i)`:parentheses 内的内容
`a(` / `a)`:包含括号自身的内容
组合使用: `ci"` (change inner double quote),即删除双引号内的内容,并进入插入模式。`dit` (delete inner tag) 删除 HTML/XML 标签内的内容。这些组合操作非常强大。
3. 多光标操作 (Multicursor):
虽然 `vi` 本身没有像现代编辑器那样直接的多光标,但可以通过一些插件或者特殊的命令组合实现类似效果。比如利用 `Ctrl+v` 进入块可视模式,然后 `I` 在选块前面插入文本,`A` 在选块后面插入文本。
也可以配合插件如 `vimmultiplecursors` 来实现。如果你老板允许安装插件,这是一个巨大的效率提升。
4. 命令的组合与重复:
很多命令都可以带数字前缀,例如 `3j` 表示向下移动三行,`10l` 表示向右移动十个字符。
`.` (点号): 重复上一次编辑命令。这是 `vi` 中最常用的命令之一,比 `@@` 更常用,因为它只重复一个命令,而不是一个宏。
5. 分屏操作 (Splits):
`:sp`:水平分屏。
`:vsp`:垂直分屏。
`Ctrl+w` + 方向键:在分屏之间切换。
`Ctrl+w` + `w`:在窗口间循环切换。
`Ctrl+w` + `c`:关闭当前窗口。
用途: 同时查看多个文件,或者在一个文件中查看头部和尾部,或者在一个文件里写代码,在另一个文件里写注释。
6. 搜索和替换的高级用法:
使用正则表达式进行搜索和替换。例如 `:s/<(if|for|while)>/(1)/g` 会在所有单独的 `if`, `for`, `while` 单词外面加上括号。
利用可视模式选择一段文本,然后执行替换命令 (`:'<,'>s/old/new/g`),它只会作用于你选择的区域。
如果老板是“原教旨主义者”
如果老板不仅限定了 `vi`,而且还反对你修改 `.vimrc`,甚至反对你使用插件,那情况就比较棘手了。这时你就只能纯粹地使用 `vi` 的原生功能。
回归基础: 专注于掌握所有的 `vi` 命令,尤其是那些能够让你快速移动和编辑的。
善用命令行模式: 大量的查找、替换、跳转等操作都需要通过 `:` 命令来完成。
记忆力是关键: 在这种情况下,你的记忆力就成了最大的武器。需要记住各种组合键,以及它们的作用。
耐心和练习: 熟能生巧,不断地在 `vi` 中进行编辑,你会逐渐内化这些操作,让它们变成一种本能。
如何向老板展示你的“技艺”?
一旦你掌握了 `vi`,如何让老板看到你的进步和适应呢?
高效的代码提交: 使用 `git commit v`,它会默认用 `vi` 打开提交信息编辑器。你的提交信息会写得清晰利落,展示你对 `vi` 的熟悉度。
解决问题的速度: 当出现 bug 时,如果能够快速地在 `vi` 中定位问题、修改代码、然后编译运行,这就是最好的证明。你可以时不时地跟老板说:“我刚才在 `vi` 里定位到个问题,改了一下就好了。” 透露出一种“在命令行里解决一切”的范儿。
参与代码审查: 如果你的代码审查是直接在服务器上进行的,或者需要通过 `vi` 来查看 diff,你的熟练度就能体现出来。
“润物细无声”: 不用刻意炫耀,用事实说话。当别人还在抱怨编辑器不好用时,你已经高效地完成了任务。
最后的忠告
虽然为了适应老板的要求,你需要学习和使用 `vi`,但作为开发者,了解和学习不同的工具是非常有益的。即使现在只允许用 `vi`,未来你可能会遇到其他更适合特定场景的工具。
关键在于 适应能力 和 学习能力。把这次经历当作一个挑战,去挖掘 `vi` 的潜能,你会发现它远比你想象的要强大得多。而且,一旦你征服了 `vi`,你会发现自己在处理任何编辑器时都会得心应手,因为你已经学会了“思考”如何高效地操作文本。
祝你在 `vi` 的世界里驰骋愉快!