基础操作

Vim 是基于模式的文本编辑器。

1
2
3
4
5
6
Normal --< i >--------> Insert
--< R >--------> Replace
<esc> <--< V >--------> View
--< Shift-V >--> View Line
--< Ctrl-V >---> View Block
--< : >--------> Command Line

需要熟悉这些切换,不然你就可以在你的屏幕上得到一串随机字符串 😀

因为你会在使用 Vim 时大量使用 <ESC> 键,所以可以考虑把大小写锁定键重定义成 <ESC> 键,这个通过 Vim 里面的映射来完成。

缓存, 标签页, 窗口

Vim 的窗口与我们以前所用的编辑器都不同。

Vim 会维护一系列打开的文件,称为“缓存”(即 buffer)。一个 Vim 会话包含一系列标签页(即 tab),每个标签页包含 一系列窗口(分隔面板 window)。每个窗口显示一个缓存。跟网页浏览器等其他你熟悉的程序不一样的是, 缓存和窗口不是一一对应的关系;窗口只是视角。一个缓存可以在多个窗口打开,甚至在同一 个标签页内的多个窗口打开。这个功能其实很好用,比如在查看同一个文件的不同部分的时候,即你可以在一个标签页内打开两个窗口,一个窗口看文件头部,一个看文件尾部的内容。你在其中一个窗口输入的时候,另一个在同一个buffer下的窗口内容也会跟着改变。

命令行模式

在正常模式下键入 : 进入命令行模式。 在键入 : 后,你的光标会立即跳到屏幕下方的命令行。 这个模式有很多功能,包括打开,保存,关闭文件,以及退出 Vim。

  • :q 退出(关闭窗口)

  • :w 保存(写)

  • :wq 保存然后退出

  • :e {文件名} 打开要编辑的文件(配合上下键选择已经打开的缓存)

  • :ls 显示打开的缓存

  • :help {标题}

    打开帮助文档时要注意区别:

    • :help :w 打开 :w 命令的帮助文档
    • :help w 打开 w 移动的帮助文档

Vim 设计思想

移动

  • 基本移动: hjkl (左, 下, 上, 右)

  • 词: w (下一个词), b (词初), e (词尾)

  • 行: 0 (行初), ^ (第一个非空格字符), $ (行尾)

  • 屏幕: H (屏幕首行), M (屏幕中间), L (屏幕底部)

  • 翻页: Ctrl-u (上翻), Ctrl-d (下翻)

  • 文件: gg (文件头), G (文件尾)

  • 行数跳转:

    • :{行数}<CR回车>,跳转的指定的行
    • {行数}G ,跳转到下 n 行
  • 杂项: % (找到配对,比如括号或者 /* */ 之类的注释对)

  • 查找:

    1
    f{字符}
    1
    t{字符}
    1
    F{字符}
    1
    T{字符}
    • 查找/到 向前/向后 在本行的字符
    • 小写向后查找,大写向前查找
    • f是定位到查找的字符上,t是定位到查找的字符前,大写同理
    • , / ; 用于导航匹配
  • 搜索: /{正则表达式}, 按下enter确定后,n / N 用于导航匹配(下一个/上一个匹配项)

选择

即进入可视化模式:

  • 可视化:v
  • 可视化行: V(即 shift-v
  • 可视化块:Ctrl+v

可以用移动命令来选中。

编辑

所有你需要用鼠标做的事, 你现在都可以用键盘:采用编辑命令和移动命令的组合来完成。 这就是 Vim 的界面开始看起来像一个程序语言的时候。下面是 Vim 处于普通模式下的一些编辑命令:

  • i进入插入模式

  • O / o 在之上/之下插入行并进入插入模式

  • d{移动命令}

    • 例如,dw 删除词, d$ 删除到行尾, d0 删除到行头。
  • c{移动命令}
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53

    - 例如,`cw` 改变词
    - 相当于 `d{移动命令}` 再 `i`,`c`命令会自动进入`insert`模式

    - `x` 删除字符(等同于 `dl`)

    - `s` 替换字符(等同于 `xi`)

    - 可视化模式 + 操作

    - 选中文字, `d` 删除 或者 `c` 改变,或者 `y` `p` 复制粘贴

    - `u` 撤销, `<C-r>` 重做

    - `y` 复制 / “yank” (其他一些命令比如 `d` 也会复制,相当于剪切)

    - `p` 粘贴 / "paste"

    - 更多值得学习的: 比如 `~` 改变字符的大小写,看老师演示时挺难蚌的

    ### 计数

    你可以用一个计数来结合“名词”和“动词”,这会执行指定操作若干次。

    - `3w` 向前移动三个词
    - `5j` 向下移动 5 行
    - `7dw` 删除 7 个词

    ### 修饰语

    你可以用修饰语改变“名词”的意义。修饰语有 `i`,表示“内部”或者“在内“,和 `a`, 表示”周围“。

    - `i`不包含配对符,`a`则包含
    - `ci(` 改变当前括号内的内容
    - `ci[` 改变当前方括号内的内容
    - `da'` 删除一个单引号字符串, 包括周围的单引号

    ## 演示例子

    这里是一个有问题的 [fizz buzz](https://en.wikipedia.org/wiki/Fizz_buzz) 实现:

    ```python
    def fizz_buzz(limit):
    for i in range(limit):
    if i % 3 == 0:
    print('fizz')
    if i % 5 == 0:
    print('fizz')
    if i % 3 and i % 5:
    print(i)

    def main():
    fizz_buzz(10)

我们会修复以下问题:

  • 主函数没有被调用
  • 从 0 而不是 1 开始
  • 在 15 的整数倍的时候在不用行打印 “fizz” 和 “buzz”
  • 在 5 的整数倍的时候打印 “fizz”
  • 采用硬编码的参数 10 而不是从命令控制行读取参数
  • 主函数没有被调用
    • G 文件尾
    • o 向下打开一个新行
    • 输入 “if name …”
  • 从 0 而不是 1 开始
    • 搜索 /range
    • ww 向前移动两个词
    • i 插入文字, “1, “
    • ea 在 limit 后插入, “+1”
  • 在新的一行 “fizzbuzz”
    • jj$i 插入文字到行尾
    • 加入 “, end=’’”
    • jj. 重复第二个打印
    • jjo 在 if 打开一行
    • 加入 “else: print()”
  • fizz fizz
    • ci' 变到 fizz
  • 命令控制行参数
    • ggO 向上打开
    • “import sys”
    • /10
    • ci( to “int(sys.argv[1])”

Vim 学习小结

第一讲小结

  • 光标移动
    使用 hjkl 字母键:

    • h (左移)
    • j (下行)
    • k (上行)
    • l (右移)
  • 进入 Vim 编辑器
    输入:vim 文件名 <回车>

  • 退出 Vim 编辑器

    • 放弃改动:<ESC> :q! <回车>
    • 保存改动:<ESC> :wq <回车>
  • 删除光标所在字符
    按键:x

  • 插入/添加文本

    • i:光标前插入文本,按 <ESC> 退出
    • A:在一行末尾添加文本,按 <ESC> 退出
  • 特别提示
    <ESC> 键可返回正常模式或取消不完整命令。


第二讲小结

  • 删除命令

    • 删除至下一个单词:dw
    • 删除至行末:d$
    • 删除整行:dd
  • 重复动作
    在命令前加数字:2w

  • 命令格式
    operator [number] motion

    • operator:操作符(如 d 代表删除)
    • [number]:重复次数
    • motion:移动方式(如 w 代表单词,$ 代表行末)
  • 其他命令

    • 移动至行首:0
    • 撤销:u
    • 撤销整行改动:U
    • 恢复撤销:CTRL-R

第三讲小结

  • 置入已删除文本
    p 将删除内容置于光标后。删除整行时置于下一行。

  • 字符替换
    输入:r 新字符

  • 更改命令

    • 替换至单词末尾:ce
    • 替换至行末:c$
      格式:c [number] motion

第四讲小结

  • 跳转命令

    • 显示文件状态:CTRL-G
    • 跳至文件末尾:G
    • 跳至指定行:行号G
    • 跳至文件开头:gg
  • 查找命令

    • 正向查找:/字符串
    • 反向查找:?字符串
    • 查找下一个匹配:n
    • 反向查找下一个:N
  • 跳转回旧位置

    • 较旧位置:CTRL-O
    • 较新位置:CTRL-I
  • 括号配对跳转
    %

  • 替换命令

    • 替换当前行首个::s/old/new
    • 替换当前行所有::s/old/new/g
    • 替换两行间所有::#,#s/old/new/g
    • 全文替换::%s/old/new/g
    • 全文替换并确认::%s/old/new/gc

第五讲小结

  • 执行外部命令
    :!command

  • 保存文件

    • 保存为新文件::w FILENAME
    • 可视模式保存:v motion :w FILENAME
  • 插入文件内容

    • 从磁盘插入::r FILENAME
    • 插入命令输出::r !dir

第六讲小结

  • 插入/添加文本

    • 在下方插入新行:o
    • 在上方插入新行:O
    • 光标后插入:a
    • 行末后插入:A
  • 移动光标
    到单词末尾:e

  • 复制/粘贴文本

    • 复制:y
    • 粘贴:p
  • 替换模式
    输入 R 持续替换,按 <ESC> 退出。

  • 设置选项

    • 忽略大小写::set ic
    • 搜索时高亮显示::set hls
    • 关闭选项::set noic

第七讲小结

  • 帮助命令

    • 打开帮助::help
    • 查看特定命令帮助::help cmd
    • 关闭帮助窗口::q
  • 窗口操作
    窗口间跳转:CTRL-W

  • 补全命令

    • 查看补全:按 CTRL-D
    • 使用补全:按 <TAB>
  • 配置启动文件
    可创建 vimrc 脚本保存偏好设置。