vim 使用教程

1,054 阅读5分钟

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/