引言
本次tutorial分享的是 vim 的基本命令和用法。从 vim 的基本命令和哲学开始,介绍了部分常用 vim 操作,随后以阅读和修改 ext4 文件系统为例,讲解了开发过程中常用的批量替换和大型工程跳转,帮助刚加入实验室的新同学快速了解 vim。
- 主讲人:易纪非(IPADS四年级博士)
- 材料下载地址:https://ipads.se.sjtu.edu.cn/zh/slides/tutorial-2021/Tutorial04_Vim.pdf
“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
innera
aroundt
tillf
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 |
意外收获
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
- vimtutor
- https://vimsnake.com/
- http://www.vimgenius.com/ https://vim-adventures.com/
- MIT missing semester:https://missing.csail.mit.edu/2020/editors/ https://missing-semester-cn.github.io/2020/editors/
- 键位图:http://www.viemu.com/vi-vim-cheat-sheet.gif
Reference
- Editors (Vim), https://missing.csail.mit.edu/2020/editors/
- Ranges, https://vim.fandom.com/wiki/Ranges
- Search and Substitute, https://github.com/iggredible/Learn-Vim/blob/master/ch12_search_and_substitute.md