VIM基础

一、 正常模式 (Normal Mode)

这是 Vim 启动后的默认模式,所有的按键都被映射为控制指令。此模式主导光标移动、文本的复制删除、视口控制以及模式切换。

1. 光标移动与基础跳转

  • 基础方向(h/j/k/l)
    1
    2
    3
    4
    5
    6
        ^
    k 提示: h 的键位于左边,每次按下就会向左移动。
    < h l > l 的键位于右边,每次按下就会向右移动。
    j j 键看起来很象一支尖端方向朝下的箭头。
    v

  • 词级跳跃
    • w:移动到下一个单词的起始处。
    • b:移动到上一个单词的起始处。
  • 行与文件级跳转
    • ^:跳转至当前行的行头(首个非空字符)。
    • $:跳转至当前行的行尾。
    • gg:跳转至文件/文章开头。
    • G:跳转至文件/文章结尾。
    • <数字>gg:例如 52gg,精确跳转至第 52 行。
    • [[:跳转到当前文件开头(通常用于代码块匹配)。
    • ]]:跳转至当前文件结尾。

2. 文本删除、置入与替换

许多改变文本的命令都由 操作符 + 动作 (Motion) 构成。

  • 删除操作符 (d)

    • x:删除光标当前所在位置的单个字符。
    • dw:从光标当前位置删除直到下一个单词起始处。
    • de:从光标当前位置删除到单词末尾(包含最后一个字符)。
    • d^:删除光标当前位置至行头的所有内容。
    • d$:删除光标当前位置直至行末的所有内容。
    • dd:删除光标所在的整行。
    • dG:删除从当前光标位置直至文档结尾的所有内容。
  • 置入与粘贴 (p / P)

    • p:将最后一次删除或复制的内容,置入/粘贴到光标之后(或下一行)。常配合 dd 剪切整行使用。
    • P:将内容置入/粘贴到光标之前(或上一行)。
  • 替换 (r)

    • r<字符>:仅替换光标所在位置的一个字符,替换后自动保持在正常模式。

3. 数据操控与自增减

  • Ctrl + a:将光标所在的数字加 1(支持寻找行内首个数字,支持 0x 十六进制)。如输入 10 再按 Ctrl + a 则直接加 10。
  • Ctrl + x:将光标所在的数字减 1。

4. 查找匹配与路径追踪

  • /查找内容:正向查找目标字符串。
  • ?查找内容:反向(向上)查找目标字符串。
  • n:按照原搜索方向,继续寻找下一个匹配项。
  • N:反转方向,寻找上一个匹配项。
  • Ctrl + ]:跳转到光标所在函数的定义处(需配合 ctags)。
  • Ctrl + t:从函数定义处跳回,完成调用栈的回溯。

5. 视口翻页、分屏与进程管理

  • 滚动与翻页

    • Ctrl + f / Ctrl + b:向下 / 向上翻一整页。
    • Ctrl + d / Ctrl + u:向下 / 向上翻半页(代码阅读最佳实践)。
    • Ctrl + e / Ctrl + y:视口向下 / 向上滚动一行(光标停留原处微调)。
  • 跳转历史追溯

    • Ctrl + o:跳回上一个光标历史位置(时光倒流)。
    • Ctrl + i(或 Tab):跳到下一个光标历史位置。
  • 分屏管理 (Ctrl + w 前缀)

    • Ctrl + w 后接 v / s:垂直 / 水平分割窗口。
    • Ctrl + w 后接 h/j/k/lw:在窗口间切换光标焦点。
    • Ctrl + w 后接 q:关闭当前分屏。
    • Ctrl + w 后接 =:均等化所有分屏大小。
  • 快捷保存退出与系统挂起

    • ZZ(大写):快速保存并退出(无需输入冒号进入末行模式,等同于 :wq:x)。
    • Ctrl + z:挂起当前 Vim 进程退回 Shell。在终端敲击 fg 即可恢复。

二、 插入模式 (Insert Mode)

此模式专用于文本输入。在正常模式下输入特定触发键进入,按 EscCtrl + c 退出。

1. 进入编辑状态的触发键

  • i (Insert):在光标插入,进入编辑模式。
  • a (Append):在光标追加,进入编辑模式。

2. 插入模式下的极速编辑 (Ctrl 组合键)

在疯狂敲击代码时,手无需离开主键盘区即可完成删除和补全:

  • Ctrl + h:删除光标前的一个字符(等同于 Backspace)。
  • Ctrl + w:删除光标前的一个单词(极速纠错)。
  • Ctrl + u:删除光标当前位置到行首的所有内容。
  • Ctrl + p / Ctrl + n:自动补全(Previous/Next)。基于当前缓冲区及关联文件弹出变量名/函数名下拉列表。
  • Ctrl + c:退出插入模式返回正常模式(等效于 Esc)。

三、 末行模式 (Command-line Mode)

在正常模式下输入 :/? 触发。这是 Vim 的底层宏观控制台,用于执行全局操作、系统交互和环境配置。

1. 缓冲区保存与文件句柄管理

  • :w:将当前缓冲区内容写入磁盘。
  • :w <文件路径> / :saveas <文件路径>:将当前内容另存为指定文件。
  • :q:正常退出当前窗口(若有未保存修改会被拦截)。
  • :q!:强制退出,丢弃所有未保存的修改。
  • :wq / :wq!:保存并退出 / 强制保存并退出。
  • :x:安全保存并退出(仅当文件被修改过时才执行写入,保护文件 mtime 时间戳)。
  • :e <文件路径>:不离开当前 Vim 进程,直接打开新文件进行编辑。
  • :w !sudo tee %:(极客提权技巧)在忘记使用 sudo 打开需 root 权限的文件时,通过调用系统 tee 强制覆盖当前文件并保存。

2. 正则表达式与全局替换

标准语法::[范围]s/目标正则/替换内容/[修饰符]

  • :%s/old/new/g:将全文所有行的 old 全部替换为 new
  • :%s/old/new/gc:全文替换,但在每次修改前弹窗高亮询问(y/n/a/q/l/x),确保代码重构的安全性。
  • :10,50s/foo/bar/g:限定范围操作,仅在第 10 行至 50 行内进行批量替换。

3. 系统级 Shell 交互

通过 ! 符号突破 Vim 边界,直接调用底层 OS 命令。

  • :!ls -l:临时切回控制台执行 ls -l,按回车返回 Vim 编辑现场。
  • :r <文件名>:读取指定文件的全部内容,插入到光标所在行的下方。
  • :r !<系统命令>:执行外部命令,并将回显结果直接写入到当前文件中(如 :r !ip addr:r !uuidgen)。

4. 运行环境与底层状态控制

动态修改当前 Vim 会话的运行参数(写入 .vimrc 可永久生效)。

  • :set nu / :set nonu:开启 / 关闭行号显示。
  • :set list:显示不可见控制字符(制表符显示为 ^I,换行显示为 $),排查空格/Tab 混用报错的利器。
  • :set ff=unix:转换文件格式。强制将 Windows 风格的换行符(CRLF)转换为 Linux 风格(LF),解决跨平台脚本运行时的 ^M 报错。
  • :set syntax=python:强制覆盖当前文件的语法高亮渲染规则为 Python。

5. 范围批量操作

  • :.,$d:范围删除。删除从当前所在行(.)直到文档最后一行($)的所有内容。
  • :10,20y:范围复制。将第 10 到 20 行的代码一次性提取到寄存器中。

读写命令

echo命令

echo 'i love u' > a.txt,如果文件没有则创建,如果存在文件就覆盖
echo 'i love u' >> a.txt,如果文件没有则创建,如果存在文件就追加