vim介绍
vim是上古时期的一个高效的文本编辑器,可以脱离鼠标通过键盘快速的移动光标位置进行文档编辑.具有强大的可扩展性.
vim模式及切换
普通模式
该模式是vim的默认模式
插入模式
该模式是一般编辑器的正常模式,在该模式下进行文档的编辑工作
可视模式
该模式下通过光标移动,高亮选择区
命令行模式
该模式下执行一些vim编辑器的设置及文档替换等及一些vim支持的命令操作
普通模式 ——> 插入模式
操作 |
说明 |
---|---|
i |
在光标左侧插入正文 |
a |
在光标右侧插入正文 |
o |
在光标所在行的下一行增添新行 |
O |
在光标所在行的上一行增添新行 |
I |
在光标所在行的开头插入 |
A |
在光标所在行的末尾插入 |
插入模式 ——> 普通模式
按ESC由插入模式切换到普通模式
普通模式 ——> 可视模式
操作 |
说明 |
---|---|
v |
字符移动高亮 |
V |
按行高亮 |
ctrl + v |
按块高亮 |
vi{ |
选中{}中间的内容,不包括{} |
va{ |
选中{}中间内容,包括{} |
vi( |
选中()中间内容 |
vi< |
选中<>中间内容 |
vi[ |
选中[]中间内容 |
vit |
选中中间的内容 |
vi” |
选中”"中间内容 |
vi’ |
选中”中间的内容、 |
vis |
选中一个句子 |
vib |
选中一个block |
viw |
选中一个单词 |
vip |
选中一个段落 |
o |
切换光标开头和结尾 |
可视模式 ——> 普通模式
在模式下v的反操作
普通模式 ——> 命令行模式
命令行模式输入":"进入命令行模式
光标移动
字符移动
操作 |
说明 |
---|---|
h |
左 |
j |
下 |
k |
上 |
l |
右 |
单词移动
操作 |
说明 |
---|---|
w |
移动到下个单词开头 |
W |
移动到下个单词开头(单词含标点) |
e |
移动到下个单词结尾 |
E |
移动到下个单词结尾(单词含标点) |
b |
移动到上个单词结尾 |
B |
移动到上个单词结尾(单词含标点) |
fx |
向后搜索<字母>并跳转到第一个匹配的位置 |
Fx |
向前搜索<字母>并跳转到第一个匹配的位置 |
% |
移动到{,[( |
行内移动
操作 |
说明 |
---|---|
0 |
移动到行首 |
^ |
移动到行首 |
$ |
移动到行尾 |
g_ |
移动到行内最后一个非空白符 |
行间移动
操作 |
说明 |
---|---|
ngg |
移动到n行 |
G |
移动到行尾 |
页内移动
操作 |
说明 |
---|---|
H |
移动到当前页面顶部 |
M |
移动到当前页面中间 |
L |
移动到当前页面底部 |
文档移动
操作 |
说明 |
---|---|
Ctrl + b |
向后滚动一屏 |
Ctrl + f |
向前滚动一屏 |
Ctrl + d |
向前滚动半屏 |
Ctrl + u |
向后滚动半屏 |
zz |
移动屏幕使光标居中 |
文档编辑
编辑
操作 |
说明 |
---|---|
r |
替换当前字符 |
J |
将下一行合并到当前行 |
gJ |
join line below to the current one without space in between |
gwip |
reflow paragraph |
cc |
清空当前行, 然后进入插入模式 |
c$ |
从光标位置开始, 修改当前行 |
ciw |
change (replace) entire word |
cw |
从光标位置开始, 修改单词 |
s |
删除当前字符, 然后进入插入模式 |
S |
清空当前行, 然后进入插入模式 (同cc) |
xp |
当前字符后移 |
u |
撤销 |
Ctrl + r |
重复 |
. |
再次执行上个命令 |
查找/替换
操作 |
说明 |
---|---|
/pattern |
查找pattern |
?pattern |
向上查找pattern |
\vpattern |
pattern 中的非字母数字字符被视为正则表达式特殊字符 (不需转义字符) |
n |
查找下一个 |
N |
查找上一个 |
:%s/old/new/g |
替换全部 |
:%s/old/new/gc |
(逐个)替换 |
:noh |
移除搜索结果的高亮显示 |
删除
操作 |
说明 |
---|---|
x |
删除光标后字符 |
X |
删除光标前字符 |
dd |
删除改行 |
dw |
删除单词 |
d$ |
删除到行尾 |
d^ |
删除到行首 |
ndd |
删除n行 |
剪切, 复制, 粘贴
操作 |
说明 |
---|---|
yy |
复制当前行 |
nyy |
复制 n 行 |
yw |
复制当前单词 |
y$ |
复制, 从光标位置到行末 |
p |
在光标后粘贴 |
P |
在光标前粘贴 |
dd |
剪切当前行 |
ndd |
剪切 2 行 |
dw |
剪切当前单词 |
D |
剪切, 从光标位置到行末 |
d$ |
剪切, 从光标位置到行末 (同D) |
x |
剪切当前字符 |
分屏和标签
操作 |
说明 |
---|---|
:e file |
新建缓冲区打开 filename |
:bnext or :bn |
切换到下个缓冲区 |
:bprev or :bp |
切换到上个缓冲区 |
:bd |
关闭缓冲区 |
:ls |
列出所有打开的缓冲区 |
:sp file |
新建缓冲区打开 filename 并水平分割窗口 |
:vsp file |
新缓冲区打开 filename 并垂直分割窗口 |
Ctrl + ws |
水平分割窗口 |
Ctrl + ww |
在窗口间切换 |
Ctrl + wq |
关闭窗口 |
Ctrl + wv |
垂直分割窗口 |
Ctrl + wh |
切换到右侧窗口 |
Ctrl + wl |
切换到左侧窗口 |
Ctrl + wj |
切换到下侧窗口 |
Ctrl + wk |
切换到上侧窗口 |
配置管理
Vim的配置文件位于~/.vimrc,文件使用VimScript语法来编写
参考阮一峰的Vim 配置入门
快捷键配置
映射模式
定义映射模式时,我们可以使用nmap、imap、vmap来定义映射仅在normal、insert、visual模式有效
一般的映射模式是有副作用的,例如:
nmap dd O<esc>jddk
这一命令想要将dd映射为:
O向上添加一个新行
esc返回normal模式
j向下移动到要删除的一行
dd删除这一行
k向上移动到新增的一行
然而实际执行中,当你按下dd时,文件会无限刷出空行直到你按下,这是因为这一命令中jddk中的dd也按照按键映射解读了。因此形成了一个死循环。
命令noremap解决了这个问题,每一个map命令都对应一个noremap命令。包括noremap、nnoremap、inoremap、vnoremap,它可以保证映射中的操作都遵循默认的操作。
这次我们使用noremap重新定义刚才的映射:
nnoremap dd O<esc>jddk
再次测试,发现不再出现死循环了。
使用Leader键
vim中的组合键是通过按键序列来执行的,例如qd这个操作,你只需要先按下q再按下d就好了,而不需要qd一起按。
由于Vim已经占用了大量的按键,导致我们配置快捷键时处处受限。
由于有些按键在vim的非insert模式中几乎是永远不会用到的(例如逗号,),因此我们可以在快捷键的命令前统一加上这个键,方便好记又不会冲突。这个键就称为Leader键。
我们可以通过let mapleader=","这一命令将逗号设置为leader键(设置其它键的方法同理)。然后对前文中我们定义的映射dd做一些修改:
nnoremap <leader>dd O<esc>jddk
这下我们就可以通过,dd的组合键来调用映射了。
插件管理
安装vundle
$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
$vim ~/vimrc
set nocompatible " 去除VI一致性,必须要添加
filetype off " 必须要添加
" 设置包括vundle和初始化相关的runtime path
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" 另一种选择, 指定一个vundle安装插件的路径
"call vundle#begin('~/some/path/here')
" 让vundle管理插件版本,必须
Plugin 'VundleVim/Vundle.vim'
" 以下范例用来支持不同格式的插件安装.
" 请将安装插件的命令放在vundle#begin和vundle#end之间.
" Github上的插件
" 格式为 Plugin '用户名/插件仓库名'
Plugin 'tpope/vim-fugitive'
" 来自 http://vim-scripts.org/vim/scripts.html 的插件
" Plugin '插件名称' 实际上是 Plugin 'vim-scripts/插件仓库名' 只是此处的用户名可以省略
Plugin 'L9'
" 由Git支持但不再github上的插件仓库 Plugin 'git clone 后面的地址'
Plugin 'git://git.wincent.com/command-t.git'
" 本地的Git仓库(例如自己的插件) Plugin 'file:///+本地插件仓库绝对路径'
Plugin 'file:///home/gmarik/path/to/plugin'
" 插件在仓库的子目录中.
" 正确指定路径用以设置runtimepath. 以下范例插件在sparkup/vim目录下
Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
" 安装L9,如果已经安装过这个插件,可利用以下格式避免命名冲突
Plugin 'ascenator/L9', {'name': 'newL9'}
" 你的所有插件需要在下面这行之前
call vundle#end() " 必须
filetype plugin indent on " 必须 加载vim自带和插件相应的语法和文件类型相关脚本
" 忽视插件改变缩进,可以使用以下替代:
"filetype plugin on
"
" 常用的命令
" :PluginList - 列出所有已配置的插件
" :PluginInstall - 安装插件,追加 `!` 用以更新或使用 :PluginUpdate
" :PluginSearch foo - 搜索 foo ; 追加 `!` 清除本地缓存
" :PluginClean - 清除未使用插件,需要确认; 追加 `!` 自动批准移除未使用插件
"
" 查阅 :h vundle 获取更多细节和wiki以及FAQ
" 将你自己对非插件片段放在这行之后
常用的插件
- NERD Tree 文档目录
- YouCompleteMe 自动补全
- ctrlp 文件搜索
总结
接触vim也有段时间了,零零散散的看了很多资料,没有一篇将vim的知识点都覆盖的,可见vim的复杂性,作为一个文档编辑的工具,也没必要将所有的点都记忆,所以就系统的整理了下,形成一个知识闭环,其中还有一些知识点未曾涉及到,作为完整的补充可以参考这个vim.rtorr.com/lang/zh_cn/