Vim的使用
本文参考MIT-Missing-Semester课程
Vim的理念
当我们编程的时候,会花费大量时间阅读和修改代码,Vim是一个模块化编辑器,整个Vim使用一种可编程化按键操作(包括界面和命令),这种设计可以让人们不使用鼠标和键盘方向键来节省时间
模块化编辑
- 标准模式(Normal):移动和编辑文件
- 插入模式(Insert):插入文本
- 替换模式(Replace):替换文本
- 可视化模式(Visual):选择文本块
- 命令行模式(Command-line):运行命令
Vim在左下角显示当前模式,默认模式为标准模式,大部分时间我们会在标准模式和插入模式中切换(因为经常使用<ESC>
,所以很多人重新映射该按键为CapsLock
)
切换模式:
- 标准模式:
<ESC>
- 插入模式:
i
- 替换模式:
R
- 可视化模式:
v
- 可视化行模式:
V
- 可视化块模式:
<Ctrl-v>
(Ctrl+V,也写作 ^V) - 命令行模式:
:
基础
插入文本
在标准模式下按i
进入插入模式,此时可以像使用其他编辑器一样输入文本,知道按下<ESC>
返回标准模式
缓冲区
Vim会生成一系列缓冲文件,一个会话有许多页面和窗口,共享一个缓冲区,这允许我们同时观看一个文件的不同部分,默认情况下,Vim仅开启一个页面和窗口
命令行
在标准模式下按:
进入命令行模式,光标会跳到屏幕底部的命令行区域。命令行模式有很多功能,包括打开,保存,关闭文件以及退出Vim
:q
退出(关闭窗口):w
保存(写入文件):wq
保存并退出:e {file name}
打开文件并编辑:ls
展示打开的缓存:help {topic}
打开帮助
Vim界面操作
移动
- 基础移动:
hjkl
(左,下,上,右) - 单词:
w
(下一个单词),b
(单词的开头),e
(单词的结尾) - 行:
0
(一行的开头),^
(第一个非空格字符),$
(一行的结尾) - 屏幕:
H
(屏幕顶部),M
(屏幕中央),L
(屏幕底部) - 滚动:
Ctrl-u
(上升),Ctrl-d
(下降) - 文件:
gg
(文件开头),G
(文件结尾) - 行号:
:{number}<CR>
或者{number}G
(行号) - 杂项:
%
对应项目 - 查找:
f{character}
,t{character}
,F{character}
,T{character}
- 查找本行前面或后面的字符
,
/:
导航匹配
- 搜索:
/{regex}
.n
/N
导航匹配
选择
可视化模式:
- 可视化:
v
- 可视化行:
V
- 可视化文本块:
Ctrl-v
也可以使用移动按键选择
编辑
i
进入插入模式(删除和修改操作使用不止退格键)o
/O
在上面或下面插入一行d{motion}
删除{motion},(dw
删除单词,d$
删除到行末,d0
删除到行首)c{motion}
修改{motion},(cw
修改单词,作用相当于插入模式的d{motion}
)x
删除字符(等效于dl
)s
替换字符(等效于cl
)- 可视化模式+操作(选择文本,
d
删除,c
修改) u
撤回,<
Ctrl-r>`取消撤回y
复制(d
也是复制)p
粘贴~
翻转字符大小写
计数
3w
向前移动3个单词5j
向下移动5行7dw
删除7个单词
修改
i
:内部a
:周围
ci(
改变当前小括号内部的内容ci[
改变当前方括号内部的内容da'
删除一个单引号字符串,包括单引号
个性化Vim
Vim通过一个纯文本配置文件进行个性化(包括命令行命令),在~/.vimrc
推荐按照以下设置修改默认配置:
1 | " Comments in Vimscript start with a `"`. |
随着使用Vim,你会更加熟悉Vim的设置内容,建议根据自己的习惯进行更改,可以参考其他人的设置,但不建议复制别人的全部配置
拓展Vim
Vim有很多实用的插件,不需要下载额外的插件器,可以用内置的包管理器系统,只需要创建文件夹~/.vim/pack/vendor/start/
然后把插件放到里面即可
推荐插件:
- ctrlp.vim :文件查找
- ack.vim :代码搜索
- nerdtree :文件资源管理器
- vim-easymotion :快捷手势
其他程序中的Vim模式
许多工具支持Vim仿真模式,支持Vim的大部分基础操作
Shell
Bash:set -o vi
Zsh:bindkey -v
Fish:fish_vi_key_bindings
其他:export EDITOR=vim
(git生效)
GNU Readline
添加set editing-mode vi
到文件~/.inputrc
(适用于Python REPL)
高级Vim
搜索和替换
s
替换命令
%s/foo/bar/g
(将文件里的全部foo替换为bar)%s/\[.*\](\(.*\))/\1/g
(将带有命名的md链接替换为纯文本URL)
多窗口
:sp
/:vsp
分割窗口(对同一个缓存区有多个视口)
宏
q{character}
开始记录一个宏q
停止记录宏@{character}
重播这个宏- 如果有错误,宏会停止
{number}@{character}
多次执行同一个宏- 宏可以被递推
- 用
q{character}q
清理宏 - 记录宏,并用
@{character}
去递归调用宏
- 用
Use this card to join the Pochacco and participate in a pleasant discussion together .
Welcome to Pochacco's home,wish you a nice day .