A Naïve Vim Tutorial

引言

本次tutorial分享的是 vim 的基本命令和用法。从 vim 的基本命令和哲学开始,介绍了部分常用 vim 操作,随后以阅读和修改 ext4 文件系统为例,讲解了开发过程中常用的批量替换和大型工程跳转,帮助刚加入实验室的新同学快速了解 vim。

“Which editors are popular today? See this Stack Overflow survey (there may be some bias because Stack Overflow users may not be representative of programmers as a whole). Visual Studio Code is the most popular editor. Vim is the most popular command-line-based editor.”

从⼀个例⼦开始

How to exit the vim editor

如何产生一个随机字符串

正经的退出命令

  • 保存并退出::wq
  • 强制退出::q!

Vim 哲学

  • Vim is programmable (with Vimscript and also other languages like Python), and Vim’s interface itself is a programming language: keystrokes (with mnemonic names) are commands, and these commands are composable.
  • Vim avoids the use of the mouse, because it’s too slow.
  • Vim even avoids using the arrow keys because it requires too much movement

三个主要模式

默认左下⻆会显示当前所处的模式(⽆显示即为 Normal Mode)

  • Normal Mode (Command Mode)
  • Insert Mode:插⼊⽂本
  • Visual Mode:选择⽂本

Normal mode => Insert mode

  • 在下⽅插⼊⼀⾏: o
  • 在上⽅插⼊⼀⾏: O
  • 在当前光标后插⼊: a
  • 在当前光标前插⼊: i
  • 在⾏尾插⼊: A
  • 在⾏⾸插⼊: I

光标移动

基础移动

  • 上下左右: hjkl
  • 移动到第⼀⾏: gg
  • 移动到最后⼀⾏/指定⾏: G

进阶移动

  • 移动到下⼀个单词的开头: w
  • 移动到下⼀个单词的结尾: e
  • 移动到上⼀个单词的开头: b
  • 移动到⾏⾸: 0
  • 移动到第⼀个⾮空字符: ^
  • 移动到⾏尾: $
  • 移动到匹配的括号处: %
  • 移动到变量定义处: gd
  • 移动到前⼀个没有匹配的左⼤括号处: [{

复制粘贴

  • 复制: y
  • 粘贴: p

不要害怕尝试

  • Undo: u
  • Redo: C-r

删除

  • 删除整⾏: dd
  • 删除字符: x
  • 删除到⾏尾: D

替换

  • 替换字符: r
  • 替换到⾏尾: C / Da
  • 修改⼤⼩写: ~

Composable

  • 删除2个单词 d2w
  • 删除单词,做两遍 2dw
  • 2d2w
  • d5j = 在 visual mode 下选中后5⾏,再按 d

搜索替换

  • 搜索下⼀个: /
  • 搜索上⼀个: ?
  • 快速搜索当前单词: # / *
  • 将 range 范围内的 from 替换为 to: :[range]s/from/to/[flags]

⽣成从 1 到 1000 的序列

  • 录制宏: q
  • 运⾏宏: @

修饰词

  • i inner
  • a around
  • t till
  • f find

Split window

  • sp
  • vsp
  • 移动: C-w [hjkl]

Mark

  • ⽣成标签 m
  • 跳转 `

注释不需要的⼤段代码

  • visual block

  • 使⽤注释插件 vim-commentary / nerdcommenter

    安装插件

    • mkdir -p ~/.vim/pack/vendor/start
    • 将插件 clone 到该⽬录下即可

man in vim

  • :help

在 ext4 的基础上开发 ext5

⽣成 tags ⽅便跳转

  • ctags -R .

  • 查找 inode_operations 的定义

    No tags file

    • 当前⽬录不存在 tags ⽂件
    • 在⽗⽬录中寻找 tags ⽂件:在 .vimrc 中添加 set tags=./tags;,tags
  • 直接打开定义 inode_operations 的⽂件

    • vim -t inode_opeartions

ext4 替换为 ext5

fast_commit.c 为例

将 range 范围内的 from 替换为 to: :[range]s/from/to/[flags]

使⽤了3条命令将 ext4 全部替换为 ext5 ,如何简化

  • 正则表达式 :%s/\([Ee][Xx][Tt]\)4/\15/g

  • 我们只需要⼤⼩写不敏感即可 :%s/\(ext\)4/\15/ig

  • 其他办法 \zs\ze : ext 只⽤于匹配,不需要替换 :%s/ext\zs4/5/ig

批量替换多个⽂件内的 ext4

:args *.c *.h
:argdo %s/ext4/ext5/g
:argdo update
:argdo exit

意外收获

sed -i "[range]s/from/to/[flags]" filename 将⽂件 filename 内的 from 替换为 to

  • -i edit files in place

查看 mkdir syscall

  • 搜索 syscall_define\d(mkdir
  • vim filename +linenumber

其他插件

  • gitgutter
  • easymotion
  • fzf
  • vim-linux-coding-style
  • cscope

Vim 键位使⽤⼴泛

shell

  • bash : set -o vi
  • zsh : bindkey -v
  • fish : fish_vi_key_bindings ranger

Vimium Chrome 插件

Vscode 插件 已被安装 3.15M 次(截⾄ 2021.11.17)

Tutorial

Reference